Средство отрисовки потокового звука
Средство отрисовки потокового звука (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 или вызвать его в сеансе мультимедиа. Уровни тома выражаются как значения аттенуации. Для каждого канала уровень аттенуации является продуктом главного тома и тома канала.