Я работал над приложением определения частоты для 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);
Несколько вещей на заметку:
Еще раз спасибо, вы все классные!
Деметри