1e41f4b71Sopenharmony_ci# Audio Playback Stream Management
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ciAn audio playback application must notice audio stream state changes and perform corresponding operations. For example, when detecting that an audio stream is being played or paused, the application must change the UI display of the **Play** button.
4e41f4b71Sopenharmony_ci
5e41f4b71Sopenharmony_ci## Reading or Listening for Audio Stream State Changes in the Application
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ciCreate an AudioRenderer by referring to [Using AudioRenderer for Audio Playback](using-audiorenderer-for-playback.md) or [audio.createAudioRenderer](../../reference/apis-audio-kit/js-apis-audio.md#audiocreateaudiorenderer8). Then obtain the audio stream state changes in either of the following ways:
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci- Check the [state](../../reference/apis-audio-kit/js-apis-audio.md#attributes) of the AudioRenderer.
10e41f4b71Sopenharmony_ci    
11e41f4b71Sopenharmony_ci  ```ts
12e41f4b71Sopenharmony_ci  import { audio } from '@kit.AudioKit';
13e41f4b71Sopenharmony_ci  
14e41f4b71Sopenharmony_ci  let audioRendererState: audio.AudioState = audioRenderer.state;
15e41f4b71Sopenharmony_ci  console.info(`Current state is: ${audioRendererState }`)
16e41f4b71Sopenharmony_ci  ```
17e41f4b71Sopenharmony_ci
18e41f4b71Sopenharmony_ci- Register **stateChange** to listen for state changes of the AudioRenderer.
19e41f4b71Sopenharmony_ci    
20e41f4b71Sopenharmony_ci  ```ts
21e41f4b71Sopenharmony_ci  import { audio } from '@kit.AudioKit';
22e41f4b71Sopenharmony_ci  
23e41f4b71Sopenharmony_ci  audioRenderer.on('stateChange', (rendererState: audio.AudioState) => {
24e41f4b71Sopenharmony_ci    console.info(`State change to: ${rendererState}`)
25e41f4b71Sopenharmony_ci  });
26e41f4b71Sopenharmony_ci  ```
27e41f4b71Sopenharmony_ci
28e41f4b71Sopenharmony_ciThe application then performs an operation, for example, changing the display of the **Play** button, by comparing the obtained state with [AudioState](../../reference/apis-audio-kit/js-apis-audio.md#audiostate8).
29e41f4b71Sopenharmony_ci
30e41f4b71Sopenharmony_ci## Reading or Listening for Changes in All Audio Streams
31e41f4b71Sopenharmony_ci
32e41f4b71Sopenharmony_ciIf an application needs to obtain the change information about all audio streams, it can use **AudioStreamManager** to read or listen for the changes of all audio streams.
33e41f4b71Sopenharmony_ci
34e41f4b71Sopenharmony_ci<!--Del-->
35e41f4b71Sopenharmony_ci> **NOTE**
36e41f4b71Sopenharmony_ci> 
37e41f4b71Sopenharmony_ci> The audio stream change information marked as the system API can be viewed only by system applications.
38e41f4b71Sopenharmony_ci<!--DelEnd-->
39e41f4b71Sopenharmony_ci
40e41f4b71Sopenharmony_ciThe figure below shows the call relationship of audio stream management.
41e41f4b71Sopenharmony_ci
42e41f4b71Sopenharmony_ci![Call relationship of audio stream management](figures/audio-stream-mgmt-invoking-relationship.png)
43e41f4b71Sopenharmony_ci
44e41f4b71Sopenharmony_ciDuring application development, first use **getStreamManager()** to create an **AudioStreamManager** instance. Then call **on('audioRendererChange')** to listen for audio stream changes and obtain a notification when the audio stream state or device changes. To cancel the listening for these changes, call **off('audioRendererChange')**. You can also call **getCurrentAudioRendererInfoArray()** to obtain information such as the unique ID of the playback stream, UID of the playback stream client, and stream status.
45e41f4b71Sopenharmony_ci
46e41f4b71Sopenharmony_ciFor details about the APIs, see [AudioStreamManager](../../reference/apis-audio-kit/js-apis-audio.md#audiostreammanager9).
47e41f4b71Sopenharmony_ci
48e41f4b71Sopenharmony_ci## How to Develop
49e41f4b71Sopenharmony_ci
50e41f4b71Sopenharmony_ci1. Create an **AudioStreamManager** instance.
51e41f4b71Sopenharmony_ci   
52e41f4b71Sopenharmony_ci   Before using **AudioStreamManager** APIs, you must use **getStreamManager()** to create an **AudioStreamManager** instance.
53e41f4b71Sopenharmony_ci
54e41f4b71Sopenharmony_ci   ```ts
55e41f4b71Sopenharmony_ci   import { audio } from '@kit.AudioKit';
56e41f4b71Sopenharmony_ci   
57e41f4b71Sopenharmony_ci   let audioManager = audio.getAudioManager();
58e41f4b71Sopenharmony_ci   let audioStreamManager = audioManager.getStreamManager();
59e41f4b71Sopenharmony_ci   ```
60e41f4b71Sopenharmony_ci
61e41f4b71Sopenharmony_ci2. Use **on('audioRendererChange')** to listen for audio playback stream changes. If the application needs to receive a notification when the audio playback stream state or device changes, it can subscribe to this event.
62e41f4b71Sopenharmony_ci     
63e41f4b71Sopenharmony_ci   ```ts
64e41f4b71Sopenharmony_ci   import { audio } from '@kit.AudioKit';
65e41f4b71Sopenharmony_ci   
66e41f4b71Sopenharmony_ci   audioStreamManager.on('audioRendererChange',  (AudioRendererChangeInfoArray: audio.AudioRendererChangeInfoArray) => {
67e41f4b71Sopenharmony_ci     for (let i = 0; i < AudioRendererChangeInfoArray.length; i++) {
68e41f4b71Sopenharmony_ci       let AudioRendererChangeInfo = AudioRendererChangeInfoArray[i];
69e41f4b71Sopenharmony_ci       console.info(`## RendererChange on is called for ${i} ##`);
70e41f4b71Sopenharmony_ci       console.info(`StreamId for ${i} is: ${AudioRendererChangeInfo.streamId}`);
71e41f4b71Sopenharmony_ci       console.info(`Content ${i} is: ${AudioRendererChangeInfo.rendererInfo.content}`);
72e41f4b71Sopenharmony_ci       console.info(`Stream ${i} is: ${AudioRendererChangeInfo.rendererInfo.usage}`);
73e41f4b71Sopenharmony_ci       console.info(`Flag ${i} is: ${AudioRendererChangeInfo.rendererInfo.rendererFlags}`); 
74e41f4b71Sopenharmony_ci       for (let j = 0;j < AudioRendererChangeInfo.deviceDescriptors.length; j++) {
75e41f4b71Sopenharmony_ci         console.info(`Id: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].id}`);
76e41f4b71Sopenharmony_ci         console.info(`Type: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].deviceType}`);
77e41f4b71Sopenharmony_ci         console.info(`Role: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].deviceRole}`);
78e41f4b71Sopenharmony_ci         console.info(`Name: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].name}`);
79e41f4b71Sopenharmony_ci         console.info(`Address: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].address}`);
80e41f4b71Sopenharmony_ci         console.info(`SampleRates: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].sampleRates[0]}`);
81e41f4b71Sopenharmony_ci         console.info(`ChannelCount ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].channelCounts[0]}`);
82e41f4b71Sopenharmony_ci         console.info(`ChannelMask: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].channelMasks}`);
83e41f4b71Sopenharmony_ci       }
84e41f4b71Sopenharmony_ci     }
85e41f4b71Sopenharmony_ci   });
86e41f4b71Sopenharmony_ci   ```
87e41f4b71Sopenharmony_ci
88e41f4b71Sopenharmony_ci3. (Optional) Use **off('audioRendererChange')** to cancel listening for audio playback stream changes.
89e41f4b71Sopenharmony_ci     
90e41f4b71Sopenharmony_ci   ```ts
91e41f4b71Sopenharmony_ci   audioStreamManager.off('audioRendererChange');
92e41f4b71Sopenharmony_ci   console.info('RendererChange Off is called ');
93e41f4b71Sopenharmony_ci   ```
94e41f4b71Sopenharmony_ci
95e41f4b71Sopenharmony_ci4. (Optional) Call **getCurrentAudioRendererInfoArray()** to obtain the information about all audio playback streams.
96e41f4b71Sopenharmony_ci     
97e41f4b71Sopenharmony_ci     This API can be used to obtain the unique ID of the audio playback stream, UID of the audio playback client, audio status, and other information about the audio player.
98e41f4b71Sopenharmony_ci   > **NOTE**
99e41f4b71Sopenharmony_ci   >
100e41f4b71Sopenharmony_ci   > Before listening for state changes of all audio streams, the application must [declare the ohos.permission.USE_BLUETOOTH permission](../../security/AccessToken/declare-permissions.md), for the device name and device address (Bluetooth related attributes) to be displayed correctly.
101e41f4b71Sopenharmony_ci   
102e41f4b71Sopenharmony_ci   ```ts
103e41f4b71Sopenharmony_ci   import { audio } from '@kit.AudioKit';
104e41f4b71Sopenharmony_ci   import { BusinessError } from '@kit.BasicServicesKit';
105e41f4b71Sopenharmony_ci   
106e41f4b71Sopenharmony_ci   async function getCurrentAudioRendererInfoArray(): Promise<void> {
107e41f4b71Sopenharmony_ci     await audioStreamManager.getCurrentAudioRendererInfoArray().then((AudioRendererChangeInfoArray: audio.AudioRendererChangeInfoArray) => {
108e41f4b71Sopenharmony_ci       console.info(`getCurrentAudioRendererInfoArray  Get Promise is called `);
109e41f4b71Sopenharmony_ci       if (AudioRendererChangeInfoArray != null) {
110e41f4b71Sopenharmony_ci         for (let i = 0; i < AudioRendererChangeInfoArray.length; i++) {
111e41f4b71Sopenharmony_ci           let AudioRendererChangeInfo = AudioRendererChangeInfoArray[i];
112e41f4b71Sopenharmony_ci           console.info(`StreamId for ${i} is: ${AudioRendererChangeInfo.streamId}`);
113e41f4b71Sopenharmony_ci           console.info(`Content ${i} is: ${AudioRendererChangeInfo.rendererInfo.content}`);
114e41f4b71Sopenharmony_ci           console.info(`Stream ${i} is: ${AudioRendererChangeInfo.rendererInfo.usage}`);
115e41f4b71Sopenharmony_ci           console.info(`Flag ${i} is: ${AudioRendererChangeInfo.rendererInfo.rendererFlags}`);  
116e41f4b71Sopenharmony_ci           for (let j = 0;j < AudioRendererChangeInfo.deviceDescriptors.length; j++) {
117e41f4b71Sopenharmony_ci             console.info(`Id: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].id}`);
118e41f4b71Sopenharmony_ci             console.info(`Type: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].deviceType}`);
119e41f4b71Sopenharmony_ci             console.info(`Role: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].deviceRole}`);
120e41f4b71Sopenharmony_ci             console.info(`Name: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].name}`);
121e41f4b71Sopenharmony_ci             console.info(`Address: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].address}`);
122e41f4b71Sopenharmony_ci             console.info(`SampleRates: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].sampleRates[0]}`);
123e41f4b71Sopenharmony_ci             console.info(`ChannelCount ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].channelCounts[0]}`);
124e41f4b71Sopenharmony_ci             console.info(`ChannelMask: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].channelMasks}`);
125e41f4b71Sopenharmony_ci           }
126e41f4b71Sopenharmony_ci         }
127e41f4b71Sopenharmony_ci       }
128e41f4b71Sopenharmony_ci     }).catch((err: BusinessError ) => {
129e41f4b71Sopenharmony_ci       console.error(`Invoke getCurrentAudioRendererInfoArray failed, code is ${err.code}, message is ${err.message}`);
130e41f4b71Sopenharmony_ci     });
131e41f4b71Sopenharmony_ci   }
132e41f4b71Sopenharmony_ci   ```
133