Обнаружение наушников на ноутбуке в Windows

#c# #.net #windows #desktop-application #naudio

#c# #.net #Windows #desktop-приложение #naudio

Вопрос:

В настоящее время я работаю над настольным приложением Windows, которое должно получать уведомления о любых изменениях в подключенных аудиоустройствах.

В настоящее время я использую API основного аудиоинтерфейса через пакет NAudio следующим образом:

 NAudio.CoreAudioApi.MMDeviceEnumerator enumerator;   

public void PopulateAudioDevices()
{
    enumerator = new NAudio.CoreAudioApi.MMDeviceEnumerator();

    var endpoints = enumerator.EnumerateAudioEndPoints(
        DataFlow.Render,
        DeviceState.Unplugged | DeviceState.Active);
}

protected override void OnStart()
{
    PopulateAudioDevices();

    if (enumerator != null)
    {
        enumerator.RegisterEndpointNotificationCallback(this);
    }
}

public void OnDeviceStateChanged(string deviceId, DeviceState newState)
{
    Console.Writeline($"{deviceName} : Device State {newState}");
}
  

Похоже, это нормально работает для большинства USB-устройств, однако, похоже, что бывают случаи, когда подключение устройства через внешний разъем для наушников на ноутбуке не приводит к запуску обратного вызова OnDeviceStateChanged. Одним из отличительных факторов, который я заметил, является то, что в этих случаях не было никаких видимых изменений на экране диспетчера устройств Windows при подключении внешнего аудиоустройства. Однако я заметил, что настройка громкости Windows меняется при каждом подключении аудиоустройства. Это заставило меня поверить, что ОС каким-то образом регистрирует разницу в подключенных устройствах.

Есть ли какой-либо способ обнаружить такие случаи?

Комментарии:

1. Если вы не получаете никаких событий, вы можете попытаться вызвать PopulateAudioDevices по таймеру, чтобы обнаружить наушники.

2. нет никакой гарантии, что Windows вообще сообщит, когда наушники подключены к звуковой карте (особенно, если это внешняя звуковая карта). Вы полагаетесь на драйвер звуковой карты, предоставляющий эту информацию, который решит, представлять ли это ОС как отдельное «устройство» или нет.