43066


作成したアプリケーションだけをミュート、アンミュートしたいのですが、良い方法はないでしょうか。  
アプリケーションにはブラウザが含まれており、ブラウザ内のFlashなどもまとめてミュートしたいです。  
音声ミキサーのアプリケーション単位のミュート動作が合致します。  
一応、Vannatec.CoreAudio.dllを使う方法はありましたが、できれば外部dll無しの方法が今後を考えるとありがたいです。


CC BY-SA 3.0
2018-04-08T08:19:41.307
43058
2018-04-08T20:25:26.690
26989
question
c# wpf
wpfでの動作アプリケーションのミュート


具体的に同等の実装を行ったことがないので、基本的にポインター提供のみとなります。

要は Windows の Core Audio API を叩ければいいので、Vannatec.CoreAudio.dll
がどういう挙動を取っているかは分かりませんが、おそらくほぼ同等の事を行えば良いかと思います。名前的にも Windows Core Audio API
を叩いてるのでしょうし。

という点で言うと、<https://blog.sverrirs.com/2016/02/windows-coreaudio-api-in-c.html>
……にある <https://gist.github.com/sverrirs/d099b34b7f72bb4fb386> が参考になるように思えます。  
GetVolumeObject() 内でプロセス列挙して実際の API コールは SetApplicationMute() 辺りで行っている形ですね。

ここで取得している IAudioSessionControl2::GetProcessId() から得られるプロセス ID が (Win32 API 的な)
CreateProcess() 的なプロセス ID であれば、単に自身のプロセス ID を指定して mute
操作を行えば大丈夫かと思います。そうでなかったとしても、GetVolumeObject()
内で列挙して取得しているので、その辺りが十分に参考になるかと思います。

ただ、Core Audio になってから「音を鳴らしていないアプリは音量ミキサーの一覧に出てくるのを見たことがない」ので、もしかしたら
GetVolumeObject() で行っている ISimpleAudioVolume オブジェクトを直接プロセス ID
を指定しても取得できないかもしれないので、もしかしたらその辺りにちょっと工夫がいるかもしれません。  
単にシステム音を鳴らす (例えば System.Media.SystemSounds.Asterisk.Play(); で鳴らす)
だけのアプリなどは出てきませんので、別途前準備が必要になるかもしれません。


CC BY-SA 3.0
2018-04-08T20:25:26.690
43066
2018-04-08T20:25:26.690
13613
43058
answer