AudioUnitRender Ошибка -50 значение

Я получаю ошибку -50 в вызове AudioUnitRender. My Audio Unit — это просто устройство RemoteIO, получающее сэмплы с микрофона. Что означает ошибка -50?

  let status = AudioUnitRender(controller.audioUnit!, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, listPtr)

if noErr != status {
    print("Error \(status)");
    fatalError("Render status \(status)")
  // return status;
}

person Deepak Sharma    schedule 14.08.2018    source источник


Ответы (2)


-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
comment
Как мне передать AudioBufferList с нулевым mData, я пытаюсь, но снова выдает ошибку -50. - person Deepak Sharma; 28.08.2018
comment
Моя конфигурация сложная. У меня тоже есть AVCaptureSession. Я воспроизвожу ошибку -50 следующим образом. Запустите приложение и закройте его до инициализации AVCaptureSession. Я вижу все настройки в фоновом режиме. Теперь, когда я вывожу приложение на передний план, я начинаю получать ошибку -50. Не знаю, как его отлаживать. - person Deepak Sharma; 28.08.2018
comment
У вас есть проект на github, которым вы можете поделиться? - person Rhythmic Fistman; 28.08.2018
comment
К сожалению, это отображается только в моем сложном приложении. Я пытаюсь сделать пример приложения, которое воспроизводит проблему, но это сложно. Буду держать вас в курсе, как только воссоздам минимальный образец кода. - person Deepak Sharma; 28.08.2018
comment
Я вижу, что проблема возникает, когда параметр inNumberFrames имеет нечетную длину (1115 вместо 1114). Я не знаю, как inNumberFrames меняется с 1024 на 1114 или 1115 после прерывания. Любые идеи, что влияет на этот параметр? - person Deepak Sharma; 28.08.2018
comment
Я добавил новый вопрос с очень конкретным кодом, пожалуйста, посмотрите и дайте мне знать ваши ответы: stackoverflow.com/questions/52061575/ - person Deepak Sharma; 28.08.2018
comment
Судя по забавным размерам буфера, частота дискретизации AVAudioSession была изменена. Я думаю, вы можете попробовать изменить его обратно, но в идеале ваш код должен иметь дело с нежелательными настройками, поскольку вы не гарантируете, что получите то, что просите. - person Rhythmic Fistman; 28.08.2018
comment
Да, я меняю его обратно на 44100, когда мой AVCaptureSession возобновляется, но я обнаружил, что все буферы постоянно имеют длину 1115 в моей настройке приложения Swift. В проекте Objective C все работает, и я получаю inNumberBuffers, чередующиеся между 1114 и 1115. Я понятия не имею, что вызывает постоянный размер буфера 1115 в коде Swift. Вместо того, чтобы смотреть код построчно, я пытаюсь определить место, где что-то идет не так. - person Deepak Sharma; 28.08.2018
comment
Между вами и оборудованием есть преобразователь частоты дискретизации — 1024*48000/44100 = 1114.5... кадров, отсюда и чередование 1114 и 1115. - person Rhythmic Fistman; 28.08.2018
comment
Но откуда эти 48000? Насколько я знаю, по умолчанию у микрофона 44100. Почему при изменении категории с воспроизведения на запись количество кадров не сбрасывается до 1024? - person Deepak Sharma; 28.08.2018
comment
Хорошо, у меня есть хорошие новости. У меня есть воспроизводимый пример кода, который минимален. Должен ли я поделиться им с вами? - person Deepak Sharma; 29.08.2018
comment
Давайте продолжим это обсуждение в чате. - person Rhythmic Fistman; 29.08.2018
comment
отправил вам сообщение в чат - person Deepak Sharma; 03.09.2018
comment
где вы находите, что код ошибки -50 соответствует kAudio_ParamError. документация Apple просто бесполезна developer.apple.com/documentation/audiotoolbox/ (Код результата. хахахахаха) - person Martin Mlostek; 11.09.2019
comment
Вы можете использовать файлы заголовков osstatus.com или grep. Это не здорово. Также я думаю, что -50 был ошибкой параметра на Mac в течение очень долгого времени, например, 25+ лет. - person Rhythmic Fistman; 11.09.2019

убедитесь, что вы передаете AudioBufferList с достаточным количеством mDataByteSize, он должен быть больше, чем канал inNumberFrames *.

person tanrk    schedule 09.02.2021