Windowsでバッチファイルを使用してワンクリックでオーディオデバイスを切り替える

## 背景

個人的な趣味として音楽活動（mixing）とPCゲームをしています。
音楽をするときはオーディオインターフェースを経由したちゃんとした音を聞きたいし、
ゲームをするときは友人とVC（ボイスチャット）をするのでヘッドセットを使いたい。
いちいち既定のオーディオデバイスをポチポチ変えるのは面倒くさい。
ワンクリックで切り替えたい！

## 結論
- コマンドプロンプトではできないっぽいのでPowerShellを使用する
- PowerShellからオーディオデバイスをごにょごにょするために[AudioDeviceCmdletsコマンドレット](https://github.com/frgnca/AudioDeviceCmdlets)を使用する  
（素晴らしいコマンドレットに感謝）

## How to

- PowerShellを管理者権限で起動する
- 以下コマンドを実行してコマンドレットをインストールする  

```shell:PowerShell
Install-Module -Name AudioDeviceCmdlets
```

- 以下コマンドを実行して切り替えたいオーディオデバイスの名前をそれぞれ調べる（ここではAとBとします）
  - このとき、`Type:Playback`となっているものは再生デバイス、`Type:Recording`となっているものは録音デバイスです

```powershell:PowerShell
Get-AudioDevice -List
```

```powershell:出力例
Index   : 1
Default : True
Type    : Playback
Name    : ライン (Steinberg UR24C) # ← ★★(A:再生)★★
ID      : {0.0.0.00000000}.{e629262c-ac93-401b-9f8f-20db5a2cdcf8}
Device  : CoreAudioApi.MMDevice

Index   : 2
Default : False
Type    : Playback
Name    : ヘッドホン (Arctis 5 Game) # ← ★★(B:再生)★★
ID      : {0.0.0.00000000}.{fcb48e51-eb73-4cb8-9563-6d3d59dda8d4}
Device  : CoreAudioApi.MMDevice

Index   : 3
Default : True
Type    : Recording
Name    : ライン (Steinberg UR24C) # ← ★★(A:録音)★★
ID      : {0.0.1.00000000}.{126b19fd-18cc-4fe2-9eea-4c85ee7f82a8}
Device  : CoreAudioApi.MMDevice

Index   : 4
Default : False
Type    : Recording
Name    : マイク (Arctis 5 Chat) # ← ★★(B:録音)★★
ID      : {0.0.1.00000000}.{26d2d285-8b0c-4231-9487-7eac0c8df80d}
Device  : CoreAudioApi.MMDevice
```

- 以下`.ps1`ファイルを作成して保存（ファイル名はお好みで）
    - `.ps1`ファイルは`UTF-8 with BOM`エンコードで保存しないと日本語が処理できないので注意

```powershell:ChangeAudioDevice.ps1
$playback1 = "ライン (Steinberg UR24C)" # ← A:再生
$recording1 = "ライン (Steinberg UR24C)" # ← A:録音

$playback2 = "ヘッドホン (Arctis 5 Game)" # ← B:再生
$recording2 = "マイク (Arctis 5 Chat)" # ← B:録音

$currentAudio = Get-AudioDevice -playback

if ($currentAudio.Name.StartsWith($playback1)) {
    (Get-AudioDevice -list | Where-Object Name -like ("$playback2*") | Set-AudioDevice)   
    (Get-AudioDevice -list | Where-Object Name -like ("$recording2*") | Set-AudioDevice)   
}
Else {
    (Get-AudioDevice -list | Where-Object Name -like ("$playback1*") | Set-AudioDevice)   
    (Get-AudioDevice -list | Where-Object Name -like ("$recording1*") | Set-AudioDevice)   
}

```

### **実行したら切り替わる！**

# その他

- `.ps1`ファイルが実行できない場合はポリシー違反の可能性が高いです
ありがたい記事 → [PowerShell のスクリプトが実行できない場合の対処方法](https://qiita.com/Targityen/items/3d2e0b5b0b7b04963750)

- 今回は分かりやすいようにデバイス名でスクリプトを作成しましたが、本来は[公式サンプル](https://github.com/frgnca/AudioDeviceCmdlets/blob/master/EXAMPLE/Toggle-AudioDevice.ps1)のようにIDで管理する方が望ましいです

- スタートメニューに登録するには以下手順でできます
    - 作成した.ps1ファイルへのショートカットを作成
    - ショートカットのプロパティの「リンク」の**先頭**に以下を追加  
    `powershell ` ※最後に半角スペース
    - 右クリックメニューから「スタートメニューにピン留め」
- 再生デバイスと録音デバイスが一致している場合は`Set-AudioDevice`の実行は1回で良いです（例ではヘッドセットが2デバイス判定になっているため2回実行している）

```powershell:例
$audioDevice1 = "ライン (Steinberg UR24C)"
$audioDevice2 = "ヘッドホン (hogehoge)"
$currentAudio = Get-AudioDevice -playback
if ($currentAudio.Name.StartsWith($audioDevice1)) (Get-AudioDevice -list | Where-Object Name -like ("$audioDevice2*") | Set-AudioDevice)   
Else (Get-AudioDevice -list | Where-Object Name -like ("$audioDevice1*") | Set-AudioDevice)
```