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```ts 48import { audio } from '@kit.AudioKit'; 49 50// 监听音频设备状态变化 51audioRoutingManager.on('deviceChange', audio.DeviceFlag.OUTPUT_DEVICES_FLAG, (deviceChanged: audio.DeviceChangeAction) => { 52 console.info(`device change type : ${deviceChanged.type}`); // 设备连接状态变化,0为连接,1为断开连接 53 console.info(`device descriptor size : ${deviceChanged.deviceDescriptors.length}`); 54 console.info(`device change descriptor : ${deviceChanged.deviceDescriptors[0].deviceRole}`); // 设备角色 55 console.info(`device change descriptor : ${deviceChanged.deviceDescriptors[0].deviceType}`); // 设备类型 56}); 57 58// 取消监听音频设备状态变化 59audioRoutingManager.off('deviceChange'); 60``` 61 62<!--Del--> 63## 选择音频输出设备(仅对系统应用开放) 64 65选择音频输出设备,当前只能选择一个输出设备,以设备ID作为唯一标识。AudioDeviceDescriptors的具体信息可以参考[AudioDeviceDescriptors](../../reference/apis-audio-kit/js-apis-audio.md#audiodevicedescriptors)。 66 67> **说明:** 68> 69> 用户可以选择连接一组音频设备(如一对蓝牙耳机),但系统侧只感知为一个设备,该组设备共用一个设备ID。 70 71```ts 72import { audio } from '@kit.AudioKit'; 73import { BusinessError } from '@kit.BasicServicesKit'; 74 75let outputAudioDeviceDescriptor: audio.AudioDeviceDescriptors = [{ 76 deviceRole : audio.DeviceRole.OUTPUT_DEVICE, 77 deviceType : audio.DeviceType.SPEAKER, 78 id : 1, 79 name : "", 80 address : "", 81 sampleRates : [44100], 82 channelCounts : [2], 83 channelMasks : [0], 84 networkId : audio.LOCAL_NETWORK_ID, 85 interruptGroupId : 1, 86 volumeGroupId : 1, 87 displayName : "" 88}]; 89 90async function selectOutputDevice() { 91 audioRoutingManager.selectOutputDevice(outputAudioDeviceDescriptor).then(() => { 92 console.info('Invoke selectOutputDevice succeeded.'); 93 }).catch((err: BusinessError) => { 94 console.error(`Invoke selectOutputDevice failed, code is ${err.code}, message is ${err.message}`); 95 }); 96} 97``` 98<!--DelEnd--> 99 100## 获取最高优先级输出设备信息 101 102使用getPreferOutputDeviceForRendererInfo()方法, 可以获取当前最高优先级的输出设备。 103 104> **说明:** 105> 106> 最高优先级输出设备表示声音将在此设备输出的设备。 107 108```ts 109import { audio } from '@kit.AudioKit'; 110import { BusinessError } from '@kit.BasicServicesKit'; 111 112let rendererInfo: audio.AudioRendererInfo = { 113 usage : audio.StreamUsage.STREAM_USAGE_MUSIC, 114 rendererFlags : 0 115}; 116 117async function getPreferOutputDeviceForRendererInfo() { 118 audioRoutingManager.getPreferOutputDeviceForRendererInfo(rendererInfo).then((desc: audio.AudioDeviceDescriptors) => { 119 console.info(`device descriptor: ${desc}`); 120 }).catch((err: BusinessError) => { 121 console.error(`Result ERROR: ${err}`); 122 }) 123} 124``` 125 126## 监听最高优先级输出设备变化 127 128```ts 129import { audio } from '@kit.AudioKit'; 130 131let rendererInfo: audio.AudioRendererInfo = { 132 usage : audio.StreamUsage.STREAM_USAGE_MUSIC, 133 rendererFlags : 0 134}; 135 136// 监听最高优先级输出设备变化 137audioRoutingManager.on('preferOutputDeviceChangeForRendererInfo', rendererInfo, (desc: audio.AudioDeviceDescriptors) => { 138 console.info(`device change descriptor : ${desc[0].deviceRole}`); // 设备角色 139 console.info(`device change descriptor : ${desc[0].deviceType}`); // 设备类型 140}); 141 142// 取消监听最高优先级输出设备变化 143audioRoutingManager.off('preferOutputDeviceChangeForRendererInfo'); 144``` 145