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_MANAGER_H 16 #define NAPI_AUDIO_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_MNGR_CLASS_NAME = "AudioManager"; 29 const std::string VOLUME_CHANGE_CALLBACK_NAME = "volumeChange"; 30 31 class NapiAudioManager { 32 public: 33 NapiAudioManager(); 34 ~NapiAudioManager(); 35 36 static napi_value Init(napi_env env, napi_value exports); 37 static napi_status InitNapiAudioManager(napi_env env, napi_value &constructor); 38 39 private: 40 struct AudioManagerAsyncContext : public ContextBase { 41 int32_t volType; 42 int32_t volLevel; 43 int32_t deviceType; 44 int32_t ringMode; 45 int32_t scene; 46 int32_t deviceFlag; 47 int32_t intValue; 48 int32_t focusType; 49 int32_t groupId; 50 bool isMute; 51 bool isActive; 52 bool isTrue; 53 std::string key; 54 std::string valueStr; 55 std::string networkId; 56 std::vector<sptr<AudioDeviceDescriptor>> deviceDescriptors; 57 std::vector<sptr<VolumeGroupInfo>> volumeGroupInfos; 58 std::vector<std::pair<std::string, std::string>> subKvpairs; 59 std::vector<std::string> subKeys; 60 }; 61 static NapiAudioManager* GetParamWithSync(const napi_env &env, napi_callback_info info, 62 size_t &argc, napi_value *args); 63 static bool CheckContextStatus(std::shared_ptr<AudioManagerAsyncContext> context); 64 static bool CheckAudioManagerStatus(NapiAudioManager *napi, 65 std::shared_ptr<AudioManagerAsyncContext> context); 66 static void Destructor(napi_env env, void *nativeObject, void *finalizeHint); 67 static napi_value Construct(napi_env env, napi_callback_info info); 68 static napi_value CreateAudioManagerWrapper(napi_env env); 69 static napi_value GetAudioManager(napi_env env, napi_callback_info info); 70 static napi_value SetVolume(napi_env env, napi_callback_info info); 71 static napi_value GetVolume(napi_env env, napi_callback_info info); 72 static napi_value GetMaxVolume(napi_env env, napi_callback_info info); 73 static napi_value GetMinVolume(napi_env env, napi_callback_info info); 74 static napi_value GetDevices(napi_env env, napi_callback_info info); 75 static napi_value SetStreamMute(napi_env env, napi_callback_info info); 76 static napi_value IsStreamMute(napi_env env, napi_callback_info info); 77 static napi_value IsStreamActive(napi_env env, napi_callback_info info); 78 static napi_value SetRingerMode(napi_env env, napi_callback_info info); 79 static napi_value GetRingerMode(napi_env env, napi_callback_info info); 80 static napi_value SetAudioScene(napi_env env, napi_callback_info info); 81 static napi_value GetAudioScene(napi_env env, napi_callback_info info); 82 static napi_value GetAudioSceneSync(napi_env env, napi_callback_info info); 83 static napi_value SetDeviceActive(napi_env env, napi_callback_info info); 84 static napi_value IsDeviceActive(napi_env env, napi_callback_info info); 85 static napi_value SetAudioParameter(napi_env env, napi_callback_info info); 86 static napi_value GetAudioParameter(napi_env env, napi_callback_info info); 87 static napi_value SetExtraParameters(napi_env env, napi_callback_info info); 88 static napi_value GetExtraParameters(napi_env env, napi_callback_info info); 89 static napi_value SetMicrophoneMute(napi_env env, napi_callback_info info); 90 static napi_value IsMicrophoneMute(napi_env env, napi_callback_info info); 91 static napi_value RequestIndependentInterrupt(napi_env env, napi_callback_info info); 92 static napi_value AbandonIndependentInterrupt(napi_env env, napi_callback_info info); 93 static napi_value GetStreamManager(napi_env env, napi_callback_info info); 94 #if !defined(ANDROID_PLATFORM) && !defined(IOS_PLATFORM) 95 static napi_value GetSessionManager(napi_env env, napi_callback_info info); 96 #endif 97 static napi_value GetRoutingManager(napi_env env, napi_callback_info info); 98 static napi_value GetVolumeManager(napi_env env, napi_callback_info info); 99 static napi_value GetInterruptManager(napi_env env, napi_callback_info info); 100 static napi_value GetSpatializationManager(napi_env env, napi_callback_info info); 101 static napi_value DisableSafeMediaVolume(napi_env env, napi_callback_info info); 102 static napi_value On(napi_env env, napi_callback_info info); 103 static napi_value Off(napi_env env, napi_callback_info info); 104 static void UnregisterDeviceChangeCallback(napi_env env, napi_value callback, NapiAudioManager *audioMgrNapi); 105 template<typename T> static void UnregisterInterruptCallback(napi_env env, const T &argv, 106 const size_t argCount, NapiAudioManager *napiAudioManager); 107 static napi_value RegisterCallback(napi_env env, napi_value jsThis, 108 napi_value *argv, const std::string &cbName); 109 template<typename T> static void RegisterInterruptCallback(napi_env env, const T &argv, 110 NapiAudioManager *napiAudioManager); 111 template<typename T> static void RegisterRingerModeCallback(napi_env env, const T &argv, 112 NapiAudioManager *napiAudioManager); 113 template<typename T> static void RegisterVolumeChangeCallback(napi_env env, const T &argv, 114 NapiAudioManager *napiAudioManager); 115 template<typename T> static void RegisterDeviceChangeCallback(napi_env env, const T &argv, 116 NapiAudioManager *napiAudioManager); 117 118 AudioSystemManager *audioMngr_; 119 int32_t cachedClientId_ = -1; 120 std::shared_ptr<AudioManagerDeviceChangeCallback> deviceChangeCallbackNapi_ = nullptr; 121 std::shared_ptr<AudioManagerCallback> interruptCallbackNapi_ = nullptr; 122 std::shared_ptr<AudioRingerModeCallback> ringerModecallbackNapi_ = nullptr; 123 std::shared_ptr<VolumeKeyEventCallback> volumeKeyEventCallbackNapi_ = nullptr; 124 napi_env env_; 125 }; 126 } // namespace AudioStandard 127 } // namespace OHOS 128 #endif /* NAPI_AUDIO_MANAGER_H */