• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }