Можете ли вы запретить SndVol показывать пустой аудио сеанс - PullRequest
0 голосов
/ 04 апреля 2009

Я играл с CoreAudio в Vista, в частности с IAudionSessionEvents, с целью мониторинга аудиосеанса по умолчанию на предмет изменения громкости, вызванного загруженным кодом.

Однако, похоже, как только вы устанавливаете прослушиватель IAudioSessionEvents, SndVol перечисляет программу со всеми связанными регуляторами громкости. Большую часть времени не было загружено ни одного кода, который на самом деле будет воспроизводить что-либо, это далеко не идеально.

В принципе, есть ли способ контролировать аудио сеанс по умолчанию, не вызывая SndVol перечислять его?

Решение для Vista предпочтительнее, но что-то, зависящее от новых API-интерфейсов в Windows 7, лучше, чем ничего.


Ларри Остерман указал на интерфейсы ISessionManager2 и IAudioSessionNotification, добавленные в Windows 7. Однако я никогда не получаю уведомления о новом сеансе. Кто-нибудь знает о проблемах или проблемах с этим API в Windows 7 build 7000?

Код регистрации IAudioSessionNotifications, без большого количества кода проверки ошибок *:

BOOL success = false;
HRESULT hr;
IMMDeviceEnumerator *pEnumerator = NULL;
IMMDevice *pDevice = NULL;
IAudioSessionManager2* pManager = NULL;
IClassFactory* pFactory = NULL;

hr = CoInitialize(NULL);

hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pEnumerator);

hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice);

pDevice->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, NULL, (void**)&pManager);

listener = NULL;

hr = CoGetClassObject(CLSID_CustomFactory, CLSCTX_ALL, NULL, __uuidof(IClassFactory), (void**)&pFactory);

hr = pFactory->CreateInstance(NULL, __uuidof(IAudioSessionNotification), (void**)&listener);

hr = pManager->RegisterSessionNotification(listener);

* Хотя это и не цель этого вопроса, конструктивный критик моего COM-кода приветствуется.

1 Ответ

1 голос
/ 05 апреля 2009

Если вы хотите отслеживать аудиосессионную информацию, вы должны использовать интерфейс IAudioSessionManager для получения вашего объекта IAudioSessionControl. Сеанс отображается в SndVol только при переходе из неактивного в активное состояние - это происходит, когда кто-то вызывает IAudioClient :: Start () - если вы не вызываете IAudioClient :: Start, вы не должны получать сеанс слайдер.

В Windows 7 есть новый набор API ( IAudioSessionManager2 ), которые позволяют прослушивать создание и уничтожение сеанса.

Также для Windows 7 есть флаг AUDCLNT_SESSIONFLAGS_HIDE (документация для этого еще не обновлена, но она находится в заголовках)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...