Средство отрисовки потокового звука
Средство отрисовки потокового звука (SAR) — это приемник мультимедиа, который отрисовывает звук. Каждый экземпляр SAR отрисовывает один звуковой поток. Чтобы отобразить несколько потоков, используйте несколько экземпляров SAR.
Чтобы создать SAR, вызовите любую из следующих функций:
- MFCreateAudioRenderer. Возвращает указатель на SAR.
- MFCreateAudioRendererActivate. Возвращает указатель на объект активации, который можно использовать для создания SAR.
Вторая функция, которая возвращает объект активации, требуется, если вы играете защищенное содержимое, так как объект активации должен быть сериализован в защищенный процесс. Для очистки содержимого можно использовать любую функцию.
SAR может получать несжатый звук в формате PCM или IEEE с плавающей запятой. Если скорость воспроизведения быстрее или медленнее 1×, SAR автоматически настраивает шаг.
Настройка средства отрисовки звука
SAR поддерживает несколько атрибутов конфигурации. Механизм настройки этих атрибутов зависит от того, какая функция вызывается для создания SAR. Если вы используете функцию MFCreateAudioRenderer, сделайте следующее:
- Создайте новое хранилище атрибутов, вызвав MFCreateAttributes.
- Добавьте атрибуты в хранилище атрибутов.
- Передайте хранилище атрибутов функцию MFCreateAudioRenderer в параметре pAudioAttributes.
Если вы используете функцию MFCreateAudioRendererActivate, функция возвращает указатель на интерфейс IMFAttributes в параметре ppActivate. Используйте этот указатель для добавления атрибутов.
Список атрибутов конфигурации см. в разделе Атрибуты отрисовщика звука.
Выбор устройства конечной точки аудио
Устройство звуковой конечной точки — это аппаратное устройство, которое отрисовывает или записывает звук. Примерами являются динамики, наушники, микрофоны и cd-проигрыватели. SAR всегда использует устройство отрисовки звука. Выбрать устройство можно двумя способами.
Первым подходом является перечисление устройств отрисовки звука в системе с помощью интерфейса IMMDeviceEnumerator. Этот интерфейс описан в основной документации по API аудио.
- Создайте объект перечислителя устройств.
- Перечислитель устройств используется для перечисления устройств отрисовки звука. Каждое устройство представлено указателем на интерфейс IMMDevice.
- Выберите устройство на основе свойств устройства или выбора пользователя.
- Вызовите IMMDevice::GetId, чтобы получить идентификатор устройства.
- Задайте идентификатор устройства в качестве значения атрибута MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID.
Вместо перечисления устройств можно указать звуковое устройство с помощью роли. Звуковая роль определяет общую категорию использования. Например, роль консоли определена для игр и системных уведомлений, а роль мультимедиа определена для музыки и фильмов. Каждая роль имеет одно устройство отрисовки звука, назначенное ему, и пользователь может изменить эти назначения. Если указать роль устройства, SAR использует любое звуковое устройство, назначаемое для этой роли. Чтобы указать роль устройства, задайте атрибут MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE.
Два атрибута, перечисленные в этом разделе, являются взаимоисключающими. Если ни один из них не задан, SAR использует звуковое устройство, назначенное роли eConsole.
Следующий код перечисляет устройства отрисовки звука и назначает первое устройство в списке SAR. В этом примере используется функция MFCreateAudioRenderer для создания SAR.
#include <mmdeviceapi.h>
HRESULT hr = S_OK;
IMMDeviceEnumerator *pEnum = NULL; // Audio device enumerator.
IMMDeviceCollection *pDevices = NULL; // Audio device collection.
IMMDevice *pDevice = NULL; // An audio device.
IMFAttributes *pAttributes = NULL; // Attribute store.
IMFMediaSink *pSink = NULL; // Streaming audio renderer (SAR)
LPWSTR wstrID = NULL; // Device ID.
// Create the device enumerator.
hr = CoCreateInstance(
__uuidof(MMDeviceEnumerator),
NULL,
CLSCTX_ALL,
__uuidof(IMMDeviceEnumerator),
(void**)&pEnum
);
// Enumerate the rendering devices.
if (SUCCEEDED(hr))
{
hr = pEnum->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &pDevices);
}
// Get ID of the first device in the list.
if (SUCCEEDED(hr))
{
hr = pDevices->Item(0, &pDevice);
}
if (SUCCEEDED(hr))
{
hr = pDevice->GetId(&wstrID);
}
// Create an attribute store and set the device ID attribute.
if (SUCCEEDED(hr))
{
hr = MFCreateAttributes(&pAttributes, 2);
}
if (SUCCEEDED(hr))
{
hr = pAttributes->SetString(
MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID,
wstrID
);
}
// Create the audio renderer.
if (SUCCEEDED(hr))
{
hr = MFCreateAudioRenderer(pAttributes, &pSink);
}
SAFE_RELEASE(pEnum);
SAFE_RELEASE(pDevices);
SAFE_RELEASE(pDevice);
SAFE_RELEASE(pAttributes);
CoTaskMemFree(wstrID);
Чтобы создать объект активации для SAR, измените код, отображаемый после вызова IMMDevice::GetId следующим образом:
IMFActivate *pActivate = NULL; // Activation object.
if (SUCCEEDED(hr))
{
hr = MFCreateAudioRendererActivate(&pActivate);
}
if (SUCCEEDED(hr))
{
hr = pActivate->SetString(
MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID,
wstrID
);
}
SAFE_RELEASE(pActivate);
Выбор сеанса аудио
Звуковой сеанс — это группа связанных аудиопотоков, которые приложение может совместно управлять. Приложение может управлять уровнем тома и отключить состояние каждого сеанса. Сеансы определяются GUID. Чтобы указать звуковой сеанс для SAR, используйте атрибут MF_AUDIO_RENDERER_ATTRIBUTE_SESSION_ID. Если этот атрибут не задан, SAR присоединяется к сеансу по умолчанию для этого процесса, определяемого GUID_NULL.
По умолчанию звуковой сеанс зависит от процесса, то есть он содержит только потоки из вызывающего процесса. Чтобы присоединиться к сеансу между процессами, задайте атрибут MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS со значением MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS_CROSSPROCESS.
После создания SAR вы используете интерфейс МВФAudioPolicy для присоединения сеанса к группе сеансов, все из которых контролируются одинаковым контролем тома на панели управления. Этот интерфейс также можно использовать для задания отображаемого имени и значка, отображаемого в элементе управления томом.
Управление уровнями томов
Чтобы контролировать уровень основного громкости всех потоков в звуковом сеансе SAR, используйте интерфейс МВФSimpleAudioVolume. Чтобы управлять объемом отдельного потока или управлять объемом отдельных каналов в потоке, используйте интерфейс IMFAudioStreamVolume. Оба интерфейса получаются путем вызова IMFGetService::GetService. Вы можете вызвать GetService непосредственно в SAR или вызвать его в сеансе мультимедиа. Уровни тома выражаются как значения аттенуации. Для каждого канала уровень аттенуации является продуктом главного тома и тома канала.
Связанные разделы