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