如何设置iOS应用程序以使用USB音频输入和输出到内置扬声器

我有两种不同的吉他适配器,使用闪电连接器连接到我的iphone

当插入适配器1时,该设备成为USB音频麦克风,它通过我的iPhone扬声器播放声音,因为适配器不包含耳机插孔

插入适配器2后,设备将变为USB音频麦克风,但通过适配器上的耳机插孔播放声音。

我正在尝试编写一个与适配器2兼容的应用程序,但不是将声音输出到适配器的耳机插孔,我想通过iPhone的扬声器进行路由。

下面的代码应该可以工作,但我发现用AVAudioSessionPortOverrideSpeaker选项调用AVAudioSessionPortOverride并且音频会话的类别是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]; } } 

我认为当USB设备没有音频输出组件时,您只能通过USB设备实现输入并通过扬声器输出。

我找不到任何说明这一点的文档,但我的推理如下:

混合和匹配音频设备是通过AVAudioSessionCategoryPlayAndRecord的通用版本AVAudioSessionCategoryPlayAndRecord ,即所谓的多路径类别( AVAudioSessionCategoryMultiRoute )及其在AVAudioSession.h文档说

  1. 输入仅限于后进输入端口。
  2. 仅当没有连接其他符合条件的输出时,才允许使用AVAudioSessionPortBuiltInSpeaker

第1点不是问题,但第2点不允许适配器2方案。

注意允许适配器1和2同时使用USB输入和线路输出或耳机。 这会对你有用吗?

这是一个很长的镜头,但你试过..

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

..还是overrideOutputAudioPort: :?