У меня есть скелетное аудио приложение, которое использует kAudioUnitSubType_HALOutput
для воспроизведения звука через AURenderCallback
. Я генерирую простой чистый тон только для того, чтобы проверить все, но тон меняет шаг заметно время от времени; иногда дрейфуя вверх или вниз, и иногда быстро меняется. Это может быть до нескольких тонов на ~ 500 Гц. Вот обратный вызов:Частотный дрейф в Core Audio на OSX
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
Вы взяли запись, изучая ее - особенно, если она зависит от буферов? По моему опыту CoreAudio вообще не дрейфует. – Volker
Я добавил его выше. Три отдельных тона в первую минуту; ни один не соответствует желаемому набору 1 кГц. –
, и цикл в вашем обратном вызове дает желаемые результаты - лучше всего тестировать, заполняя его волной? нет различий в выборке или подобных «простых» ошибок? – Volker