MacでPhotonVoiceを使用したときに他アプリケーションの音量が小さくなる問題

# 概要

PhotonVoice を使用した Unity 製アプリを起動した途端、別アプリケーションとして起動している Google Chrome 上の YouTube や Spotify 等の音量が極小になる。また、通話中の Discord に至っては音量だけではなくマイク入力も極小になるようだった。本事象は UnityEditor 上でアプリケーションを実行しても発生した。

同じ事象は PhotonVoice を使用していないと思われる LINE や Skype, Zoom の通話中でも発生しているが、Discord や Slack, Google Chrome 上の Facebook Messenger の通話中では発生していないので、何か解決方法があることが分かる。

確定的な原因は分からなかったが、対処方法は分かったので記事として残しておく。

# 各種バージョン

|環境|バージョン|
|---|---|
|macOS|macOS 10.15.4|
|Unity|Unity 2018.2.21f1|
|Photon Unity Network|PUN 1.91|

(全体的にバージョンが古くてお恥ずかしい限りです)

# 対処方法

PhotonVoiceRecorder にある Microphone Type で「Unity」を使用する。
自分のプロジェクトでは「Photon」を使用していたが、これを「Unity」に変更したら解決した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44388/3dd549ad-6a15-0758-282a-ad831dd1c6f7.png)

ただし、基本的には Unity マイクよりも Photon マイクのほうが何かと優秀なので、Mac で起動したときのみ「Unity」マイクを使用するようにするために下記コードを書いた。 (PhotonマイクのクライアントとUnityマイクのクライアント同士で音声通信が正常に出来ることは検証済み)

```csharp
private void Start() {
  GetComponent<PhotonVoiceRecorder>().MicrophoneType = IsMacOs() 
    ? PhotonVoiceRecorder.MicAudioSourceType.Unity 
    : PhotonVoiceRecorder.MicAudioSourceType.Photon;
  
  // 念の為PhotonVoiceSettingも変更しておく
  PhotonVoiceSettings.Instance.MicrophoneType = IsMacOs() 
    ? PhotonVoiceSettings.MicAudioSourceType.Unity 
    : PhotonVoiceSettings.MicAudioSourceType.Photon;
}

// Macで実行されていたらtrue
private bool IsMacOs() {
#if UNITY_STANDALONE_OSX || UNITY_EDITOR_OSX
  return true;
#endif
  return false;
}
```

# 原因究明 (未解決)

下記のフォーラムで探して回ったが、とにかく同じ事で悩んでいる人が少なかった。
また、投稿があっても回答が無いパターンも多かった。

- Unity Forum
- Apple Developer Forums
- Photon Engine Support Forum
- Stack Overflow

## 似たような問題を抱えている人

本事象に一番近いなと思ったのは、Apple Developer Forums に投稿されていた下記の質問。
(もしかしたら全く関係無いかもしれないが)
[VoiceProcessingIO lowers the volume of all othe... |Apple Developer Forums](https://forums.developer.apple.com/message/284401#284401)

> VoIPアプリケーションでVoiceProcessingIO（kAudioUnitSubType_VoiceProcessingIO）オーディオユニットを使用してオーディオを録音および再生しています。ユニットが初期化されている場合を除き、すべてが正常に動作します。他に何かがオーディオを再生している場合、そのオーディオは非常に静かになりますが、出力はすべてフルボリュームで聞こえます。

こちらの投稿には回答が付いていなかったが、macOS のオーディオ API 周りの機能が原因である事が分かる。
(上記記事で紹介されていた [kAUVoiceIOProperty_DuckNonVoiceAudio - AudioToolbox | Apple Developer Documentation](https://developer.apple.com/documentation/audiotoolbox/kauvoiceioproperty_ducknonvoiceaudio) のプロパティをドキュメントから参照したが、非推奨と書いてあったので対応出来なかった。)

全てのアプリケーションにおいて音声入力時に他のアプリケーションの音量が小さくなるのならここで諦めるが、上述した通り Discord や Slack の通話では音量が変わる事が無かったので、もう少し調べてみることにした。

## Photon Voice のマイクタイプについて

公式ドキュメントの「Photon」マイクの説明を見ると、ネイティブのオーディオAPIとやりとりしている事が分かる。

> Unityマイクは、ほぼ同じコードベースを使用して複数のプラットフォームをターゲットにすることを容易にするのに最適です。ただし、いくつかの点で、UnityのマイクAPIは制限されているか、あちこちにいくつかの問題があります。そのため、オーディオ入力デバイスと直接やり取りし、UnityのマイクAPIをバイパスする独自の方法を導入しました。これの主な理由の1つは、デバイスのハードウェアに組み込まれているエコーキャンセレーションを利用することです。 ※ [Photon Voice For PUN | Photon Engine](https://doc.photonengine.com/ja-jp/voice/v1/getting-started/voice-for-pun) より引用

macOS の API (特にオーディオ周り)には詳しくないが、オーディオ API が本事象の原因であり、Photon マイクの実装がネイティブのオーディオ API を利用しているのならもしかして？と思ってマイクタイプを「Unity」に変更したら他アプリケーションの音量に影響を与えない事が出来た。

# 最後に

Unity マイクも内部的にはネイティブのオーディオ API を参照しているのでは？と思ったが、他アプリケーションの音量操作は Unity API 側で無効にされているという認識で良かったのだろうか。

結局、具体的に何のオーディオ API の何のパラメータが原因で、どのような場合に音量操作を行うのかというのは分からなかったので、もし詳しい方がいらっしゃいましたらご教示いただけますと幸いです。

# 参考リンク

- [Photon Voice For PUN | Photon Engine](https://doc.photonengine.com/ja-jp/voice/v1/getting-started/voice-for-pun)
- [アプリケーションの音量調節を制限する方法-Appleコミュニティ](https://discussions.apple.com/thread/8010316)
- [自動ゲインコントロールを無効にする（コアオーディオ）-Unityフォーラム](https://forum.unity.com/threads/disable-automatic-gain-control-core-audio.407045/)
- [ios-プログラムでVoiceProcessingIO AGCをオフにする-スタックオーバーフロー](https://stackoverflow.com/questions/15644871/programmatically-turn-off-voiceprocessingio-agc)
- [mountain lion - Mac OSX microphone input volume level auto-adjusts - can it be disabled? - Ask Different](https://apple.stackexchange.com/questions/97810/mac-osx-microphone-input-volume-level-auto-adjusts-can-it-be-disabled#comment434571_100149)
- [VoiceProcessingIOは他のすべての音量を下げます... | Apple開発者フォーラム](https://forums.developer.apple.com/message/284401#284401)
- [kAUVoiceIOProperty_DuckNonVoiceAudio - AudioToolbox | Apple Developer Documentation](https://developer.apple.com/documentation/audiotoolbox/kauvoiceioproperty_ducknonvoiceaudio)