• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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