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