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 16 #ifndef AUDIO_HAPTIC_PLAYER_NAPI_H 17 #define AUDIO_HAPTIC_PLAYER_NAPI_H 18 19 #include <map> 20 21 #include "audio_info.h" 22 #include "napi/native_api.h" 23 #include "napi/native_node_api.h" 24 25 #include "audio_haptic_common_napi.h" 26 #include "audio_haptic_player.h" 27 #include "audio_haptic_player_callback_napi.h" 28 #include "media_errors.h" 29 #include "audio_haptic_log.h" 30 31 namespace OHOS { 32 namespace Media { 33 static const std::string AUDIO_HAPTIC_PLAYER_NAPI_CLASS_NAME = "AudioHapticPlayer"; 34 35 struct VolumeContext : public AsyncContext { 36 float volume = 1.0f; 37 int32_t result = -1; 38 }; 39 40 struct VibrationContext : public AsyncContext { 41 float intensity = 1.0f; 42 int32_t result = -1; 43 }; 44 45 struct LoopContext : public AsyncContext { 46 bool loop = false; 47 int32_t result = -1; 48 }; 49 50 struct RampContext : public AsyncContext { 51 int32_t duration = 0; 52 float startIntensity = 0.0f; 53 float endIntensity = 0.0f; 54 int32_t result = -1; 55 }; 56 57 class AudioHapticPlayerNapi { 58 public: 59 static napi_value Init(napi_env env, napi_value exports); 60 static napi_value CreatePlayerInstance(napi_env env, std::shared_ptr<AudioHapticPlayer> &audioHapticPlayer); 61 62 AudioHapticPlayerNapi(); 63 ~AudioHapticPlayerNapi(); 64 65 private: 66 static void Destructor(napi_env env, void *nativeObject, void *finalizeHint); 67 static napi_value Constructor(napi_env env, napi_callback_info info); 68 static napi_value IsMuted(napi_env env, napi_callback_info info); 69 static napi_value Start(napi_env env, napi_callback_info info); 70 static napi_value Stop(napi_env env, napi_callback_info info); 71 static napi_value Release(napi_env env, napi_callback_info info); 72 static napi_value On(napi_env env, napi_callback_info info); 73 static napi_value Off(napi_env env, napi_callback_info info); 74 static napi_value SetVolume(napi_env env, napi_callback_info info); 75 static napi_value SetHapticsIntensity(napi_env env, napi_callback_info info); 76 static napi_value EnableHapticsInSilentMode(napi_env env, napi_callback_info info); 77 static napi_value IsHapticsIntensityAdjustmentSupported(napi_env env, napi_callback_info info); 78 static napi_value SetLoop(napi_env env, napi_callback_info info); 79 static napi_value IsHapticsRampSupported(napi_env env, napi_callback_info info); 80 static napi_value SetHapticsRamp(napi_env env, napi_callback_info info); 81 82 static napi_value RegisterCallback(napi_env env, napi_value jsThis, napi_value* argv, const std::string& cbName); 83 static napi_value RegisterAudioHapticPlayerCallback(napi_env env, napi_value* argv, const std::string& cbName, 84 AudioHapticPlayerNapi *audioHapticPlayerNapi); 85 static napi_value UnregisterCallback(napi_env env, napi_value jsThis, const std::string& cbName); 86 static napi_value UnregisterAudioHapticPlayerCallback(napi_env env, const std::string& cbName, 87 AudioHapticPlayerNapi *audioHapticPlayerNapi); 88 89 static void CommonAsyncCallbackComp(napi_env env, napi_status status, void *data); 90 91 static bool IsLegalAudioHapticType(int32_t audioHapticType); 92 static bool IsLegalVolumeOrIntensity(double volume); 93 static bool JudgeVolume(napi_env env, std::unique_ptr<VolumeContext>& asyncContext); 94 static bool JudgeIntensity(napi_env env, std::unique_ptr<VibrationContext>& asyncContext); 95 static bool JudgeRamp(napi_env env, std::unique_ptr<RampContext> &asyncContext); 96 97 napi_env env_; 98 std::shared_ptr<AudioHapticPlayer> audioHapticPlayer_; 99 std::shared_ptr<AudioHapticPlayerCallbackNapi> callbackNapi_ = nullptr; 100 101 static thread_local napi_ref sConstructor_; 102 static std::shared_ptr<AudioHapticPlayer> sAudioHapticPlayer_; 103 }; 104 105 struct AudioHapticPlayerAsyncContext { 106 napi_env env; 107 napi_async_work work; 108 napi_deferred deferred; 109 bool status; 110 AudioHapticPlayerNapi *objectInfo; 111 }; 112 } // namespace Media 113 } // namespace OHOS 114 #endif // AUDIO_HAPTIC_PLAYER_NAPI_H