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