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 #if !defined(ANDROID_PLATFORM) && !defined(IOS_PLATFORM) 46 std::shared_ptr<AudioRenderer> audioRenderer_; 47 #else 48 std::unique_ptr<AudioRenderer> audioRenderer_; 49 #endif 50 std::mutex writeCallbackMutex_; 51 std::condition_variable writeCallbackCv_; 52 std::list<std::shared_ptr<NapiAudioRendererCallbackInner>> audioRendererCallbacks_; 53 54 private: 55 struct AudioRendererAsyncContext : public ContextBase { 56 int32_t intValue; 57 int32_t audioRendererRate; 58 int32_t rendererFlags; 59 int32_t interruptMode; 60 bool isTrue; 61 uint64_t time; 62 size_t bufferLen; 63 size_t bufferSize; 64 int32_t volType; 65 double volLevel; 66 uint32_t rendererSampleRate; 67 uint32_t audioStreamId; 68 size_t totalBytesWritten; 69 uint32_t underflowCount; 70 void *data; 71 int32_t audioEffectMode; 72 int32_t channelBlendMode; 73 DeviceRole deviceRole; 74 int32_t deviceType; 75 Timestamp timeStamp; 76 AudioRendererOptions rendererOptions; 77 AudioDeviceDescriptor deviceInfo = AudioDeviceDescriptor(AudioDeviceDescriptor::DEVICE_INFO); 78 AudioRendererInfo rendererInfo; 79 AudioStreamInfo streamInfo; 80 }; 81 82 static napi_status InitNapiAudioRenderer(napi_env env, napi_value &constructor); 83 static void Destructor(napi_env env, void *nativeObject, void *finalizeHint); 84 static void CreateRendererFailed(); 85 static napi_value Construct(napi_env env, napi_callback_info info); 86 static unique_ptr<NapiAudioRenderer> CreateAudioRendererNativeObject(napi_env env); 87 static napi_value CreateAudioRendererWrapper(napi_env env, const AudioRendererOptions rendererOptions); 88 static napi_value CreateAudioRenderer(napi_env env, napi_callback_info info); 89 static napi_value CreateAudioRendererSync(napi_env env, napi_callback_info info); 90 static napi_value SetRenderRate(napi_env env, napi_callback_info info); 91 static napi_value GetRenderRate(napi_env env, napi_callback_info info); 92 static napi_value GetRenderRateSync(napi_env env, napi_callback_info info); 93 static napi_value SetRendererSamplingRate(napi_env env, napi_callback_info info); 94 static napi_value GetRendererSamplingRate(napi_env env, napi_callback_info info); 95 static napi_value Start(napi_env env, napi_callback_info info); 96 static napi_value Write(napi_env env, napi_callback_info info); 97 static napi_value GetAudioTime(napi_env env, napi_callback_info info); 98 static napi_value GetAudioTimeSync(napi_env env, napi_callback_info info); 99 static napi_value Drain(napi_env env, napi_callback_info info); 100 static napi_value Flush(napi_env env, napi_callback_info info); 101 static napi_value Pause(napi_env env, napi_callback_info info); 102 static napi_value Stop(napi_env env, napi_callback_info info); 103 static napi_value Release(napi_env env, napi_callback_info info); 104 static napi_value GetBufferSize(napi_env env, napi_callback_info info); 105 static napi_value GetBufferSizeSync(napi_env env, napi_callback_info info); 106 static napi_value GetAudioStreamId(napi_env env, napi_callback_info info); 107 static napi_value GetAudioStreamIdSync(napi_env env, napi_callback_info info); 108 static napi_value SetVolume(napi_env env, napi_callback_info info); 109 static napi_value GetVolume(napi_env env, napi_callback_info info); 110 static napi_value GetRendererInfo(napi_env env, napi_callback_info info); 111 static napi_value GetRendererInfoSync(napi_env env, napi_callback_info info); 112 static napi_value GetStreamInfo(napi_env env, napi_callback_info info); 113 static napi_value GetStreamInfoSync(napi_env env, napi_callback_info info); 114 static napi_value SetInterruptMode(napi_env env, napi_callback_info info); 115 static napi_value SetInterruptModeSync(napi_env env, napi_callback_info info); 116 static napi_value GetMinStreamVolume(napi_env env, napi_callback_info info); 117 static napi_value GetMinStreamVolumeSync(napi_env env, napi_callback_info info); 118 static napi_value GetMaxStreamVolume(napi_env env, napi_callback_info info); 119 static napi_value GetMaxStreamVolumeSync(napi_env env, napi_callback_info info); 120 static napi_value GetCurrentOutputDevices(napi_env env, napi_callback_info info); 121 static napi_value GetCurrentOutputDevicesSync(napi_env env, napi_callback_info info); 122 static napi_value GetUnderflowCount(napi_env env, napi_callback_info info); 123 static napi_value GetUnderflowCountSync(napi_env env, napi_callback_info info); 124 static napi_value GetAudioTimestampInfo(napi_env env, napi_callback_info info); 125 static napi_value GetAudioTimestampInfoSync(napi_env env, napi_callback_info info); 126 static napi_value GetAudioEffectMode(napi_env env, napi_callback_info info); 127 static napi_value SetAudioEffectMode(napi_env env, napi_callback_info info); 128 static napi_value SetChannelBlendMode(napi_env env, napi_callback_info info); 129 static napi_value SetVolumeWithRamp(napi_env env, napi_callback_info info); 130 static napi_value SetSpeed(napi_env env, napi_callback_info info); 131 static napi_value GetSpeed(napi_env env, napi_callback_info info); 132 static napi_value GetState(napi_env env, napi_callback_info info); 133 static napi_value On(napi_env env, napi_callback_info info); 134 static napi_value Off(napi_env env, napi_callback_info info); 135 static napi_value SetSilentModeAndMixWithOthers(napi_env env, napi_callback_info info); 136 static napi_value GetSilentModeAndMixWithOthers(napi_env env, napi_callback_info info); 137 static napi_value SetDefaultOutputDevice(napi_env env, napi_callback_info info); 138 static napi_value GetCallback(size_t argc, napi_value *argv); 139 140 static napi_status WriteArrayBufferToNative(std::shared_ptr<AudioRendererAsyncContext> context); 141 142 static napi_value RegisterCallback(napi_env env, napi_value jsThis, 143 napi_value *argv, const std::string &cbName); 144 static napi_value RegisterRendererCallback(napi_env env, napi_value *argv, 145 const std::string &cbName, NapiAudioRenderer *napiRenderer); 146 static napi_value RegisterPositionCallback(napi_env env, napi_value *argv, 147 const std::string &cbName, NapiAudioRenderer *napiRenderer); 148 static void UnregisterPositionCallback(napi_env env, size_t argc, const std::string &cbName, 149 napi_value *argv, NapiAudioRenderer *napiRenderer); 150 static napi_value RegisterPeriodPositionCallback(napi_env env, napi_value *argv, 151 const std::string &cbName, NapiAudioRenderer *napiRenderer); 152 static void UnregisterPeriodPositionCallback(napi_env env, size_t argc, const std::string &cbName, 153 napi_value *argv, NapiAudioRenderer *napiRenderer); 154 static napi_value RegisterDataRequestCallback(napi_env env, napi_value *argv, 155 const std::string &cbName, NapiAudioRenderer *napiRenderer); 156 static void UnregisterDataRequestCallback(napi_env env, size_t argc, const std::string &cbName, 157 napi_value *argv, NapiAudioRenderer *napiRenderer); 158 static napi_value UnregisterCallback(napi_env env, napi_value jsThis, size_t argc, napi_value *argv, 159 const std::string &cbName); 160 static void RegisterRendererDeviceChangeCallback(napi_env env, napi_value *argv, 161 const std::string &cbName, NapiAudioRenderer *napiRenderer); 162 static void UnregisterRendererCallback(napi_env env, size_t argc, const std::string &cbName, 163 napi_value *argv, NapiAudioRenderer *napiRenderer); 164 static void UnregisterRendererDeviceChangeCallback(napi_env env, size_t argc, const std::string &cbName, 165 napi_value *argv, NapiAudioRenderer *napiRenderer); 166 167 static void RegisterRendererOutputDeviceChangeWithInfoCallback(napi_env env, napi_value *argv, 168 const std::string &cbName, NapiAudioRenderer *napiRenderer); 169 static void UnregisterRendererOutputDeviceChangeWithInfoCallback(napi_env env, size_t argc, 170 const std::string &cbName, napi_value *argv, NapiAudioRenderer *napiRenderer); 171 172 static void RegisterRendererWriteDataCallback(napi_env env, napi_value *argv, 173 const std::string &cbName, NapiAudioRenderer *napiRenderer); 174 static void UnregisterRendererWriteDataCallback(napi_env env, size_t argc, const napi_value *argv, 175 NapiAudioRenderer *napiRenderer); 176 /* common interface in AudioRendererNapi */ 177 static bool CheckContextStatus(std::shared_ptr<AudioRendererAsyncContext> context); 178 static bool CheckAudioRendererStatus(NapiAudioRenderer *napi, std::shared_ptr<AudioRendererAsyncContext> context); 179 static NapiAudioRenderer* GetParamWithSync(const napi_env &env, napi_callback_info info, 180 size_t &argc, napi_value *args); 181 182 static constexpr double MIN_VOLUME_IN_DOUBLE = 0.0; 183 static constexpr double MAX_VOLUME_IN_DOUBLE = 1.0; 184 static std::mutex createMutex_; 185 static int32_t isConstructSuccess_; 186 static std::unique_ptr<AudioRendererOptions> sRendererOptions_; 187 188 ContentType contentType_; 189 StreamUsage streamUsage_; 190 napi_env env_; 191 std::shared_ptr<AudioRendererCallback> callbackNapi_ = nullptr; 192 std::shared_ptr<RendererPositionCallback> positionCbNapi_ = nullptr; 193 std::shared_ptr<RendererPeriodPositionCallback> periodPositionCbNapi_ = nullptr; 194 std::shared_ptr<AudioRendererWriteCallback> dataRequestCbNapi_ = nullptr; 195 std::shared_ptr<NapiAudioRendererDeviceChangeCallback> rendererDeviceChangeCallbackNapi_ = nullptr; 196 std::shared_ptr<NapiAudioRendererOutputDeviceChangeWithInfoCallback> 197 rendererOutputDeviceChangeWithInfoCallbackNapi_ = nullptr; 198 std::shared_ptr<AudioRendererPolicyServiceDiedCallback> rendererPolicyServiceDiedCallbackNapi_ = nullptr; 199 std::shared_ptr<AudioRendererWriteCallback> rendererWriteDataCallbackNapi_ = nullptr; 200 }; 201 } // namespace AudioStandard 202 } // namespace OHOS 203 #endif /* AUDIO_RENDERER_NAPI_H */ 204