В 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;
}