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 NAPI_AUDIO_RENDERER_H 17 #define NAPI_AUDIO_RENDERER_H 18 19 #include <iostream> 20 #include <map> 21 #include <queue> 22 23 #include "napi/native_api.h" 24 #include "napi/native_node_api.h" 25 #include "audio_stream_manager.h" 26 #include "audio_renderer.h" 27 #include "napi_async_work.h" 28 #include "napi_audio_renderer_device_change_callback.h" 29 30 namespace OHOS { 31 namespace AudioStandard { 32 using namespace HiviewDFX; 33 using namespace std; 34 35 const std::string NAPI_AUDIO_RENDERER_CLASS_NAME = "AudioRenderer"; 36 37 class NapiAudioRenderer { 38 public: 39 NapiAudioRenderer(); 40 ~NapiAudioRenderer() = default; 41 42 static napi_value Init(napi_env env, napi_value exports); 43 void DestroyCallbacks(); 44 void DestroyNAPICallbacks(); 45 46 std::unique_ptr<AudioRenderer> audioRenderer_; 47 std::mutex writeCallbackMutex_; 48 std::condition_variable writeCallbackCv_; 49 50 private: 51 struct AudioRendererAsyncContext : public ContextBase { 52 int32_t intValue; 53 int32_t audioRendererRate; 54 int32_t rendererFlags; 55 int32_t interruptMode; 56 bool isTrue; 57 uint64_t time; 58 size_t bufferLen; 59 size_t bufferSize; 60 int32_t volType; 61 double volLevel; 62 uint32_t rendererSampleRate; 63 uint32_t audioStreamId; 64 size_t totalBytesWritten; 65 uint32_t underflowCount; 66 void *data; 67 int32_t audioEffectMode; 68 int32_t channelBlendMode; 69 DeviceRole deviceRole; 70 int32_t deviceType; 71 AudioRendererOptions rendererOptions; 72 DeviceInfo deviceInfo; 73 AudioRendererInfo rendererInfo; 74 AudioStreamInfo streamInfo; 75 }; 76 77 static napi_status InitNapiAudioRenderer(napi_env env, napi_value &constructor); 78 static void Destructor(napi_env env, void *nativeObject, void *finalizeHint); 79 static void CreateRendererFailed(); 80 static napi_value Construct(napi_env env, napi_callback_info info); 81 static unique_ptr<NapiAudioRenderer> CreateAudioRendererNativeObject(napi_env env); 82 static napi_value CreateAudioRendererWrapper(napi_env env, const AudioRendererOptions rendererOptions); 83 static napi_value CreateAudioRenderer(napi_env env, napi_callback_info info); 84 static napi_value CreateAudioRendererSync(napi_env env, napi_callback_info info); 85 static napi_value SetRenderRate(napi_env env, napi_callback_info info); 86 static napi_value GetRenderRate(napi_env env, napi_callback_info info); 87 static napi_value GetRenderRateSync(napi_env env, napi_callback_info info); 88 static napi_value SetRendererSamplingRate(napi_env env, napi_callback_info info); 89 static napi_value GetRendererSamplingRate(napi_env env, napi_callback_info info); 90 static napi_value Start(napi_env env, napi_callback_info info); 91 static napi_value Write(napi_env env, napi_callback_info info); 92 static napi_value GetAudioTime(napi_env env, napi_callback_info info); 93 static napi_value GetAudioTimeSync(napi_env env, napi_callback_info info); 94 static napi_value Drain(napi_env env, napi_callback_info info); 95 static napi_value Flush(napi_env env, napi_callback_info info); 96 static napi_value Pause(napi_env env, napi_callback_info info); 97 static napi_value Stop(napi_env env, napi_callback_info info); 98 static napi_value Release(napi_env env, napi_callback_info info); 99 static napi_value GetBufferSize(napi_env env, napi_callback_info info); 100 static napi_value GetBufferSizeSync(napi_env env, napi_callback_info info); 101 static napi_value GetAudioStreamId(napi_env env, napi_callback_info info); 102 static napi_value GetAudioStreamIdSync(napi_env env, napi_callback_info info); 103 static napi_value SetVolume(napi_env env, napi_callback_info info); 104 static napi_value GetVolume(napi_env env, napi_callback_info info); 105 static napi_value GetRendererInfo(napi_env env, napi_callback_info info); 106 static napi_value GetRendererInfoSync(napi_env env, napi_callback_info info); 107 static napi_value GetStreamInfo(napi_env env, napi_callback_info info); 108 static napi_value GetStreamInfoSync(napi_env env, napi_callback_info info); 109 static napi_value SetInterruptMode(napi_env env, napi_callback_info info); 110 static napi_value SetInterruptModeSync(napi_env env, napi_callback_info info); 111 static napi_value GetMinStreamVolume(napi_env env, napi_callback_info info); 112 static napi_value GetMinStreamVolumeSync(napi_env env, napi_callback_info info); 113 static napi_value GetMaxStreamVolume(napi_env env, napi_callback_info info); 114 static napi_value GetMaxStreamVolumeSync(napi_env env, napi_callback_info info); 115 static napi_value GetCurrentOutputDevices(napi_env env, napi_callback_info info); 116 static napi_value GetCurrentOutputDevicesSync(napi_env env, napi_callback_info info); 117 static napi_value GetUnderflowCount(napi_env env, napi_callback_info info); 118 static napi_value GetUnderflowCountSync(napi_env env, napi_callback_info info); 119 static napi_value GetAudioEffectMode(napi_env env, napi_callback_info info); 120 static napi_value SetAudioEffectMode(napi_env env, napi_callback_info info); 121 static napi_value SetChannelBlendMode(napi_env env, napi_callback_info info); 122 static napi_value SetVolumeWithRamp(napi_env env, napi_callback_info info); 123 static napi_value SetSpeed(napi_env env, napi_callback_info info); 124 static napi_value GetSpeed(napi_env env, napi_callback_info info); 125 static napi_value GetState(napi_env env, napi_callback_info info); 126 static napi_value On(napi_env env, napi_callback_info info); 127 static napi_value Off(napi_env env, napi_callback_info info); 128 static napi_value SetSilentModeAndMixWithOthers(napi_env env, napi_callback_info info); 129 static napi_value GetSilentModeAndMixWithOthers(napi_env env, napi_callback_info info); 130 static napi_value SetDefaultOutputDevice(napi_env env, napi_callback_info info); 131 132 static napi_status WriteArrayBufferToNative(std::shared_ptr<AudioRendererAsyncContext> context); 133 134 static napi_value RegisterCallback(napi_env env, napi_value jsThis, 135 napi_value *argv, const std::string &cbName); 136 static napi_value RegisterRendererCallback(napi_env env, napi_value *argv, 137 const std::string &cbName, NapiAudioRenderer *napiRenderer); 138 static napi_value RegisterPositionCallback(napi_env env, napi_value *argv, 139 const std::string &cbName, NapiAudioRenderer *napiRenderer); 140 static napi_value RegisterPeriodPositionCallback(napi_env env, napi_value *argv, 141 const std::string &cbName, NapiAudioRenderer *napiRenderer); 142 static napi_value RegisterDataRequestCallback(napi_env env, napi_value *argv, 143 const std::string &cbName, NapiAudioRenderer *napiRenderer); 144 static napi_value UnregisterCallback(napi_env env, napi_value jsThis, size_t argc, napi_value *argv, 145 const std::string &cbName); 146 static void RegisterRendererDeviceChangeCallback(napi_env env, napi_value *argv, NapiAudioRenderer *napiRenderer); 147 static void UnregisterRendererCallback(napi_env env, 148 const std::string &cbName, NapiAudioRenderer *napiRenderer); 149 static void UnregisterRendererDeviceChangeCallback(napi_env env, size_t argc, const napi_value *argv, 150 NapiAudioRenderer *napiRenderer); 151 152 static void RegisterRendererOutputDeviceChangeWithInfoCallback(napi_env env, napi_value *argv, 153 NapiAudioRenderer *napiRenderer); 154 static void UnregisterRendererOutputDeviceChangeWithInfoCallback(napi_env env, size_t argc, const napi_value *argv, 155 NapiAudioRenderer *napiRenderer); 156 157 static void RegisterRendererWriteDataCallback(napi_env env, napi_value *argv, 158 const std::string &cbName, NapiAudioRenderer *napiRenderer); 159 static void UnregisterRendererWriteDataCallback(napi_env env, size_t argc, const napi_value *argv, 160 NapiAudioRenderer *napiRenderer); 161 /* common interface in AudioRendererNapi */ 162 static bool CheckContextStatus(std::shared_ptr<AudioRendererAsyncContext> context); 163 static bool CheckAudioRendererStatus(NapiAudioRenderer *napi, std::shared_ptr<AudioRendererAsyncContext> context); 164 static NapiAudioRenderer* GetParamWithSync(const napi_env &env, napi_callback_info info, 165 size_t &argc, napi_value *args); 166 167 static constexpr double MIN_VOLUME_IN_DOUBLE = 0.0; 168 static constexpr double MAX_VOLUME_IN_DOUBLE = 1.0; 169 static std::mutex createMutex_; 170 static int32_t isConstructSuccess_; 171 static std::unique_ptr<AudioRendererOptions> sRendererOptions_; 172 173 ContentType contentType_; 174 StreamUsage streamUsage_; 175 napi_env env_; 176 std::shared_ptr<AudioRendererCallback> callbackNapi_ = nullptr; 177 std::shared_ptr<RendererPositionCallback> positionCbNapi_ = nullptr; 178 std::shared_ptr<RendererPeriodPositionCallback> periodPositionCbNapi_ = nullptr; 179 std::shared_ptr<AudioRendererWriteCallback> dataRequestCbNapi_ = nullptr; 180 std::shared_ptr<NapiAudioRendererDeviceChangeCallback> rendererDeviceChangeCallbackNapi_ = nullptr; 181 std::shared_ptr<NapiAudioRendererOutputDeviceChangeWithInfoCallback> 182 rendererOutputDeviceChangeWithInfoCallbackNapi_ = nullptr; 183 std::shared_ptr<AudioRendererPolicyServiceDiedCallback> rendererPolicyServiceDiedCallbackNapi_ = nullptr; 184 std::shared_ptr<AudioRendererWriteCallback> rendererWriteDataCallbackNapi_ = nullptr; 185 }; 186 } // namespace AudioStandard 187 } // namespace OHOS 188 #endif /* AUDIO_RENDERER_NAPI_H */ 189