マイクのON/OFF状態が一目瞭然なツールを作った[C#]

# MuteGate について
リモート会議やライブ配信の時にマイクオフ（ミュート）状態であることに気づかず，ひたすら力説していたことはありませんか？これは，そういう事故をできるだけ防ぐために作ったもの，要はマイクのオン／オフ状態を目立たせるツールです。下記ツールバーのマイク形状のアイコンをクリックすると，マイクオン・オフ状態が切り替わり，表示されるメッセージも色も背景色も切り替わります。

```plantuml
@startuml
<style>
root {
  padding: 0;
  margin: 0;
}
footer {
  fontColor: black;
  fontSize: 16;
}
</style>
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490655/0c91cca7-dd66-1e65-3ae1-7e3cfac28f86.png>
footer 図１　マイクオン時の様子
@enduml
```

マイクのアイコンをクリックすると状態が変わります。

```plantuml
@startuml
<style>
root {
  padding: 0;
  margin: 0;
}
footer {
  fontColor: black;
  fontSize: 16;
}
</style>
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490655/652bd837-1d14-0655-b0b0-acdede4346b4.png>
footer 図２　マイクオフ時の様子
@enduml
```

表示されるメッセージの内容，フォント，色，背景色は自由にカスタマイズすることができます。

```plantuml
@startuml
<style>
root {
  padding: 0;
  margin: 0;
}
footer {
  fontColor: black;
  fontSize: 16;
}
</style>
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490655/0c92796b-4121-1070-0f0d-5aa277e03fad.png> 
footer 図３　メッセージ変更時の様子
@enduml
```

# MuteGate のビルド
MuteGate はソースコードで配布しています。下記サイトからダウンロードして下さい。
[MuteGate.zip（google drive）](https://drive.google.com/file/d/1VXHAv0uB1rpZkzoZjrdxtCLg0-Ec0CYY/view?usp=share_link)

ビルドにはマイクロソフト社製の DOTNET 6.0 SDK（以上）が必要です。下記アドレスを参照して下さい。
[Download .NET 6.0（microsoft.com）](https://dotnet.microsoft.com/en-us/download/dotnet/6.0)

ダウンロードした MuteGate.zip を展開します。コマンドプロンプトを起動し，展開したフォルダに移動して次のコマンドを入力します。
```
dotnet build -c Release
```

ビルドの様子を示します。必要に応じてライブラリ（NAudioなど）をダウンロードするので，ビルドの際にはインターネットに接続している必要があります。

```plantuml
@startuml
<style>
root {
  padding: 0;
  margin: 0;
}
footer {
  fontColor: black;
  fontSize: 20;
}
</style>
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490655/0bb16cb4-67d0-acf4-d797-04d27f92ced7.png>
footer 図４　ビルドの様子
@enduml
```

ビルドに成功すると bin\Release\net6.0-windows 以下のフォルダに MuteGate.exe が作られます。この MuteGate.exe をクリックするとプログラムが起動します。

# 注意事項
## 1.アプリケーションのミュート機能との混用を避ける 
MuteGate は，マイクを使うアプリケーションと音声入力デバイス（マイク等）の間に介在する音声ドライバを操作し，強制的にマイクのミュートを制御します。マイクを使うアプリケーション（Zoom, Skype, Webex, Teamsなど）にもマイクのミュート機能があるので混用を避けた方がよいでしょう。

```plantuml
@startuml
<style>
root {
  margin: 0;
  padding: 0;
  fontSize: 16;
  horizontalalignment: center;
}
footer {
  fontColor: black
}
element {
  LineThickness 0.5
  composite {
    title {
      FontStyle normal
    }  
  }
}
</style>
skinparam componentStyle rectangle

[音声入力デバイス\n（マイク等）] as A
[音声ドライバ\n（WASAPI等）] as B
[マイクを使うアプリケーション\n（Teams, Zoom等）] as C
component "MuteGate"{
  [Naudio]
}
[A] --> [B]
[B] --> [C]
[Naudio] -right-> [B]

footer 図５　MuteGate の仕組み
@enduml
```

## 2. マイクが複数あるとき
音声入力デバイス（マイク）を選択することができますが，選択したデバイスのミュートオン／オフの設定が他のデバイスにも反映されます。つまり，事実上，全デバイスの一斉ミュートオン／オフになっており，デバイスの選択はあまり意味が無さそうです。ちなみに音声入力デバイス（マイク）が複数あるとき，デフォルトデバイスにするか，それとも前回選択したデバイス（を記憶しておいて，次回起動時に選択）とするか悩んだのですが，現在はシンプルにリストの先頭のデバイスを選択するようにしています。

## 3. 設定ファイル
設定を変更すると設定値が bin\Release\net6.0-windows 以下（つまり MuteGate.exe と同じフォルダ）の MuteGate.dll.config に書き込まれます。テキストファイル（UTF-8形式）ですので，テキストエディタを用いて直接カスタマイズすることもできます。

## 4. 表示がボヤける場合がある
ディスプレイ設定において，表示スケールが100%以外の時に表示がボヤけてしまうという課題があります。可変解像度対応のプログラムは難しいな・・・

Windows10 Version 22H2 の場合の暫定対策を以下示します。エクスプローラ上で MuteGate.exe を右クリック，［互換性］タブの［高DPI設定の変更］ボタンをクリック，［高いDPIスケールの動作を上書きします。］にチェック，［アプリケーション］を選択します。

```plantuml
@startuml
<style>
root {
  padding: 0;
  margin: 0;
}
footer {
  fontColor: black;
  fontSize: 16;
}
</style>
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490655/72f36031-983c-fad4-2c60-4b1ec2c5a441.png>
footer 図６　プロパティ画面（１／２）
@enduml
```


```plantuml
@startuml
<style>
root {
  padding: 0;
  margin: 0;
}
footer {
  fontColor: black;
  fontSize: 18;
}
</style>
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490655/228b72be-02d0-7b1a-7063-808370a2fdb3.png>
footer 図７　プロパティ画面（２／２）
```

## 5. 二重起動防止
MuteGate は二重起動できないようにするためオペレーティングシステムの mutex という仕組みを利用しています。しかし，何らかの事情で MuteGate が異常終了して mutex の解放に失敗してしまうと再度 MuteGate を起動できなくなります。この場合，オペレーティングシステムを再起動して下さい。

# 謝辞
技術的には下記サイトの情報が大変参考になりました。
[C#でマイク入力の ON / OFF をホットキーで切り替えるツールを作る（オノフブログ）](https://onofuu.com/post-181/)