tot*_*ian 16 iphone objective-c avfoundation ios avaudiosession
我有两种不同的吉他适配器,使用闪电连接器连接到我的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];
}
}
Run Code Online (Sandbox Code Playgroud)
我认为只有当USB设备没有音频输出组件时,才能通过USB设备输入并通过扬声器输出。
我找不到任何文档准确说明这一点,但我的推理如下:
AVAudioSessionCategoryPlayAndRecord混合和匹配音频设备是通过所谓的多路由类别 ( )的通用版本完成的,AVAudioSessionCategoryMultiRoute其文档中AVAudioSession.h表示
AVAudioSessionPortBuiltInSpeaker仅当没有连接其他合格输出时才允许使用第 1 点不是问题,但第 2 点不允许您的适配器 2 方案。
注意:这将允许适配器 1 和 2 与 USB 输入和线路输出或耳机一起使用。这对你有用吗?