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 void JudgeFuncDrain(napi_env &env, napi_value &result, 110 std::unique_ptr<AudioRendererAsyncContext> &asyncContext); 111 static void JudgeFuncGetAudioStreamId(napi_env &env, napi_value &result, 112 std::unique_ptr<AudioRendererAsyncContext> &asyncContext); 113 114 static bool ParseRendererOptions(napi_env env, napi_value root, AudioRendererOptions *opts); 115 static bool ParseRendererInfo(napi_env env, napi_value root, AudioRendererInfo *rendererInfo); 116 static bool ParseStreamInfo(napi_env env, napi_value root, AudioStreamInfo* streamInfo); 117 static bool CheckContextStatus(AudioRendererAsyncContext *context); 118 119 static void CommonCallbackRoutine(napi_env env, AudioRendererAsyncContext* &asyncContext, 120 const napi_value &valueParam); 121 static void SetFunctionAsyncCallbackComplete(napi_env env, napi_status status, void *data); 122 static void AudioParamsAsyncCallbackComplete(napi_env env, napi_status status, void *data); 123 static void IsTrueAsyncCallbackComplete(napi_env env, napi_status status, void *data); 124 static void GetBufferSizeAsyncCallbackComplete(napi_env env, napi_status status, void *data); 125 static void GetAudioStreamIdCallbackComplete(napi_env env, napi_status status, void *data); 126 static void GetIntValueAsyncCallbackComplete(napi_env env, napi_status status, void *data); 127 static void GetInt64ValueAsyncCallbackComplete(napi_env env, napi_status status, void *data); 128 static void WriteAsyncCallbackComplete(napi_env env, napi_status status, void *data); 129 static void PauseAsyncCallbackComplete(napi_env env, napi_status status, void *data); 130 static void StartAsyncCallbackComplete(napi_env env, napi_status status, void *data); 131 static void StopAsyncCallbackComplete(napi_env env, napi_status status, void *data); 132 static void AudioRendererInfoAsyncCallbackComplete(napi_env env, napi_status status, void *data); 133 static void AudioStreamInfoAsyncCallbackComplete(napi_env env, napi_status status, void *data); 134 static void GetRendererAsyncCallbackComplete(napi_env env, napi_status status, void *data); 135 static void VoidAsyncCallbackComplete(napi_env env, napi_status status, void *data); 136 137 static napi_value RegisterCallback(napi_env env, napi_value jsThis, 138 napi_value* argv, const std::string& cbName); 139 static napi_value RegisterRendererCallback(napi_env env, napi_value* argv, 140 const std::string& cbName, AudioRendererNapi *rendererNapi); 141 static napi_value RegisterPositionCallback(napi_env env, napi_value* argv, 142 const std::string& cbName, AudioRendererNapi *rendererNapi); 143 static napi_value RegisterPeriodPositionCallback(napi_env env, napi_value* argv, 144 const std::string& cbName, AudioRendererNapi *rendererNapi); 145 static napi_value RegisterDataRequestCallback(napi_env env, napi_value* argv, 146 const std::string& cbName, AudioRendererNapi *rendererNapi); 147 static napi_value UnregisterCallback(napi_env env, napi_value jsThis, const std::string& cbName); 148 149 static napi_status AddNamedProperty(napi_env env, napi_value object, const std::string name, int32_t enumValue); 150 static napi_value CreateAudioRendererRateObject(napi_env env); 151 static napi_value CreateInterruptEventTypeObject(napi_env env); 152 static napi_value CreateInterruptForceTypeObject(napi_env env); 153 static napi_value CreateInterruptHintTypeObject(napi_env env); 154 static napi_value CreateAudioStateObject(napi_env env); 155 static napi_value CreateAudioSampleFormatObject(napi_env env); 156 157 static napi_ref audioRendererRate_; 158 static napi_ref interruptEventType_; 159 static napi_ref interruptForceType_; 160 static napi_ref interruptHintType_; 161 static napi_ref audioState_; 162 static napi_ref sampleFormat_; 163 static std::unique_ptr<AudioParameters> sAudioParameters_; 164 static std::unique_ptr<AudioRendererOptions> sRendererOptions_; 165 static std::mutex createMutex_; 166 static int32_t isConstructSuccess_; 167 168 ContentType contentType_; 169 StreamUsage streamUsage_; 170 DeviceRole deviceRole_; 171 DeviceType deviceType_; 172 int32_t rendererFlags_; 173 napi_env env_; 174 std::queue<napi_async_work> writeRequestQ_; 175 std::atomic<bool> scheduleFromApiCall_; 176 std::atomic<bool> doNotScheduleWrite_; 177 std::atomic<bool> isDrainWriteQInProgress_; 178 std::shared_ptr<AudioRendererCallback> callbackNapi_ = nullptr; 179 std::shared_ptr<RendererPositionCallback> positionCBNapi_ = nullptr; 180 std::shared_ptr<RendererPeriodPositionCallback> periodPositionCBNapi_ = nullptr; 181 std::shared_ptr<AudioRendererWriteCallback> dataRequestCBNapi_ = nullptr; 182 static constexpr double MIN_VOLUME_IN_DOUBLE = 0.0; 183 static constexpr double MAX_VOLUME_IN_DOUBLE = 1.0; 184 }; 185 186 static const std::map<std::string, InterruptType> interruptEventTypeMap = { 187 {"INTERRUPT_TYPE_BEGIN", INTERRUPT_TYPE_BEGIN}, 188 {"INTERRUPT_TYPE_END", INTERRUPT_TYPE_END} 189 }; 190 191 static const std::map<std::string, InterruptForceType> interruptForceTypeMap = { 192 {"INTERRUPT_FORCE", INTERRUPT_FORCE}, 193 {"INTERRUPT_SHARE", INTERRUPT_SHARE}, 194 }; 195 196 static const std::map<std::string, InterruptHint> interruptHintTypeMap = { 197 {"INTERRUPT_HINT_NONE", INTERRUPT_HINT_NONE}, 198 {"INTERRUPT_HINT_PAUSE", INTERRUPT_HINT_PAUSE}, 199 {"INTERRUPT_HINT_RESUME", INTERRUPT_HINT_RESUME}, 200 {"INTERRUPT_HINT_STOP", INTERRUPT_HINT_STOP}, 201 {"INTERRUPT_HINT_DUCK", INTERRUPT_HINT_DUCK}, 202 {"INTERRUPT_HINT_UNDUCK", INTERRUPT_HINT_UNDUCK} 203 }; 204 205 static const std::map<std::string, RendererState> audioStateMap = { 206 {"STATE_INVALID", RENDERER_INVALID}, 207 {"STATE_NEW", RENDERER_NEW}, 208 {"STATE_PREPARED", RENDERER_PREPARED}, 209 {"STATE_RUNNING", RENDERER_RUNNING}, 210 {"STATE_STOPPED", RENDERER_STOPPED}, 211 {"STATE_RELEASED", RENDERER_RELEASED}, 212 {"STATE_PAUSED", RENDERER_PAUSED} 213 }; 214 } // namespace AudioStandard 215 } // namespace OHOS 216 #endif /* AUDIO_RENDERER_NAPI_H_ */ 217