@lxtral

UPDATE! Выравнивание громкости (WinAPI, ICodecAPI, DirectShow, Core Audio Interface, MMDevice API, DeviceTopology API)

В Windows есть "Выравнивание громкости" (Звук - Воспроизведение - Выбираем устройство - Дополнительные возможности).
При просмотре видео громкость находится на одном уровне (голос и эффекты звучат одинаково громко), но слушать музыку невозможно – убивается вся динамика.
Надоело по 50 раз в день открывать настройки, чтобы включить/выключить галочку. Решил написать утилиту, которая висит в трее и в один клик это делает. Но столкнулся с проблемой :) Все примеры на C++, с которым я не знаком.

Что имеем:
1. Есть интерфейс ICodecAPI (goo.gl/4Fb0WR)
2. С помощью метода SetValue можно устанавливать значение для свойства CODECAPI_AVDSPLoudnessEqualization (goo.gl/eqzKfv), которое и включает/выключает выравнивание.

Что написал:
#include "stdafx.h"
#include <Dshow.h>
#pragma comment(lib, "strmiids")

int _tmain(int argc, _TCHAR* argv[])
{
	HRESULT hr = CoInitialize(NULL);
	ICodecAPI *myCodecAPI = NULL;
	VARIANT VResult;

	hr = CoCreateInstance(
		CLSID_FilterGraph,
		NULL,
		CLSCTX_INPROC_SERVER,
		IID_IGraphBuilder,
		(void**)&myGraphBuilder
		);

	hr = myGraphBuilder->QueryInterface(IID_ICodecAPI, (void**)&myCodecAPI);

Но в myCodecAPI->GetValue нет свойства CODECAPI_AVDSPLoudnessEqualization.

В правильном ли направлении я двигаюсь?
Ещё такой момент – выравнивание громкости мы устанавливаем для конкретного устройства вывода, значит нужно программно получить это устройство и обращаться к его настройкам. Как это сделать?
Очень надеюсь на помощь. Может кто с таким сталкивался. Подскажите, что почитать в этом направлении?

UPDATE
Подсказали, что копать нужно в направлении MMDevice API.
Получил устройство воспроизведения по-умолчанию. Теперь нужно как-то добраться до его настроек. Нашел интерфейс IAudioLoudness (goo.gl/i1UEIC), но как его использовать?
Вот листинг того, что получилось:
#include "stdafx.h"
#include "Mmdeviceapi.h"
#include "Functiondiscoverykeys_devpkey.h"

int _tmain(int argc, _TCHAR* argv[])
{
        HRESULT hr = CoInitialize(NULL);
        if (SUCCEEDED(hr))
        {
                IMMDeviceEnumerator *pEnum = NULL;
                hr = CoCreateInstance(
                        __uuidof(MMDeviceEnumerator),
                        NULL,
                        CLSCTX_ALL,
                        __uuidof(IMMDeviceEnumerator),
                        (void**)&pEnum);
                if (SUCCEEDED(hr))
                {
                        IMMDevice *pDevice;
                        hr = pEnum->GetDefaultAudioEndpoint(
                                eRender,
                                eMultimedia,
                                &pDevice);
                        if (SUCCEEDED(hr))
                        {
                                IPropertyStore *pStore;
                                hr = pDevice->OpenPropertyStore(STGM_READ, &pStore);
                                if (SUCCEEDED(hr))
                                {
                                        PROPVARIANT friendlyName;
                                        PropVariantInit(&friendlyName);
                                        hr = pStore->GetValue(
                                                PKEY_Device_DeviceDesc,
                                                &friendlyName);
                                        if (SUCCEEDED(hr))
                                        {
                                                printf("Audio Device: %i\n", friendlyName.pwszVal);
                                                PropVariantClear(&friendlyName);
                                        }
                                        pStore->Release();
                                }
                                pDevice->Release();
                        }
                        pEnum->Release();
                }
        }
        return hr;
}
  • Вопрос задан
  • 3082 просмотра
Пригласить эксперта
Ответы на вопрос 1
AxisPod
@AxisPod
Ну ваше требование говорит о одном, что отстойная звукаха или акустика, либо всё вместе сразу. Обачно проблема в другом, тяжело слушать русский дубляж, потому что наши почему-то имеют манию занижать громкость голоса в сравнении с оригиналом.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы