Обработка измененного события аудиоустройства в c # - PullRequest
5 голосов
/ 28 мая 2011

Мне интересно, как обрабатывать событие, когда я вставляю (или извлекаю) свои наушники или другое устройство вывода в гнездо звуковой карты.

Поиск здесь и в Google дает мне информацию о библиотеке "naudio", но у нее очень скудная документация, и один из координаторов этого проекта сказал мне, что он не уверен, чем это вообще возможно в их библиотеке.

Моей конечной целью является автоматическое управление громкостью для разных устройств, например, когда наушники активны - установите 10% громкость, а когда динамики активны - установите 100%.

Ответы [ 3 ]

8 голосов
/ 12 февраля 2014

Вы можете сделать это с помощью MMDeviceEnumerator от NAudio и IMMNotificationClient.Однако вы добавляете реализации для RegisterEndpointNotificationCallback & UnRegisterEndpointNotificationCallback в класс MMDeviceEnumerator

Это реализации

 /// <summary>
       /// Registers a call back for Device Events
       /// </summary>
        /// <param name="client">Object implementing IMMNotificationClient type casted as IMMNotificationClient interface</param>
       /// <returns></returns>
        public int RegisterEndpointNotificationCallback([In] [MarshalAs(UnmanagedType.Interface)] IMMNotificationClient client)
        {
            //DeviceEnum declared below
            return deviceEnum.RegisterEndpointNotificationCallback(client);
        }

        /// <summary>
        /// UnRegisters a call back for Device Events
        /// </summary>
        /// <param name="client">Object implementing IMMNotificationClient type casted as IMMNotificationClient interface </param>
        /// <returns></returns>
        public int UnRegisterEndpointNotificationCallback([In] [MarshalAs(UnmanagedType.Interface)] IMMNotificationClient client)
        {
            //DeviceEnum declared below
            return deviceEnum.UnregisterEndpointNotificationCallback(client);
        } 

Затем создайте класс, который реализует IMMNotificationClient

sample:

class NotificationClientImplementation : NAudio.CoreAudioApi.Interfaces.IMMNotificationClient
    {

        public void OnDefaultDeviceChanged(DataFlow dataFlow, Role deviceRole, string defaultDeviceId)
        {
            //Do some Work
            Console.WriteLine("OnDefaultDeviceChanged --> {0}", dataFlow.ToString());
        }

        public void OnDeviceAdded(string deviceId)
        {
             //Do some Work
            Console.WriteLine("OnDeviceAdded -->");
        }

        public void OnDeviceRemoved(string deviceId)
        {

            Console.WriteLine("OnDeviceRemoved -->");
             //Do some Work
        }

        public void OnDeviceStateChanged(string deviceId, DeviceState newState)
        {
            Console.WriteLine("OnDeviceStateChanged\n Device Id -->{0} : Device State {1}", deviceId, newState);
             //Do some Work
        }

        public NotificationClientImplementation()
        {
            //_realEnumerator.RegisterEndpointNotificationCallback();
            if (System.Environment.OSVersion.Version.Major < 6)
            {
                throw new NotSupportedException("This functionality is only supported on Windows Vista or newer.");
            }
        }

        public void OnPropertyValueChanged(string deviceId, PropertyKey propertyKey)
        {
             //Do some Work
             //fmtid & pid are changed to formatId and propertyId in the latest version NAudio
            Console.WriteLine("OnPropertyValueChanged: formatId --> {0}  propertyId --> {1}", propertyKey.formatId.ToString(), propertyKey.propertyId.ToString());
        }

    }

Тогда все, что вам нужно сделать, это

  1. Объявить следующие объекты NAudio и вашу реализацию IMMNotificationClient

Образец:

private NAudio.CoreAudioApi.MMDeviceEnumerator deviceEnum = new NAudio.CoreAudioApi.MMDeviceEnumerator();
private NotificationClientImplementation notificationClient;
private NAudio.CoreAudioApi.Interfaces.IMMNotificationClient notifyClient;
Затем введите приведение уведомленийКлиента как IMMNotificationClient и передайте его в качестве параметра в MMDeviceEnumerator

Пример:

notificationClient = new NotificationClientImplementation();
notifyClient = (NAudio.CoreAudioApi.Interfaces.IMMNotificationClient)notificationClient;
deviceEnum.RegisterEndpointNotificationCallback(notifyClient);

Надеюсь, это поможет некоторым телам.Спасибо форумам MSDN и, в частности, Майклу Тейлору http://msmvps.com/blogs/p3net за помощь в этом.

Спасибо и ура.

4 голосов
/ 28 мая 2011

Вы сможете определить, когда устройство подключено к системе, вам придется реализовать IMMNotificationClient через COM-взаимодействие.По сути, вам придется определить реализации следующих методов:

Обратите внимание, что из вышеперечисленного наиболее интересны следующие:

  • OnDefaultDeviceChanged
  • OnDeviceAdded
  • OnDeviceStateChanged

Однако вы должны знать, что базовое оборудование должно поддерживать эту функцию, и что она доступна только в Windows Vista и Windows Server 2008 на.

0 голосов
/ 28 мая 2011

Я был почти уверен, что подключение / отключение наушников или чего-либо еще в аудиокарте не вызывает никаких системных событий

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...