Я играл с 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-кода приветствуется.