Запись с удаленным вводом / выводом, код возврата AudioUnitRender -50 - PullRequest
5 голосов
/ 07 декабря 2010

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

Еще раз спасибо, вы все потрясающие!

Деметрий

Ответы [ 3 ]

5 голосов
/ 07 декабря 2010

Если у вас есть 2 канала на кадр, вы не можете иметь bytesPerSample в качестве размера кадра.Поскольку терминология немного сбивает с толку:

  • A sample - это отдельное значение в заданной позиции в форме сигнала
  • A channel относится к данным, связанным с конкретным аудиопотоком, т. е. левым / правым каналом для стерео, единственным каналом для моно и т. д.
  • A frame содержит выборки для всех каналов для данногопозиция в осциллограмме
  • A пакет содержит один или несколько кадров

Так что в основном вам нужно использовать bytesPerSample * mChannelsPerFrame для mBytesPerFrame и использовать mBytesPerFrame * mFramesPerPacket для mBytesPerPacket.

Также я заметил, что вы используете 32-битный размер выборки.Я не уверен, действительно ли вы хотите это сделать - обычно вы хотите записывать аудио, используя 16-битные сэмплы.Разница в звуке между 16 и 32-битным звуком практически невозможна для большинства слушателей (средний CD-диск записан на частоте 44,1 кГц, 16-битный PCM), и это сэкономит вам 50% затрат на ввод-вывод и хранение.

0 голосов
/ 22 июня 2012

Линия bufferList = (AudioBufferList *)malloc(sizeof(AudioBuffer)); также неверна.Поскольку AudioBuffer меньше, чем AudioBufferList, он выделяет недостаточно памяти.

0 голосов
/ 07 декабря 2010

Одно отличие состоит в том, что в блоге Tyson RemoteIO используется 2 байта на выборку линейного PCM. Так что это может быть ошибка несовместимости формата.

...