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 "PublicPriorityRouter"
17 #endif
18 
19 #include "public_priority_router.h"
20 using namespace std;
21 
22 namespace OHOS {
23 namespace AudioStandard {
24 
GetMediaRenderDevice(StreamUsage streamUsage,int32_t clientUID)25 unique_ptr<AudioDeviceDescriptor> PublicPriorityRouter::GetMediaRenderDevice(StreamUsage streamUsage,
26     int32_t clientUID)
27 {
28     vector<unique_ptr<AudioDeviceDescriptor>> descs;
29     if (streamUsage == STREAM_USAGE_RINGTONE || streamUsage == STREAM_USAGE_VOICE_RINGTONE) {
30         descs = AudioDeviceManager::GetAudioDeviceManager().GetCommRenderPublicDevices();
31         if (descs.size() == 0) {
32             descs = AudioDeviceManager::GetAudioDeviceManager().GetMediaRenderPublicDevices();
33         }
34     } else {
35         descs = AudioDeviceManager::GetAudioDeviceManager().GetMediaRenderPublicDevices();
36     }
37     unique_ptr<AudioDeviceDescriptor> desc = GetLatestConnectDeivce(descs);
38     AUDIO_DEBUG_LOG("streamUsage %{public}d clientUID %{public}d fetch device %{public}d", streamUsage,
39         clientUID, desc->deviceType_);
40     return desc;
41 }
42 
GetCallRenderDevice(StreamUsage streamUsage,int32_t clientUID)43 unique_ptr<AudioDeviceDescriptor> PublicPriorityRouter::GetCallRenderDevice(StreamUsage streamUsage,
44     int32_t clientUID)
45 {
46     return make_unique<AudioDeviceDescriptor>();
47 }
48 
GetCallCaptureDevice(SourceType sourceType,int32_t clientUID)49 unique_ptr<AudioDeviceDescriptor> PublicPriorityRouter::GetCallCaptureDevice(SourceType sourceType,
50     int32_t clientUID)
51 {
52     return make_unique<AudioDeviceDescriptor>();
53 }
54 
GetRingRenderDevices(StreamUsage streamUsage,int32_t clientUID)55 vector<std::unique_ptr<AudioDeviceDescriptor>> PublicPriorityRouter::GetRingRenderDevices(StreamUsage streamUsage,
56     int32_t clientUID)
57 {
58     AudioRingerMode curRingerMode = audioPolicyManager_.GetRingerMode();
59     vector<unique_ptr<AudioDeviceDescriptor>> descs;
60     vector<unique_ptr<AudioDeviceDescriptor>> curDescs;
61     if (streamUsage == STREAM_USAGE_VOICE_RINGTONE || streamUsage == STREAM_USAGE_RINGTONE) {
62         // Only the Bluetooth Car can ring for public device.
63         curDescs = AudioDeviceManager::GetAudioDeviceManager().GetCommRenderBTCarDevices();
64     } else {
65         curDescs = AudioDeviceManager::GetAudioDeviceManager().GetMediaRenderPublicDevices();
66     }
67 
68     unique_ptr<AudioDeviceDescriptor> latestConnDesc = GetLatestConnectDeivce(curDescs);
69     if (!latestConnDesc.get()) {
70         AUDIO_INFO_LOG("Have no latest connecte desc, just only add default device.");
71         descs.push_back(make_unique<AudioDeviceDescriptor>());
72         return descs;
73     }
74     if (latestConnDesc->getType() == DEVICE_TYPE_NONE) {
75         AUDIO_INFO_LOG("Latest connecte desc type is none, just only add default device.");
76         descs.push_back(make_unique<AudioDeviceDescriptor>());
77         return descs;
78     }
79 
80     if (latestConnDesc->getType() == DEVICE_TYPE_BLUETOOTH_SCO ||
81         latestConnDesc->getType() == DEVICE_TYPE_BLUETOOTH_A2DP ||
82         latestConnDesc->getType() == DEVICE_TYPE_USB_HEADSET ||
83         latestConnDesc->getType() == DEVICE_TYPE_USB_ARM_HEADSET) {
84         // Add the latest connected device.
85         descs.push_back(move(latestConnDesc));
86         switch (streamUsage) {
87             case STREAM_USAGE_ALARM:
88                 // Add default device at same time for alarm.
89                 descs.push_back(AudioDeviceManager::GetAudioDeviceManager().GetRenderDefaultDevice());
90                 break;
91             case STREAM_USAGE_VOICE_RINGTONE:
92             case STREAM_USAGE_RINGTONE:
93                 if (curRingerMode == RINGER_MODE_NORMAL) {
94                     // Add default devices at same time only in ringer normal mode.
95                     descs.push_back(AudioDeviceManager::GetAudioDeviceManager().GetRenderDefaultDevice());
96                 }
97                 break;
98             default:
99                 AUDIO_DEBUG_LOG("Don't add default device at the same time.");
100                 break;
101         }
102     } else if (latestConnDesc->getType() != DEVICE_TYPE_NONE) {
103         descs.push_back(move(latestConnDesc));
104     } else {
105         descs.push_back(make_unique<AudioDeviceDescriptor>());
106     }
107     return descs;
108 }
109 
GetRecordCaptureDevice(SourceType sourceType,int32_t clientUID)110 unique_ptr<AudioDeviceDescriptor> PublicPriorityRouter::GetRecordCaptureDevice(SourceType sourceType,
111     int32_t clientUID)
112 {
113     vector<unique_ptr<AudioDeviceDescriptor>> descs =
114         AudioDeviceManager::GetAudioDeviceManager().GetMediaCapturePublicDevices();
115     unique_ptr<AudioDeviceDescriptor> desc = GetLatestConnectDeivce(descs);
116     AUDIO_DEBUG_LOG("sourceType %{public}d clientUID %{public}d fetch device %{public}d", sourceType,
117         clientUID, desc->deviceType_);
118     return desc;
119 }
120 
GetToneRenderDevice(StreamUsage streamUsage,int32_t clientUID)121 unique_ptr<AudioDeviceDescriptor> PublicPriorityRouter::GetToneRenderDevice(StreamUsage streamUsage,
122     int32_t clientUID)
123 {
124     return make_unique<AudioDeviceDescriptor>();
125 }
126 
127 } // namespace AudioStandard
128 } // namespace OHOS