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