9

我正在使用令人惊叹的NAudio框架来获取音频设备的列表。

但正如我所见,哪个音频设备是 PC 的集成音频,哪个是耳机,这是不可能的区别。我的意思是它们具有相同的名称,并且只有当我们插入耳机时它才会进入Active状态。

想象一下,如果我使用插入的耳机启动应用程序,我如何知道当前设备是耳机而不是 PC 的集成音频?

我的意思是我们可以通过 NAduio 检测到插入的音频设备是外部音频设备并且是耳机本身吗?

var enumerator = new NAudio.CoreAudioApi.MMDeviceEnumerator();

// Allows you to enumerate rendering devices in certain states
var endpoints = enumerator.EnumerateAudioEndPoints(
    DataFlow.Render,
    DeviceState.Unplugged | DeviceState.Active);
foreach (var endpoint in endpoints)
{
    Console.WriteLine("{0} - {1}", endpoint.DeviceFriendlyName, endpoint.State);
}

// Aswell as hook to the actual event
enumerator.RegisterEndpointNotificationCallback(new NotificationClient());

其中 NotificationClient 实现如下:

class NotificationClient : NAudio.CoreAudioApi.Interfaces.IMMNotificationClient
{
    void IMMNotificationClient.OnDeviceStateChanged(string deviceId, DeviceState newState)
    {
        Console.WriteLine("OnDeviceStateChanged\n Device Id -->{0} : Device State {1}", deviceId, newState);
    }

    void IMMNotificationClient.OnDeviceAdded(string pwstrDeviceId) { }
    void IMMNotificationClient.OnDeviceRemoved(string deviceId) { }
    void IMMNotificationClient.OnDefaultDeviceChanged(DataFlow flow, Role role, string defaultDeviceId) { }
    void IMMNotificationClient.OnPropertyValueChanged(string pwstrDeviceId, PropertyKey key) { }
}
4

2 回答 2

3

项目似乎可以满足您的需求。但是,根据我的研究,您尝试做的似乎是“杰克检测”,因此也许这将有助于您进一步搜索。

从链接的项目:

项目描述 这是一个简单的 iTunes 连接应用程序,用于在拔下耳机时暂停音乐。yzraeu 最后于 2011 年 4 月 2 日晚上 11:24 编辑,版本 2

它不使用 NAUDIO,但最相关的代码在这里:

const string HEAD_PHONE_GUID = "46d16a2c-5654-41c0-911e-7860d2bce7ee";
const string HEAD_PHONE_PLUGGED_VALUE = "1";

void CheckHeadphone()
        {
            var device = new MMDeviceEnumerator().GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
            if (device.Properties[new Guid(HEAD_PHONE_GUID)].Value.ToString() == HEAD_PHONE_PLUGGED_VALUE)
                IsHeadphonePlugged = true;
            else
                IsHeadphonePlugged = false;
        }

一切背后真正的“魔力”是 MMDeviceEnumerator,这里有更多关于它的信息。

于 2016-02-24T16:45:21.703 回答
3

发布的片段不完整,您需要查看(可能是新的)默认音频设备的设备属性。特别是外形尺寸,您需要检测耳机或耳机。大致是这样的:

void IMMNotificationClient.OnDeviceStateChanged(string deviceId, DeviceState newState) {
    Console.WriteLine("OnDeviceStateChanged\n Device Id -->{0} : Device State {1}", deviceId, newState);
    var endp = new NAudio.CoreAudioApi.MMDeviceEnumerator().GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
    bool isHeadPhone = false;
    PropertyKey key = PropertyKeys.PKEY_AudioEndpoint_FormFactor;
    var store = endp.Properties;
    for (var index = 0; index < store.Count; index++) {
        if (store.Get(index).Equals(key)) {
            var value = (uint)store.GetValue(index).Value;
            const uint formHeadphones = 3;
            const uint formHeadset = 5;
            if (value == formHeadphones || value == formHeadset) {
                isHeadPhone = true;
                break;
            }
        }
    }
    // Use isHeadPhone
    // etc...

}
于 2016-02-24T16:52:35.567 回答