1e41f4b71Sopenharmony_ci# Distributed Audio Playback (for System Applications Only) 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ciDistributed audio playback enables an application to continue audio playback on another device in the same network. 4e41f4b71Sopenharmony_ci 5e41f4b71Sopenharmony_ciYou can use distributed audio playback to transfer all audio streams or the specified audio stream being played on the current device to a remote device. 6e41f4b71Sopenharmony_ci 7e41f4b71Sopenharmony_ci## How to Develop 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ciBefore continuing audio playback on another device in the same network, you must obtain the device list on the network and listen for device connection state changes. For details, see [Audio Output Device Management](audio-output-device-management.md). 10e41f4b71Sopenharmony_ci 11e41f4b71Sopenharmony_ciWhen obtaining the device list on the network, you can specify **DeviceFlag** to filter out the required devices. 12e41f4b71Sopenharmony_ci 13e41f4b71Sopenharmony_ci| Name | Description | 14e41f4b71Sopenharmony_ci| -------- | -------- | 15e41f4b71Sopenharmony_ci| NONE_DEVICES_FLAG<sup>9+</sup> | No device is available. This is a system API. | 16e41f4b71Sopenharmony_ci| OUTPUT_DEVICES_FLAG | Local output device. | 17e41f4b71Sopenharmony_ci| INPUT_DEVICES_FLAG | Local input device. | 18e41f4b71Sopenharmony_ci| ALL_DEVICES_FLAG | Local input and output device. | 19e41f4b71Sopenharmony_ci| DISTRIBUTED_OUTPUT_DEVICES_FLAG<sup>9+</sup> | Remote output device. This is a system API. | 20e41f4b71Sopenharmony_ci| DISTRIBUTED_INPUT_DEVICES_FLAG<sup>9+</sup> | Remote input device. This is a system API. | 21e41f4b71Sopenharmony_ci| ALL_DISTRIBUTED_DEVICES_FLAG<sup>9+</sup> | Remote input and output device. This is a system API. | 22e41f4b71Sopenharmony_ci 23e41f4b71Sopenharmony_ciFor details about the API reference, see [AudioRoutingManager](../../reference/apis-audio-kit/js-apis-audio.md#audioroutingmanager9). 24e41f4b71Sopenharmony_ci 25e41f4b71Sopenharmony_ci### Continuing the Playing of All Audio Streams 26e41f4b71Sopenharmony_ci 27e41f4b71Sopenharmony_ci1. [Obtain the output device information](audio-output-device-management.md#obtaining-output-device-information). 28e41f4b71Sopenharmony_ci 29e41f4b71Sopenharmony_ci2. Create an **AudioDeviceDescriptor** instance to describe an audio output device. 30e41f4b71Sopenharmony_ci 31e41f4b71Sopenharmony_ci3. Call **selectOutputDevice** to select a remote device, on which all the audio streams will continue playing. 32e41f4b71Sopenharmony_ci 33e41f4b71Sopenharmony_ci```ts 34e41f4b71Sopenharmony_ciimport { audio } from '@kit.AudioKit'; 35e41f4b71Sopenharmony_ciimport { BusinessError } from '@kit.BasicServicesKit'; 36e41f4b71Sopenharmony_ci 37e41f4b71Sopenharmony_cilet audioManager = audio.getAudioManager(); 38e41f4b71Sopenharmony_cilet audioRoutingManager = audioManager.getRoutingManager(); 39e41f4b71Sopenharmony_cilet outputAudioDeviceDescriptor: audio.AudioDeviceDescriptors = [{ 40e41f4b71Sopenharmony_ci deviceRole: audio.DeviceRole.OUTPUT_DEVICE, 41e41f4b71Sopenharmony_ci deviceType: audio.DeviceType.SPEAKER, 42e41f4b71Sopenharmony_ci id: 1, 43e41f4b71Sopenharmony_ci name: "", 44e41f4b71Sopenharmony_ci address: "", 45e41f4b71Sopenharmony_ci sampleRates: [44100], 46e41f4b71Sopenharmony_ci channelCounts: [2], 47e41f4b71Sopenharmony_ci channelMasks: [0], 48e41f4b71Sopenharmony_ci networkId: audio.LOCAL_NETWORK_ID, 49e41f4b71Sopenharmony_ci interruptGroupId: 1, 50e41f4b71Sopenharmony_ci volumeGroupId: 1, 51e41f4b71Sopenharmony_ci displayName: "" 52e41f4b71Sopenharmony_ci}]; 53e41f4b71Sopenharmony_ci 54e41f4b71Sopenharmony_ciasync function selectOutputDevice(): Promise<void> { 55e41f4b71Sopenharmony_ci audioRoutingManager.selectOutputDevice(outputAudioDeviceDescriptor, (err: BusinessError) => { 56e41f4b71Sopenharmony_ci if (err) { 57e41f4b71Sopenharmony_ci console.error(`Invoke selectOutputDevice failed, code is ${err.code}, message is ${err.message}`); 58e41f4b71Sopenharmony_ci } else { 59e41f4b71Sopenharmony_ci console.info('Invoke selectOutputDevice succeeded.'); 60e41f4b71Sopenharmony_ci } 61e41f4b71Sopenharmony_ci }); 62e41f4b71Sopenharmony_ci} 63e41f4b71Sopenharmony_ci``` 64e41f4b71Sopenharmony_ci 65e41f4b71Sopenharmony_ci### Continuing the Playing of the Specified Audio Stream 66e41f4b71Sopenharmony_ci 67e41f4b71Sopenharmony_ci1. [Obtain the output device information](audio-output-device-management.md#obtaining-output-device-information). 68e41f4b71Sopenharmony_ci 69e41f4b71Sopenharmony_ci2. Create an **AudioRendererFilter** instance, with **uid** to specify an application and **rendererId** to specify an audio stream. 70e41f4b71Sopenharmony_ci 71e41f4b71Sopenharmony_ci3. Create an **AudioDeviceDescriptor** instance to describe an audio output device. 72e41f4b71Sopenharmony_ci 73e41f4b71Sopenharmony_ci4. Call **selectOutputDeviceByFilter** to select a remote device, on which the specified audio stream will continue playing. 74e41f4b71Sopenharmony_ci 75e41f4b71Sopenharmony_ci```ts 76e41f4b71Sopenharmony_ciimport { audio } from '@kit.AudioKit'; 77e41f4b71Sopenharmony_ciimport { BusinessError } from '@kit.BasicServicesKit'; 78e41f4b71Sopenharmony_ci 79e41f4b71Sopenharmony_cilet audioManager = audio.getAudioManager(); 80e41f4b71Sopenharmony_cilet audioRoutingManager = audioManager.getRoutingManager(); 81e41f4b71Sopenharmony_cilet outputAudioRendererFilter: audio.AudioRendererFilter = { 82e41f4b71Sopenharmony_ci uid: 20010041, 83e41f4b71Sopenharmony_ci rendererInfo: { 84e41f4b71Sopenharmony_ci usage: audio.StreamUsage.STREAM_USAGE_MUSIC, 85e41f4b71Sopenharmony_ci rendererFlags: 0 } as audio.AudioRendererInfo, 86e41f4b71Sopenharmony_ci rendererId: 0 }; 87e41f4b71Sopenharmony_ci 88e41f4b71Sopenharmony_cilet outputAudioDeviceDescriptor: audio.AudioDeviceDescriptors = [{ 89e41f4b71Sopenharmony_ci deviceRole: audio.DeviceRole.OUTPUT_DEVICE, 90e41f4b71Sopenharmony_ci deviceType: audio.DeviceType.SPEAKER, 91e41f4b71Sopenharmony_ci id: 1, 92e41f4b71Sopenharmony_ci name: "", 93e41f4b71Sopenharmony_ci address: "", 94e41f4b71Sopenharmony_ci sampleRates: [44100], 95e41f4b71Sopenharmony_ci channelCounts: [2], 96e41f4b71Sopenharmony_ci channelMasks: [0], 97e41f4b71Sopenharmony_ci networkId: audio.LOCAL_NETWORK_ID, 98e41f4b71Sopenharmony_ci interruptGroupId: 1, 99e41f4b71Sopenharmony_ci volumeGroupId: 1, 100e41f4b71Sopenharmony_ci displayName: "" 101e41f4b71Sopenharmony_ci}]; 102e41f4b71Sopenharmony_ciasync function selectOutputDeviceByFilter(): Promise<void> { 103e41f4b71Sopenharmony_ci audioRoutingManager.selectOutputDeviceByFilter(outputAudioRendererFilter, outputAudioDeviceDescriptor, (err: BusinessError) => { 104e41f4b71Sopenharmony_ci if (err) { 105e41f4b71Sopenharmony_ci console.error(`Invoke selectOutputDeviceByFilter failed, code is ${err.code}, message is ${err.message}`); 106e41f4b71Sopenharmony_ci } else { 107e41f4b71Sopenharmony_ci console.info('Invoke selectOutputDeviceByFilter succeeded.'); 108e41f4b71Sopenharmony_ci } 109e41f4b71Sopenharmony_ci }); 110e41f4b71Sopenharmony_ci} 111e41f4b71Sopenharmony_ci``` 112