1 /*
2 * Copyright (c) 2024 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 "audio_memo.h"
17 #include "log.h"
18 #include "audio_stream_info.h"
19 #include "audio_source_type.h"
20 #include "audio_info.h"
21 #include "monitor_error.h"
22
23 namespace {
24 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_FOUNDATION, "AudioMemo"};
25 constexpr int32_t EXCLUDED = 0;
26 constexpr int32_t UNEXCLUDED = 1;
27 }
28
29 namespace OHOS {
30 namespace Media {
31 namespace MediaMonitor {
32
UpdataRouteInfo(std::shared_ptr<EventBean> & bean)33 void AudioMemo::UpdataRouteInfo(std::shared_ptr<EventBean> &bean)
34 {
35 MEDIA_LOG_D("Begin updata preferred device");
36 if (bean == nullptr) {
37 MEDIA_LOG_E("eventBean is nullptr");
38 return;
39 }
40 bool isInDeviceMap = false;
41 PreferredType preferredType = GetPreferredType(bean);
42 std::map<PreferredType, std::shared_ptr<MonitorDeviceInfo>>::iterator iter;
43 std::lock_guard<std::mutex> lockEventMap(preferredDeviceMutex_);
44 for (iter = preferredDevices_.begin(); iter != preferredDevices_.end(); iter++) {
45 if (iter->first == preferredType) {
46 iter->second->deviceType_ = bean->GetIntValue("DEVICE_TYPE");
47 iter->second->deviceName_ = bean->GetIntValue("DEVICE_NAME");
48 iter->second->address_ = bean->GetIntValue("ADDRESS");
49 iter->second->deviceCategory_ = bean->GetIntValue("BT_TYPE");
50 iter->second->usageOrSourceType_ = bean->GetIntValue("STREAM_TYPE");
51 isInDeviceMap = true;
52 }
53 }
54 if (!isInDeviceMap) {
55 std::shared_ptr<MonitorDeviceInfo> deviceInfo = std::make_shared<MonitorDeviceInfo>();
56 deviceInfo->deviceType_ = bean->GetIntValue("DEVICE_TYPE");
57 deviceInfo->deviceName_ = bean->GetIntValue("DEVICE_NAME");
58 deviceInfo->address_ = bean->GetIntValue("ADDRESS");
59 deviceInfo->deviceCategory_ = bean->GetIntValue("BT_TYPE");
60 deviceInfo->usageOrSourceType_ = bean->GetIntValue("STREAM_TYPE");
61 preferredDevices_.emplace(preferredType, deviceInfo);
62 }
63 }
64
GetAudioRouteMsg(std::map<PreferredType,std::shared_ptr<MonitorDeviceInfo>> & preferredDevices)65 int32_t AudioMemo::GetAudioRouteMsg(std::map<PreferredType, std::shared_ptr<MonitorDeviceInfo>> &preferredDevices)
66 {
67 MEDIA_LOG_D("Begin get preferred device");
68 std::lock_guard<std::mutex> lockEventMap(preferredDeviceMutex_);
69 preferredDevices = preferredDevices_;
70 return SUCCESS;
71 }
72
GetPreferredType(std::shared_ptr<EventBean> & bean)73 PreferredType AudioMemo::GetPreferredType(std::shared_ptr<EventBean> &bean)
74 {
75 if (bean->GetIntValue("IS_PLAYBACK")) {
76 return GetPreferredRenderType(bean->GetIntValue("STREAM_TYPE"));
77 } else {
78 return GetPreferredCaptureType(bean->GetIntValue("AUDIO_SCENE"));
79 }
80 }
81
GetPreferredRenderType(int32_t streamUsage)82 PreferredType AudioMemo::GetPreferredRenderType(int32_t streamUsage)
83 {
84 if (streamUsage == AudioStandard::STREAM_USAGE_VOICE_COMMUNICATION ||
85 streamUsage == AudioStandard::STREAM_USAGE_VOICE_MODEM_COMMUNICATION ||
86 streamUsage == AudioStandard::STREAM_USAGE_VIDEO_COMMUNICATION) {
87 return CALL_RENDER;
88 } else {
89 return MEDIA_RENDER;
90 }
91 }
92
GetPreferredCaptureType(int32_t audioScene)93 PreferredType AudioMemo::GetPreferredCaptureType(int32_t audioScene)
94 {
95 if (audioScene == AudioStandard::AUDIO_SCENE_PHONE_CALL ||
96 audioScene == AudioStandard::AUDIO_SCENE_PHONE_CHAT ||
97 audioScene == AudioStandard::SOURCE_TYPE_VOICE_COMMUNICATION) {
98 return CALL_CAPTURE;
99 } else {
100 return RECORD_CAPTURE;
101 }
102 }
103
WriteInfo(int32_t fd,std::string & dumpString)104 void AudioMemo::WriteInfo(int32_t fd, std::string &dumpString)
105 {
106 if (fd != -1) {
107 std::lock_guard<std::mutex> lockEventMap(preferredDeviceMutex_);
108 if (preferredDevices_.size() == 0) {
109 dumpString += "No preferred device set.\n";
110 return;
111 }
112 dumpString += "Preferred Device\n";
113 for (auto &it : preferredDevices_) {
114 dumpString += " preferred type: " + GetPreferredNameFromType(it.first) + "\n";
115 dumpString += " device type: " + std::to_string(it.second->deviceType_) + "\n";
116 dumpString += "\n";
117 }
118 }
119 }
120
GetPreferredNameFromType(const PreferredType & type)121 std::string AudioMemo::GetPreferredNameFromType(const PreferredType &type)
122 {
123 std::string preferredName = "";
124 switch (type) {
125 case CALL_RENDER:
126 preferredName = "call render";
127 break;
128 case MEDIA_RENDER:
129 preferredName = "media render";
130 break;
131 case CALL_CAPTURE:
132 preferredName = "call capture";
133 break;
134 case RECORD_CAPTURE:
135 preferredName = "record capture";
136 break;
137 default:
138 break;
139 }
140 return preferredName;
141 }
142
ErasePreferredDeviceByType(const PreferredType & preferredType)143 int32_t AudioMemo::ErasePreferredDeviceByType(const PreferredType &preferredType)
144 {
145 MEDIA_LOG_D("Erase preferred device by type");
146 std::lock_guard<std::mutex> lockEventMap(preferredDeviceMutex_);
147 auto iter = preferredDevices_.find(preferredType);
148 if (iter != preferredDevices_.end()) {
149 preferredDevices_.erase(iter);
150 return SUCCESS;
151 }
152 return ERROR;
153 }
154
UpdateExcludedDevice(std::shared_ptr<EventBean> & bean)155 void AudioMemo::UpdateExcludedDevice(std::shared_ptr<EventBean> &bean)
156 {
157 MEDIA_LOG_D("Begin updata excluded device");
158 if (bean == nullptr) {
159 MEDIA_LOG_E("eventBean is nullptr");
160 return;
161 }
162 AudioDeviceUsage audioDeviceUsage = static_cast<AudioDeviceUsage>(bean->GetIntValue("AUDIO_DEVICE_USAGE"));
163 std::map<AudioDeviceUsage, std::vector<std::shared_ptr<MonitorDeviceInfo>>>::iterator iter;
164 std::lock_guard<std::mutex> lockEventMap(excludedDeviceMutex_);
165 std::shared_ptr<MonitorDeviceInfo> deviceInfo = std::make_shared<MonitorDeviceInfo>();
166 deviceInfo->deviceType_ = bean->GetIntValue("DEVICE_TYPE");
167 deviceInfo->deviceCategory_ = bean->GetIntValue("BT_TYPE");
168 deviceInfo->usageOrSourceType_ = bean->GetIntValue("STREAM_TYPE");
169 deviceInfo->audioDeviceUsage_ = bean->GetIntValue("AUDIO_DEVICE_USAGE");
170 deviceInfo->deviceName_ = bean->GetStringValue("DEVICE_NAME");
171 deviceInfo->address_ = bean->GetStringValue("ADDRESS");
172 deviceInfo->networkId_ = bean->GetStringValue("NETWORKID");
173 int32_t exclusionStatus = bean->GetIntValue("EXCLUSION_STATUS");
174 UpdateExcludedDeviceInner(audioDeviceUsage, deviceInfo, exclusionStatus);
175 }
176
UpdateExcludedDeviceInner(AudioDeviceUsage audioDevUsage,std::shared_ptr<MonitorDeviceInfo> & deviceInfo,int32_t exclusionStatus)177 void AudioMemo::UpdateExcludedDeviceInner(AudioDeviceUsage audioDevUsage,
178 std::shared_ptr<MonitorDeviceInfo> &deviceInfo, int32_t exclusionStatus)
179 {
180 auto isPresent = [&deviceInfo](const std::shared_ptr<MonitorDeviceInfo> &device) {
181 return device->deviceType_ == deviceInfo->deviceType_ &&
182 device->address_ == deviceInfo->address_ &&
183 device->networkId_ == deviceInfo->networkId_;
184 };
185 if (exclusionStatus == EXCLUDED) {
186 auto it = find_if(excludedDevices_[audioDevUsage].begin(), excludedDevices_[audioDevUsage].end(),
187 isPresent);
188 if (it == excludedDevices_[audioDevUsage].end()) {
189 excludedDevices_[audioDevUsage].push_back(deviceInfo);
190 }
191 } else if (exclusionStatus == UNEXCLUDED) {
192 auto it = find_if(excludedDevices_[audioDevUsage].begin(), excludedDevices_[audioDevUsage].end(),
193 isPresent);
194 if (it != excludedDevices_[audioDevUsage].end()) {
195 excludedDevices_[audioDevUsage].erase(it);
196 }
197 }
198 }
199
GetAudioExcludedDevicesMsg(std::map<AudioDeviceUsage,std::vector<std::shared_ptr<MonitorDeviceInfo>>> & excludedDevices)200 int32_t AudioMemo::GetAudioExcludedDevicesMsg(std::map<AudioDeviceUsage,
201 std::vector<std::shared_ptr<MonitorDeviceInfo>>> &excludedDevices)
202 {
203 MEDIA_LOG_D("Begin get excluded device");
204 std::lock_guard<std::mutex> lockEventMap(excludedDeviceMutex_);
205 excludedDevices = excludedDevices_;
206 return SUCCESS;
207 }
208 } // namespace MediaMonitor
209 } // namespace Media
210 } // namespace OHOS