0

ロードされたコードによって引き起こされる音量の変化について、デフォルトのオーディオセッションを監視することを目的として、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 コードに対する建設的な批評家は大歓迎です。

4

1 に答える 1

1

オーディオ セッションを監視する場合は、IAudioSessionManager インターフェイスを使用して IAudioSessionControl オブジェクトを取得する必要があります。セッションは、非アクティブ状態からアクティブ状態に移行するときにのみ SndVol に表示されます。これは、誰かが IAudioClient::Start() を呼び出したときに発生します。IAudioClient::Start を呼び出さない限り、セッションを取得するべきではありません。スライダー。

Windows 7 には、セッションの作成と破棄をリッスンできる新しい API セット ( IAudioSessionManager2 ) があります。

また、Windows 7 には、AUDCLNT_SESSIONFLAGS_HIDE フラグがあります (このドキュメントはまだ更新されていませんが、ヘッダーにあります)。

于 2009-04-04T20:24:44.290 に答える