私は、ロードされたコードによって引き起こされるボリュームの変更のためにデフォルトのオーディオセッションを監視するという目的で、VistaのCoreAudio、特にIAudionSessionEventsを使って遊んできました。SndVolが空のオーディオセッションを表示しないようにすることはできますか?
ただし、IAudioSessionEventsリスナーをインストールするとすぐに表示されます。SndVolは、関連するすべての音量コントロールでプログラムを一覧表示します。実際に何かを演奏するコードはロードされていないので、理想的ではありません。
基本的に、SndVolにそれをリストさせずにデフォルトのオーディオセッションを監視する方法はありますか?
Vista用のソリューションが推奨されますが、Windows 7で提供される新しいAPIに依存するものは何もありません。
ラリー・オスターマンしかし、私は新しいセッションの通知を受けたことがないの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コードの建設的な批評は歓迎です。
私は最も確かにIAudioClientを呼び出していないよありSndVolに現れます。 IAudioSessionControl :: RegisterAudioSessionNotification(...)を介してイベントハンドラをインストールすると、セッションがアクティブになります。少なくともWindows 7では7000をビルドします。 –
IAudioSessionManager2 :: RegisterSessionNotification()は機能していないようです。私はインストールプロセスを含め、どのプロセスからでも新しいセッションの通知を受けません。あなたはこれについて何か知っていますか? Windows 7ビルド7000で動作します。 –
なぜ動作しないのか分かりません。これはsndvolが内部で使用するのと同じメカニズムです。私たちはAPIを公開しました。 –