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 "multimedia_audio_volume_group_manager_impl.h"
17
18 #include "audio_policy_log.h"
19 #include "cj_lambda.h"
20 #include "multimedia_audio_common.h"
21 #include "multimedia_audio_error.h"
22
23 namespace OHOS {
24 namespace AudioStandard {
25 extern "C" {
MMAAudioVolumeGroupManagerImpl(int32_t groupId)26 MMAAudioVolumeGroupManagerImpl::MMAAudioVolumeGroupManagerImpl(int32_t groupId)
27 {
28 audioMngr_ = AudioSystemManager::GetInstance();
29 audioGroupMngr_ = audioMngr_->GetGroupManager(groupId);
30 audioRingerModeCallback_ = std::make_shared<CjAudioRingerModeCallback>();
31 micStateChangeCallback_ = std::make_shared<CjAudioManagerMicStateChangeCallback>();
32 cachedClientId_ = getpid();
33 }
GetMaxVolume(int32_t volumeType)34 int32_t MMAAudioVolumeGroupManagerImpl::GetMaxVolume(int32_t volumeType)
35 {
36 if (audioGroupMngr_ == nullptr) {
37 AUDIO_ERR_LOG("invalid audio group manager instance");
38 return CJ_ERR_INVALID_VALUE;
39 }
40 auto ret = audioGroupMngr_->GetMaxVolume(GetNativeAudioVolumeType(volumeType));
41 return ret;
42 }
43
GetMinVolume(int32_t volumeType)44 int32_t MMAAudioVolumeGroupManagerImpl::GetMinVolume(int32_t volumeType)
45 {
46 if (audioGroupMngr_ == nullptr) {
47 AUDIO_ERR_LOG("invalid audio group manager instance");
48 return CJ_ERR_INVALID_VALUE;
49 }
50 auto ret = audioGroupMngr_->GetMinVolume(GetNativeAudioVolumeType(volumeType));
51 return ret;
52 }
53
GetRingerMode() const54 int32_t MMAAudioVolumeGroupManagerImpl::GetRingerMode() const
55 {
56 if (audioGroupMngr_ == nullptr) {
57 AUDIO_ERR_LOG("invalid audio group manager instance");
58 return CJ_ERR_INVALID_VALUE;
59 }
60 auto ret = audioGroupMngr_->GetRingerMode();
61 return static_cast<int32_t>(ret);
62 }
63
GetSystemVolumeInDb(int32_t volumeType,int32_t volumeLevel,int32_t deviceType)64 float MMAAudioVolumeGroupManagerImpl::GetSystemVolumeInDb(int32_t volumeType, int32_t volumeLevel, int32_t deviceType)
65 {
66 if (audioGroupMngr_ == nullptr) {
67 AUDIO_ERR_LOG("invalid audio group manager instance");
68 return CJ_ERR_INVALID_RETURN_FLOAT_VALUE;
69 }
70 auto ret = audioGroupMngr_->GetSystemVolumeInDb(
71 GetNativeAudioVolumeType(volumeType), volumeLevel, static_cast<DeviceType>(deviceType));
72 return ret;
73 }
74
GetVolume(int32_t volumeType)75 int32_t MMAAudioVolumeGroupManagerImpl::GetVolume(int32_t volumeType)
76 {
77 if (audioGroupMngr_ == nullptr) {
78 AUDIO_ERR_LOG("invalid audio group manager instance");
79 return CJ_ERR_INVALID_VALUE;
80 }
81 auto ret = audioGroupMngr_->GetVolume(GetNativeAudioVolumeType(volumeType));
82 return ret;
83 }
84
IsMicrophoneMute()85 bool MMAAudioVolumeGroupManagerImpl::IsMicrophoneMute()
86 {
87 if (audioGroupMngr_ == nullptr) {
88 AUDIO_ERR_LOG("invalid audio group manager instance");
89 return false;
90 }
91 auto ret = audioGroupMngr_->IsMicrophoneMute();
92 return ret;
93 }
94
IsMute(int32_t volumeType)95 bool MMAAudioVolumeGroupManagerImpl::IsMute(int32_t volumeType)
96 {
97 bool isMute { false };
98 if (audioGroupMngr_ == nullptr) {
99 AUDIO_ERR_LOG("invalid audio group manager instance");
100 return isMute;
101 }
102 auto ret = audioGroupMngr_->IsStreamMute(GetNativeAudioVolumeType(volumeType), isMute);
103 if (ret != NATIVE_SUCCESS) {
104 AUDIO_ERR_LOG("failed to get mute status.");
105 }
106 return isMute;
107 }
108
IsVolumeUnadjustable()109 bool MMAAudioVolumeGroupManagerImpl::IsVolumeUnadjustable()
110 {
111 if (audioGroupMngr_ == nullptr) {
112 AUDIO_ERR_LOG("invalid audio group manager instance");
113 return false;
114 }
115 auto ret = audioGroupMngr_->IsVolumeUnadjustable();
116 return ret;
117 }
118
GetMaxAmplitudeForOutputDevice(const int32_t deviceId)119 float MMAAudioVolumeGroupManagerImpl::GetMaxAmplitudeForOutputDevice(const int32_t deviceId)
120 {
121 if (audioGroupMngr_ == nullptr) {
122 AUDIO_ERR_LOG("invalid audio group manager instance");
123 return CJ_ERR_INVALID_RETURN_FLOAT_VALUE;
124 }
125 auto ret = audioGroupMngr_->GetMaxAmplitude(deviceId);
126 if (ret < 0) {
127 AUDIO_ERR_LOG("failed to get MaxAmplitude.");
128 }
129 return ret;
130 }
131
GetMaxAmplitudeForInputDevice(const int32_t deviceId)132 float MMAAudioVolumeGroupManagerImpl::GetMaxAmplitudeForInputDevice(const int32_t deviceId)
133 {
134 if (audioGroupMngr_ == nullptr) {
135 AUDIO_ERR_LOG("invalid audio group manager instance");
136 return CJ_ERR_INVALID_RETURN_FLOAT_VALUE;
137 }
138 auto ret = audioGroupMngr_->GetMaxAmplitude(deviceId);
139 if (ret < 0) {
140 AUDIO_ERR_LOG("failed to get MaxAmplitude.");
141 }
142 return ret;
143 }
144
RegisterCallback(int32_t callbackType,void (* callback)(),int32_t * errorCode)145 void MMAAudioVolumeGroupManagerImpl::RegisterCallback(int32_t callbackType, void (*callback)(), int32_t* errorCode)
146 {
147 if (errorCode == nullptr) {
148 AUDIO_ERR_LOG("invalid pointer");
149 return;
150 }
151 if (audioGroupMngr_ == nullptr) {
152 AUDIO_ERR_LOG("invalid audio group manager instance");
153 *errorCode = CJ_ERR_SYSTEM;
154 return;
155 }
156 switch (callbackType) {
157 case AudioVolumeGroupManagerCallbackType::RING_MODE_CHANGE: {
158 auto func = CJLambda::Create(reinterpret_cast<void (*)(int32_t)>(callback));
159 if (func == nullptr) {
160 AUDIO_ERR_LOG("Register RING_MODE_CHANGE event failure!");
161 *errorCode = CJ_ERR_SYSTEM;
162 return;
163 }
164 audioRingerModeCallback_->RegisterFunc(func);
165 audioGroupMngr_->SetRingerModeCallback(cachedClientId_, audioRingerModeCallback_);
166 break;
167 }
168 case AudioVolumeGroupManagerCallbackType::MICSTATE_CHANGE: {
169 auto func = CJLambda::Create(reinterpret_cast<void (*)(CMicStateChangeEvent)>(callback));
170 if (func == nullptr) {
171 AUDIO_ERR_LOG("Register MICSTATE_CHANGE event failure!");
172 *errorCode = CJ_ERR_SYSTEM;
173 return;
174 }
175 micStateChangeCallback_->RegisterFunc(func);
176 audioGroupMngr_->SetMicStateChangeCallback(micStateChangeCallback_);
177 break;
178 }
179 default:
180 AUDIO_ERR_LOG("No such callback supported");
181 }
182 }
183 }
184 } // namespace AudioStandard
185 } // namespace OHOS
186