1 /*
2 * Copyright (c) 2021-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 #ifndef LOG_TAG
16 #define LOG_TAG "AudioMicrophoneDescriptor"
17 #endif
18
19 #include "audio_microphone_descriptor.h"
20 #include <ability_manager_client.h>
21 #include "iservice_registry.h"
22 #include "parameter.h"
23 #include "parameters.h"
24 #include "audio_policy_log.h"
25 #include "audio_manager_listener_stub.h"
26 #include "audio_inner_call.h"
27 #include "media_monitor_manager.h"
28 #include "audio_policy_manager_factory.h"
29 #include "audio_stream_collector.h"
30
31 #include "audio_config_manager.h"
32 #include "audio_server_proxy.h"
33
34
35 namespace OHOS {
36 namespace AudioStandard {
37
38 static int32_t startMicrophoneId = 1;
39
SetMicrophoneMute(bool isMute)40 int32_t AudioMicrophoneDescriptor::SetMicrophoneMute(bool isMute)
41 {
42 AUDIO_DEBUG_LOG("SetMicrophoneMute state[%{public}d]", isMute);
43 int32_t ret = AudioServerProxy::GetInstance().SetMicrophoneMuteProxy(isMute | isMicrophoneMutePersistent_);
44 if (ret == SUCCESS) {
45 isMicrophoneMuteTemporary_ = isMute;
46 AudioStreamCollector::GetAudioStreamCollector().UpdateCapturerInfoMuteStatus(0,
47 isMicrophoneMuteTemporary_ | isMicrophoneMutePersistent_);
48 }
49 return ret;
50 }
51
SetMicrophoneMutePersistent(const bool isMute)52 int32_t AudioMicrophoneDescriptor::SetMicrophoneMutePersistent(const bool isMute)
53 {
54 AUDIO_DEBUG_LOG("state[%{public}d]", isMute);
55 isMicrophoneMutePersistent_ = isMute;
56 bool flag = isMicrophoneMuteTemporary_ | isMicrophoneMutePersistent_;
57 int32_t ret = AudioServerProxy::GetInstance().SetMicrophoneMuteProxy(flag);
58 if (ret == SUCCESS) {
59 AUDIO_INFO_LOG("UpdateCapturerInfoMuteStatus when set mic mute state persistent.");
60 AudioStreamCollector::GetAudioStreamCollector().UpdateCapturerInfoMuteStatus(0,
61 isMicrophoneMuteTemporary_|isMicrophoneMutePersistent_);
62 }
63 ret = AudioPolicyManagerFactory::GetAudioPolicyManager().SetPersistMicMuteState(isMicrophoneMutePersistent_);
64 if (ret != SUCCESS) {
65 AUDIO_ERR_LOG("Failed to save the persistent microphone mute status in setting database.");
66 return ERROR;
67 }
68 return ret;
69 }
70
GetPersistentMicMuteState()71 bool AudioMicrophoneDescriptor::GetPersistentMicMuteState()
72 {
73 return isMicrophoneMutePersistent_;
74 }
75
InitPersistentMicrophoneMuteState(bool & isMute)76 int32_t AudioMicrophoneDescriptor::InitPersistentMicrophoneMuteState(bool &isMute)
77 {
78 int32_t ret = AudioPolicyManagerFactory::GetAudioPolicyManager().GetPersistMicMuteState(isMute);
79 if (ret != SUCCESS) {
80 AUDIO_ERR_LOG("GetPersistMicMuteState failed.");
81 return ret;
82 }
83 // Ensure persistent mic mute state takes effect when first startup
84 isMicrophoneMutePersistent_ = isMute;
85 ret = AudioServerProxy::GetInstance().SetMicrophoneMuteProxy(isMicrophoneMutePersistent_);
86 if (ret == SUCCESS) {
87 AUDIO_INFO_LOG("UpdateCapturerInfoMuteStatus when audio service restart.");
88 AudioStreamCollector::GetAudioStreamCollector().UpdateCapturerInfoMuteStatus(0, isMicrophoneMutePersistent_);
89 }
90 return ret;
91 }
92
IsMicrophoneMute()93 bool AudioMicrophoneDescriptor::IsMicrophoneMute()
94 {
95 return isMicrophoneMuteTemporary_ | isMicrophoneMutePersistent_;
96 }
97
GetMicrophoneMuteTemporary()98 bool AudioMicrophoneDescriptor::GetMicrophoneMuteTemporary()
99 {
100 return isMicrophoneMuteTemporary_;
101 }
102
GetMicrophoneMutePersistent()103 bool AudioMicrophoneDescriptor::GetMicrophoneMutePersistent()
104 {
105 return isMicrophoneMutePersistent_;
106 }
107
AddMicrophoneDescriptor(std::shared_ptr<AudioDeviceDescriptor> & deviceDescriptor)108 void AudioMicrophoneDescriptor::AddMicrophoneDescriptor(std::shared_ptr<AudioDeviceDescriptor> &deviceDescriptor)
109 {
110 if (deviceDescriptor->deviceRole_ == INPUT_DEVICE &&
111 deviceDescriptor->deviceType_ != DEVICE_TYPE_FILE_SOURCE) {
112 auto isPresent = [&deviceDescriptor](const sptr<MicrophoneDescriptor> &desc) {
113 CHECK_AND_RETURN_RET_LOG(desc != nullptr, false, "Invalid device descriptor");
114 return desc->deviceType_ == deviceDescriptor->deviceType_;
115 };
116
117 auto iter = std::find_if(connectedMicrophones_.begin(), connectedMicrophones_.end(), isPresent);
118 if (iter == connectedMicrophones_.end()) {
119 sptr<MicrophoneDescriptor> micDesc = new (std::nothrow) MicrophoneDescriptor(startMicrophoneId++,
120 deviceDescriptor->deviceType_);
121 CHECK_AND_RETURN_LOG(micDesc != nullptr, "new MicrophoneDescriptor failed");
122 connectedMicrophones_.push_back(micDesc);
123 }
124 }
125 }
126
RemoveMicrophoneDescriptor(std::shared_ptr<AudioDeviceDescriptor> & deviceDescriptor)127 void AudioMicrophoneDescriptor::RemoveMicrophoneDescriptor(std::shared_ptr<AudioDeviceDescriptor> &deviceDescriptor)
128 {
129 auto isPresent = [&deviceDescriptor](const sptr<MicrophoneDescriptor> &desc) {
130 CHECK_AND_RETURN_RET_LOG(desc != nullptr, false, "Invalid device descriptor");
131 return desc->deviceType_ == deviceDescriptor->deviceType_;
132 };
133
134 auto iter = std::find_if(connectedMicrophones_.begin(), connectedMicrophones_.end(), isPresent);
135 if (iter != connectedMicrophones_.end()) {
136 connectedMicrophones_.erase(iter);
137 }
138 }
139
AddAudioCapturerMicrophoneDescriptor(int32_t sessionId,DeviceType devType)140 void AudioMicrophoneDescriptor::AddAudioCapturerMicrophoneDescriptor(int32_t sessionId, DeviceType devType)
141 {
142 if (devType == DEVICE_TYPE_NONE) {
143 audioCaptureMicrophoneDescriptor_[sessionId] = new MicrophoneDescriptor(0, DEVICE_TYPE_INVALID);
144 return;
145 }
146 auto isPresent = [&devType] (const sptr<MicrophoneDescriptor> &desc) {
147 CHECK_AND_RETURN_RET_LOG(desc != nullptr, false, "Invalid microphone descriptor");
148 return (devType == desc->deviceType_);
149 };
150
151 auto itr = std::find_if(connectedMicrophones_.begin(), connectedMicrophones_.end(), isPresent);
152 if (itr != connectedMicrophones_.end()) {
153 audioCaptureMicrophoneDescriptor_[sessionId] = *itr;
154 }
155 }
156
GetAudioCapturerMicrophoneDescriptors(int32_t sessionId)157 vector<sptr<MicrophoneDescriptor>> AudioMicrophoneDescriptor::GetAudioCapturerMicrophoneDescriptors(int32_t sessionId)
158 {
159 vector<sptr<MicrophoneDescriptor>> descList = {};
160 const auto desc = audioCaptureMicrophoneDescriptor_.find(sessionId);
161 if (desc != audioCaptureMicrophoneDescriptor_.end()) {
162 sptr<MicrophoneDescriptor> micDesc = new (std::nothrow) MicrophoneDescriptor(desc->second);
163 if (micDesc == nullptr) {
164 AUDIO_ERR_LOG("Create microphone device descriptor failed");
165 return descList;
166 }
167 descList.push_back(micDesc);
168 }
169 return descList;
170 }
171
GetAvailableMicrophones()172 vector<sptr<MicrophoneDescriptor>> AudioMicrophoneDescriptor::GetAvailableMicrophones()
173 {
174 return connectedMicrophones_;
175 }
176
UpdateAudioCapturerMicrophoneDescriptor(DeviceType devType)177 void AudioMicrophoneDescriptor::UpdateAudioCapturerMicrophoneDescriptor(DeviceType devType)
178 {
179 auto isPresent = [&devType] (const sptr<MicrophoneDescriptor> &desc) {
180 CHECK_AND_RETURN_RET_LOG(desc != nullptr, false, "Invalid microphone descriptor");
181 return (devType == desc->deviceType_);
182 };
183
184 auto itr = std::find_if(connectedMicrophones_.begin(), connectedMicrophones_.end(), isPresent);
185 if (itr != connectedMicrophones_.end()) {
186 for (auto& desc : audioCaptureMicrophoneDescriptor_) {
187 if (desc.second->deviceType_ != devType) {
188 desc.second = *itr;
189 }
190 }
191 }
192 }
193
RemoveAudioCapturerMicrophoneDescriptor(int32_t uid)194 void AudioMicrophoneDescriptor::RemoveAudioCapturerMicrophoneDescriptor(int32_t uid)
195 {
196 std::vector<std::shared_ptr<AudioCapturerChangeInfo>> audioCapturerChangeInfos;
197 AudioStreamCollector::GetAudioStreamCollector().GetCurrentCapturerChangeInfos(audioCapturerChangeInfos);
198
199 for (auto &info : audioCapturerChangeInfos) {
200 if (info->clientUID != uid && info->createrUID != uid) {
201 continue;
202 }
203 audioCaptureMicrophoneDescriptor_.erase(info->sessionId);
204 }
205 }
206
RemoveAudioCapturerMicrophoneDescriptorBySessionID(int32_t sessionID)207 void AudioMicrophoneDescriptor::RemoveAudioCapturerMicrophoneDescriptorBySessionID(int32_t sessionID)
208 {
209 audioCaptureMicrophoneDescriptor_.erase(sessionID);
210 }
211
212 }
213 }