1# Using AudioSession to Manage Audio Focus (C/C++)
2
3In the scenario where multiple audio streams are concurrently playing, the system has preset a [default audio focus strategy](audio-playback-concurrency.md#audio-focus-strategy) for unified audio focus management of all streams (including playback and recording).
4
5An application can use an audio session provided by the audio session manager to actively manage the audio focus. Specifically, it can customize an audio focus strategy and determine the timing for releasing the audio focus, thereby meeting its specific service needs.
6
7This topic describes the usage and precautions of the C APIs related to the audio session. For more information about the audio focus and audio session, see [Introduction to Audio Focus and Audio Session](audio-playback-concurrency.md).
8
9## Prerequisites
10
11To use the audio session manager provided by OHAudio, add the corresponding header file.
12
13### Linking the Dynamic Library in the CMake Script
14
15``` cmake
16target_link_libraries(sample PUBLIC libohaudio.so)
17```
18
19### Adding a Header File
20
21Include the [native_audio_session_manager.h](../../reference/apis-audio-kit/native__audio__session__manager_8h.md) header file.
22
23```cpp
24#include <ohaudio/native_audio_session_manager.h>
25```
26
27## Obtaining an Audio Session Manager
28
29Create an [OH_AudioSessionManager](../../reference/apis-audio-kit/_o_h_audio.md#oh_audiosessionmanager) instance. Before using any APIs of **OH_AudioSessionManager**, you must use [OH_AudioManager_GetAudioSessionManager](../../reference/apis-audio-kit/_o_h_audio.md#oh_audiomanager_getaudiosessionmanager) to obtain an **OH_AudioSessionManager** instance.
30
31  ```cpp
32  OH_AudioSessionManager *audioSessionManager;
33  OH_AudioManager_GetAudioSessionManager(&audioSessionManager);
34  ```
35
36## Activating an Audio Session
37
38Call [OH_AudioSessionManager_ActivateAudioSession](../../reference/apis-audio-kit/_o_h_audio.md#oh_audiosessionmanager_activateaudiosession) to activate an audio session.
39
40During the activation, specify an [audio session strategy](../../reference/apis-audio-kit/_o_h_audio.md#oh_audiosession_strategy). The strategy contains the [OH_AudioSession_ConcurrencyMode](../../reference/apis-audio-kit/_o_h_audio.md#oh_audiosession_concurrencymode) parameter, which is used to declare the audio concurrency strategy.
41
42  ```cpp
43  OH_AudioSession_Strategy strategy = {CONCURRENCY_MIX_WITH_OTHERS};
44
45  OH_AudioSessionManager_ActivateAudioSession(audioSessionManager, &strategy);
46  ```
47
48## Checking Whether an Audio Session Is Activated
49
50Call [OH_AudioSessionManager_IsAudioSessionActivated](../../reference/apis-audio-kit/_o_h_audio.md#oh_audiosessionmanager_isaudiosessionactivated) to check whether an audio session is activated.
51
52  ```cpp
53  bool isActivated = OH_AudioSessionManager_IsAudioSessionActivated(audioSessionManager);
54  ```
55
56## Deactivating an Audio Session
57
58Call [OH_AudioSessionManager_DeactivateAudioSession](../../reference/apis-audio-kit/_o_h_audio.md#oh_audiosessionmanager_deactivateaudiosession) to deactivate an audio session.
59
60  ```cpp
61  OH_AudioSessionManager_DeactivateAudioSession(audioSessionManager);
62  ```
63
64## Listening for Audio Session Deactivation Events
65
66When using the audio session, you are advised to listen for the [OH_AudioSession_DeactivatedEvent](../../reference/apis-audio-kit/_o_h_audio.md#oh_audiosession_deactivatedevent) event.
67
68When an audio session is deactivated (not proactively), the application receives [OH_AudioSession_DeactivatedEvent](../../reference/apis-audio-kit/_o_h_audio.md#oh_audiosession_deactivatedevent), which contains [OH_AudioSession_DeactivatedReason](../../reference/apis-audio-kit/_o_h_audio.md#oh_audiosession_deactivatedreason).
69
70Upon this event, the application can perform operations based on service requirements, for example, releasing resources or reactivating the audio session.
71
72### Defining a Callback
73
74  ```cpp
75  int32_t MyAudioSessionDeactivatedCallback(OH_AudioSession_DeactivatedEvent event)
76  {
77    switch(event.reason) {
78      case DEACTIVATED_LOWER_PRIORITY:
79        // The application focus is preempted.
80        return 0;
81      case DEACTIVATED_TIMEOUT:
82        // A timeout error occurs.
83        return 0;
84    }
85  }
86  ```
87
88### Registering a Callback to Listen for Audio Session Deactivation Events
89
90Call [OH_AudioSessionManager_RegisterSessionDeactivatedCallback](../../reference/apis-audio-kit/_o_h_audio.md#oh_audiosessionmanager_registersessiondeactivatedcallback) to register a callback to listen for audio session deactivation events.
91
92```cpp
93OH_AudioSessionManager_RegisterSessionDeactivatedCallback(audioSessionManager, MyAudioSessionDeactivatedCallback);
94```
95
96### Unregistering the Callback Used to Listen for Audio Session Deactivation Events
97
98Call [OH_AudioSessionManager_UnregisterSessionDeactivatedCallback](../../reference/apis-audio-kit/_o_h_audio.md#oh_audiosessionmanager_unregistersessiondeactivatedcallback) to cancel listening for audio session deactivation events.
99
100```cpp
101OH_AudioSessionManager_UnregisterSessionDeactivatedCallback(audioSessionManager, MyAudioSessionDeactivatedCallback);
102```
103
104## Sample Code
105
106Refer to the sample code below to complete the process of creating, activating, and listening of an audio session.
107
108  ```cpp
109  #include <cstdint>
110  #include "ohaudio/native_audio_session_manager.h"
111
112  int32_t MyAudioSessionDeactivatedCallback(OH_AudioSession_DeactivatedEvent event)
113  {
114    switch(event.reason) {
115      case DEACTIVATED_LOWER_PRIORITY:
116        // The application focus is preempted.
117        return 0;
118      case DEACTIVATED_TIMEOUT:
119        // A timeout error occurs.
120        return 0;
121    }
122  }
123
124  OH_AudioSessionManager *audioSessionManager;
125
126  // Create an OH_AudioSessionManager instance.
127  OH_AudioCommon_Result resultManager = OH_AudioManager_GetAudioSessionManager(&audioSessionManager);
128
129  OH_AudioSession_Strategy strategy = {CONCURRENCY_MIX_WITH_OTHERS};
130
131  // Set an audio concurrency mode and activate an audio session.
132  OH_AudioCommon_Result resultActivate = OH_AudioSessionManager_ActivateAudioSession(audioSessionManager, &strategy);
133
134  // Check whether the audio session is activated.
135  bool isActivated = OH_AudioSessionManager_IsAudioSessionActivated(audioSessionManager);
136
137  // Listen for audio session deactivation events.
138  OH_AudioCommon_Result resultRegister = OH_AudioSessionManager_RegisterSessionDeactivatedCallback(audioSessionManager, MyAudioSessionDeactivatedCallback);
139
140  // After the audio session is activated, the application can perform operations such as playing, pausing, stopping, and releasing audio streams.
141
142  // Cancel listening for audio session deactivation events.
143  OH_AudioCommon_Result resultUnregister = OH_AudioSessionManager_UnregisterSessionDeactivatedCallback(audioSessionManager, MyAudioSessionDeactivatedCallback);
144
145  // Deactivate the audio session.
146  OH_AudioCommon_Result resultDeactivate = OH_AudioSessionManager_DeactivateAudioSession(audioSessionManager);
147  ```
148