• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024-2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "OHAudioManager.h"
17 
18 #include <set>
19 
20 #include "audio_common_log.h"
21 #include "audio_system_manager.h"
22 
23 namespace {
24 // should be same with OH_AudioScene in native_audio_common.h
25 const std::set<OHOS::AudioStandard::AudioScene> INVALID_AUDIO_SCENES = {
26     OHOS::AudioStandard::AUDIO_SCENE_DEFAULT,
27     OHOS::AudioStandard::AUDIO_SCENE_RINGING,
28     OHOS::AudioStandard::AUDIO_SCENE_PHONE_CALL,
29     OHOS::AudioStandard::AUDIO_SCENE_PHONE_CHAT,
30     OHOS::AudioStandard::AUDIO_SCENE_VOICE_RINGING
31 };
32 }
33 using OHOS::AudioStandard::OHAudioManager;
convertManager(OH_AudioManager * audioManager)34 static OHOS::AudioStandard::OHAudioManager *convertManager(OH_AudioManager *audioManager)
35 {
36     return (OHAudioManager*) audioManager;
37 }
38 
OH_GetAudioManager(OH_AudioManager ** audioManager)39 OH_AudioCommon_Result OH_GetAudioManager(OH_AudioManager **audioManager)
40 {
41     if (audioManager == nullptr) {
42         AUDIO_ERR_LOG("invalid OH_AudioManager");
43         return AUDIOCOMMON_RESULT_ERROR_INVALID_PARAM;
44     }
45     OHAudioManager *manager = OHAudioManager::GetInstance();
46     *audioManager = (OH_AudioManager *)manager;
47     return AUDIOCOMMON_RESULT_SUCCESS;
48 }
49 
OH_GetAudioScene(OH_AudioManager * manager,OH_AudioScene * scene)50 OH_AudioCommon_Result OH_GetAudioScene(OH_AudioManager* manager, OH_AudioScene *scene)
51 {
52     if (manager == nullptr || scene == nullptr) {
53         AUDIO_ERR_LOG("invalid OH_AudioManager or scene");
54         return AUDIOCOMMON_RESULT_ERROR_INVALID_PARAM;
55     }
56     *scene = static_cast<OH_AudioScene>(convertManager(manager)->GetAudioScene());
57     return AUDIOCOMMON_RESULT_SUCCESS;
58 }
59 
OH_AudioManager_RegisterAudioSceneChangeCallback(OH_AudioManager * manager,OH_AudioManager_OnAudioSceneChangeCallback callback,void * userData)60 OH_AudioCommon_Result OH_AudioManager_RegisterAudioSceneChangeCallback(OH_AudioManager *manager,
61     OH_AudioManager_OnAudioSceneChangeCallback callback, void *userData)
62 {
63     if (manager == nullptr || callback == nullptr) {
64         AUDIO_ERR_LOG("invalid OH_AudioManager or callback");
65         return AUDIOCOMMON_RESULT_ERROR_INVALID_PARAM;
66     }
67 
68     OHAudioManager *ohAudioManager = (OHAudioManager*)manager;
69     int32_t result = ohAudioManager->SetAudioSceneChangeCallback(callback, userData);
70     return static_cast<OH_AudioCommon_Result>(result);
71 }
72 
OH_AudioManager_UnregisterAudioSceneChangeCallback(OH_AudioManager * manager,OH_AudioManager_OnAudioSceneChangeCallback callback)73 OH_AudioCommon_Result OH_AudioManager_UnregisterAudioSceneChangeCallback(OH_AudioManager *manager,
74     OH_AudioManager_OnAudioSceneChangeCallback callback)
75 {
76     if (manager == nullptr || callback == nullptr) {
77         AUDIO_ERR_LOG("invalid OH_AudioManager or callback");
78         return AUDIOCOMMON_RESULT_ERROR_INVALID_PARAM;
79     }
80 
81     OHAudioManager *ohAudioManager = (OHAudioManager*)manager;
82     int32_t result = ohAudioManager->UnsetAudioSceneChangeCallback(callback);
83     return static_cast<OH_AudioCommon_Result>(result);
84 }
85 
86 namespace OHOS {
87 namespace AudioStandard {
GetInstance()88 OHAudioManager *OHAudioManager::GetInstance()
89 {
90     static OHAudioManager manager;
91     return &manager;
92 }
93 
GetAudioScene()94 AudioScene OHAudioManager::GetAudioScene()
95 {
96     AudioScene scene = AudioSystemManager::GetInstance()->GetAudioScene();
97     if (!INVALID_AUDIO_SCENES.count(scene)) {
98         AUDIO_WARNING_LOG("Get scene:%{public}d that is not defined, return defalut!", scene);
99         return AUDIO_SCENE_DEFAULT;
100     }
101     if (scene == AUDIO_SCENE_VOICE_RINGING) {
102         return AUDIO_SCENE_RINGING;
103     }
104     return scene;
105 }
106 
SetAudioSceneChangeCallback(OH_AudioManager_OnAudioSceneChangeCallback callback,void * userData)107 int32_t OHAudioManager::SetAudioSceneChangeCallback(OH_AudioManager_OnAudioSceneChangeCallback callback, void *userData)
108 {
109     CHECK_AND_RETURN_RET_LOG(callback != nullptr, AUDIOCOMMON_RESULT_ERROR_INVALID_PARAM,
110         "Failed, pointer to the fuction is nullptr");
111     if (callbacks_.count(callback) != 0) {
112         AUDIO_INFO_LOG("Callback is already registered");
113         return AUDIOCOMMON_RESULT_SUCCESS;
114     }
115 
116     auto ohAudioManagerAudioSceneChangedCallback =
117         std::make_shared<OHAudioManagerAudioSceneChangedCallback>(callback, userData);
118     CHECK_AND_RETURN_RET_LOG(ohAudioManagerAudioSceneChangedCallback != nullptr, AUDIOCOMMON_RESULT_ERROR_SYSTEM,
119         "Failed, create callback failed");
120 
121     AudioSystemManager *audioSystemManager = AudioSystemManager::GetInstance();
122     CHECK_AND_RETURN_RET_LOG(audioSystemManager != nullptr, AUDIOCOMMON_RESULT_ERROR_SYSTEM,
123         "Failed, audio system manager is nullptr");
124 
125     int32_t result = audioSystemManager->SetAudioSceneChangeCallback(
126         ohAudioManagerAudioSceneChangedCallback);
127     if (result == AUDIOCOMMON_RESULT_SUCCESS) {
128         callbacks_.emplace(callback, ohAudioManagerAudioSceneChangedCallback);
129     }
130     return result == AUDIOCOMMON_RESULT_SUCCESS ? AUDIOCOMMON_RESULT_SUCCESS : AUDIOCOMMON_RESULT_ERROR_SYSTEM;
131 }
132 
UnsetAudioSceneChangeCallback(OH_AudioManager_OnAudioSceneChangeCallback callback)133 int32_t OHAudioManager::UnsetAudioSceneChangeCallback(OH_AudioManager_OnAudioSceneChangeCallback callback)
134 {
135     if (callback == nullptr || !callbacks_.count(callback)) {
136         AUDIO_ERR_LOG("Invalid callback or callback not registered");
137         return AUDIOCOMMON_RESULT_ERROR_INVALID_PARAM;
138     }
139 
140     AudioSystemManager *audioSystemManager = AudioSystemManager::GetInstance();
141     CHECK_AND_RETURN_RET_LOG(audioSystemManager != nullptr, AUDIOCOMMON_RESULT_ERROR_SYSTEM,
142         "Failed, audio system manager is nullptr");
143 
144     int32_t result = audioSystemManager->UnsetAudioSceneChangeCallback(callbacks_[callback]);
145     if (result == AUDIOCOMMON_RESULT_SUCCESS) {
146         callbacks_.erase(callback);
147     }
148     return result == AUDIOCOMMON_RESULT_SUCCESS ? AUDIOCOMMON_RESULT_SUCCESS : AUDIOCOMMON_RESULT_ERROR_SYSTEM;
149 }
150 
OnAudioSceneChange(const AudioScene audioScene)151 void OHAudioManagerAudioSceneChangedCallback::OnAudioSceneChange(const AudioScene audioScene)
152 {
153     CHECK_AND_RETURN_LOG(callback_ != nullptr, "Failed, pointer to the fuction is nullptr");
154     AudioScene scene = audioScene;
155     if (!INVALID_AUDIO_SCENES.count(audioScene)) {
156         AUDIO_WARNING_LOG("Get scene:%{public}d that is not defined, return defalut!", scene);
157         scene = AUDIO_SCENE_DEFAULT;
158     }
159     if (audioScene == AUDIO_SCENE_VOICE_RINGING) {
160         scene = AUDIO_SCENE_RINGING;
161     }
162     callback_(userData_, static_cast<OH_AudioScene>(scene));
163 }
164 }  // namespace AudioStandard
165 }  // namespace OHOS
166