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 NAPI_AUDIO_ROUNTING_MANAGER_H
16 #define NAPI_AUDIO_ROUNTING_MANAGER_H
17 
18 #include <iostream>
19 #include <map>
20 #include <vector>
21 #include "napi/native_api.h"
22 #include "napi/native_node_api.h"
23 #include "napi_async_work.h"
24 #include "audio_system_manager.h"
25 
26 namespace OHOS {
27 namespace AudioStandard {
28 const std::string NAPI_AUDIO_ROUTING_MANAGER_CLASS_NAME = "AudioRoutingManager";
29 class NapiAudioRoutingManager {
30 public:
31     NapiAudioRoutingManager();
32     ~NapiAudioRoutingManager();
33 
34     static napi_value Init(napi_env env, napi_value exports);
35     static napi_value CreateRoutingManagerWrapper(napi_env env);
36 
37 private:
38     struct AudioRoutingManagerAsyncContext : public ContextBase {
39         int32_t deviceFlag;
40         int32_t deviceType;
41         int32_t intValue;
42         bool isActive;
43         bool isTrue;
44         bool bArgTransFlag = true;
45         bool supported = false;
46         AudioRendererInfo rendererInfo;
47         AudioCapturerInfo captureInfo;
48         sptr<AudioRendererFilter> audioRendererFilter;
49         sptr<AudioCapturerFilter> audioCapturerFilter;
50         std::vector<sptr<AudioDeviceDescriptor>> deviceDescriptors;
51         std::vector<sptr<AudioDeviceDescriptor>> outDeviceDescriptors;
52         std::vector<sptr<AudioDeviceDescriptor>> inputDeviceDescriptors;
53     };
54 
55 #if !defined(IOS_PLATFORM) && !defined(ANDROID_PLATFORM)
56     static napi_value IsMicBlockDetectionSupported(napi_env env, napi_callback_info info);
57 #endif
58     static napi_value GetDevices(napi_env env, napi_callback_info info);
59     static napi_value GetDevicesSync(napi_env env, napi_callback_info info);
60     static napi_value On(napi_env env, napi_callback_info info);
61     static napi_value Off(napi_env env, napi_callback_info info);
62     static napi_value SelectOutputDevice(napi_env env, napi_callback_info info);
63     static napi_value SelectOutputDeviceByFilter(napi_env env, napi_callback_info info);
64     static napi_value SelectInputDevice(napi_env env, napi_callback_info info);
65     static napi_value SelectInputDeviceByFilter(napi_env env, napi_callback_info info);
66     static napi_value SetCommunicationDevice(napi_env env, napi_callback_info info);
67     static napi_value IsCommunicationDeviceActive(napi_env env, napi_callback_info info);
68     static napi_value IsCommunicationDeviceActiveSync(napi_env env, napi_callback_info info);
69     static napi_value GetActiveOutputDeviceDescriptors(napi_env env, napi_callback_info info);
70     static napi_value GetPreferredOutputDeviceForRendererInfo(napi_env env, napi_callback_info info);
71     static napi_value GetPreferOutputDeviceForRendererInfo(napi_env env, napi_callback_info info);
72     static napi_value GetPreferredOutputDeviceForRendererInfoSync(napi_env env, napi_callback_info info);
73     static napi_value GetPreferredInputDeviceForCapturerInfo(napi_env env, napi_callback_info info);
74     static napi_value GetPreferredInputDeviceForCapturerInfoSync(napi_env env, napi_callback_info info);
75     static napi_value GetAvailableMicrophones(napi_env env, napi_callback_info info);
76     static napi_value GetAvailableDevices(napi_env env, napi_callback_info info);
77     static napi_value RegisterCallback(napi_env env, napi_value jsThis, size_t argc, napi_value *args,
78         const std::string &cbName);
79     static void RegisterDeviceChangeCallback(napi_env env, size_t argc, napi_value *args, const std::string &cbName,
80         NapiAudioRoutingManager *napiRoutingMgr);
81     static void RegisterPreferredOutputDeviceChangeCallback(napi_env env, size_t argc, napi_value *args,
82         const std::string &cbName, NapiAudioRoutingManager *napiRoutingMgr);
83     static void RegisterPreferredInputDeviceChangeCallback(napi_env env, size_t argc, napi_value *args,
84         const std::string &cbName, NapiAudioRoutingManager *napiRoutingMgr);
85     static void RegisterAvaiableDeviceChangeCallback(napi_env env, size_t argc, napi_value *args,
86         const std::string &cbName, NapiAudioRoutingManager *napiRoutingMgr);
87     static void UnregisterDeviceChangeCallback(napi_env env, napi_value callback,
88         NapiAudioRoutingManager *napiRoutingMgr);
89     static void UnregisterPreferredOutputDeviceChangeCallback(napi_env env, napi_value callback,
90         NapiAudioRoutingManager *napiRoutingMgr);
91     static void UnregisterPreferredInputDeviceChangeCallback(napi_env env, napi_value callback,
92         NapiAudioRoutingManager *napiRoutingMgr);
93     static void UnregisterAvailableDeviceChangeCallback(napi_env env, napi_value callback,
94         NapiAudioRoutingManager *napiRoutingMgr);
95     static napi_value UnregisterCallback(napi_env env, napi_value jsThis, const std::string &callbackName,
96         napi_value callback);
97     static napi_value Construct(napi_env env, napi_callback_info info);
98     static void Destructor(napi_env env, void *nativeObject, void *finalizeHint);
99 
100     static bool CheckContextStatus(std::shared_ptr<AudioRoutingManagerAsyncContext> context);
101     static bool CheckAudioRoutingManagerStatus(NapiAudioRoutingManager *napi,
102         std::shared_ptr<AudioRoutingManagerAsyncContext> context);
103     static NapiAudioRoutingManager* GetParamWithSync(const napi_env &env, napi_callback_info info,
104         size_t &argc, napi_value *args);
105 
106     static void RegisterMicrophoneBlockedCallback(napi_env env, size_t argc, napi_value *args,
107         const std::string &cbName, NapiAudioRoutingManager *napiRoutingMgr);
108     static void UnregisterMicrophoneBlockedCallback(napi_env env, napi_value callback,
109         NapiAudioRoutingManager *napiRoutingMgr);
110 
111     static int32_t NapiAudioRountingMicroPhoneBlockCallback();
112 
113     AudioSystemManager *audioMngr_;
114     AudioRoutingManager *audioRoutingMngr_ = nullptr;
115     std::shared_ptr<AudioManagerDeviceChangeCallback> deviceChangeCallbackNapi_ = nullptr;
116     std::shared_ptr<AudioManagerMicStateChangeCallback> micStateChangeCallbackNapi_ = nullptr;
117     std::shared_ptr<AudioPreferredOutputDeviceChangeCallback> preferredOutputDeviceCallbackNapi_ = nullptr;
118     std::shared_ptr<AudioPreferredInputDeviceChangeCallback> preferredInputDeviceCallbackNapi_ = nullptr;
119     std::shared_ptr<AudioManagerAvailableDeviceChangeCallback> availableDeviceChangeCallbackNapi_ = nullptr;
120     std::shared_ptr<AudioManagerMicrophoneBlockedCallback> microphoneBlockedCallbackNapi_ = nullptr;
121 
122     napi_env env_;
123 };
124 } // namespace AudioStandard
125 } // namespace OHOS
126 #endif /* NAPI_AUDIO_ROUNTING_MANAGER_H */