1# 响应音频流输出设备变更 2<!--Kit: Audio Kit--> 3<!--Subsystem: Multimedia--> 4<!--Owner: @songshenke--> 5<!--Designer: @caixuejiang; @hao-liangfei; @zhanganxiang--> 6<!--Tester: @Filger--> 7<!--Adviser: @zengyawen--> 8 9开发者可以了解音频流输出设备变更信息,并完成相应适配,确保应用在设备发生变更时的用户体验。 10 11开发者可使用AudioRenderer的[outputDeviceChangeWithInfo](../../reference/apis-audio-kit/arkts-apis-audio-AudioRenderer.md#onoutputdevicechangewithinfo11),用于监听音频流输出设备变化及原因。当系统出现音频输出设备的上下线、用户强选、设备抢占或设备选择策略变更等情况,导致音频流输出设备变更时,系统将通过该接口通知应用当前音频流设备变更信息,包含当前音频流输出设备信息和设备变更原因。 12 13## 音频流输出设备信息 14 15在[outputDeviceChangeWithInfo](../../reference/apis-audio-kit/arkts-apis-audio-AudioRenderer.md#onoutputdevicechangewithinfo11)返回的音频流设备变更信息中,包含当前音频流输出设备信息,以数组形式发送,一般该列表仅包含一个设备信息,具体可参考[AudioDeviceDescriptors](../../reference/apis-audio-kit/arkts-apis-audio-t.md#audiodevicedescriptors)(设备信息列表)。 16 17## 音频流输出设备变更原因 18 19> **说明:** 20当发生下述四种情况([AudioStreamDeviceChangeReason](../../reference/apis-audio-kit/arkts-apis-audio-e.md#audiostreamdevicechangereason11))时,系统将向应用发送设备变更回调。 21 22- **REASON_NEW_DEVICE_AVAILABLE**:新设备可用。 23 24 **触发场景:** 25 26 普通蓝牙设备(耳机、眼镜、音箱、车机等)连接、支持佩戴检测的蓝牙设备(耳机、眼镜等)佩戴、有线设备(3.5mm耳机、Type-C耳机、USB耳机、USB音箱等)插入、分布式设备上线等。 27 28- **REASON_OLD_DEVICE_UNAVAILABLE**:旧设备不可用。 29 30 当报告此原因时,应用程序应考虑暂停音频播放。 31 32 **触发场景:** 33 34 普通蓝牙设备(耳机、眼镜、音箱、车机等)断开、支持佩戴检测的蓝牙耳机双耳摘下、支持佩戴检测的蓝牙眼镜摘下、有线设备(3.5mm耳机、Type-C耳机、USB耳机、USB音箱等)拔出、分布式设备下线等。 35 36 针对此场景,常用业务场景的**处理建议**如下: 37 38 - 游戏场景:不暂停 39 - 听书场景:暂停 40 - 音乐场景:暂停 41 - 视频场景:暂停 42 43- **REASON_OVERRODE**:用户强制选择设备。 44 45 **触发场景:** 46 47 用户从界面选择切换音频流输出设备、从外设选择接听蜂窝或VoIP来电。 48 49- **REASON_UNKNOWN**:未知原因。 50 51## 参考示例 52 53 ```ts 54 import { audio } from '@kit.AudioKit'; 55 import { BusinessError } from '@kit.BasicServicesKit'; 56 57 let audioRenderer: audio.AudioRenderer | undefined = undefined; 58 let audioStreamInfo: audio.AudioStreamInfo = { 59 samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_48000, // 采样率。 60 channels: audio.AudioChannel.CHANNEL_2, // 通道。 61 sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE, // 采样格式。 62 encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW // 编码格式。 63 }; 64 let audioRendererInfo: audio.AudioRendererInfo = { 65 usage: audio.StreamUsage.STREAM_USAGE_MUSIC, // 音频流使用类型:音乐。根据业务场景配置,参考StreamUsage。 66 rendererFlags: 0 // 音频渲染器标志。 67 }; 68 let audioRendererOptions: audio.AudioRendererOptions = { 69 streamInfo: audioStreamInfo, 70 rendererInfo: audioRendererInfo 71 }; 72 73 // 创建AudioRenderer实例。 74 audio.createAudioRenderer(audioRendererOptions).then((data) => { 75 audioRenderer = data; 76 console.info('AudioFrameworkRenderLog: AudioRenderer Created : Success : Stream Type: SUCCESS'); 77 }).catch((err: BusinessError) => { 78 console.error(`AudioFrameworkRenderLog: AudioRenderer Created : ERROR : ${err}`); 79 }); 80 81 if (audioRenderer) { 82 // 订阅监听音频流输出设备变化及原因。 83 (audioRenderer as audio.AudioRenderer).on('outputDeviceChangeWithInfo', async (deviceChangeInfo: audio.AudioStreamDeviceChangeInfo) => { 84 switch (deviceChangeInfo.changeReason) { 85 case audio.AudioStreamDeviceChangeReason.REASON_OLD_DEVICE_UNAVAILABLE: 86 // 响应设备不可用事件,如果应用处于播放状态,应暂停播放,更新UX界面。 87 // await audioRenderer.pause(); 88 break; 89 case audio.AudioStreamDeviceChangeReason.REASON_NEW_DEVICE_AVAILABLE: 90 // 应用根据业务情况响应设备可用事件。 91 break; 92 case audio.AudioStreamDeviceChangeReason.REASON_OVERRODE: 93 // 应用根据业务情况响应设备强选事件。 94 break; 95 case audio.AudioStreamDeviceChangeReason.REASON_UNKNOWN: 96 // 应用根据业务情况响应未知原因事件。 97 break; 98 } 99 }); 100 } 101 ```