ロードされたコードによって引き起こされる音量の変化について、デフォルトのオーディオセッションを監視することを目的として、Vista の CoreAudio のもの、特に IAudionSessionEvents をいじっています。
ただし、IAudioSessionEvents リスナーをインストールするとすぐに、SndVol は関連するすべてのボリューム コントロールを含むプログラムを一覧表示するように見えます。かなりの時間、実際に何かを再生するコードがロードされていないため、これは理想的とは言えません。
基本的に、SndVol にリストさせずにデフォルトのオーディオ セッションを監視する方法はありますか?
Vista 向けのソリューションが望ましいですが、Windows 7 で提供される新しい API に依存するものは、何もないよりはましです。
Larry Osterman は、Windows 7 で追加された ISessionManager2 および IAudioSessionNotification インターフェイスを指摘しました。しかし、新しいセッションの通知を受け取りません。Windows 7 ビルド 7000 でのこの API の落とし穴や問題を知っている人はいますか?
多くのエラー チェック コードを省略した 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 コードに対する建設的な批評家は大歓迎です。