Запись падения громкости переключения между RemoteIO и VPIO
В моем приложении мне нужно переключаться между этими двумя различными аудиоустройствами. Всякий раз, когда я переключаюсь с VPIO на RemoteIO, у меня падает громкость записи. Довольно значительное падение. Без изменений в громкости воспроизведения. Кто-нибудь испытал это?
Вот код, где я делаю переключение, которое вызывается изменением маршрутизации. (Я не слишком уверен, правильно ли я сделал изменение, поэтому спрашиваю и здесь.)
Как решить проблему падения громкости записи?
Спасибо, ценю любую помощь, которую я могу получить.
Пирс.
- (void)switchInputBoxTo : (OSType) inputBoxSubType
{
OSStatus result;
if (!remoteIONode) return; // NULL check
// Get info about current output node
AudioComponentDescription outputACD;
AudioUnit currentOutputUnit;
AUGraphNodeInfo(theGraph, remoteIONode, &outputACD, ¤tOutputUnit);
if (outputACD.componentSubType != inputBoxSubType)
{
AUGraphStop(theGraph);
AUGraphUninitialize(theGraph);
result = AUGraphDisconnectNodeInput(theGraph, remoteIONode, 0);
NSCAssert (result == noErr, @"Unable to disconnect the nodes in the audio processing graph. Error code: %d '%.4s'", (int) result, (const char *)&result);
AUGraphRemoveNode(theGraph, remoteIONode);
// Re-init as other type
outputACD.componentSubType = inputBoxSubType;
// Add the RemoteIO unit node to the graph
result = AUGraphAddNode (theGraph, &outputACD, &remoteIONode);
NSCAssert (result == noErr, @"Unable to add the replacement IO unit to the audio processing graph. Error code: %d '%.4s'", (int) result, (const char *)&result);
result = AUGraphConnectNodeInput(theGraph, mixerNode, 0, remoteIONode, 0);
// Obtain a reference to the I/O unit from its node
result = AUGraphNodeInfo (theGraph, remoteIONode, 0, &_remoteIOUnit);
NSCAssert (result == noErr, @"Unable to obtain a reference to the I/O unit. Error code: %d '%.4s'", (int) result, (const char *)&result);
//result = AudioUnitUninitialize(_remoteIOUnit);
[self setupRemoteIOTest]; // reinit all that remoteIO/voiceProcessing stuff
[self configureAndStartAudioProcessingGraph:theGraph];
}
}
4 ответа
Я использовал мою поддержку разработчиков Apple для этого. Вот что сказала поддержка:
Наличие голосового ввода / вывода приведет к тому, что ввод / вывод будет обрабатываться совершенно по-разному. Мы не ожидаем, что эти юниты будут иметь одинаковые уровни усиления вообще, но уровни не должны быть резко отключены, как вы, похоже, указываете.
Тем не менее, Core Audio engineering указал, что ваши результаты могут быть связаны с тем, когда создается голосовой блок, это также влияет на экземпляр RIO. После дальнейшего обсуждения технологии Core Audio было высказано мнение, что, поскольку вы говорите, что разность уровней очень резкая, было бы хорошо, если бы вы могли сообщить об ошибке в некоторых записях, чтобы выделить разницу в уровне, которую вы слышите между голосовым вводом / выводом и удаленный ввод / вывод вместе с вашим тестовым кодом, чтобы мы могли попытаться воспроизвести его самостоятельно и посмотреть, действительно ли это ошибка. Было бы неплохо включить результаты одиночных модульных тестов ввода-вывода, описанные выше, а также дополнительные сравнительные результаты.
Нет API, который контролирует этот уровень усиления, все внутренне настраивается ОС в зависимости от категории аудио-сеанса (например, ожидается, что VPIO будет использоваться всегда с PlayAndRecord) и какой модуль ввода-вывода был настроен. Как правило, не ожидается, что оба будут созданы одновременно.
Заключение? Я думаю, что это ошибка.:/
Говорят о проблемах с низкой громкостью, если вы не правильно утилизируете аудиоустройство. По сути, первый аудиокомпонент остается в памяти, и любое последующее воспроизведение будет скрыто под вашими или другими приложениями, что приведет к падению громкости.
Решение: Аудиоустройства являются AudioComponentInstance и должны быть освобождены с помощью AudioComponentInstanceDispose().
Я добился успеха, когда я изменил категорию аудио сеанса при переходе от голосовой обработки ввода-вывода (PlayAndRecord) к удаленному вводу-выводу (SoloAmbient). Убедитесь, что вы приостановили аудио сессию, прежде чем изменить это. Вы также должны будете инициализировать свой аудио график.
Из разговора с инженером Apple AVAudioSession.
VPIO - добавляет обработку звука в образец звука, что также создает эхоподавление, что приводит к падению уровня звука.
RemoteIO - не выполняет никакой обработки звука, поэтому уровень громкости останется высоким.
Если вы ищете подавление эха при использовании опции RemoteIO, вы должны создать собственную обработку звука в обратном вызове рендеринга.