# ステレオ音声を入出力する

Sora Android SDK では、ステレオ音声を入出力することができます。

## ステレオ音声を入力する

ステレオ音声を入力するには、 `SoraAudioOption.useStereoInput` に `true` を指定します。
このとき SDK が標準の `JavaAudioDeviceModule` を生成する際に、音声入力を 2 チャンネルで初期化します。

`useStereoInput` のデフォルト値は `false` です。

また、 `MediaRecorder.AudioSource` 、 `audioProcessingAutoGainControl` についてもサンプルコードのように設定する必要があります。

```kotlin
val mediaOption = SoraMediaOption().apply {
    enableAudioUpstream()

    audioOption = SoraAudioOption().apply {
        // ステレオ入力を有効にする
        useStereoInput = true
        // MIC ではステレオマイクの近接センサーによる音量低下が発生する場合がある
        audioSource = MediaRecorder.AudioSource.CAMCORDER
        // libwebrtc の AGC が有効な場合はステレオで送信されない
        audioProcessingAutoGainControl = false
    }
}
```

MediaRecorder の詳細については [Android のリファレンス](https://developer.android.com/reference/android/media/MediaRecorder.AudioSource) をご確認ください。

> **注釈**
>
> - カスタム `AudioDeviceModule` を利用する場合は `useStereoInput` の指定は無視されます
> - 端末のマイクや音声ソースがモノラルの場合、左右で同じ音の疑似ステレオになります。左右で異なる音のステレオにはなりません

## ステレオ音声を出力する

受信したステレオ音声を出力するには、 `SoraAudioOption.useStereoOutput` に `true` を指定します。
併せて、 `AudioAttributes` にオーディオ用途 `USAGE_MEDIA` と `CONTENT_TYPE_MUSIC` を
指定することを推奨します。

`useStereoOutput` のデフォルト値は `false` です。

`AudioAttributes` の詳細については
[Android のドキュメント](https://source.android.com/docs/core/audio/attributes?hl=ja)
をご確認ください。

> **注釈**
>
> - カスタム `AudioDeviceModule` を利用する場合は `useStereoOutput` の指定は無視されます。
> - `AudioAttributes` 既定の `USAGE_VOICE_COMMUNICATION` と `CONTENT_TYPE_SPEECH` では、 Android の音声ポリシーによってステレオ音声がモノラルへダウンミックスされる場合があります。ステレオで出力する場合は `USAGE_MEDIA` と `CONTENT_TYPE_MUSIC` を指定してください。

```kotlin
val mediaOption = SoraMediaOption().apply {
    enableAudioDownstream()

    audioOption = SoraAudioOption().apply {
        useStereoOutput = true
        audioAttributes =
            AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_MEDIA)
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                .build()
    }
}
```

> **注釈**
>
> ステレオ音声の受信には Opus の `stereo` / `sprop-stereo` ネゴシエーションが必要です。
> SDK は Sora が送る offer に応答する answer SDP の Opus fmtp に `stereo=1` /
> `sprop-stereo=1` を自動で追記するためアプリ側での対応は必要ありません。

## カスタム AudioDeviceModule を利用する場合

`SoraAudioOption.audioDeviceModule` にカスタム `AudioDeviceModule` を指定した場合、
SDK は標準の `JavaAudioDeviceModule` を生成せず、 `useStereoInput` 、
`useStereoOutput` 、 `audioAttributes` の指定は無視されます。
ステレオのネゴシエーション（ answer SDP の Opus fmtp への `stereo=1` /
`sprop-stereo=1` 追記）はカスタム `AudioDeviceModule` でも動作しますが、
実際にステレオ入出力を行うかはカスタム `AudioDeviceModule` の実装次第です。

## 受信チャンネル数を確認する

受信した PCM のチャンネル数は、 `AudioTrackSink.onData` の `numberOfChannels` で確認できます。
ステレオ音声を受信している場合は `2` が渡されます。

`AudioTrackSink` の登録方法、コールバックの実行スレッド、関連付けの解除については、 [音声データ取得機能](audio_track_sink.html) をご確認ください。
