我不熟悉新的 CoreAudio API,所以可能有更简单的方法。这是我去年解决同样问题的方法。
您可以通过 Bonjour(也称为多播 DNS 或 Zeroconf)确定设备是否需要密码。您应该能够将源名称与 CoreAudio 信息相匹配。对于音频 AirPlay,您需要检查 _raop._tcp 设备。以下是它在终端上的工作方式:
首先,发现附近的 AirPlay 设备(注意 dns-sd 命令在 Mountain Lion 之前称为 mDNS):
劳伦特〜$ dns-sd -B _raop._tcp
浏览_raop._tcp
日期:---2013 年 1 月 15 日星期二---
17:37:31.977 ...开始...
如果域服务类型实例名称,则时间戳 A/R 标志
17:37:31.977 添加 2 4 本地。 _raop._tcp。 406C8F53F1DD@iMac de Laurent
然后,获取 AirPlay 实例的完整记录:
laurent ~ $ dns-sd -L "406C8F53F1DD@iMac de Laurent" _raop._tcp local
查找 406C8F53F1DD@iMac de Laurent._raop._tcp.local
日期:---2013 年 1 月 15 日星期二---
17:43:47.097 ...开始...
17:43:47.098 406C8F53F1DD@iMac\032de\032Laurent._raop._tcp.local。可通过 iMac-de-Laurent.local.:5000(接口 4)访问
et=0,1 ek=1 ss=16 raAudioFormats=ALAC,L16 tp=UDP pw=false txtvers=1 ramach=iMac12,1 vn=3 md=0,1,2 sv=false sm=false ch=2 sr =44100 rast=afs rastx=iafs cn=0,1
pw=false表示没有密码。这是基本的想法,现在你应该对DNSServiceResolve 做同样的事情。
现在,据我所知,检查设备是否忙碌的唯一方法是实际连接到它。在内部,AirPlay 使用 RTSP,因此您可以发送此请求:
RTSP/1.0 选项 *
# 空行
如果设备回复状态为 453,则表示它已经在流式传输。
您可以查看我的AirPlay RTSP stack 了解更多信息。