• 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 "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