Как установить приложение iOS для использования USB-аудио для ввода и вывода на внутренние колонки

У меня есть 2 разных типа гитарных адаптеров, которые подключаются к моему iphone с помощью молниевого разъема

Когда адаптер 1 подключен, устройство становится аудиомикшером usb и воспроизводит звук через динамики iPhone, поскольку адаптер не содержит гнезда для наушников

Когда адаптер 2 подключен, устройство становится аудиомикшером USB, но воспроизводит звук через гнездо для наушников на адаптере.

Я пытаюсь написать приложение, которое работает с адаптером 2, но вместо того, чтобы выводить звук на гнездо для наушников адаптера, я хочу направить его через динамики iPhone.

Код ниже должен работать, но я нахожу, что вызов AVAudioSessionPortOverride с опцией AVAudioSessionPortOverrideSpeaker и категория аудиосеансов AVAudioSessionCategoryPlayAndRecord заставляет аудио использовать встроенный динамик и микрофон независимо от другого настройки, в основном игнорируя setPreferredInput

Я не могу понять, как адаптеру 1 удается принимать входные данные из аудио и вывода usb в динамик, но мое приложение не может из-за ограничений выше. Кто-нибудь знает о решении?

AVAudioSession* session = [AVAudioSession sharedInstance];
//Set the audioSession category. Needs to be Record or PlayAndRecord to use audioRouteOverride:
[session    setCategory:AVAudioSessionCategoryPlayAndRecord 
            withOptions:AVAudioSessionCategoryOptionMixWithOthers 
            error:nil];

//set the audioSession override
[session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker 
error:nil];

//activate the audio session
[session setActive:YES error:nil];

//set input to usb
for (AVAudioSessionPortDescription *destPort in session.availableInputs){
    if ([destPort.portType isEqualToString:AVAudioSessionPortUSBAudio]) {
        [setPreferredInput:(AVAudioSessionPortDescription *)inPort
                error:(nil)outError
                session setPreferredInput:destPort error:nil];
    }
}

Ответы

Ответ 1

Я думаю, что вы можете только вводить данные через USB-устройство и выводить через динамики, когда USB-устройство не имеет компонент аудиовыхода.

Я не могу найти документацию, в которой говорится именно об этом, но мои рассуждения таковы:

Смешивание и сопоставление аудиоустройств осуществляется с помощью обобщенной версии AVAudioSessionCategoryPlayAndRecord, так называемой многопроходной категории (AVAudioSessionCategoryMultiRoute), и ее документация в AVAudioSession.h говорит, что

  • Вход ограничивается последним входным портом.
  • AVAudioSessionPortBuiltInSpeaker разрешено использовать только в том случае, если не подключены другие допустимые выходы.

Точка 1 не проблема, но точка 2 запрещает сценарий вашего адаптера 2.

NB. Это позволит адаптерам 1 и 2 работать с USB-входом и линейным выходом или с наушниками. Будет ли это полезно для вас?

Ответ 2

Это немного длинный выстрел, но вы пробовали..

[session setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:nil]

.. вместо overrideOutputAudioPort:?