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 "UserSelectRouter"
17 #endif
18
19 #include "user_select_router.h"
20
21 using namespace std;
22
23 namespace OHOS {
24 namespace AudioStandard {
GetMediaRenderDevice(StreamUsage streamUsage,int32_t clientUID)25 shared_ptr<AudioDeviceDescriptor> UserSelectRouter::GetMediaRenderDevice(StreamUsage streamUsage, int32_t clientUID)
26 {
27 if (streamUsage == STREAM_USAGE_RINGTONE || streamUsage == STREAM_USAGE_VOICE_RINGTONE) {
28 AUDIO_INFO_LOG("Ringtone skip user select");
29 return make_shared<AudioDeviceDescriptor>();
30 }
31 shared_ptr<AudioDeviceDescriptor> perDev_ =
32 AudioStateManager::GetAudioStateManager().GetPreferredMediaRenderDevice();
33 vector<shared_ptr<AudioDeviceDescriptor>> mediaDevices =
34 AudioDeviceManager::GetAudioDeviceManager().GetAvailableDevicesByUsage(MEDIA_OUTPUT_DEVICES);
35 if (perDev_->deviceId_ == 0) {
36 AUDIO_DEBUG_LOG(" PreferredMediaRenderDevice is null");
37 return make_shared<AudioDeviceDescriptor>();
38 } else {
39 int32_t audioId = perDev_->deviceId_;
40 AUDIO_INFO_LOG(" PreferredMediaRenderDevice audioId is %{public}d", audioId);
41 return RouterBase::GetPairDevice(perDev_, mediaDevices);
42 }
43 }
44
GetCallRenderDevice(StreamUsage streamUsage,int32_t clientUID)45 shared_ptr<AudioDeviceDescriptor> UserSelectRouter::GetCallRenderDevice(StreamUsage streamUsage, int32_t clientUID)
46 {
47 shared_ptr<AudioDeviceDescriptor> perDev_ =
48 AudioStateManager::GetAudioStateManager().GetPreferredCallRenderDevice();
49 vector<shared_ptr<AudioDeviceDescriptor>> callDevices =
50 AudioDeviceManager::GetAudioDeviceManager().GetAvailableDevicesByUsage(CALL_OUTPUT_DEVICES);
51 if (perDev_->deviceId_ == 0) {
52 AUDIO_DEBUG_LOG(" PreferredCallRenderDevice is null");
53 return make_shared<AudioDeviceDescriptor>();
54 } else {
55 int32_t audioId = perDev_->deviceId_;
56 AUDIO_INFO_LOG(" PreferredCallRenderDevice audioId is %{public}d", audioId);
57 return RouterBase::GetPairDevice(perDev_, callDevices);
58 }
59 }
60
GetCallCaptureDevice(SourceType sourceType,int32_t clientUID)61 shared_ptr<AudioDeviceDescriptor> UserSelectRouter::GetCallCaptureDevice(SourceType sourceType, int32_t clientUID)
62 {
63 shared_ptr<AudioDeviceDescriptor> perDev_ =
64 AudioStateManager::GetAudioStateManager().GetPreferredCallCaptureDevice();
65 vector<shared_ptr<AudioDeviceDescriptor>> callDevices =
66 AudioDeviceManager::GetAudioDeviceManager().GetAvailableDevicesByUsage(CALL_INPUT_DEVICES);
67 if (perDev_->deviceId_ == 0) {
68 AUDIO_DEBUG_LOG(" PreferredCallCaptureDevice is null");
69 return make_shared<AudioDeviceDescriptor>();
70 } else {
71 int32_t audioId = perDev_->deviceId_;
72 AUDIO_INFO_LOG(" PreferredCallCaptureDevice audioId is %{public}d", audioId);
73 return RouterBase::GetPairDevice(perDev_, callDevices);
74 }
75 }
76
GetRingRenderDevices(StreamUsage streamUsage,int32_t clientUID)77 vector<std::shared_ptr<AudioDeviceDescriptor>> UserSelectRouter::GetRingRenderDevices(StreamUsage streamUsage,
78 int32_t clientUID)
79 {
80 vector<shared_ptr<AudioDeviceDescriptor>> descs;
81 AudioRingerMode curRingerMode = audioPolicyManager_.GetRingerMode();
82 shared_ptr<AudioDeviceDescriptor> selectedDesc =
83 (streamUsage == STREAM_USAGE_VOICE_RINGTONE || streamUsage == STREAM_USAGE_RINGTONE) ?
84 GetCallRenderDevice(streamUsage, clientUID) : GetMediaRenderDevice(streamUsage, clientUID);
85
86 if (!selectedDesc.get()) {
87 AUDIO_INFO_LOG("Have no selected connected desc, just only add default device.");
88 descs.push_back(make_shared<AudioDeviceDescriptor>());
89 return descs;
90 }
91 if (selectedDesc->getType() == DEVICE_TYPE_NONE) {
92 AUDIO_INFO_LOG("Selected connected desc type is none, just only add default device.");
93 descs.push_back(make_shared<AudioDeviceDescriptor>());
94 return descs;
95 }
96 if (selectedDesc->getType() == DEVICE_TYPE_BLUETOOTH_A2DP && selectedDesc->GetDeviceCategory() == BT_SOUNDBOX) {
97 AUDIO_INFO_LOG("Exclude BT soundbox device for alarm stream.");
98 descs.push_back(make_shared<AudioDeviceDescriptor>());
99 return descs;
100 }
101
102 if (NeedLatestConnectWithDefaultDevices(selectedDesc->getType())) {
103 // Add the latest connected device.
104 descs.push_back(move(selectedDesc));
105 switch (streamUsage) {
106 case STREAM_USAGE_ALARM:
107 // Add default device at same time for alarm.
108 descs.push_back(AudioDeviceManager::GetAudioDeviceManager().GetRenderDefaultDevice());
109 break;
110 case STREAM_USAGE_VOICE_RINGTONE:
111 case STREAM_USAGE_RINGTONE:
112 if (curRingerMode == RINGER_MODE_NORMAL) {
113 // Add default devices at same time only in ringer normal mode.
114 descs.push_back(AudioDeviceManager::GetAudioDeviceManager().GetRenderDefaultDevice());
115 }
116 break;
117 default:
118 AUDIO_DEBUG_LOG("Don't add default device at the same time.");
119 break;
120 }
121 } else if (selectedDesc->getType() != DEVICE_TYPE_NONE) {
122 descs.push_back(move(selectedDesc));
123 } else {
124 descs.push_back(make_shared<AudioDeviceDescriptor>());
125 }
126 return descs;
127 }
128
GetRecordCaptureDevice(SourceType sourceType,int32_t clientUID)129 shared_ptr<AudioDeviceDescriptor> UserSelectRouter::GetRecordCaptureDevice(SourceType sourceType, int32_t clientUID)
130 {
131 shared_ptr<AudioDeviceDescriptor> perDev_ =
132 AudioStateManager::GetAudioStateManager().GetPreferredRecordCaptureDevice();
133 vector<shared_ptr<AudioDeviceDescriptor>> recordDevices =
134 AudioDeviceManager::GetAudioDeviceManager().GetAvailableDevicesByUsage(MEDIA_INPUT_DEVICES);
135 if (perDev_->deviceId_ == 0) {
136 AUDIO_DEBUG_LOG(" PreferredRecordCaptureDevice is null");
137 return make_shared<AudioDeviceDescriptor>();
138 } else {
139 int32_t audioId = perDev_->deviceId_;
140 AUDIO_INFO_LOG(" PreferredRecordCaptureDevice audioId is %{public}d", audioId);
141 return RouterBase::GetPairDevice(perDev_, recordDevices);
142 }
143 }
144
GetToneRenderDevice(StreamUsage streamUsage,int32_t clientUID)145 shared_ptr<AudioDeviceDescriptor> UserSelectRouter::GetToneRenderDevice(StreamUsage streamUsage, int32_t clientUID)
146 {
147 return make_shared<AudioDeviceDescriptor>();
148 }
149
150 } // namespace AudioStandard
151 } // namespace OHOS