AudioQueue не выводит звук
У меня проблемы с выводом звука в моем эксперименте с iPhone, и у меня нет идей.
Вот мой обратный вызов для заполнения буфера аудио-очереди
void AudioOutputCallback(void *user, AudioQueueRef refQueue, AudioQueueBufferRef inBuffer)
{
NSLog(@"callback called");
inBuffer->mAudioDataByteSize = 1024;
gme_play((Music_Emu*)user, 1024, (short *)inBuffer->mAudioData);
AudioQueueEnqueueBuffer(refQueue, inBuffer, 0, NULL);
}
Я настраиваю аудио-очередь, используя следующий фрагмент
// Create stream description
AudioStreamBasicDescription streamDescription;
streamDescription.mSampleRate = 44100;
streamDescription.mFormatID = kAudioFormatLinearPCM;
streamDescription.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
streamDescription.mBytesPerPacket = 1024;
streamDescription.mFramesPerPacket = 1024 / 4;
streamDescription.mBytesPerFrame = 2 * sizeof(short);
streamDescription.mChannelsPerFrame = 2;
streamDescription.mBitsPerChannel = 16;
AudioQueueNewOutput(&streamDescription, AudioOutputCallback, theEmu, NULL, NULL, 0, &theAudioQueue);
OSStatus errorCode = AudioQueueAllocateBuffer(theAudioQueue, 1024, &someBuffer);
if( errorCode )
{
NSLog(@"Cannot allocate buffer");
}
AudioOutputCallback(theEmu, theAudioQueue, someBuffer);
AudioQueueSetParameter(theAudioQueue, kAudioQueueParam_Volume, 1.0);
AudioQueueStart(theAudioQueue, NULL);
Библиотека, которую я использую, выводит линейный PCM 16 бит 44 Гц.
2 ответа
Решение
Я обычно использую 3 буфера. Вам нужно по крайней мере 2, потому что когда один разыгрывается, другой заполняется вашим кодом. Если у вас есть только один, не хватает времени, чтобы заполнить тот же буфер и повторно поставить его в очередь, и воспроизведение будет плавным. Так что это, вероятно, просто останавливает вашу очередь, потому что она исчерпала буферы.
Вместо этого выделите два буфера.
AudioQueues
очень привередливы