Поделиться через


Реализация настраиваемого перечислителя аудиоинтерфейса

Начиная с Windows Server 2008 R2, можно реализовать настраиваемый перечислитель удаленных звуковых конечных точек в рамках поставщика протокола удаленного рабочего стола. Поставщик протокола удаленного рабочего стола может использовать настраиваемый перечислитель конечной точки аудио для получения коллекции конечных точек звука, имеющих определенный набор возможностей.

Для реализации пользовательской службы перечисления удаленных конечных точек аудиосистемы

  1. Решение перечислителя пользовательских конечных точек должно реализовать четыре основных типа объектов: объекты перечислителя устройств, объекты коллекции устройств, объекты устройства и объекты хранилища свойств.
Тип объекта Описание
Объект перечислителя устройств
Объект перечислителя устройств предоставляет функции перечислителя конечных точек. Он предоставляет методы, возвращающие конечную точку по умолчанию и указанные коллекции конечных точек. Например, в зависимости от указанных условий перечислитель может возвращать конечные точки связи, конечные точки воспроизведения или записывать конечные точки. Объект перечислителя устройств должен реализовать интерфейс IMMDeviceEnumerator.
Объект коллекции устройств
Объект коллекции устройств представляет коллекцию звуковых устройств. Он должен реализовать интерфейс IMMDeviceCollection.
Объект устройства
Объект устройства представляет определенное звуковое устройство. Он предоставляет доступ к хранилищу свойств звукового устройства и предоставляет интерфейсы воспроизведения звука и записи, доступные на устройстве. Объект устройства должен реализовать интерфейсы IMMDevice и IMMEndpoint.
Объект хранилища свойств
Объект хранилища свойств отображает свойства, связанные с аудиоустройством. Некоторые из этих свойств используются системой, но приложения также могут хранить произвольные свойства с конечной точкой звука.
Все звуковые устройства имеют следующие три свойства:
Объект хранилища свойств должен реализовать интерфейс IPropertyStore.
  1. Перечислитель пользовательских конечных точек должен быть реализован в библиотеке DLL, которая может быть загружена в аудиосистему и другие приложения. Библиотека DLL должна быть подписана, чтобы ее могли загрузить защищенные процессы. Библиотека DLL должна реализовать и экспортировать функцию GetTSAudioEndpointEnumeratorForSession, которая выступает в качестве точки входа в настраиваемый перечислитель конечных точек.

Служба удаленных рабочих столов вызывает метод QueryProperty и устанавливает параметр QueryType в значение WTS_QUERY_AUDIOENUM_DLL для получения имени объекта перечислителя.

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

Чтобы реализовать пользовательскую конечную точку аудио

Для реализации пользовательского перечислителя аудиоустройств необходимо реализовать пользовательскую конечную точку звука. Способ связывания пользовательских звуковых устройств с помощью следующих двух операторов:

  • IMMDevice::Activate(IAudioOutputEndpointRT)
  • IMMDevice::Activate(IAudioInputEndpointRT)

Мы не ожидаем, что вы реализуете полный список интерфейсов IMMDevice::Activate в пользовательском перечислителе звуковых устройств. Вместо этого следует реализовать IAudioOutputEndpointRT и IAudioInputEndpointRT. При необходимости можно реализовать несколько других, например IAudioEndpointVolume. Для любого интерфейса, который вы не реализуете, следует вернуть E_NOINTERFACE (необходимо использовать этот конкретный код сбоя). Затем Windows вернется к стандартной реализации интерфейса (например, IAudioClient2).

Дополнительные справочные сведения о реализации и регистрации конечных точек звука см. в IAudioInputEndpointRT. См. в разделе User-Mode аудиокомпонентысхему, показывающую работу WASAPI. Обратите внимание, что все аудио в режиме пользователя является новым начиная с Windows Server 2008.

Создание Поставщика Протокола Удаленного Рабочего Стола

GetTSAudioEndpointEnumeratorForSession

IMMDevice

IMMDeviceCollection

IMMDeviceEnumerator

IMMEndpoint

IPropertyStore