我正在开发基于示例developer.apple.com/library/mac/samplecode/AudioDriverExamples/Introduction/Intro.html的coreaudio用户空间hal插件。
在插件实现中,我计划从其他进程(即CFMessagePort)获取音频数据。
然而,在尝试创建端口CFMessagePortCreateLocal时,在控制台中得到以下错误:
sandboxd[251]: ([2597]) coreaudiod(2597) deny mach-register com.mycompnay.audio
我进行了一些搜索,并阅读了这篇文章:
Technical Q&A QA1811 https://developer.apple.com/library/mac/qa/qa1811/_index.html,讲解了在plist中添加AudioServerPlugIn_MachServices,但仍无法成功。
除了添加权限、代码签名外,是否还需要做其他事情才能使其正常工作? 我不确定MesssagePort机制是否仍可用于沙箱中。XPC服务是否可行?
非常感谢您的时间。任何帮助都将不胜感激。
更新1:
在音频插件中,我应该创建一个远程端口而不是本地端口。因此,在plist文件中使用AudioServerPlugIn_MachServices属性后,现在控制台中没有sandboxd[559]: ([552]) coreaudiod(552) deny mach-lookup / register消息。
然而,在我的音频hal插件(客户端)中,我有以下代码:
CFStringRef port_name = CFSTR("com.mycompany.audio.XPCService");
CFMessagePortRef port = CFMessagePortCreateRemote(kCFAllocatorDefault, port_name);
端口返回0。我在另一个应用程序中尝试了这个方法,并且可以正常工作。
以下是我的服务器端:
CFStringRef port_name = CFSTR("com.mycompany.audio.XPCService");
CFMessagePortRef port = CFMessagePortCreateLocal(kCFAllocatorDefault, port_name, &callback, NULL, NULL);
CFRunLoopSourceRef runLoopSource =
CFMessagePortCreateRunLoopSource(nil, port, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(),
runLoopSource,
kCFRunLoopCommonModes);
CFRunLoopRun();
我确实收到了有关此事的控制台消息。
com.apple.audio.DriverHelper[1314]: 名为SimpleAudioPlugIn.driver的插件需要扩展沙盒以使用名为com.mycompnay.audio.XPCService的mach服务
有人知道为什么吗??
更新2
我注意到当我使用coreaudiod的调试模式时,它成功获取了mach服务的对象引用。(当我尝试使用xpc_service方法时也发生了同样的事情) 项目方案设置
有人知道吗?