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