オーディオルート制御
iOSでは、PlanetKitは現在のオーディオ出力ルートを内蔵の受話口、内蔵スピーカーフォン、外部ヘッドセットに分類します。内蔵スピーカーフォンへの出力を要求または解除し、ルートの変更をアプリに通知できます。
| 通話タイプ | SDKの最低バージョン |
|---|---|
| 1対1通話、グループ通話(カンファレンス) | PlanetKit 6.0 |
- オーディオルート制御はiOS専用の機能です。macOSでは、オーディオデバイスの選択機能を使用してください。
- PlanetKitは外部の出力デバイスを直接選択しません。ユーザーがデバイスを選べるようにするには、AVRoutePickerViewを使用してください。
オーディオルートの値
PlanetKitはPlanetKitAudioRouteを使用して現在の出力ルートを分類します。
| 値 | 説明 |
|---|---|
.builtInHandset | 端末の受話口 |
.builtInSpeakerphone | 端末のスピーカーフォン |
.externalHeadset | 有線またはBluetoothヘッドセット |
- PlanetKitには現在の
PlanetKitAudioRouteを同期的に読み取るプロパティはありません。出力ルートが変わると、PlanetKitAudioRouteChangeDelegateを通じてPlanetKitAudioRouteの値を通知します。詳しくは「オーディオルートの変更を監視する」を参照してください。 - 現在のオーディオルートについて入出力ポートの詳細を確認するには、Appleの
AVAudioSession.currentRouteAPIを使用してください。
スピーカーフォンに切り替える
内蔵スピーカーフォンへの出力を要求または解除するには、PlanetKitAudioSession.speakerOut(_:)を使用してください。
let session = PlanetKitAudioManager.shared.session
// Request speakerphone output asynchronously.
session.speakerOut(true)
// Release the speakerphone request asynchronously and let iOS choose the route.
session.speakerOut(false)
// Read the current output state; pending requests may not yet be reflected.
let isSpeakerOn = session.isSpeakerOut
スピーカーフォンへの出力要求は一時的な出力先の上書きであり、オーディオルートが変わるとiOSによってリセットされることがあります。ルートが外部デバイスに変わった場合、PlanetKitは以前のスピーカーフォン要求を再適用しません。出力先の上書き動作についてはApple QA1754を参照してください。
デフォルトルートの自動調整
デフォルトでは、PlanetKitは通話用の内蔵ルートを自動調整します。通話が内蔵の受話口で始まった場合、音声通話では受話口を維持し、ビデオ通話では内蔵スピーカーフォンを要求します。この自動調整では外部デバイスを選択しません。
この自動調整を無効にするには、PlanetKitの初期化前に初期設定を構成してください。
let initialSettings = PlanetKitInitialSettingBuilder()
.withDisableDefaultAudioRouteKey(disable: true)
.build()
PlanetKitManager.shared.initialize(initialSettings: initialSettings)
PlanetKitによる内蔵ルートの自動調整をアプリで望まない場合にのみ、disableをtrueに設定してください。デフォルトはfalseです。speakerOut(false)でアプリのスピーカーフォン要求を解除しても、デフォルトルートの自動調整は無効になりません。
自動調整が有効な場合、ビデオ通話を有効にすると、現在のルートが内蔵の受話口であるときにのみスピーカーフォンを要求します。内蔵スピーカーフォンと外部ヘッドセットのルートは維持されます。ビデオ通話を無効にしても、それだけではルートは変わりません。接続中のビデオ通話で外部ヘッドセットから内蔵の受話口に戻った場合、PlanetKitはスピーカーフォンを要求します。
オーディオルートの変更を監視する
PlanetKitはオーディオの再生を維持するため、ルートの変更を内部で処理します。スピーカーフォンの切り替えボタンの表示を更新するなど、変更に応じてアプリのUIを更新する必要がある場合にのみ、このデリゲートを実装してください。
ルートが変わったとき(ヘッドセットの接続や取り外しなど)に通知を受けるには、PlanetKitAudioRouteChangeDelegateを登録してください。
final class MyRouteObserver: PlanetKitAudioRouteChangeDelegate {
func didAudioRouteChange(current: PlanetKitAudioRoute, previous: PlanetKitAudioRoute) {
print("Route changed from \(previous) to \(current)")
// Update UI — e.g., refresh speakerphone button state
}
}
final class CallViewController: UIViewController {
// PlanetKit retains route delegates weakly, so retain this observer strongly.
private let routeObserver = MyRouteObserver()
func startObservingRouteChanges() {
PlanetKitAudioManager.shared.addAudioRouteChangeDelegate(routeObserver)
}
deinit {
PlanetKitAudioManager.shared.removeAudioRouteChangeDelegate(routeObserver)
}
}
デリゲートはメインキューで呼び出されます。
関連API
オーディオルート制御に関連するAPIは次のとおりです。
列挙型
プロパティ
メソッド
-
PlanetKitAudioManagerのaddAudioRouteChangeDelegate(_:) -
PlanetKitAudioManagerのremoveAudioRouteChangeDelegate(_:) -
PlanetKitAudioSessionのspeakerOut(_:) -
PlanetKitInitialSettingBuilderのwithDisableDefaultAudioRouteKey(disable:)