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