-50 (kAudio_ParamError
) означает, что один из переданных вами параметров неверен.
Распространенной ошибкой с AudioUnitRender
является передача AudioBufferList
с неправильным количеством mNumberBuffers
(возможно, вы записываете неперемежающееся стерео), или сами AudioBuffer
могут быть неправильного размера или иметь неправильное количество каналов.
Я сталкиваюсь с этой проблемой всякий раз, когда забываю, что симулятор и удаленные аудиоустройства устройства имеют разные форматы потока по умолчанию и не устанавливают их явно через
AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &streamFormatIActuallyWant, UInt32(MemoryLayout<AudioStreamBasicDescription>.size))
Я думаю, что симулятор по умолчанию использует чередующееся целое число, а устройство по умолчанию использует не чередующееся число с плавающей запятой, хотя, возможно, это только моя конфигурация.
Из заголовочного файла AudioUnitRender
:
Вызывающий объект должен предоставить действительный ioData AudioBufferList, который соответствует ожидаемой топологии для текущего аудиоформата для данной шины. Список буферов может быть двух вариантов:
(1) Если указатели mData не нулевые, то аудиоустройство отобразит свой вывод в эти буферы. Эти буферы должны быть выровнены по 16-байтовым границам (что обычно возвращает malloc).
(2) Если указатели mData равны нулю, то аудиоустройство может предоставить указатели на свои собственные буферы. В этом случае требуется, чтобы аудиоустройство сохраняло эти буферы действительными в течение цикла ввода-вывода вызывающего потока.
Передача нуля mData
(пункт (2)) может избавить вас от ненужной копии, но вам все равно нужно знать «топологию» формата, которая равна просто mNumberBuffers
(вероятно, 1 или 2).
person
Rhythmic Fistman
schedule
14.08.2018