MacOS 自定义音频驱动程序不会覆盖默认驱动程序

kin*_*aar 3 audio macos iokit core-audio driverkit

我们正在为 USB 麦克风开发自定义音频驱动程序,以便对输入音频流进行简单处理 (EQ)(与 Windows 的 APO 相当)。经过一些帮助,我们设法将我们的驱动程序(基于 SimpleAudioDriver 分配给正确的音频设备。但现在我们显示了两个设备:一个分配给我们的驱动程序,另一个分配给默认驱动程序。我们如何用我们的设备覆盖原来的设备,只显示一台设备?

我们已经尝试添加更多 IOKitPersonalities 以获得更好的探测分数,但结果是一样的。我们还读取了日志,原始驱动程序和我们的探测分数均处于最大值(100000)。

这是 info.plist 文件的当前状态:

<plist version="1.0">
<dict>
    <key>IOKitPersonalities</key>
    <dict>
        <key>SimpleAudioDriver</key>
        <dict>
            <key>idProduct</key>
            <integer>49456</integer>
            <key>idVendor</key>
            <integer>1130</integer>
            <key>CFBundleIdentifier</key>
            <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
            <key>IOClass</key>
            <string>IOUserService</string>
            <key>IOMatchCategory</key>
            <string>SimpleAudioDriver</string>
            <key>IOProviderClass</key>
            <string>IOUSBDevice</string>
            <key>IOResourceMatch</key>
            <string>IOKit</string>
            <key>IOUserAudioDriverUserClientProperties</key>
            <dict>
                <key>IOClass</key>
                <string>IOUserUserClient</string>
                <key>IOUserClass</key>
                <string>IOUserAudioDriverUserClient</string>
            </dict>
            <key>IOUserClass</key>
            <string>SimpleAudioDriver</string>
            <key>IOUserServerName</key>
            <string>com.example.apple-samplecode.SimpleAudio.Driver</string>
            <key>SimpleAudioDriverUserClientProperties</key>
            <dict>
                <key>IOClass</key>
                <string>IOUserUserClient</string>
                <key>IOUserClass</key>
                <string>SimpleAudioDriverUserClient</string>
            </dict>
        </dict>
    </dict>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

如果您有任何提示,请回复我们。

谢谢。

pmd*_*mdj 5

示例驱动程序与任何真实硬件都不匹配,而是将自身附加到虚拟“资源”小块:

            <key>IOProviderClass</key>
            <string>IOUserResources</string>
Run Code Online (Sandbox Code Playgroud)

这是一个通用对象,除了存在之外什么也不做,以便虚拟驱动程序可以附加。默认情况下,对象只能被一个客户端(即驱动程序)成功匹配,因此虚拟驱动程序将争夺对该虚拟对象的访问权限。所以当只匹配这个对象时,需要使用匹配类别:

            <key>IOMatchCategory</key>
            <string>SimpleAudioDriver</string>
Run Code Online (Sandbox Code Playgroud)

但是,在匹配真实硬件时绝对不要使用此键,除非有充分的理由。如果你保留这个,你的驱动程序的匹配类别将与Apple的默认驱动程序不同,因此两者都会匹配设备,从而导致混乱。

为了避免多个驱动程序尝试声明同一设备,只需删除整个IOMatchCategory键/值对以使用默认类别,这也是标准 macOS USB 音频驱动程序使用的类别,因此只有一个驱动程序能够成功匹配。可以通过不同 USB 匹配模式的不同探测分数级别来控制哪一个获胜,或者在不寻常的情况下,使用显式探测分数来控制。