• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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