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