OSX上Core Audio的频率漂移

时间:2015-04-28 20:34:15

标签: macos core-audio audiounit

我有一个骨架音频应用,它使用kAudioUnitSubType_HALOutput通过AURenderCallback播放音频。我正在生成一个简单的纯音,只是为了测试一下,但音调会不时变化;有时会向上或向下漂移,有时会迅速变化。在~500Hz时,它可以达到几个音调。这是回调:

static OSStatus outputCallback(void *inRefCon, AudioUnitRenderActionFlags *ioActionFlags,
                               const AudioTimeStamp *inTimeStamp, UInt32 inOutputBusNumber,
                               UInt32 inNumberFrames, AudioBufferList *ioData) {

    static const float frequency = 1000;
    static const float rate = 48000;
    static float phase = 0;

    SInt16 *buffer = (SInt16 *)ioData->mBuffers[0].mData;

    for (int s = 0; s < inNumberFrames; s++) {
        buffer[s] = (SInt16)(sinf(phase) * INT16_MAX);
        phase += 2.0 * M_PI * frequency / rate;
    }

    return noErr;

}

我知道音频设备会随着时间的推移而漂移(尤其是内置IO等便宜的音频设备),但这是很多漂移 - 它无法用于音乐。有什么想法吗?

Recording http://files.danhalliday.com/stackoverflow/audio.png

1 个答案:

答案 0 :(得分:3)

您永远不会重置phase,因此其价值会无限增加。由于它以浮点类型存储,因此随着值的增加,存储值的精度将降低。这可能是您所描述的频率变化的原因。

将以下行添加到for()循环的主体应该可以显着缓解问题:

if (phase > 2.0 * M_PI)
    phase -= 2.0 * M_PI;

phase的类型从float更改为double也会有很大帮助。

相关问题