AirPlay的音频输出路由

时间:2011-12-04 22:27:21

标签: ios audio ios5 audiotoolbox

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

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

kAudioSessionOutputRoute_AirPlay

讨论

  

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

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

由于

3 个答案:

答案 0 :(得分:5)

即使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/AudioToolbox.h>并链接到AudioToolbox框架。

答案 1 :(得分:1)

从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 docs以了解描述每个输入/输出端口类型的AVAudioSessionPort...常量,例如内置输入/输出扬声器,蓝牙LE,耳机麦克风等。

另外,请不要忘记通过订阅AVAudioSessionRouteChangeNotification来回应路线更改。

答案 2 :(得分:0)

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);

我不太确定确切的语法,所以你不得不稍微讨论它,但你应该得到一般的想法。