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