AirPlay的音频输出路由

我看过但找不到访问音频输出路由的方法,所以我可以检测音频是否通过AirPlay传出。

这是我在iOS 5.0文档中找到的

kAudioSessionOutputRoute_AirPlay 

讨论

这些字符串用作与kAudioSession_AudioRouteKey_Outputs数组关联的字典的kAudioSession_AudioRouteKey_Type键的值。

我找不到访问kAudioSession_AudioRouteKey_Outputs数组的方法。

谢谢

即使Bassem似乎找到了解决方案,但为了完成起见,这里是如何检测当前输出路由是否为AirPlay:

 - (BOOL)isAirPlayActive{ CFDictionaryRef currentRouteDescriptionDictionary = nil; UInt32 dataSize = sizeof(currentRouteDescriptionDictionary); AudioSessionGetProperty(kAudioSessionProperty_AudioRouteDescription, &dataSize, &currentRouteDescriptionDictionary); if (currentRouteDescriptionDictionary) { CFArrayRef outputs = CFDictionaryGetValue(currentRouteDescriptionDictionary, kAudioSession_AudioRouteKey_Outputs); if (outputs) { if(CFArrayGetCount(outputs) > 0) { CFDictionaryRef currentOutput = CFArrayGetValueAtIndex(outputs, 0); CFStringRef outputType = CFDictionaryGetValue(currentOutput, kAudioSession_AudioRouteKey_Type); return (CFStringCompare(outputType, kAudioSessionOutputRoute_AirPlay, 0) == kCFCompareEqualTo); } } } return NO; } 

请记住,您必须#import 并链接到AudioToolbox框架。

从iOS 6开始,推荐的方法是使用AVAudioSession (从iOS 7开始,不推荐使用基于C的AudioSession API)。

 let currentRoute = AVAudioSession.sharedInstance().currentRoute 

currentRoute返回一个AVAudioSessionRouteDescription ,这是一个非常简单的类,有两个属性: inputsoutputs 。 其中每个都是AVAudioSessionPortDescriptions的可选数组,它提供了我们当前路由所需的信息:

 if let outputs = currentRoute?.outputs as? [AVAudioSessionPortDescription] { // Usually, there will be just one output port (or none), but let's play it safe... if let airplayOutputs = outputs.filter { $0.portType == AVAudioSessionPortAirPlay } where !airplayOutputs.isEmpty { // Connected to airplay output... } else { // Not connected to airplay output... } } 

portType是这里有用的信息…请参阅AVAudioSessionPortDescription文档 , AVAudioSessionPort...描述每个输入/输出端口类型的AVAudioSessionPort...常量,例如线路输入/输出,内置扬声器,蓝牙LE,耳机麦克风等。

此外,不要忘记通过订阅AVAudioSessionRouteChangeNotification来响应路由更改。

 CFArray *destinations; CFNumber *currentDest; // Get the output destination list AudioSessionGetProperty(kAudioSessionProperty_OutputDestinations, nil, destinations); // Get the index of the current destination (in the list above) AudioSessionGetProperty(kAudioSessionProperty_OutputDestination, nil, currentDest); 

我不太确定确切的语法,所以你将不得不乱用它,但你应该得到一般的想法。