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_SPATIALIZATION_MANAGER_H
16 #define NAPI_AUDIO_SPATIALIZATION_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 #include "audio_spatialization_manager.h"
26 
27 namespace OHOS {
28 namespace AudioStandard {
29 const std::string AUDIO_SPATIALIZATION_MANAGER_NAPI_CLASS_NAME = "AudioSpatializationManager";
30 class NapiAudioSpatializationManager {
31 public:
32     NapiAudioSpatializationManager();
33     ~NapiAudioSpatializationManager();
34 
35     static napi_value Init(napi_env env, napi_value exports);
36     static napi_value CreateSpatializationManagerWrapper(napi_env env);
37 
38 private:
39 struct AudioSpatializationManagerAsyncContext : public ContextBase {
40     sptr<AudioDeviceDescriptor> deviceDescriptor = new(std::nothrow) AudioDeviceDescriptor();
41     bool spatializationEnable;
42     bool headTrackingEnable;
43     int32_t intValue;
44     AudioSpatialDeviceState spatialDeviceState;
45 };
46     static bool CheckContextStatus(std::shared_ptr<AudioSpatializationManagerAsyncContext> context);
47     static bool CheckAudioSpatializationManagerStatus(NapiAudioSpatializationManager *napi,
48     std::shared_ptr<AudioSpatializationManagerAsyncContext> context);
49     static NapiAudioSpatializationManager* GetParamWithSync(const napi_env &env, napi_callback_info info,
50         size_t &argc, napi_value *args);
51     static void Destructor(napi_env env, void *nativeObject, void *finalizeHint);
52     static napi_value Construct(napi_env env, napi_callback_info info);
53     static napi_value IsSpatializationEnabled(napi_env env, napi_callback_info info);
54     static napi_value SetSpatializationEnabled(napi_env env, napi_callback_info info);
55     static napi_value IsHeadTrackingEnabled(napi_env env, napi_callback_info info);
56     static napi_value SetHeadTrackingEnabled(napi_env env, napi_callback_info info);
57     static napi_value IsSpatializationSupported(napi_env env, napi_callback_info info);
58     static napi_value IsSpatializationSupportedForDevice(napi_env env, napi_callback_info info);
59     static napi_value IsHeadTrackingSupported(napi_env env, napi_callback_info info);
60     static napi_value IsHeadTrackingSupportedForDevice(napi_env env, napi_callback_info info);
61     static napi_value UpdateSpatialDeviceState(napi_env env, napi_callback_info info);
62     static napi_value GetSpatializationSceneType(napi_env env, napi_callback_info info);
63     static napi_value SetSpatializationSceneType(napi_env env, napi_callback_info info);
64     static napi_value On(napi_env env, napi_callback_info info);
65     static napi_value Off(napi_env env, napi_callback_info info);
66     static void RegisterCallback(napi_env env, napi_value jsThis,
67         napi_value *args, const std::string &cbName);
68     static void RegisterSpatializationEnabledChangeCallback(napi_env env, napi_value *args,
69         const std::string &cbName, NapiAudioSpatializationManager *napiAudioSpatializationManager);
70     static void RegisterHeadTrackingEnabledChangeCallback(napi_env env, napi_value *args,
71         const std::string &cbName, NapiAudioSpatializationManager *napiAudioSpatializationManager);
72     static void UnRegisterCallback(napi_env env, napi_value jsThis,
73         napi_value *args, const std::string &cbName);
74     static void UnregisterSpatializationEnabledChangeCallback(napi_env env, napi_value callback,
75         const std::string &cbName, NapiAudioSpatializationManager *napiAudioSpatializationManager);
76     static void UnregisterHeadTrackingEnabledChangeCallback(napi_env env, napi_value callback,
77         const std::string &cbName, NapiAudioSpatializationManager *napiAudioSpatializationManager);
78     static napi_value updateSpatializationEnabled(napi_env env, const std::size_t argc,
79     std::shared_ptr<AudioSpatializationManagerAsyncContext> &context);
80     static napi_value updateHeadTrackingEnabled(napi_env env, const std::size_t argc,
81     std::shared_ptr<AudioSpatializationManagerAsyncContext> &context);
82 
83     AudioSpatializationManager *audioSpatializationMngr_;
84     std::shared_ptr<AudioSpatializationEnabledChangeCallback> spatializationEnabledChangeCallbackNapi_ = nullptr;
85     std::shared_ptr<AudioHeadTrackingEnabledChangeCallback> headTrackingEnabledChangeCallbackNapi_ = nullptr;
86 
87     napi_env env_;
88 };
89 } // namespace AudioStandard
90 } // namespace OHOS
91 #endif /* NAPI_AUDIO_SPATIALIZATION_MANAGER_H */
92