1 /* 2 * Copyright (c) 2021-2022 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_RENDERER_NAPI_H_ 17 #define AUDIO_RENDERER_NAPI_H_ 18 19 #include <iostream> 20 #include <map> 21 #include <queue> 22 23 #include "audio_renderer.h" 24 #include "audio_errors.h" 25 #include "audio_system_manager.h" 26 #include "napi/native_api.h" 27 #include "napi/native_node_api.h" 28 29 namespace OHOS { 30 namespace AudioStandard { 31 static const std::string AUDIO_RENDERER_NAPI_CLASS_NAME = "AudioRenderer"; 32 33 static const std::map<std::string, AudioRendererRate> rendererRateMap = { 34 {"RENDER_RATE_NORMAL", RENDER_RATE_NORMAL}, 35 {"RENDER_RATE_DOUBLE", RENDER_RATE_DOUBLE}, 36 {"RENDER_RATE_HALF", RENDER_RATE_HALF} 37 }; 38 39 class AudioRendererNapi { 40 public: 41 AudioRendererNapi(); 42 ~AudioRendererNapi(); 43 44 enum AudioSampleFormat { 45 SAMPLE_FORMAT_INVALID = -1, 46 SAMPLE_FORMAT_U8 = 0, 47 SAMPLE_FORMAT_S16LE = 1, 48 SAMPLE_FORMAT_S24LE = 2, 49 SAMPLE_FORMAT_S32LE = 3, 50 SAMPLE_FORMAT_F32LE = 4 51 }; 52 std::unique_ptr<AudioRenderer> audioRenderer_; 53 static napi_value Init(napi_env env, napi_value exports); 54 private: 55 struct AudioRendererAsyncContext { 56 napi_env env; 57 napi_async_work work; 58 napi_deferred deferred; 59 napi_ref callbackRef = nullptr; 60 int32_t status = SUCCESS; 61 int32_t intValue; 62 int32_t audioRendererRate; 63 int32_t rendererFlags; 64 int32_t interruptMode; 65 bool isTrue; 66 uint64_t time; 67 size_t bufferLen; 68 size_t bufferSize; 69 int32_t volType; 70 double volLevel; 71 uint32_t audioStreamId; 72 size_t totalBytesWritten; 73 void *data; 74 AudioSampleFormat sampleFormat; 75 AudioSamplingRate samplingRate; 76 AudioChannel channelCount; 77 AudioEncodingType encodingType; 78 ContentType contentType; 79 StreamUsage usage; 80 DeviceRole deviceRole; 81 DeviceType deviceType; 82 AudioRendererNapi *objectInfo; 83 AudioRendererOptions rendererOptions; 84 }; 85 86 static void Destructor(napi_env env, void *nativeObject, void *finalize_hint); 87 static napi_value Construct(napi_env env, napi_callback_info info); 88 static napi_value CreateAudioRenderer(napi_env env, napi_callback_info info); 89 static napi_value SetRenderRate(napi_env env, napi_callback_info info); 90 static napi_value GetRenderRate(napi_env env, napi_callback_info info); 91 static napi_value Start(napi_env env, napi_callback_info info); 92 static napi_value Write(napi_env env, napi_callback_info info); 93 static napi_value GetAudioTime(napi_env env, napi_callback_info info); 94 static napi_value Drain(napi_env env, napi_callback_info info); 95 static napi_value Pause(napi_env env, napi_callback_info info); 96 static napi_value Stop(napi_env env, napi_callback_info info); 97 static napi_value Release(napi_env env, napi_callback_info info); 98 static napi_value GetBufferSize(napi_env env, napi_callback_info info); 99 static napi_value GetAudioStreamId(napi_env env, napi_callback_info info); 100 static napi_value SetVolume(napi_env env, napi_callback_info info); 101 static napi_value GetState(napi_env env, napi_callback_info info); 102 static napi_value GetRendererInfo(napi_env env, napi_callback_info info); 103 static napi_value GetStreamInfo(napi_env env, napi_callback_info info); 104 static napi_value On(napi_env env, napi_callback_info info); 105 static napi_value Off(napi_env env, napi_callback_info info); 106 static napi_value CreateAudioRendererWrapper(napi_env env, std::unique_ptr<AudioRendererOptions> &renderOptions); 107 static napi_value SetInterruptMode(napi_env env, napi_callback_info info); 108 109 static bool ParseRendererOptions(napi_env env, napi_value root, AudioRendererOptions *opts); 110 static bool ParseRendererInfo(napi_env env, napi_value root, AudioRendererInfo *rendererInfo); 111 static bool ParseStreamInfo(napi_env env, napi_value root, AudioStreamInfo* streamInfo); 112 static bool CheckContextStatus(AudioRendererAsyncContext *context); 113 114 static void CommonCallbackRoutine(napi_env env, AudioRendererAsyncContext* &asyncContext, 115 const napi_value &valueParam); 116 static void SetFunctionAsyncCallbackComplete(napi_env env, napi_status status, void *data); 117 static void AudioParamsAsyncCallbackComplete(napi_env env, napi_status status, void *data); 118 static void IsTrueAsyncCallbackComplete(napi_env env, napi_status status, void *data); 119 static void GetBufferSizeAsyncCallbackComplete(napi_env env, napi_status status, void *data); 120 static void GetAudioStreamIdCallbackComplete(napi_env env, napi_status status, void *data); 121 static void GetIntValueAsyncCallbackComplete(napi_env env, napi_status status, void *data); 122 static void GetInt64ValueAsyncCallbackComplete(napi_env env, napi_status status, void *data); 123 static void WriteAsyncCallbackComplete(napi_env env, napi_status status, void *data); 124 static void PauseAsyncCallbackComplete(napi_env env, napi_status status, void *data); 125 static void StartAsyncCallbackComplete(napi_env env, napi_status status, void *data); 126 static void StopAsyncCallbackComplete(napi_env env, napi_status status, void *data); 127 static void AudioRendererInfoAsyncCallbackComplete(napi_env env, napi_status status, void *data); 128 static void AudioStreamInfoAsyncCallbackComplete(napi_env env, napi_status status, void *data); 129 static void GetRendererAsyncCallbackComplete(napi_env env, napi_status status, void *data); 130 static void VoidAsyncCallbackComplete(napi_env env, napi_status status, void *data); 131 132 static napi_value RegisterCallback(napi_env env, napi_value jsThis, 133 napi_value* argv, const std::string& cbName); 134 static napi_value RegisterRendererCallback(napi_env env, napi_value* argv, 135 const std::string& cbName, AudioRendererNapi *rendererNapi); 136 static napi_value RegisterPositionCallback(napi_env env, napi_value* argv, 137 const std::string& cbName, AudioRendererNapi *rendererNapi); 138 static napi_value RegisterPeriodPositionCallback(napi_env env, napi_value* argv, 139 const std::string& cbName, AudioRendererNapi *rendererNapi); 140 static napi_value RegisterDataRequestCallback(napi_env env, napi_value* argv, 141 const std::string& cbName, AudioRendererNapi *rendererNapi); 142 static napi_value UnregisterCallback(napi_env env, napi_value jsThis, const std::string& cbName); 143 144 static napi_status AddNamedProperty(napi_env env, napi_value object, const std::string name, int32_t enumValue); 145 static napi_value CreateAudioRendererRateObject(napi_env env); 146 static napi_value CreateInterruptEventTypeObject(napi_env env); 147 static napi_value CreateInterruptForceTypeObject(napi_env env); 148 static napi_value CreateInterruptHintTypeObject(napi_env env); 149 static napi_value CreateAudioStateObject(napi_env env); 150 static napi_value CreateAudioSampleFormatObject(napi_env env); 151 152 static napi_ref audioRendererRate_; 153 static napi_ref interruptEventType_; 154 static napi_ref interruptForceType_; 155 static napi_ref interruptHintType_; 156 static napi_ref audioState_; 157 static napi_ref sampleFormat_; 158 static std::unique_ptr<AudioParameters> sAudioParameters_; 159 static std::unique_ptr<AudioRendererOptions> sRendererOptions_; 160 static std::mutex createMutex_; 161 static int32_t isConstructSuccess_; 162 163 ContentType contentType_; 164 StreamUsage streamUsage_; 165 DeviceRole deviceRole_; 166 DeviceType deviceType_; 167 int32_t rendererFlags_; 168 napi_env env_; 169 std::queue<napi_async_work> writeRequestQ_; 170 std::atomic<bool> scheduleFromApiCall_; 171 std::atomic<bool> doNotScheduleWrite_; 172 std::atomic<bool> isDrainWriteQInProgress_; 173 std::shared_ptr<AudioRendererCallback> callbackNapi_ = nullptr; 174 std::shared_ptr<RendererPositionCallback> positionCBNapi_ = nullptr; 175 std::shared_ptr<RendererPeriodPositionCallback> periodPositionCBNapi_ = nullptr; 176 std::shared_ptr<AudioRendererWriteCallback> dataRequestCBNapi_ = nullptr; 177 static constexpr double MIN_VOLUME_IN_DOUBLE = 0.0; 178 static constexpr double MAX_VOLUME_IN_DOUBLE = 1.0; 179 }; 180 181 static const std::map<std::string, InterruptType> interruptEventTypeMap = { 182 {"INTERRUPT_TYPE_BEGIN", INTERRUPT_TYPE_BEGIN}, 183 {"INTERRUPT_TYPE_END", INTERRUPT_TYPE_END} 184 }; 185 186 static const std::map<std::string, InterruptForceType> interruptForceTypeMap = { 187 {"INTERRUPT_FORCE", INTERRUPT_FORCE}, 188 {"INTERRUPT_SHARE", INTERRUPT_SHARE}, 189 }; 190 191 static const std::map<std::string, InterruptHint> interruptHintTypeMap = { 192 {"INTERRUPT_HINT_NONE", INTERRUPT_HINT_NONE}, 193 {"INTERRUPT_HINT_PAUSE", INTERRUPT_HINT_PAUSE}, 194 {"INTERRUPT_HINT_RESUME", INTERRUPT_HINT_RESUME}, 195 {"INTERRUPT_HINT_STOP", INTERRUPT_HINT_STOP}, 196 {"INTERRUPT_HINT_DUCK", INTERRUPT_HINT_DUCK}, 197 {"INTERRUPT_HINT_UNDUCK", INTERRUPT_HINT_UNDUCK} 198 }; 199 200 static const std::map<std::string, RendererState> audioStateMap = { 201 {"STATE_INVALID", RENDERER_INVALID}, 202 {"STATE_NEW", RENDERER_NEW}, 203 {"STATE_PREPARED", RENDERER_PREPARED}, 204 {"STATE_RUNNING", RENDERER_RUNNING}, 205 {"STATE_STOPPED", RENDERER_STOPPED}, 206 {"STATE_RELEASED", RENDERER_RELEASED}, 207 {"STATE_PAUSED", RENDERER_PAUSED} 208 }; 209 } // namespace AudioStandard 210 } // namespace OHOS 211 #endif /* AUDIO_RENDERER_NAPI_H_ */ 212