1# 管理全局音频输出设备 2 3有时设备同时连接多个音频输出设备,需要指定音频输出设备进行音频播放,此时需要使用AudioRoutingManager接口进行输出设备的管理,API说明可以参考[AudioRoutingManager API文档](../../reference/apis-audio-kit/js-apis-audio.md#audioroutingmanager9)。 4 5## 创建AudioRoutingManager实例 6 7在使用AudioRoutingManager管理音频设备前,需要先导入模块并创建实例。 8 9```ts 10import { audio } from '@kit.AudioKit'; // 导入audio模块 11 12let audioManager = audio.getAudioManager(); // 需要先创建AudioManager实例 13 14let audioRoutingManager = audioManager.getRoutingManager(); // 再调用AudioManager的方法创建AudioRoutingManager实例 15``` 16 17## 支持的音频输出设备类型 18 19目前支持的音频输出设备见下表: 20 21| 名称 | 值 | 说明 | 22| -------- | -------- | -------- | 23| EARPIECE | 1 | 听筒。 | 24| SPEAKER | 2 | 扬声器。 | 25| WIRED_HEADSET | 3 | 有线耳机,带麦克风。 | 26| WIRED_HEADPHONES | 4 | 有线耳机,无麦克风。 | 27| BLUETOOTH_SCO | 7 | 蓝牙设备SCO(Synchronous Connection Oriented)连接。 | 28| BLUETOOTH_A2DP | 8 | 蓝牙设备A2DP(Advanced Audio Distribution Profile)连接。 | 29| USB_HEADSET | 22 | USB耳机,带麦克风。 | 30 31## 获取输出设备信息 32 33使用getDevices()方法可以获取当前所有输出设备的信息。 34 35```ts 36import { audio } from '@kit.AudioKit'; 37 38audioRoutingManager.getDevices(audio.DeviceFlag.OUTPUT_DEVICES_FLAG).then((data: audio.AudioDeviceDescriptors) => { 39 console.info('Promise returned to indicate that the device list is obtained.'); 40}); 41``` 42 43## 监听设备连接状态变化 44 45可以设置监听事件来监听设备连接状态的变化,当有设备连接或断开时触发回调: 46 47> **说明:** 48> 监听设备连接状态变化可以监听到全部的设备连接状态变化,不建议作为应用处理自动暂停的依据。应用如需处理自动暂停相关业务,可参考[音频流输出设备变更原因](audio-output-device-change.md)。 49 50```ts 51import { audio } from '@kit.AudioKit'; 52 53// 监听音频设备状态变化 54audioRoutingManager.on('deviceChange', audio.DeviceFlag.OUTPUT_DEVICES_FLAG, (deviceChanged: audio.DeviceChangeAction) => { 55 console.info(`device change type : ${deviceChanged.type}`); // 设备连接状态变化,0为连接,1为断开连接 56 console.info(`device descriptor size : ${deviceChanged.deviceDescriptors.length}`); 57 console.info(`device change descriptor : ${deviceChanged.deviceDescriptors[0].deviceRole}`); // 设备角色 58 console.info(`device change descriptor : ${deviceChanged.deviceDescriptors[0].deviceType}`); // 设备类型 59}); 60 61// 取消监听音频设备状态变化 62audioRoutingManager.off('deviceChange'); 63``` 64 65<!--Del--> 66## 选择音频输出设备(仅对系统应用开放) 67 68选择音频输出设备,当前只能选择一个输出设备,以设备ID作为唯一标识。AudioDeviceDescriptors的具体信息可以参考[AudioDeviceDescriptors](../../reference/apis-audio-kit/js-apis-audio.md#audiodevicedescriptors)。 69 70> **说明:** 71> 72> 用户可以选择连接一组音频设备(如一对蓝牙耳机),但系统侧只感知为一个设备,该组设备共用一个设备ID。 73 74```ts 75import { audio } from '@kit.AudioKit'; 76import { BusinessError } from '@kit.BasicServicesKit'; 77 78let outputAudioDeviceDescriptor: audio.AudioDeviceDescriptors = [{ 79 deviceRole : audio.DeviceRole.OUTPUT_DEVICE, 80 deviceType : audio.DeviceType.SPEAKER, 81 id : 1, 82 name : "", 83 address : "", 84 sampleRates : [44100], 85 channelCounts : [2], 86 channelMasks : [0], 87 networkId : audio.LOCAL_NETWORK_ID, 88 interruptGroupId : 1, 89 volumeGroupId : 1, 90 displayName : "" 91}]; 92 93async function selectOutputDevice() { 94 audioRoutingManager.selectOutputDevice(outputAudioDeviceDescriptor).then(() => { 95 console.info('Invoke selectOutputDevice succeeded.'); 96 }).catch((err: BusinessError) => { 97 console.error(`Invoke selectOutputDevice failed, code is ${err.code}, message is ${err.message}`); 98 }); 99} 100``` 101<!--DelEnd--> 102 103## 获取最高优先级输出设备信息 104 105使用getPreferOutputDeviceForRendererInfo()方法, 可以获取当前最高优先级的输出设备。 106 107> **说明:** 108> 109> 最高优先级输出设备表示声音将在此设备输出的设备。 110 111```ts 112import { audio } from '@kit.AudioKit'; 113import { BusinessError } from '@kit.BasicServicesKit'; 114 115let rendererInfo: audio.AudioRendererInfo = { 116 usage : audio.StreamUsage.STREAM_USAGE_MUSIC, 117 rendererFlags : 0 118}; 119 120async function getPreferOutputDeviceForRendererInfo() { 121 audioRoutingManager.getPreferOutputDeviceForRendererInfo(rendererInfo).then((desc: audio.AudioDeviceDescriptors) => { 122 console.info(`device descriptor: ${desc}`); 123 }).catch((err: BusinessError) => { 124 console.error(`Result ERROR: ${err}`); 125 }) 126} 127``` 128 129## 监听最高优先级输出设备变化 130 131```ts 132import { audio } from '@kit.AudioKit'; 133 134let rendererInfo: audio.AudioRendererInfo = { 135 usage : audio.StreamUsage.STREAM_USAGE_MUSIC, 136 rendererFlags : 0 137}; 138 139// 监听最高优先级输出设备变化 140audioRoutingManager.on('preferOutputDeviceChangeForRendererInfo', rendererInfo, (desc: audio.AudioDeviceDescriptors) => { 141 console.info(`device change descriptor : ${desc[0].deviceRole}`); // 设备角色 142 console.info(`device change descriptor : ${desc[0].deviceType}`); // 设备类型 143}); 144 145// 取消监听最高优先级输出设备变化 146audioRoutingManager.off('preferOutputDeviceChangeForRendererInfo'); 147``` 148