1 /*
2  * Copyright (c) 2024 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 
16 #ifndef OH_AUDIO_ROUTING_MANAGER_H
17 #define OH_AUDIO_ROUTING_MANAGER_H
18 
19 #include "audio_info.h"
20 #include "audio_common_log.h"
21 #include "native_audio_routing_manager.h"
22 #include "native_audio_common.h"
23 #include "native_audio_device_base.h"
24 #include "audio_system_manager.h"
25 #include "OHAudioDeviceDescriptor.h"
26 
27 namespace OHOS {
28 namespace AudioStandard {
29 
30 class OHAudioDeviceChangedCallback : public AudioManagerDeviceChangeCallback {
31 public:
OHAudioDeviceChangedCallback(OH_AudioRoutingManager_OnDeviceChangedCallback callback)32     explicit OHAudioDeviceChangedCallback(OH_AudioRoutingManager_OnDeviceChangedCallback callback)
33         : callback_(callback)
34     {
35     }
36     void OnDeviceChange(const DeviceChangeAction &deviceChangeAction) override;
37 
GetCallback()38     OH_AudioRoutingManager_OnDeviceChangedCallback GetCallback()
39     {
40         return callback_;
41     }
42 
~OHAudioDeviceChangedCallback()43     ~OHAudioDeviceChangedCallback()
44     {
45         AUDIO_INFO_LOG("~OHAudioDeviceChangedCallback called.");
46         if (callback_ != nullptr) {
47             callback_ = nullptr;
48         }
49     }
50 
51 private:
52     OH_AudioRoutingManager_OnDeviceChangedCallback callback_;
53 };
54 
55 class OHMicrophoneBlockCallback : public AudioManagerMicrophoneBlockedCallback {
56 public:
OHMicrophoneBlockCallback(OH_AudioRoutingManager_OnDeviceBlockStatusCallback callback,void * userData)57     explicit OHMicrophoneBlockCallback(OH_AudioRoutingManager_OnDeviceBlockStatusCallback callback, void *userData)
58         : blockedCallback_(callback)
59     {
60     }
61 
GetCallback()62     OH_AudioRoutingManager_OnDeviceBlockStatusCallback GetCallback()
63     {
64         return blockedCallback_;
65     }
66 
~OHMicrophoneBlockCallback()67     ~OHMicrophoneBlockCallback()
68     {
69         AUDIO_INFO_LOG("~OHMicrophoneBlockCallback called.");
70         blockedCallback_ = nullptr;
71     }
72     void OnMicrophoneBlocked(const MicrophoneBlockedInfo &microphoneBlockedInfo) override;
73 
74 private:
75     OH_AudioRoutingManager_OnDeviceBlockStatusCallback blockedCallback_;
76 };
77 
78 class OHAudioRoutingManager {
79 public:
80     ~OHAudioRoutingManager();
81 
GetInstance()82     static OHAudioRoutingManager* GetInstance()
83     {
84         if (!ohAudioRoutingManager_) {
85             ohAudioRoutingManager_ = new OHAudioRoutingManager();
86         }
87         return ohAudioRoutingManager_;
88     }
89     OH_AudioDeviceDescriptorArray* GetDevices(DeviceFlag deviceFlag);
90 
91     OH_AudioDeviceDescriptorArray *ConvertDesc(std::vector<sptr<AudioDeviceDescriptor>> &desc);
92     OH_AudioDeviceDescriptorArray *GetAvailableDevices(AudioDeviceUsage deviceUsage);
93     OH_AudioDeviceDescriptorArray *GetPreferredOutputDevice(StreamUsage streamUsage);
94     OH_AudioDeviceDescriptorArray *GetPreferredInputDevice(SourceType sourceType);
95 
96     OH_AudioCommon_Result SetDeviceChangeCallback(const DeviceFlag flag,
97         OH_AudioRoutingManager_OnDeviceChangedCallback callback);
98     OH_AudioCommon_Result UnsetDeviceChangeCallback(DeviceFlag flag,
99         OH_AudioRoutingManager_OnDeviceChangedCallback ohOnDeviceChangedcallback);
100     OH_AudioCommon_Result SetMicrophoneBlockedCallback(OH_AudioRoutingManager_OnDeviceBlockStatusCallback callback,
101         void* userData);
102     OH_AudioCommon_Result UnsetMicrophoneBlockedCallback(OH_AudioRoutingManager_OnDeviceBlockStatusCallback callback);
103 
104 private:
105     OHAudioRoutingManager();
106     static OHAudioRoutingManager *ohAudioRoutingManager_;
107     AudioSystemManager *audioSystemManager_ = AudioSystemManager::GetInstance();
108     std::vector<std::shared_ptr<OHAudioDeviceChangedCallback>> ohAudioOnDeviceChangedCallbackArray_;
109     std::vector<std::shared_ptr<OHMicrophoneBlockCallback>> ohMicroPhoneBlockCallbackArray_;
110 };
111 OHAudioRoutingManager* OHAudioRoutingManager::ohAudioRoutingManager_ = nullptr;
112 
113 } // namespace AudioStandard
114 } // namespace OHOS
115 #endif // OH_AUDIO_ROUTING_MANAGER_H