• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_H
17 #define NAPI_AUDIO_RENDERER_H
18 
19 #include <iostream>
20 #include <map>
21 #include <queue>
22 
23 #include "napi/native_api.h"
24 #include "napi/native_node_api.h"
25 #include "audio_stream_manager.h"
26 #include "audio_renderer.h"
27 #include "napi_async_work.h"
28 #include "napi_audio_renderer_device_change_callback.h"
29 
30 namespace OHOS {
31 namespace AudioStandard {
32 using namespace HiviewDFX;
33 using namespace std;
34 
35 const std::string NAPI_AUDIO_RENDERER_CLASS_NAME = "AudioRenderer";
36 
37 class NapiAudioRenderer {
38 public:
39     NapiAudioRenderer();
40     ~NapiAudioRenderer();
41 
42     static napi_value Init(napi_env env, napi_value exports);
43     void DestroyCallbacks();
44     void DestroyNAPICallbacks();
45 #if !defined(ANDROID_PLATFORM) && !defined(IOS_PLATFORM)
46     std::shared_ptr<AudioRenderer> audioRenderer_;
47 #else
48     std::unique_ptr<AudioRenderer> audioRenderer_;
49 #endif
50     std::mutex writeCallbackMutex_;
51     std::condition_variable writeCallbackCv_;
52     bool enqueued_ = false;
53     std::list<std::shared_ptr<NapiAudioRendererCallbackInner>> audioRendererCallbacks_;
54 
55 private:
56     struct AudioRendererAsyncContext : public ContextBase {
57         int32_t intValue;
58         int32_t audioRendererRate;
59         int32_t rendererFlags;
60         int32_t interruptMode;
61         bool isTrue;
62         uint64_t time;
63         size_t bufferLen;
64         size_t bufferSize;
65         int32_t volType;
66         double volLevel;
67         double loudnessGain;
68         uint32_t rendererSampleRate;
69         uint32_t audioStreamId;
70         size_t totalBytesWritten;
71         uint32_t underflowCount;
72         void *data;
73         int32_t audioEffectMode;
74         int32_t channelBlendMode;
75         DeviceRole deviceRole;
76         int32_t deviceType;
77         Timestamp timeStamp;
78         AudioRendererOptions rendererOptions;
79         AudioDeviceDescriptor deviceInfo = AudioDeviceDescriptor(AudioDeviceDescriptor::DEVICE_INFO);
80         AudioRendererInfo rendererInfo;
81         AudioStreamInfo streamInfo;
82     };
83 
84     static napi_status InitNapiAudioRenderer(napi_env env, napi_value &constructor);
85     static void Destructor(napi_env env, void *nativeObject, void *finalizeHint);
86     static void CreateRendererFailed();
87     static napi_value Construct(napi_env env, napi_callback_info info);
88     static unique_ptr<NapiAudioRenderer> CreateAudioRendererNativeObject(napi_env env);
89     static napi_value CreateAudioRendererWrapper(napi_env env, const AudioRendererOptions rendererOptions);
90     static napi_value CreateAudioRenderer(napi_env env, napi_callback_info info);
91     static napi_value CreateAudioRendererSync(napi_env env, napi_callback_info info);
92     static napi_value SetRenderRate(napi_env env, napi_callback_info info);
93     static napi_value GetRenderRate(napi_env env, napi_callback_info info);
94     static napi_value GetRenderRateSync(napi_env env, napi_callback_info info);
95     static napi_value SetRendererSamplingRate(napi_env env, napi_callback_info info);
96     static napi_value GetRendererSamplingRate(napi_env env, napi_callback_info info);
97     static napi_value Start(napi_env env, napi_callback_info info);
98     static napi_value Write(napi_env env, napi_callback_info info);
99     static napi_value GetAudioTime(napi_env env, napi_callback_info info);
100     static napi_value GetAudioTimeSync(napi_env env, napi_callback_info info);
101     static napi_value Drain(napi_env env, napi_callback_info info);
102     static napi_value Flush(napi_env env, napi_callback_info info);
103     static napi_value Pause(napi_env env, napi_callback_info info);
104     static napi_value Stop(napi_env env, napi_callback_info info);
105     static napi_value Release(napi_env env, napi_callback_info info);
106     static napi_value GetBufferSize(napi_env env, napi_callback_info info);
107     static napi_value GetBufferSizeSync(napi_env env, napi_callback_info info);
108     static napi_value GetAudioStreamId(napi_env env, napi_callback_info info);
109     static napi_value GetAudioStreamIdSync(napi_env env, napi_callback_info info);
110     static napi_value SetVolume(napi_env env, napi_callback_info info);
111     static napi_value GetVolume(napi_env env, napi_callback_info info);
112     static napi_value SetLoudnessGain(napi_env env, napi_callback_info info);
113     static napi_value GetLoudnessGain(napi_env env, napi_callback_info info);
114     static napi_value GetRendererInfo(napi_env env, napi_callback_info info);
115     static napi_value GetRendererInfoSync(napi_env env, napi_callback_info info);
116     static napi_value GetStreamInfo(napi_env env, napi_callback_info info);
117     static napi_value GetStreamInfoSync(napi_env env, napi_callback_info info);
118     static napi_value SetInterruptMode(napi_env env, napi_callback_info info);
119     static napi_value SetInterruptModeSync(napi_env env, napi_callback_info info);
120     static napi_value GetMinStreamVolume(napi_env env, napi_callback_info info);
121     static napi_value GetMinStreamVolumeSync(napi_env env, napi_callback_info info);
122     static napi_value GetMaxStreamVolume(napi_env env, napi_callback_info info);
123     static napi_value GetMaxStreamVolumeSync(napi_env env, napi_callback_info info);
124     static napi_value GetCurrentOutputDevices(napi_env env, napi_callback_info info);
125     static napi_value GetCurrentOutputDevicesSync(napi_env env, napi_callback_info info);
126     static napi_value GetUnderflowCount(napi_env env, napi_callback_info info);
127     static napi_value GetUnderflowCountSync(napi_env env, napi_callback_info info);
128     static napi_value GetAudioTimestampInfo(napi_env env, napi_callback_info info);
129     static napi_value GetAudioTimestampInfoSync(napi_env env, napi_callback_info info);
130     static napi_value GetAudioEffectMode(napi_env env, napi_callback_info info);
131     static napi_value SetAudioEffectMode(napi_env env, napi_callback_info info);
132     static napi_value SetChannelBlendMode(napi_env env, napi_callback_info info);
133     static napi_value SetVolumeWithRamp(napi_env env, napi_callback_info info);
134     static napi_value SetSpeed(napi_env env, napi_callback_info info);
135     static napi_value GetSpeed(napi_env env, napi_callback_info info);
136     static napi_value GetState(napi_env env, napi_callback_info info);
137     static napi_value On(napi_env env, napi_callback_info info);
138     static napi_value Off(napi_env env, napi_callback_info info);
139     static napi_value SetSilentModeAndMixWithOthers(napi_env env, napi_callback_info info);
140     static napi_value GetSilentModeAndMixWithOthers(napi_env env, napi_callback_info info);
141     static napi_value SetDefaultOutputDevice(napi_env env, napi_callback_info info);
142     static napi_value GetCallback(size_t argc, napi_value *argv);
143 
144     static napi_status WriteArrayBufferToNative(std::shared_ptr<AudioRendererAsyncContext> context);
145 
146     static napi_value RegisterCallback(napi_env env, napi_value jsThis,
147         napi_value *argv, const std::string &cbName);
148     static napi_value RegisterRendererCallback(napi_env env, napi_value *argv,
149         const std::string &cbName, NapiAudioRenderer *napiRenderer);
150     static napi_value RegisterPositionCallback(napi_env env, napi_value *argv,
151         const std::string &cbName, NapiAudioRenderer *napiRenderer);
152     static void UnregisterPositionCallback(napi_env env, size_t argc, const std::string &cbName,
153         napi_value *argv, NapiAudioRenderer *napiRenderer);
154     static napi_value RegisterPeriodPositionCallback(napi_env env, napi_value *argv,
155         const std::string &cbName, NapiAudioRenderer *napiRenderer);
156     static void UnregisterPeriodPositionCallback(napi_env env, size_t argc, const std::string &cbName,
157         napi_value *argv, NapiAudioRenderer *napiRenderer);
158     static napi_value RegisterDataRequestCallback(napi_env env, napi_value *argv,
159         const std::string &cbName, NapiAudioRenderer *napiRenderer);
160     static void UnregisterDataRequestCallback(napi_env env, size_t argc, const std::string &cbName,
161         napi_value *argv, NapiAudioRenderer *napiRenderer);
162     static napi_value UnregisterCallback(napi_env env, napi_value jsThis, size_t argc, napi_value *argv,
163         const std::string &cbName);
164     static void RegisterRendererDeviceChangeCallback(napi_env env, napi_value *argv,
165         NapiAudioRenderer *napiRenderer);
166     static void UnregisterRendererCallback(napi_env env, size_t argc, const std::string &cbName,
167         napi_value *argv, NapiAudioRenderer *napiRenderer);
168     static void UnregisterRendererDeviceChangeCallback(napi_env env, size_t argc,
169         napi_value *argv, NapiAudioRenderer *napiRenderer);
170 
171     static void RegisterRendererOutputDeviceChangeWithInfoCallback(napi_env env, napi_value *argv,
172         NapiAudioRenderer *napiRenderer);
173     static void UnregisterRendererOutputDeviceChangeWithInfoCallback(napi_env env, size_t argc,
174         napi_value *argv, NapiAudioRenderer *napiRenderer);
175 
176     static void RegisterRendererWriteDataCallback(napi_env env, napi_value *argv,
177         const std::string &cbName, NapiAudioRenderer *napiRenderer);
178     static void UnregisterRendererWriteDataCallback(napi_env env, size_t argc, const napi_value *argv,
179         NapiAudioRenderer *napiRenderer);
180     /* common interface in AudioRendererNapi */
181     static bool CheckContextStatus(std::shared_ptr<AudioRendererAsyncContext> context);
182     static bool CheckAudioRendererStatus(NapiAudioRenderer *napi, std::shared_ptr<AudioRendererAsyncContext> context);
183     static NapiAudioRenderer* GetParamWithSync(const napi_env &env, napi_callback_info info,
184         size_t &argc, napi_value *args);
185 
186     static constexpr double MIN_VOLUME_IN_DOUBLE = 0.0;
187     static constexpr double MAX_VOLUME_IN_DOUBLE = 1.0;
188     static std::mutex createMutex_;
189     static int32_t isConstructSuccess_;
190     static std::unique_ptr<AudioRendererOptions> sRendererOptions_;
191 
192     ContentType contentType_;
193     StreamUsage streamUsage_;
194     napi_env env_;
195     std::shared_ptr<AudioRendererCallback> callbackNapi_ = nullptr;
196     std::shared_ptr<RendererPositionCallback> positionCbNapi_ = nullptr;
197     std::shared_ptr<RendererPeriodPositionCallback> periodPositionCbNapi_ = nullptr;
198     std::shared_ptr<AudioRendererWriteCallback> dataRequestCbNapi_ = nullptr;
199     std::shared_ptr<NapiAudioRendererDeviceChangeCallback> rendererDeviceChangeCallbackNapi_ = nullptr;
200     std::shared_ptr<NapiAudioRendererOutputDeviceChangeWithInfoCallback>
201         rendererOutputDeviceChangeWithInfoCallbackNapi_ = nullptr;
202     std::shared_ptr<AudioRendererPolicyServiceDiedCallback> rendererPolicyServiceDiedCallbackNapi_ = nullptr;
203     std::shared_ptr<AudioRendererWriteCallback> rendererWriteDataCallbackNapi_ = nullptr;
204 };
205 } // namespace AudioStandard
206 } // namespace OHOS
207 #endif /* AUDIO_RENDERER_NAPI_H */
208