iOS AVAudioSessionRouteChangeReasonOverride:麦克风默认回内置 ipad 麦克风

Posted

技术标签:

【中文标题】iOS AVAudioSessionRouteChangeReasonOverride:麦克风默认回内置 ipad 麦克风【英文标题】:iOS AVAudioSessionRouteChangeReasonOverride: Mic defaults back to inbuilt ipad mic 【发布时间】:2015-08-13 16:30:40 【问题描述】:

在我的应用中,我会记录用户所说的内容并将其转发给他们。

我这样设置类别以允许播放和录制以及蓝牙设备:

[[AVAudiosession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth 错误:&error];

我订阅了通知 - AVAudioSessionRouteChangeNotification

当蓝牙设备断开并重新连接时,我可以看到 routeChangeReason : AVAudioSessionRouteChangeReasonCategoryChange

我可以看到端口类型是蓝牙HFP,这很好。

但是在路由更改原因几秒钟后又有另一个通知: AVAudioSessionRouteChangeReasonOverride

然后它切换回内置的 ipad 麦克风,但扬声器与蓝牙设备保持一致?

为什么会发生覆盖?

【问题讨论】:

【参考方案1】:

我可以通过检查是否连接了蓝牙设备然后将其设置为首选输入来从覆盖中恢复来解决此问题:

NSArray *availInputs = [[AVAudioSession sharedInstance] availableInputs];
        int count = [availInputs count];
        for (int i = 0; i < count; i++) 
            AVAudioSessionPortDescription* inPort = [availInputs objectAtIndex:i];
            if([inPort.portType isEqualToString:@"BluetoothHFP"]) 
                NSError *setPreferredErr = nil;
                [[AVAudioSession sharedInstance] setPreferredInput:inPort error:&setPreferredErr];
                if(setPreferredErr)
                    NSLog (@"connectToBlueToothDeviceIfAvailable setPreferredInput:%@", setPreferredErr);
            
        

【讨论】:

以上是关于iOS AVAudioSessionRouteChangeReasonOverride:麦克风默认回内置 ipad 麦克风的主要内容,如果未能解决你的问题,请参考以下文章

IO复用阻塞IO非阻塞IO同步IO异步IO

四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘

5种IO模型阻塞IO和非阻塞IO同步IO和异步IO

网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别