Запись с удаленным вводом-выводом, код возврата AudioUnitRender -50

Я работал над приложением определения частоты для iOS, и у меня возникла проблема с заполнением определяемого пользователем списка AudioBufferList сэмплами звука с микрофона.

Я получаю код возврата -50, когда вызываю AudioUnitRender в моем методе InputCallback. Я считаю, что это означает, что один из моих параметров недействителен. Я' Я предполагаю, что это AudioBufferList, но я не смог понять, что с ним не так. Думаю, я настроил его так, чтобы он соответствовал формату данных, который я указал в моем ASBD.

Ниже приведены настройки удаленного ввода-вывода и вызовы функций, которые, по моему мнению, могут быть неправильными:

ASBD:

size_t bytesPerSample = sizeof(AudioUnitSampleType);
AudioStreamBasicDescription localStreamFormat = {0};
localStreamFormat.mFormatID = kAudioFormatLinearPCM;
localStreamFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical;
localStreamFormat.mBytesPerPacket = bytesPerSample;
localStreamFormat.mBytesPerFrame = bytesPerSample;
localStreamFormat.mFramesPerPacket = 1;
localStreamFormat.mBitsPerChannel = 8 * bytesPerSample;
localStreamFormat.mChannelsPerFrame = 2;
localStreamFormat.mSampleRate = sampleRate;

Объявление InputCallback:

err = AudioUnitSetProperty(ioUnit, kAudioOutputUnitProperty_SetInputCallback, 
                           kAudioUnitScope_Input, 
                           kOutputBus, &callbackStruct, sizeof(callbackStruct));

Объявление AudioBufferList:

// Allocate AudioBuffers
bufferList = (AudioBufferList *)malloc(sizeof(AudioBuffer));
bufferList->mNumberBuffers = 1;
bufferList->mBuffers[0].mNumberChannels = 2;

bufferList->mBuffers[0].mDataByteSize = 1024;
bufferList->mBuffers[0].mData = calloc(256, sizeof(uint32_t));

Функция InputCallback:

AudioUnit rioUnit = THIS->ioUnit;
OSStatus renderErr;
UInt32 bus1 = 1;
renderErr = AudioUnitRender(rioUnit, ioActionFlags, inTimeStamp, bus1, inNumberFrames, THIS->bufferList);

Несколько вещей на заметку:

  • Частота дискретизации = 22050 Гц
  • Поскольку каноническим форматом данных удаленного ввода-вывода является 8,24-битная фиксированная точка, я предполагаю, что каждая выборка составляет 32 бита (или 4 байта). Поскольку целое число без знака составляет 4 байта, я использую его для выделения моего аудиобуфера.
  • Я могу получить тот же код для правильного рендеринга звука, если я реализую поток аудиоданных как PassThru, а не только как ввод.
  • I «уже смотрел Майкла Тайсона» s сообщение в блоге об удаленном вводе-выводе. Не видел там ничего отличного от того, что делаю я.

Еще раз спасибо, вы все классные!

Деметри

5
задан irtemed88 7 December 2010 в 07:32
поделиться