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