我正在开发基于示例 developer.apple.com/library/mac/samplecode/AudioDriverExamples/Introduction/Intro.html 的 coreaudio 用户空间 hal 插件
在插件实现中,我打算从另一个进程即CFMessagePort获取音频数据
但是,我在控制台中尝试创建端口 CFMessagePortCreateLocal 时出现以下错误...
sandboxd[251]: ([2597]) coreaudiod(2597) 拒绝 mach-register com.mycompnay.audio
我做了一些谷歌搜索并来到这篇文章
技术问答 QA1811 https://developer.apple.com/library/mac/qa/qa1811/_index.html 关于在 plist 中添加 AudioServerPlugIn_MachServices 但仍然没有成功。
我还需要做些什么来完成这项工作(比如添加权利、代码签名)或者这不是正确的方法。?我不确定 MessagePort 机制在沙箱下是否可以工作。XPC 服务是否可行?
非常感谢您的宝贵时间。任何帮助是极大的赞赏
更新1:
我应该在音频插件中创建一个远程端口而不是本地端口。话虽如此,使用 plist 中的 AudioServerPlugIn_MachServices 属性。现在没有sandboxd[559]: ([552]) coreaudiod(552)在控制台中拒绝 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 方法时发生了同样的事情) 项目方案设置
任何人??