1 /*
2 * Copyright (c) 2023 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 "PrivacyPriorityRouter"
17 #endif
18
19 #include "privacy_priority_router.h"
20
21 using namespace std;
22
23 namespace OHOS {
24 namespace AudioStandard {
25
GetMediaRenderDevice(StreamUsage streamUsage,int32_t clientUID)26 unique_ptr<AudioDeviceDescriptor> PrivacyPriorityRouter::GetMediaRenderDevice(StreamUsage streamUsage,
27 int32_t clientUID)
28 {
29 vector<unique_ptr<AudioDeviceDescriptor>> descs =
30 AudioDeviceManager::GetAudioDeviceManager().GetMediaRenderPrivacyDevices();
31 unique_ptr<AudioDeviceDescriptor> desc = GetLatestConnectDeivce(descs);
32 AUDIO_DEBUG_LOG("streamUsage %{public}d clientUID %{public}d fetch device %{public}d", streamUsage,
33 clientUID, desc->deviceType_);
34 return desc;
35 }
36
RemoveArmUsb(vector<unique_ptr<AudioDeviceDescriptor>> & descs)37 void PrivacyPriorityRouter::RemoveArmUsb(vector<unique_ptr<AudioDeviceDescriptor>> &descs)
38 {
39 auto isPresent = [] (const unique_ptr<AudioDeviceDescriptor> &desc) {
40 CHECK_AND_RETURN_RET_LOG(desc != nullptr, false, "Invalid device descriptor");
41 return desc->deviceType_ == DEVICE_TYPE_USB_ARM_HEADSET;
42 };
43
44 auto removeBeginIt = std::remove_if(descs.begin(), descs.end(), isPresent);
45 size_t deleteNum = static_cast<uint32_t>(descs.end() - removeBeginIt);
46 descs.erase(removeBeginIt, descs.end());
47 AUDIO_INFO_LOG("Remove %{public}zu desc from privacy list", deleteNum);
48 }
49
GetCallRenderDevice(StreamUsage streamUsage,int32_t clientUID)50 unique_ptr<AudioDeviceDescriptor> PrivacyPriorityRouter::GetCallRenderDevice(StreamUsage streamUsage,
51 int32_t clientUID)
52 {
53 vector<unique_ptr<AudioDeviceDescriptor>> descs =
54 AudioDeviceManager::GetAudioDeviceManager().GetCommRenderPrivacyDevices();
55
56 if (streamUsage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION) {
57 RemoveArmUsb(descs);
58 }
59
60 unique_ptr<AudioDeviceDescriptor> desc = GetLatestConnectDeivce(descs);
61 AUDIO_DEBUG_LOG("streamUsage %{public}d clientUID %{public}d fetch device %{public}d", streamUsage,
62 clientUID, desc->deviceType_);
63 return desc;
64 }
65
GetCallCaptureDevice(SourceType sourceType,int32_t clientUID)66 unique_ptr<AudioDeviceDescriptor> PrivacyPriorityRouter::GetCallCaptureDevice(SourceType sourceType,
67 int32_t clientUID)
68 {
69 vector<unique_ptr<AudioDeviceDescriptor>> descs =
70 AudioDeviceManager::GetAudioDeviceManager().GetCommCapturePrivacyDevices();
71 unique_ptr<AudioDeviceDescriptor> desc = GetLatestConnectDeivce(descs);
72 AUDIO_DEBUG_LOG("sourceType %{public}d clientUID %{public}d fetch device %{public}d", sourceType,
73 clientUID, desc->deviceType_);
74 return desc;
75 }
76
GetRingRenderDevices(StreamUsage streamUsage,int32_t clientUID)77 vector<std::unique_ptr<AudioDeviceDescriptor>> PrivacyPriorityRouter::GetRingRenderDevices(StreamUsage streamUsage,
78 int32_t clientUID)
79 {
80 AudioRingerMode curRingerMode = audioPolicyManager_.GetRingerMode();
81 vector<unique_ptr<AudioDeviceDescriptor>> descs;
82 vector<unique_ptr<AudioDeviceDescriptor>> curDescs;
83 if (streamUsage == STREAM_USAGE_VOICE_RINGTONE || streamUsage == STREAM_USAGE_RINGTONE) {
84 curDescs = AudioDeviceManager::GetAudioDeviceManager().GetCommRenderPrivacyDevices();
85 } else {
86 curDescs = AudioDeviceManager::GetAudioDeviceManager().GetMediaRenderPrivacyDevices();
87 }
88
89 unique_ptr<AudioDeviceDescriptor> latestConnDesc = GetLatestConnectDeivce(curDescs);
90 if (!latestConnDesc.get()) {
91 AUDIO_INFO_LOG("Have no latest connecte desc, just only add default device.");
92 descs.push_back(make_unique<AudioDeviceDescriptor>());
93 return descs;
94 }
95 if (latestConnDesc->getType() == DEVICE_TYPE_NONE) {
96 AUDIO_INFO_LOG("Latest connecte desc type is none, just only add default device.");
97 descs.push_back(make_unique<AudioDeviceDescriptor>());
98 return descs;
99 }
100
101 if (latestConnDesc->getType() == DEVICE_TYPE_WIRED_HEADSET ||
102 latestConnDesc->getType() == DEVICE_TYPE_WIRED_HEADPHONES ||
103 latestConnDesc->getType() == DEVICE_TYPE_BLUETOOTH_SCO ||
104 latestConnDesc->getType() == DEVICE_TYPE_USB_HEADSET ||
105 latestConnDesc->getType() == DEVICE_TYPE_BLUETOOTH_A2DP ||
106 latestConnDesc->getType() == DEVICE_TYPE_USB_ARM_HEADSET) {
107 // Add the latest connected device.
108 descs.push_back(move(latestConnDesc));
109 switch (streamUsage) {
110 case STREAM_USAGE_ALARM:
111 // Add default device at same time for alarm.
112 descs.push_back(AudioDeviceManager::GetAudioDeviceManager().GetRenderDefaultDevice());
113 break;
114 case STREAM_USAGE_VOICE_RINGTONE:
115 case STREAM_USAGE_RINGTONE:
116 if (curRingerMode == RINGER_MODE_NORMAL) {
117 // Add default devices at same time only in ringer normal mode.
118 descs.push_back(AudioDeviceManager::GetAudioDeviceManager().GetRenderDefaultDevice());
119 }
120 break;
121 default:
122 AUDIO_DEBUG_LOG("Don't add default device at the same time.");
123 break;
124 }
125 } else if (latestConnDesc->getType() != DEVICE_TYPE_NONE) {
126 descs.push_back(move(latestConnDesc));
127 } else {
128 descs.push_back(make_unique<AudioDeviceDescriptor>());
129 }
130 return descs;
131 }
132
GetRecordCaptureDevice(SourceType sourceType,int32_t clientUID)133 unique_ptr<AudioDeviceDescriptor> PrivacyPriorityRouter::GetRecordCaptureDevice(SourceType sourceType,
134 int32_t clientUID)
135 {
136 if (sourceType == SOURCE_TYPE_VOICE_RECOGNITION) {
137 vector<unique_ptr<AudioDeviceDescriptor>> descs =
138 AudioDeviceManager::GetAudioDeviceManager().GetRecongnitionCapturePrivacyDevices();
139 unique_ptr<AudioDeviceDescriptor> desc = GetLatestConnectDeivce(descs);
140 AUDIO_DEBUG_LOG(" RecongnitionsourceType %{public}d clientUID %{public}d fetch device %{public}d", sourceType,
141 clientUID, desc->deviceType_);
142 return desc;
143 }
144 vector<unique_ptr<AudioDeviceDescriptor>> descs =
145 AudioDeviceManager::GetAudioDeviceManager().GetMediaCapturePrivacyDevices();
146 unique_ptr<AudioDeviceDescriptor> desc = GetLatestConnectDeivce(descs);
147 AUDIO_DEBUG_LOG("sourceType %{public}d clientUID %{public}d fetch device %{public}d", sourceType,
148 clientUID, desc->deviceType_);
149 return desc;
150 }
151
GetToneRenderDevice(StreamUsage streamUsage,int32_t clientUID)152 unique_ptr<AudioDeviceDescriptor> PrivacyPriorityRouter::GetToneRenderDevice(StreamUsage streamUsage,
153 int32_t clientUID)
154 {
155 return make_unique<AudioDeviceDescriptor>();
156 }
157
158 } // namespace AudioStandard
159 } // namespace OHOS