Пиковые метры для отдельных программ в Windows 7
Можно ли получить пиковые показания счетчика для отдельных программ в Windows 7, и если да, то как?
С помощью WASAPI можно захватывать весь звук системы через устройство обратной связи, но это не делает различий между выходами из разных программ. Этот вопрос касается захвата звука для одного указанного приложения, но ответы кажутся недопустимыми, когда речь идет о захвате всех программ, которые воспроизводят звук по отдельности. Это должно быть возможно, потому что SndVol может сделать это, как показано на рисунке ниже. Вопрос в том, как это делается? Делается ли это через неэкспонированные вызовы API или же возможно достичь чего-то подобного через WASAPI?
Благодарю.
3 ответа
Вы перечисляете аудио сеансы и получаете IAudioSessionControl
интерфейсы ( фрагмент кода MSDN). Недостающим является то, что вы можете запросить IAudioMeterInformation
интерфейс от IAudioSessionControl
ты уже держишь.
Если аудиоустройство поддерживает пиковые метры, вы сможете получить этот интерфейс и использовать IMeterInformation::GetPeakValue
для индивидуальных сессий. И это то, что якобы делает SndVol.
Вот кусок кода, который делает это:
CComPtr<IAudioSessionControl> pSessionControl;
...
CComQIPtr<IAudioMeterInformation> pMeterInformation = pSessionControl;
FLOAT fPeakValue;
pMeterInformation->GetPeakValue(&fPeakValue);
_tprintf(_T("nSessionIndex %d, fPeakValue %.2f\n"), nSessionIndex, fPeakValue);
Глядя на WASAPI, есть интерфейс для захвата аудио от данного клиента, но я не вижу интерфейса более высокого уровня для определения пиковых уровней. Вам может потребоваться написать некоторый код, чтобы сделать это, если только не существует библиотеки, которую кто-то создал для выполнения аудио работы более высокого уровня с этим WASPI. CHEERS!
Вот еще один выстрел: IChannelAudioVolume:: GetChannelVolume. Я следил за веткой MSDN от SndVol, и на этом я и остановился. Цитата с веб-страницы: "Метод GetChannelVolume извлекает уровень громкости для указанного канала в аудио сеансе". Вы должны написать некоторое программное обеспечение для извлечения пикового значения из этого потока. Мое быстрое предположение будет просто сравнить, если текущее значение больше, чем последнее наибольшее значение. Если это так, то текущее значение становится максимальным.
CHEERS!