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 #include "audio_stream_manager.h" 29 #include "audio_renderer_state_callback_napi.h" 30 31 namespace OHOS { 32 namespace AudioStandard { 33 static const std::string AUDIO_RENDERER_NAPI_CLASS_NAME = "AudioRenderer"; 34 35 static const std::map<std::string, AudioRendererRate> rendererRateMap = { 36 {"RENDER_RATE_NORMAL", RENDER_RATE_NORMAL}, 37 {"RENDER_RATE_DOUBLE", RENDER_RATE_DOUBLE}, 38 {"RENDER_RATE_HALF", RENDER_RATE_HALF} 39 }; 40 41 class AudioRendererNapi { 42 public: 43 AudioRendererNapi(); 44 ~AudioRendererNapi(); 45 46 enum AudioSampleFormat { 47 SAMPLE_FORMAT_INVALID = -1, 48 SAMPLE_FORMAT_U8 = 0, 49 SAMPLE_FORMAT_S16LE = 1, 50 SAMPLE_FORMAT_S24LE = 2, 51 SAMPLE_FORMAT_S32LE = 3, 52 SAMPLE_FORMAT_F32LE = 4 53 }; 54 std::unique_ptr<AudioRenderer> audioRenderer_; 55 static napi_value Init(napi_env env, napi_value exports); 56 void DestroyCallbacks(); 57 void DestroyNAPICallbacks(); 58 private: 59 struct AudioRendererAsyncContext { 60 napi_env env; 61 napi_async_work work; 62 napi_deferred deferred; 63 napi_ref callbackRef = nullptr; 64 int32_t status = SUCCESS; 65 int32_t intValue; 66 int32_t audioRendererRate; 67 int32_t rendererFlags; 68 int32_t interruptMode; 69 bool isTrue; 70 uint64_t time; 71 size_t bufferLen; 72 size_t bufferSize; 73 int32_t volType; 74 double volLevel; 75 uint32_t rendererSampleRate; 76 uint32_t audioStreamId; 77 size_t totalBytesWritten; 78 uint32_t underflowCount; 79 void *data; 80 int32_t audioEffectMode; 81 AudioSampleFormat sampleFormat; 82 AudioSamplingRate samplingRate; 83 AudioChannel channelCount; 84 AudioEncodingType encodingType; 85 ContentType contentType; 86 StreamUsage usage; 87 DeviceRole deviceRole; 88 DeviceType deviceType; 89 AudioRendererNapi *objectInfo; 90 AudioRendererOptions rendererOptions; 91 DeviceInfo deviceInfo; 92 }; 93 94 static void Destructor(napi_env env, void *nativeObject, void *finalize_hint); 95 static void CreateRendererFailed(); 96 static napi_value Construct(napi_env env, napi_callback_info info); 97 static napi_value CreateAudioRenderer(napi_env env, napi_callback_info info); 98 static napi_value CreateAudioRendererSync(napi_env env, napi_callback_info info); 99 static napi_value SetRenderRate(napi_env env, napi_callback_info info); 100 static napi_value GetRenderRate(napi_env env, napi_callback_info info); 101 static napi_value GetRenderRateSync(napi_env env, napi_callback_info info); 102 static napi_value SetRendererSamplingRate(napi_env env, napi_callback_info info); 103 static napi_value GetRendererSamplingRate(napi_env env, napi_callback_info info); 104 static napi_value Start(napi_env env, napi_callback_info info); 105 static napi_value Write(napi_env env, napi_callback_info info); 106 static napi_value GetAudioTime(napi_env env, napi_callback_info info); 107 static napi_value GetAudioTimeSync(napi_env env, napi_callback_info info); 108 static napi_value Drain(napi_env env, napi_callback_info info); 109 static napi_value Pause(napi_env env, napi_callback_info info); 110 static napi_value Stop(napi_env env, napi_callback_info info); 111 static napi_value Release(napi_env env, napi_callback_info info); 112 static napi_value GetBufferSize(napi_env env, napi_callback_info info); 113 static napi_value GetBufferSizeSync(napi_env env, napi_callback_info info); 114 static napi_value GetAudioStreamId(napi_env env, napi_callback_info info); 115 static napi_value GetAudioStreamIdSync(napi_env env, napi_callback_info info); 116 static napi_value SetVolume(napi_env env, napi_callback_info info); 117 static napi_value GetState(napi_env env, napi_callback_info info); 118 static napi_value GetRendererInfo(napi_env env, napi_callback_info info); 119 static napi_value GetRendererInfoSync(napi_env env, napi_callback_info info); 120 static napi_value GetStreamInfo(napi_env env, napi_callback_info info); 121 static napi_value GetStreamInfoSync(napi_env env, napi_callback_info info); 122 static napi_value On(napi_env env, napi_callback_info info); 123 static napi_value Off(napi_env env, napi_callback_info info); 124 static napi_value CreateAudioRendererWrapper(napi_env env, std::unique_ptr<AudioRendererOptions> &renderOptions); 125 static napi_value SetInterruptMode(napi_env env, napi_callback_info info); 126 static napi_value SetInterruptModeSync(napi_env env, napi_callback_info info); 127 static napi_value GetMinStreamVolume(napi_env env, napi_callback_info info); 128 static napi_value GetMinStreamVolumeSync(napi_env env, napi_callback_info info); 129 static napi_value GetMaxStreamVolume(napi_env env, napi_callback_info info); 130 static napi_value GetMaxStreamVolumeSync(napi_env env, napi_callback_info info); 131 static napi_value GetCurrentOutputDevices(napi_env env, napi_callback_info info); 132 static napi_value GetCurrentOutputDevicesSync(napi_env env, napi_callback_info info); 133 static napi_value GetUnderflowCount(napi_env env, napi_callback_info info); 134 static napi_value GetUnderflowCountSync(napi_env env, napi_callback_info info); 135 static napi_value GetAudioEffectMode(napi_env env, napi_callback_info info); 136 static napi_value SetAudioEffectMode(napi_env env, napi_callback_info info); 137 138 static void JudgeFuncDrain(napi_env &env, napi_value &result, 139 std::unique_ptr<AudioRendererAsyncContext> &asyncContext); 140 static void JudgeFuncGetAudioStreamId(napi_env &env, napi_value &result, 141 std::unique_ptr<AudioRendererAsyncContext> &asyncContext); 142 static bool GetArgvForSetAudioEffectMode(napi_env env, size_t argc, napi_value *argv, 143 std::unique_ptr<AudioRendererAsyncContext> &asyncContext); 144 145 static bool ParseRendererOptions(napi_env env, napi_value root, AudioRendererOptions *opts); 146 static bool ParseRendererInfo(napi_env env, napi_value root, AudioRendererInfo *rendererInfo); 147 static bool ParseStreamInfo(napi_env env, napi_value root, AudioStreamInfo* streamInfo); 148 static bool CheckContextStatus(AudioRendererAsyncContext *context); 149 150 static void CommonCallbackRoutine(napi_env env, AudioRendererAsyncContext* &asyncContext, 151 const napi_value &valueParam); 152 static void SetFunctionAsyncCallbackComplete(napi_env env, napi_status status, void *data); 153 static void AudioParamsAsyncCallbackComplete(napi_env env, napi_status status, void *data); 154 static void IsTrueAsyncCallbackComplete(napi_env env, napi_status status, void *data); 155 static void GetBufferSizeAsyncCallbackComplete(napi_env env, napi_status status, void *data); 156 static void GetAudioStreamIdCallbackComplete(napi_env env, napi_status status, void *data); 157 static void GetIntValueAsyncCallbackComplete(napi_env env, napi_status status, void *data); 158 static void GetInt64ValueAsyncCallbackComplete(napi_env env, napi_status status, void *data); 159 static void GetRendererSampleRateAsyncCallbackComplete(napi_env env, napi_status status, void *data); 160 static void WriteAsyncCallbackComplete(napi_env env, napi_status status, void *data); 161 static void PauseAsyncCallbackComplete(napi_env env, napi_status status, void *data); 162 static void StartAsyncCallbackComplete(napi_env env, napi_status status, void *data); 163 static void StopAsyncCallbackComplete(napi_env env, napi_status status, void *data); 164 static void AudioRendererInfoAsyncCallbackComplete(napi_env env, napi_status status, void *data); 165 static void AudioStreamInfoAsyncCallbackComplete(napi_env env, napi_status status, void *data); 166 static void GetRendererAsyncCallbackComplete(napi_env env, napi_status status, void *data); 167 static void VoidAsyncCallbackComplete(napi_env env, napi_status status, void *data); 168 static void GetStreamVolumeAsyncCallbackComplete(napi_env env, napi_status status, void *data); 169 static void GetDeviceInfoAsyncCallbackComplete(napi_env env, napi_status status, void *data); 170 static void GetUnderflowCountAsyncCallbackComplete(napi_env env, napi_status status, void *data); 171 static void AsyncSetSamplingRate(napi_env env, void *data); 172 static void AsyncGetCurrentOutputDevices(napi_env env, void *data); 173 static void AsyncSetAudioEffectMode(napi_env env, void *data); 174 static void AsyncGetAudioEffectMode(napi_env env, void *data); 175 176 static napi_value RegisterCallback(napi_env env, napi_value jsThis, 177 napi_value* argv, const std::string& cbName); 178 static napi_value RegisterRendererCallback(napi_env env, napi_value* argv, 179 const std::string& cbName, AudioRendererNapi *rendererNapi); 180 static napi_value RegisterPositionCallback(napi_env env, napi_value* argv, 181 const std::string& cbName, AudioRendererNapi *rendererNapi); 182 static napi_value RegisterPeriodPositionCallback(napi_env env, napi_value* argv, 183 const std::string& cbName, AudioRendererNapi *rendererNapi); 184 static napi_value RegisterDataRequestCallback(napi_env env, napi_value* argv, 185 const std::string& cbName, AudioRendererNapi *rendererNapi); 186 static napi_value UnregisterCallback(napi_env env, napi_value jsThis, size_t argc, napi_value* argv, 187 const std::string& cbName); 188 static void UnregisterRendererCallback(napi_env env, napi_value* argv, 189 const std::string& cbName, AudioRendererNapi *rendererNapi); 190 191 static napi_status AddNamedProperty(napi_env env, napi_value object, const std::string name, int32_t enumValue); 192 static napi_value CreateAudioRendererRateObject(napi_env env); 193 static napi_value CreateInterruptEventTypeObject(napi_env env); 194 static napi_value CreateInterruptForceTypeObject(napi_env env); 195 static napi_value CreateInterruptHintTypeObject(napi_env env); 196 static napi_value CreateAudioStateObject(napi_env env); 197 static napi_value CreateAudioSampleFormatObject(napi_env env); 198 static napi_value CreateAudioEffectModeObject(napi_env env); 199 static napi_value CreateAudioPrivacyTypeObject(napi_env env); 200 static void RegisterRendererDeviceChangeCallback(napi_env env, napi_value* args, AudioRendererNapi *rendererNapi); 201 static void UnregisterRendererDeviceChangeCallback(napi_env env, size_t argc, napi_value* args, 202 AudioRendererNapi *rendererNapi); 203 static napi_ref audioRendererRate_; 204 static napi_ref interruptEventType_; 205 static napi_ref interruptForceType_; 206 static napi_ref interruptHintType_; 207 static napi_ref audioState_; 208 static napi_ref sampleFormat_; 209 static napi_ref audioEffectMode_; 210 static napi_ref audioPrivacyType_; 211 static std::unique_ptr<AudioParameters> sAudioParameters_; 212 static std::unique_ptr<AudioRendererOptions> sRendererOptions_; 213 static std::mutex createMutex_; 214 static int32_t isConstructSuccess_; 215 216 ContentType contentType_; 217 StreamUsage streamUsage_; 218 DeviceRole deviceRole_; 219 DeviceType deviceType_; 220 int32_t rendererFlags_ = 0; // default flag 0 221 napi_env env_; 222 std::queue<napi_async_work> writeRequestQ_; 223 std::atomic<bool> scheduleFromApiCall_; 224 std::atomic<bool> doNotScheduleWrite_; 225 std::atomic<bool> isDrainWriteQInProgress_; 226 std::shared_ptr<AudioRendererCallback> callbackNapi_ = nullptr; 227 std::shared_ptr<RendererPositionCallback> positionCBNapi_ = nullptr; 228 std::shared_ptr<RendererPeriodPositionCallback> periodPositionCBNapi_ = nullptr; 229 std::shared_ptr<AudioRendererWriteCallback> dataRequestCBNapi_ = nullptr; 230 static constexpr double MIN_VOLUME_IN_DOUBLE = 0.0; 231 static constexpr double MAX_VOLUME_IN_DOUBLE = 1.0; 232 std::shared_ptr<AudioRendererDeviceChangeCallback> rendererDeviceChangeCallbackNapi_ = nullptr; 233 std::shared_ptr<AudioRendererPolicyServiceDiedCallback> rendererPolicyServiceDiedCallbackNapi_ = nullptr; 234 }; 235 236 static const std::map<std::string, InterruptType> interruptEventTypeMap = { 237 {"INTERRUPT_TYPE_BEGIN", INTERRUPT_TYPE_BEGIN}, 238 {"INTERRUPT_TYPE_END", INTERRUPT_TYPE_END} 239 }; 240 241 static const std::map<std::string, InterruptForceType> interruptForceTypeMap = { 242 {"INTERRUPT_FORCE", INTERRUPT_FORCE}, 243 {"INTERRUPT_SHARE", INTERRUPT_SHARE}, 244 }; 245 246 static const std::map<std::string, InterruptHint> interruptHintTypeMap = { 247 {"INTERRUPT_HINT_NONE", INTERRUPT_HINT_NONE}, 248 {"INTERRUPT_HINT_PAUSE", INTERRUPT_HINT_PAUSE}, 249 {"INTERRUPT_HINT_RESUME", INTERRUPT_HINT_RESUME}, 250 {"INTERRUPT_HINT_STOP", INTERRUPT_HINT_STOP}, 251 {"INTERRUPT_HINT_DUCK", INTERRUPT_HINT_DUCK}, 252 {"INTERRUPT_HINT_UNDUCK", INTERRUPT_HINT_UNDUCK} 253 }; 254 255 static const std::map<std::string, RendererState> audioStateMap = { 256 {"STATE_INVALID", RENDERER_INVALID}, 257 {"STATE_NEW", RENDERER_NEW}, 258 {"STATE_PREPARED", RENDERER_PREPARED}, 259 {"STATE_RUNNING", RENDERER_RUNNING}, 260 {"STATE_STOPPED", RENDERER_STOPPED}, 261 {"STATE_RELEASED", RENDERER_RELEASED}, 262 {"STATE_PAUSED", RENDERER_PAUSED} 263 }; 264 265 static const std::map<std::string, AudioPrivacyType> audioPrivacyTypeMap = { 266 {"PRIVACY_TYPE_PUBLIC", PRIVACY_TYPE_PUBLIC}, 267 {"PRIVACY_TYPE_PRIVATE", PRIVACY_TYPE_PRIVATE} 268 }; 269 } // namespace AudioStandard 270 } // namespace OHOS 271 #endif /* AUDIO_RENDERER_NAPI_H_ */ 272