AirPlay 的音频输出路由

5

我已经搜索过,但找不到一种方法来访问音频输出路由,以便可以检测音频是否通过AirPlay输出。

这是我在iOS 5.0文档中发现的内容。

kAudioSessionOutputRoute_AirPlay

讨论

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

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

谢谢

3个回答

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

自从iOS 6以来,推荐的做法是使用AVAudioSession(基于C的AudioSession API在iOS 7中已被弃用)。

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

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


你能解释一下在什么情况下,输出数组会是非空但为空的吗? - Jordan H

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

我对确切的语法不是太确定,所以你需要稍微尝试一下,但你应该能够得到一般的概念。


kAudioSessionProperty_OutputDestinations 一个 CFArrayRef 对象,包含通过 iPad 相机连接套件连接的 USB 音频配件中可用音频输出目标的详细信息。 数组的每个元素都包含一个 CFDictionaryRef 对象,其中包含“USB 附件音频目标字典键”中描述的键和相应的值。我无法使用它,因为它仅用于 USB 连接设备。 - Bassem
我已经弄清如何获取设备的音频输出,但目前无法回答自己的问题,因为我是个新手,还没有100+的声望。我将在5小时后发布答案 :) - Bassem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接