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