• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Audio Playback Stream Management (ArkTS)
2
3An 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.
4
5## Reading or Listening for Audio Stream State Changes in the Application
6
7Create 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:
8
9- Check the [state](../reference/apis-audio-kit/js-apis-audio.md#attributes) of the AudioRenderer.
10
11  ```ts
12  import audio from '@ohos.multimedia.audio';
13
14  let audioRendererState: audio.AudioState = audioRenderer.state;
15  console.info(`Current state is: ${audioRendererState }`)
16  ```
17
18- Register **stateChange** to listen for state changes of the AudioRenderer.
19
20  ```ts
21  import audio from '@ohos.multimedia.audio';
22
23  audioRenderer.on('stateChange', (rendererState: audio.AudioState) => {
24    console.info(`State change to: ${rendererState}`)
25  });
26  ```
27
28The 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).
29
30## Reading or Listening for Changes in All Audio Streams
31
32If 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.
33
34> **NOTE**
35>
36> The audio stream change information marked as the system API can be viewed only by system applications.
37
38The figure below shows the call relationship of audio stream management.
39
40![Call relationship of audio stream management](figures/audio-stream-mgmt-invoking-relationship.png)
41
42During 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.
43
44For details about the APIs, see [AudioStreamManager](../reference/apis-audio-kit/js-apis-audio.md#audiostreammanager9).
45
46## How to Develop
47
481. Create an **AudioStreamManager** instance.
49
50   Before using **AudioStreamManager** APIs, you must use **getStreamManager()** to create an **AudioStreamManager** instance.
51
52   ```ts
53   import audio from '@ohos.multimedia.audio';
54
55   let audioManager = audio.getAudioManager();
56   let audioStreamManager = audioManager.getStreamManager();
57   ```
58
592. 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.
60
61   ```ts
62   import audio from '@ohos.multimedia.audio';
63
64   audioStreamManager.on('audioRendererChange',  (AudioRendererChangeInfoArray: audio.AudioRendererChangeInfoArray) => {
65     for (let i = 0; i < AudioRendererChangeInfoArray.length; i++) {
66       let AudioRendererChangeInfo = AudioRendererChangeInfoArray[i];
67       console.info(`## RendererChange on is called for ${i} ##`);
68       console.info(`StreamId for ${i} is: ${AudioRendererChangeInfo.streamId}`);
69       console.info(`Content ${i} is: ${AudioRendererChangeInfo.rendererInfo.content}`);
70       console.info(`Stream ${i} is: ${AudioRendererChangeInfo.rendererInfo.usage}`);
71       console.info(`Flag ${i} is: ${AudioRendererChangeInfo.rendererInfo.rendererFlags}`);
72       for (let j = 0;j < AudioRendererChangeInfo.deviceDescriptors.length; j++) {
73         console.info(`Id: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].id}`);
74         console.info(`Type: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].deviceType}`);
75         console.info(`Role: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].deviceRole}`);
76         console.info(`Name: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].name}`);
77         console.info(`Address: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].address}`);
78         console.info(`SampleRates: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].sampleRates[0]}`);
79         console.info(`ChannelCount ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].channelCounts[0]}`);
80         console.info(`ChannelMask: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].channelMasks}`);
81       }
82     }
83   });
84   ```
85
863. (Optional) Use **off('audioRendererChange')** to cancel listening for audio playback stream changes.
87
88   ```ts
89   audioStreamManager.off('audioRendererChange');
90   console.info('RendererChange Off is called ');
91   ```
92
934. (Optional) Call **getCurrentAudioRendererInfoArray()** to obtain the information about all audio playback streams.
94
95     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.
96   > **NOTE**
97   >
98   > 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.
99
100   ```ts
101   import audio from '@ohos.multimedia.audio';
102   import { BusinessError } from '@ohos.base';
103
104   async function getCurrentAudioRendererInfoArray(): Promise<void> {
105     await audioStreamManager.getCurrentAudioRendererInfoArray().then((AudioRendererChangeInfoArray: audio.AudioRendererChangeInfoArray) => {
106       console.info(`getCurrentAudioRendererInfoArray  Get Promise is called `);
107       if (AudioRendererChangeInfoArray != null) {
108         for (let i = 0; i < AudioRendererChangeInfoArray.length; i++) {
109           let AudioRendererChangeInfo = AudioRendererChangeInfoArray[i];
110           console.info(`StreamId for ${i} is: ${AudioRendererChangeInfo.streamId}`);
111           console.info(`Content ${i} is: ${AudioRendererChangeInfo.rendererInfo.content}`);
112           console.info(`Stream ${i} is: ${AudioRendererChangeInfo.rendererInfo.usage}`);
113           console.info(`Flag ${i} is: ${AudioRendererChangeInfo.rendererInfo.rendererFlags}`);
114           for (let j = 0;j < AudioRendererChangeInfo.deviceDescriptors.length; j++) {
115             console.info(`Id: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].id}`);
116             console.info(`Type: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].deviceType}`);
117             console.info(`Role: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].deviceRole}`);
118             console.info(`Name: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].name}`);
119             console.info(`Address: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].address}`);
120             console.info(`SampleRates: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].sampleRates[0]}`);
121             console.info(`ChannelCount ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].channelCounts[0]}`);
122             console.info(`ChannelMask: ${i} : ${AudioRendererChangeInfo.deviceDescriptors[j].channelMasks}`);
123           }
124         }
125       }
126     }).catch((err: BusinessError ) => {
127       console.error(`Invoke getCurrentAudioRendererInfoArray failed, code is ${err.code}, message is ${err.message}`);
128     });
129   }
130   ```
131