オーディオデバイスの選択
macOSでは、PlanetKitAudioManagerを使用してオーディオデバイスを一覧表示し、1対1通話とグループ通話でマイクとスピーカーを個別に選択できます。
| 通話タイプ | SDKの最低バージョン |
|---|---|
| 1対1通話、グループ通話(カンファレンス) | PlanetKit 6.0 |
- 起動時に、PlanetKitはデバイスの種類ごとに優先デフォルトデバイスを選択します。通常はmacOSのデフォルトデバイスです。システムのデフォルトが集約デバイスであるか取得できない場合、PlanetKitは一覧から、該当する入力または出力チャンネルを持つ最初の非集約デバイスを試します。適切なデバイスがなければ、現在の選択は空になります。
- オーディオデバイスの選択はmacOS専用の機能です。iOSでは、オーディオルート制御を使用してください。
利用可能なデバイスを一覧表示する
すべてのオーディオデバイスを一覧表示するには、PlanetKitAudioManagerのdevicesプロパティを読み取ってください。ユーザーがマイクまたはスピーカーとして選択できるデバイスを表示する際は、isCapturableまたはisPlayableで一覧を絞り込んでください。入力または出力チャンネルがあるデバイスでも、その用途で選択できるとは限りません。
let audioManager = PlanetKitAudioManager.shared
let microphones = audioManager.devices.filter { $0.isCapturable }
let speakers = audioManager.devices.filter { $0.isPlayable }
for device in microphones {
print("Microphone: \(device.name ?? "Unknown") (\(device.deviceID))")
}
for device in speakers {
print("Speaker: \(device.name ?? "Unknown") (\(device.deviceID))")
}
デバイスの情報を確認するには、次のPlanetKitAudioDeviceプロパティを使用してください。
| プロパティ | 説明 |
|---|---|
deviceID | デバイス識別子 |
name | 表示名(取得できる場合) |
inputChannelCount, outputChannelCount | 入力および出力チャンネル数 |
isCapturable, isPlayable | PlanetKitがマイクまたはスピーカーとしてデバイスを受け付けるかどうか |
isAggregateType | デバイスが集約デバイスかどうか。PlanetKitは集約デバイスをマイクまたはスピーカーとして使用できません。 |
現在の選択を確認する
デバイス一覧から選択されているマイクとスピーカーを確認するには、PlanetKitAudioSessionのmicDeviceプロパティとspeakerDeviceプロパティを読み取ってください。各プロパティは、該当する種類のデバイスが選択されていない場合、または該当する種類のカスタムマイクまたはカスタムスピーカーが有効な場合にnilを返します。nilの値だけでは、オーディオのキャプチャや再生が無効になっているかどうかは判断できません。
let session = PlanetKitAudioManager.shared.session
if let mic = session.micDevice {
print("Current microphone: \(mic.name ?? "Unknown")")
}
if let speaker = session.speakerDevice {
print("Current speaker: \(speaker.name ?? "Unknown")")
}
デバイスを選択する
一覧のデバイスをPlanetKitAudioSessionのchange(micDevice:completion:)またはchange(speakerDevice:completion:)メソッドに渡してください。完了ハンドラーはメインキューで実行され、エラーがnilなら成功です。
let audioManager = PlanetKitAudioManager.shared
let session = audioManager.session
if let microphone = audioManager.devices.first(where: { $0.isCapturable }) {
session.change(micDevice: microphone) { error in
if let error = error {
print("Could not select microphone: \(error)")
}
}
}
if let speaker = audioManager.devices.first(where: { $0.isPlayable }) {
session.change(speakerDevice: speaker) { error in
if let error = error {
print("Could not select speaker: \(error)")
}
}
}
要求した種類で選択できないデバイス(集約デバイスを含む)を渡すと、完了ハンドラーにエラーが渡され、以前の選択が維持されます。その種類に対してカスタムマイクまたはカスタムスピーカーが有効な間も、デバイスの変更は失敗します。
デバイスの選択を解除する
マイクまたはスピーカーの選択を解除するには、PlanetKitAudioSessionの対応するchange(micDevice:completion:)またはchange(speakerDevice:completion:)メソッドにnilを渡してください。これはミュートとは別の操作であり、デフォルトデバイスには戻りません。
let session = PlanetKitAudioManager.shared.session
session.change(micDevice: nil) { error in
if let error = error {
print("Could not deselect microphone: \(error)")
}
}
session.change(speakerDevice: nil) { error in
if let error = error {
print("Could not deselect speaker: \(error)")
}
}
正常に完了すると、対応するmicDeviceまたはspeakerDeviceがnilになります。その後、デバイス一覧が変わると、PlanetKitが優先デフォルトデバイスを再び選択する場合があります。
優先デフォルトデバイスに戻す
選択をリセットしたいデバイスの種類ごとに、PlanetKitAudioSessionのsetPreferredDefaultDevice(type:)を呼び出してください。
let session = PlanetKitAudioManager.shared.session
// Asynchronously switches to the preferred default microphone device.
session.setPreferredDefaultDevice(type: .mic)
// Asynchronously switches to the preferred default speaker device.
session.setPreferredDefaultDevice(type: .speaker)
現在のmacOSデフォルトデバイスが適切な場合、PlanetKitはそのデバイスを使用します。集約デバイスであるか利用できない場合は、一覧から該当するチャンネルを持つ最初の非集約デバイスを使用します。候補はisCapturableまたはisPlayableも満たす必要があり、満たさなければ現在の選択が維持されます。このメソッドに完了ハンドラーはありません。結果を確認するには、micDeviceまたはspeakerDeviceを調べ、デバイス変更イベントを監視してください。
macOSのデフォルトデバイスを変更しただけでは、アプリが選択済みで引き続き利用可能なデバイスは変更されません。
デバイスの変更を監視する
PlanetKitAudioManagerのaddDeviceChangeDelegate(_:)を呼び出してPlanetKitAudioDeviceChangeDelegateを登録し、一覧、現在の選択、またはmacOSのデフォルトが変わったときにデバイス選択UIを更新してください。データソースのコールバックは任意で、内蔵スピーカーとヘッドフォンなど、異なる入力ソースや出力先を持つ内蔵デバイスに適用されます。
デリゲートのコールバックからデバイス選択UIなどを更新する場合は、DispatchQueue.main.asyncを使用してメインキューで更新してください。
final class AudioDeviceObserver: NSObject, PlanetKitAudioDeviceChangeDelegate {
func didAudioDevicesUpdate(devices: [PlanetKitAudioDevice]) {
print("Available devices: \(devices.count)")
}
func didAudioDeviceChange(device: PlanetKitAudioDevice?, type: PlanetKitAudioDeviceType) {
print("Current \(type) changed to \(device?.name ?? "none")")
}
func didAudioDefaultSystemDeviceChange(device: PlanetKitAudioDevice?, type: PlanetKitAudioDeviceType) {
print("macOS default \(type) changed to \(device?.name ?? "none")")
}
func didAudioDeviceDataSourceChange(device: PlanetKitAudioDevice, dataSource: UInt32) {
print("Data source for \(device.name ?? "Unknown"): \(dataSource)")
}
}
let observer = AudioDeviceObserver()
PlanetKitAudioManager.shared.addDeviceChangeDelegate(observer)
// Keep observer alive while registered. When no longer needed:
PlanetKitAudioManager.shared.removeDeviceChangeDelegate(observer)
選択中のデバイスが切断された場合
デフォルト設定では、デバイス一覧から選択したマイクまたはスピーカーが切断されると、PlanetKitはその種類の優先デフォルトデバイスへの切り替えを試みます。
PlanetKitは切り替えを試みる前に、更新後の一覧を渡してdidAudioDevicesUpdate(devices:)を呼び出します。このコールバックでは利用可能なデバイス一覧を更新してください。ただし、そこで読み取ったmicDeviceまたはspeakerDeviceを最終的な選択とみなさないでください。現在のデバイス選択を示すUIはdidAudioDeviceChange(device:type:)で更新してください。
関連API
オーディオデバイスの選択に関連するAPIは次のとおりです。
クラスとプロトコル
列挙型
プロパティ
-
PlanetKitAudioManager.shared -
PlanetKitAudioManagerのdevices -
PlanetKitAudioManagerのsession -
PlanetKitAudioSessionのmicDevice -
PlanetKitAudioSessionのspeakerDevice -
PlanetKitAudioDeviceのdeviceID -
PlanetKitAudioDeviceのname -
PlanetKitAudioDeviceのinputChannelCount -
PlanetKitAudioDeviceのoutputChannelCount -
PlanetKitAudioDeviceのisCapturable -
PlanetKitAudioDeviceのisPlayable -
PlanetKitAudioDeviceのisAggregateType
メソッド
-
PlanetKitAudioManagerのaddDeviceChangeDelegate(_:) -
PlanetKitAudioManagerのremoveDeviceChangeDelegate(_:) -
PlanetKitAudioSessionのchange(micDevice:completion:),PlanetKitAudioSessionのchange(speakerDevice:completion:) -
PlanetKitAudioSessionのsetPreferredDefaultDevice(type:)
イベント
-
PlanetKitAudioDeviceChangeDelegateのdidAudioDevicesUpdate(devices:) -
PlanetKitAudioDeviceChangeDelegateのdidAudioDeviceChange(device:type:) -
PlanetKitAudioDeviceChangeDelegateのdidAudioDefaultSystemDeviceChange(device:type:) -
PlanetKitAudioDeviceChangeDelegateのdidAudioDeviceDataSourceChange(device:dataSource:)