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_WRITE_DATA_CALLBACK_H 17 #define NAPI_AUDIO_RENDERER_WRITE_DATA_CALLBACK_H 18 19 #include "napi/native_api.h" 20 #include "napi/native_node_api.h" 21 #include "napi_audio_renderer.h" 22 #include "napi_audio_renderer_callback.h" 23 24 namespace OHOS { 25 namespace AudioStandard { 26 class NapiRendererWriteDataCallback : public AudioRendererWriteCallback { 27 public: 28 NapiRendererWriteDataCallback(napi_env env, NapiAudioRenderer *napiRenderer); 29 virtual ~NapiRendererWriteDataCallback(); 30 void OnWriteData(size_t length) override; 31 32 void AddCallbackReference(const std::string &callbackName, napi_value args); 33 void RemoveCallbackReference(napi_env env, napi_value callback); 34 void CreateWriteDTsfn(napi_env env); 35 bool GetWriteDTsfnFlag(); 36 37 private: 38 struct RendererWriteDataJsCallback { 39 std::shared_ptr<AutoRef> callback = nullptr; 40 std::string callbackName = "unknown"; 41 BufferDesc bufDesc {}; 42 NapiAudioRenderer *rendererNapiObj; 43 }; 44 45 static void WorkCallbackRendererWriteDataInner(RendererWriteDataJsCallback *event); 46 static void SafeJsCallbackWriteDataWork(napi_env env, napi_value js_cb, void *context, void *data); 47 static void WriteDataTsfnFinalize(napi_env env, void *data, void *hint); 48 void OnJsRendererWriteDataCallback(std::unique_ptr<RendererWriteDataJsCallback> &jsCb); 49 static void CheckWriteDataCallbackResult(napi_env env, BufferDesc &bufDesc, napi_value result); 50 51 std::mutex mutex_; 52 napi_env env_ = nullptr; 53 std::shared_ptr<AutoRef> rendererWriteDataCallback_ = nullptr; 54 NapiAudioRenderer *napiRenderer_; 55 bool regArWriteDataTsfn_ = false; 56 napi_threadsafe_function arWriteDataTsfn_ = nullptr; 57 58 #if defined(ANDROID_PLATFORM) || defined(IOS_PLATFORM) 59 static vector<NapiAudioRenderer*> activeRenderers_; 60 #endif 61 }; 62 } // namespace AudioStandard 63 } // namespace OHOS 64 #endif //NAPI_AUDIO_RENDERER_WRITE_DATA_CALLBACK_H 65