1 /*
2 * Copyright (c) 2024-2025 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 #include "multimedia_audio_routing_manager_impl.h"
16
17 #include "audio_policy_log.h"
18 #include "cj_lambda.h"
19 #include "multimedia_audio_common.h"
20 #include "multimedia_audio_error.h"
21
22 namespace OHOS {
23 namespace AudioStandard {
24 extern "C" {
MMAAudioRoutingManagerImpl()25 MMAAudioRoutingManagerImpl::MMAAudioRoutingManagerImpl()
26 {
27 routingMgr_ = AudioRoutingManager::GetInstance();
28 audioMgr_ = AudioSystemManager::GetInstance();
29 deviceUsageCallback_ = std::make_shared<CjAudioManagerAvailableDeviceChangeCallback>();
30 preferredInputDeviceChangeCallBack_ = std::make_shared<CjAudioPreferredInputDeviceChangeCallback>();
31 preferredOutputDeviceChangeCallBack_ = std::make_shared<CjAudioPreferredOutputDeviceChangeCallback>();
32 deviceChangeCallBack_ = std::make_shared<CjAudioManagerDeviceChangeCallback>();
33 }
34
~MMAAudioRoutingManagerImpl()35 MMAAudioRoutingManagerImpl::~MMAAudioRoutingManagerImpl()
36 {
37 routingMgr_ = nullptr;
38 audioMgr_ = nullptr;
39 }
40
IsCommunicationDeviceActive(int32_t deviceType)41 bool MMAAudioRoutingManagerImpl::IsCommunicationDeviceActive(int32_t deviceType)
42 {
43 return audioMgr_->IsDeviceActive(static_cast<DeviceType>(deviceType));
44 }
45
SetCommunicationDevice(int32_t deviceType,bool active)46 int32_t MMAAudioRoutingManagerImpl::SetCommunicationDevice(int32_t deviceType, bool active)
47 {
48 auto ret = audioMgr_->SetDeviceActive(static_cast<DeviceType>(deviceType), active);
49 if (ret != SUCCESS_CODE) {
50 AUDIO_ERR_LOG("set communication device failure!");
51 return CJ_ERR_SYSTEM;
52 }
53 return SUCCESS_CODE;
54 }
55
GetDevices(int32_t flags,int32_t * errorCode)56 CArrDeviceDescriptor MMAAudioRoutingManagerImpl::GetDevices(int32_t flags, int32_t* errorCode)
57 {
58 std::vector<std::shared_ptr<AudioDeviceDescriptor>> deviceDescriptors =
59 audioMgr_->GetDevices(static_cast<DeviceFlag>(flags));
60 if (deviceDescriptors.empty()) {
61 return CArrDeviceDescriptor();
62 }
63 CArrDeviceDescriptor arr {};
64 Convert2CArrDeviceDescriptor(arr, deviceDescriptors, errorCode);
65 if (*errorCode != SUCCESS_CODE) {
66 FreeCArrDeviceDescriptor(arr);
67 return CArrDeviceDescriptor();
68 }
69 return arr;
70 }
71
GetAvailableDevices(uint32_t deviceUsage,int32_t * errorCode)72 CArrDeviceDescriptor MMAAudioRoutingManagerImpl::GetAvailableDevices(uint32_t deviceUsage, int32_t* errorCode)
73 {
74 std::vector<std::shared_ptr<AudioDeviceDescriptor>> deviceDescriptors =
75 routingMgr_->GetAvailableDevices(static_cast<AudioDeviceUsage>(deviceUsage));
76 CArrDeviceDescriptor arr {};
77 if (deviceDescriptors.empty()) {
78 return arr;
79 }
80 Convert2CArrDeviceDescriptor(arr, deviceDescriptors, errorCode);
81 if (*errorCode != SUCCESS_CODE) {
82 FreeCArrDeviceDescriptor(arr);
83 return CArrDeviceDescriptor();
84 }
85 return arr;
86 }
87
GetPreferredInputDeviceForCapturerInfo(CAudioCapturerInfo cInfo,int32_t * errorCode)88 CArrDeviceDescriptor MMAAudioRoutingManagerImpl::GetPreferredInputDeviceForCapturerInfo(
89 CAudioCapturerInfo cInfo, int32_t* errorCode)
90 {
91 std::vector<std::shared_ptr<AudioDeviceDescriptor>> outDeviceDescriptors {};
92 AudioCapturerInfo capturerInfo(static_cast<SourceType>(cInfo.source), cInfo.capturerFlags);
93 routingMgr_->GetPreferredInputDeviceForCapturerInfo(capturerInfo, outDeviceDescriptors);
94 if (outDeviceDescriptors.empty()) {
95 return CArrDeviceDescriptor();
96 }
97 CArrDeviceDescriptor arr {};
98 Convert2CArrDeviceDescriptor(arr, outDeviceDescriptors, errorCode);
99 if (*errorCode != SUCCESS_CODE) {
100 FreeCArrDeviceDescriptor(arr);
101 return CArrDeviceDescriptor();
102 }
103 return arr;
104 }
105
GetPreferredOutputDeviceForRendererInfo(CAudioRendererInfo cInfo,int32_t * errorCode)106 CArrDeviceDescriptor MMAAudioRoutingManagerImpl::GetPreferredOutputDeviceForRendererInfo(
107 CAudioRendererInfo cInfo, int32_t* errorCode)
108 {
109 std::vector<std::shared_ptr<AudioDeviceDescriptor>> outDeviceDescriptors {};
110 AudioRendererInfo rendererInfo {};
111 rendererInfo.streamUsage = static_cast<StreamUsage>(cInfo.usage);
112 rendererInfo.rendererFlags = cInfo.rendererFlags;
113 routingMgr_->GetPreferredOutputDeviceForRendererInfo(rendererInfo, outDeviceDescriptors);
114 if (outDeviceDescriptors.empty()) {
115 return CArrDeviceDescriptor();
116 }
117 CArrDeviceDescriptor arr {};
118 Convert2CArrDeviceDescriptor(arr, outDeviceDescriptors, errorCode);
119 if (*errorCode != SUCCESS_CODE) {
120 FreeCArrDeviceDescriptor(arr);
121 return CArrDeviceDescriptor();
122 }
123 return arr;
124 }
125
RegisterCallback(int32_t callbackType,uint32_t deviceUsage,void (* callback)(),int32_t * errorCode)126 void MMAAudioRoutingManagerImpl::RegisterCallback(
127 int32_t callbackType, uint32_t deviceUsage, void (*callback)(), int32_t* errorCode)
128 {
129 if (callbackType == AudioRoutingManagerCallbackType::AVAILABLE_DEVICE_CHANGE) {
130 auto func = CJLambda::Create(reinterpret_cast<void (*)(CDeviceChangeAction)>(callback));
131 if (func == nullptr) {
132 AUDIO_ERR_LOG("Register avaibleDeviceChange event failure!");
133 *errorCode = CJ_ERR_SYSTEM;
134 return;
135 }
136 deviceUsageCallback_->RegisterFunc(deviceUsage, func);
137 AudioDeviceUsage audioDeviceUsage = static_cast<AudioDeviceUsage>(deviceUsage);
138 audioMgr_->SetAvailableDeviceChangeCallback(audioDeviceUsage, deviceUsageCallback_);
139 }
140 }
141
RegisterPreferredInputDeviceChangeCallback(int32_t callbackType,void (* callback)(),CAudioCapturerInfo info,int32_t * errorCode)142 void MMAAudioRoutingManagerImpl::RegisterPreferredInputDeviceChangeCallback(
143 int32_t callbackType, void (*callback)(), CAudioCapturerInfo info, int32_t* errorCode)
144 {
145 if (callbackType == AudioRoutingManagerCallbackType::INPUT_DEVICE_CHANGE_FOR_CAPTURER_INFO) {
146 auto func = CJLambda::Create(reinterpret_cast<void (*)(CArrDeviceDescriptor)>(callback));
147 if (func == nullptr) {
148 AUDIO_ERR_LOG("Register preferredInputDeviceChangeForCapturerInfo event failure!");
149 *errorCode = CJ_ERR_SYSTEM;
150 return;
151 }
152 AudioCapturerInfo capturerInfo(static_cast<SourceType>(info.source), info.capturerFlags);
153 preferredInputDeviceChangeCallBack_->RegisterFunc(func);
154 routingMgr_->SetPreferredInputDeviceChangeCallback(capturerInfo, preferredInputDeviceChangeCallBack_);
155 }
156 }
157
RegisterPreferredOutputDeviceChangeCallback(int32_t callbackType,void (* callback)(),CAudioRendererInfo info,int32_t * errorCode)158 void MMAAudioRoutingManagerImpl::RegisterPreferredOutputDeviceChangeCallback(
159 int32_t callbackType, void (*callback)(), CAudioRendererInfo info, int32_t* errorCode)
160 {
161 if (callbackType == AudioRoutingManagerCallbackType::OUTPUT_DEVICE_CHANGE_FOR_RENDERER_INFO) {
162 auto func = CJLambda::Create(reinterpret_cast<void (*)(CArrDeviceDescriptor)>(callback));
163 if (func == nullptr) {
164 AUDIO_ERR_LOG("Register preferredOutputDeviceChangeForRendererInfo event failure!");
165 *errorCode = CJ_ERR_SYSTEM;
166 return;
167 }
168 AudioRendererInfo rendererInfo {};
169 rendererInfo.streamUsage = static_cast<StreamUsage>(info.usage);
170 rendererInfo.rendererFlags = info.rendererFlags;
171 preferredOutputDeviceChangeCallBack_->RegisterFunc(func);
172 routingMgr_->SetPreferredOutputDeviceChangeCallback(rendererInfo, preferredOutputDeviceChangeCallBack_);
173 }
174 }
175
RegisterDeviceChangeCallback(int32_t callbackType,void (* callback)(),int32_t flags,int32_t * errorCode)176 void MMAAudioRoutingManagerImpl::RegisterDeviceChangeCallback(
177 int32_t callbackType, void (*callback)(), int32_t flags, int32_t* errorCode)
178 {
179 if (callbackType == AudioRoutingManagerCallbackType::DEVICE_CHANGE) {
180 auto func = CJLambda::Create(reinterpret_cast<void (*)(CDeviceChangeAction)>(callback));
181 if (func == nullptr) {
182 AUDIO_ERR_LOG("Register DeviceChangeAction event failure!");
183 *errorCode = CJ_ERR_SYSTEM;
184 return;
185 }
186 DeviceFlag deviceFlag = static_cast<DeviceFlag>(flags);
187 deviceChangeCallBack_->RegisterFunc(func);
188 audioMgr_->SetDeviceChangeCallback(deviceFlag, deviceChangeCallBack_);
189 }
190 }
191 }
192 } // namespace AudioStandard
193 } // namespace OHOS
194