我正在开发一个基于developer.apple.com/library/mac/samplecode/AudioDriverExamples/Introduction/Intro.html示例的核心音频用户空间hal插件
在插件实现中,我计划从另一个进程(即CFMessagePort )获取音频数据。
但是,在试图创建端口CFMessagePortCreateLocal的控制台中出现了以下错误.
sandboxd251:(2597) coreaudiod(2597)拒绝马赫寄存器com.mycompnay.audio
我做了一些搜索,然后来到了这篇文章。
技术问答QA1811 index.html关于在plist中添加AudioServerPlugIn_MachServices,但仍然没有成功。
我还需要做些什么(比如添加权利、代码符号),或者这不是正确的方法。我不确定MesssagePort机制是否在沙箱下继续工作。XPC服务是否可行?
非常感谢你抽出时间。任何帮助都是非常感谢的。
更新1:
我应该创建一个远程端口,而不是音频插件中的本地端口。尽管如此,在plist中使用AudioServerPlugIn_MachServices属性。现在没有sandboxd559:(552) coreaudiod(552)在控制台中拒绝马赫查找/注册消息。
但是,在我的音频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.DriverHelper1314:插件名为SimpleAudioPlugIn.driver,需要扩展名为com.mycompnay.audio.XPCService的mach服务的沙箱。
有人知道为什么吗?
更新2
我注意到,当我使用带有coreaudiod的调试模式时,它确实成功地获得了mach服务的对象引用。(在我尝试xpc_service方法时也发生了同样的事情) 项目方案设置
有人吗?
发布于 2016-04-15 13:05:27
我很确定我在我的AudioServerPlugIn中遇到了同样的问题。我可以查找并使用我尝试过的每一个Mach服务,除了我创建的那些服务。而我所创造的那些都是从一个正常的过程中正常工作的。
最后,我阅读了达莫诺明,并发现coreaudiod
(它承载HAL插件)正在使用全局引导命名空间,但是我的服务被注册到每个用户的引导命名空间中。而且由于“使用全局命名空间的进程只能看到全局名称空间中的服务”,所以我的插件无法看到我的服务。
您可以使用launchctl
来测试这一点,方法是让它运行注册服务的程序,但使用与coreaudiod
相同的引导命名空间。你可能需要无根残疾。
# launchctl bsexec $(pgrep coreaudiod) your_service_executable
在运行时,再尝试从您的插件连接。
从daemons图标的表2中可以看到,只有launchd守护进程使用全局引导命名空间。这就解释了为什么coreaudiod
会使用它。我认为这意味着您的Mach服务需要由launchd守护进程创建。
要创建一个launchd.plist,请在/Library/LaunchDaemons
中为您的服务创建一个one。将其所有者设置为root:wheel
,并使其只能由所有者写。在其中,设置MachServices
键并添加服务名称:
<key>MachServices</key>
<dict>
<key>com.mycompany.audio.XPCService</key>
<true/>
</dict>
然后注册它:
# launchctl bootstrap system /Library/LaunchDaemons/com.mycompany.audio.XPCService.plist
这就是我最后得到的结果:com.bearisdriving.BGM.XPCHelper.plist.template。注意,如果没有UserName
/GroupName
键,守护进程将作为root运行。( 我的服务和插件的代码也在回购中,以防有帮助。)
不幸的是,我最终不得不使用XPC,但我首先尝试了CFMessagePort,它运行得很好。
无论插件是否签名,似乎都能很好地工作。不过,正如您所说的,您确实需要在您的AudioServerPlugIn_MachServices
中使用Info.plist密钥。
https://stackoverflow.com/questions/33138275
复制相似问题