【发布时间】:2016-01-13 07:20:10
【问题描述】:
我正在基于示例开发一个 coreaudio 用户空间 hal 插件 developer.apple.com/library/mac/samplecode/AudioDriverExamples/Introduction/Intro.html
在插件实现中,我打算从另一个进程即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) 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 方法时发生了同样的事情) project scheme setting
有人吗??
【问题讨论】:
-
嗨艾伦,只是想设置调试这个。首先,您是如何设法使用 coreaudiod 进行调试的?我一直收到“错误:附加失败:失去连接”...
-
@Robert 我的信息在这里:Debugging a user-space HAL plugin? 和 Debugging an AudioServer plugin
-
感谢@Allen,我终于通过在恢复操作系统模式下设置“csrutil disable”让它工作了,这样调试 coreaudiod 成为可能! :)
标签: plugins core-audio appstore-sandbox xpc mach