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