我有一个骨架音频应用,它使用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
答案 0 :(得分:3)
您永远不会重置phase
,因此其价值会无限增加。由于它以浮点类型存储,因此随着值的增加,存储值的精度将降低。这可能是您所描述的频率变化的原因。
将以下行添加到for()
循环的主体应该可以显着缓解问题:
if (phase > 2.0 * M_PI)
phase -= 2.0 * M_PI;
将phase
的类型从float
更改为double
也会有很大帮助。