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


Реализация перечислителя пользовательской конечной точки аудио

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

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

  1. Пользовательское решение перечислителя конечных точек должно реализовывать четыре main типа объектов: объекты перечислителя устройств, объекты коллекции устройств, объекты устройств и объекты хранилища свойств.
Тип объекта Описание:
Объект перечислителя устройств
Объект перечислителя устройств предоставляет функции перечислителя конечной точки. Он предоставляет методы, возвращающие конечную точку по умолчанию и указанные коллекции конечных точек. Например, в зависимости от указанных критериев перечислитель может возвращать конечные точки связи, конечные точки воспроизведения или конечные точки записи. Объект перечислителя устройств должен реализовывать интерфейс 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. Схему, на которую показано, как работает WASAPI, см. в разделе Компоненты аудио пользовательского режима. Обратите внимание, что все аудио в пользовательском режиме являются новыми, начиная с Windows Server 2008.

Создание поставщика протокола удаленного рабочего стола

GetTSAudioEndpointEnumeratorForSession

IMMDevice

IMMDeviceCollection

IMMDeviceEnumerator

IMMEndpoint

IPropertyStore