2011-09-08 221 views
7

我想弄清楚如何检测哪些音频设备连接在iphone/ipad/ipod上。我知道音频路由调用和路由改变回调的所有信息,但这些信息并没有告诉我有关附件的任何信息。他们只报告音频当前路由的位置。例如,我需要知道在音频通过扬声器路由时是否还连接了耳机和/或蓝牙。或者,例如,如果用户在使用蓝牙时插入耳机,然后决定断开蓝牙连接,则需要知道蓝牙已断开,即使音频仍然通过耳机路由。检测附加的音频设备iOS

+1

我有我的应用程序类似的问题,我的应用程序正确地播放流,但如果我改变音频输出(耳机拔掉),它停止播放..没有üfigureout如何当音频输出被改变检测? –

+2

是的,通过AudioSessionPropertyListener回调来检测路由改变。然后通过AudioSessionAddPropertyListener函数注册属性监听器。但是,这不是我上面想要做的。在我的应用程序中,我需要检测哪些设备连接正确地向用户显示可用的路由选项。 – Cliff

回答

0

您可以从AudioSession属性中获取InputSources和OutputDestinations的列表。 看看这些会话属性:

kAudioSessionProperty_InputSources 
kAudioSessionProperty_OutputDestinations 

而且查询每个细节,你可以使用:

kAudioSessionProperty_InputSource 
kAudioSessionProperty_OutputDestination 
+0

这些属性适用于USB配件,因此它们不适用于我的情况。我正在检测何时连接了蓝牙或有线耳机。 – Cliff

+0

哎呀,我的歉意,我现在在你的问题上看到了不同。 – MOK9

1

在iOS 5中的情况下,你应该使用:

CFStringRef newRoute; 
size = sizeof(CFStringRef); 
XThrowIfError(AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &newRoute), "couldn't get new audio route"); 
if (newRoute) 
{ 
    CFShow(newRoute); 
    if (CFStringCompare(newRoute, CFSTR("HeadsetInOut"), NULL) == kCFCompareEqualTo) // headset plugged in 
      { 
      colorLevels[0] = .3;     
      colorLevels[5] = .5; 
      } 
    else if (CFStringCompare(newRoute, CFSTR("SpeakerAndMicrophone"), NULL) == kCFCompareEqualTo) 
} 
0

不幸,截至iOS11,似乎没有API可靠地获取当前连接的输出设备列表 - 只要当前路由发生变化,您只能通过AVAu看到1个设备(当前路由) dioSession的currentRoute.outputs,尽管多个设备仍可能连接。

然而,对于输入,这包括与HFP协议的蓝牙设备,如果使用(例如AVAudioSessionModeVoiceChatAVAudioSessionModeVideoChat)适当的音频会话模式,一个能获得通过AVAudioSession的availableInputs,而那些可用的输入列表输入即使在该设备不是主动路由时也列在那里 - 例如,当用户通过MPVolumeView从蓝牙到扬声器进行手动覆盖时,这非常有用,并且由于HFP是双向IO(同时具有两个输入和输出),您可以通过查看输入来判断输出HFP蓝牙是否仍然可用。

BOOL isBtInputAvailable = NO; 
NSArray *inputs = [[AVAudioSession sharedInstance] availableInputs]; 
for (AVAudioSessionPortDescription* port in inputs) { 
    if ([port.portType isEqualToString:AVAudioSessionPortBluetoothHFP]) { 
     isBtInputAvailable = YES; 
     break; 
    } 
}