2

Я использую Службы очереди аудио для записи аудио данных PCM в Mac OS X. Он работает, но количество кадров, которые я получаю в моем обратном вызове, варьируется.Почему номер пакета в обратном вызове ввода звуковой очереди меняется?

static void MyAQInputCallback(void *inUserData, AudioQueueRef inQueue, AudioQueueBufferRef inBuffer, const AudioTimeStamp *inStartTime, UInt32 inNumPackets, const AudioStreamPacketDescription *inPacketDesc) 

При каждом вызове моего аудио входной очереди я хочу получить 5 мс (240 кадров/inNumPackets, 48 кГц) звуковых данных.

Это аудиоформат я использую:

AudioStreamBasicDescription recordFormat = {0}; 
memset(&recordFormat, 0, sizeof(recordFormat)); 
recordFormat.mFormatID = kAudioFormatLinearPCM; 
recordFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked; 
recordFormat.mBytesPerPacket = 4; 
recordFormat.mFramesPerPacket = 1; 
recordFormat.mBytesPerFrame = 4; 
recordFormat.mChannelsPerFrame = 2; 
recordFormat.mBitsPerChannel = 16; 

У меня есть два буфер из 960 байт помещён:

for (int i = 0; i < 2; ++i) { 
    AudioQueueBufferRef buffer; 
    AudioQueueAllocateBuffer(queue, 960, &buffer); 
    AudioQueueEnqueueBuffer(queue, buffer, 0, NULL); 
} 

Моей проблемы: За каждые 204 раз в 240 кадров (inNumPackets) обратный вызов когда-то вызывается только с 192 кадрами.

Почему это происходит, и есть ли что-то, что я могу сделать, чтобы постоянно получать 240 кадров?

ответ

2

Звуковые очереди выполняются поверх аудиоустройств. Буферы аудиоустройств, скорее всего, сконфигурированы ОС как мощность в два раза, и ваши возвращенные буферы очереди воспроизведения вырезаются из больших буферов Audio Unit.

204 * 240 + 192 = 12 АУДИОБЛОКА буферы 4096.

Если вы хотите фиксированные буферы длины, которые не сила двоих детей, лучше всего, чтобы иметь приложение повторно буфера входящего буферов (сэкономить до тех пор, пока у вас не будет достаточно данных) до нужной длины. Для этой цели может быть использован кольцевой флуоресцентный буфер.