• 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 OH_AUDIO_RENDERER_H
17 #define OH_AUDIO_RENDERER_H
18 
19 #include "native_audiorenderer.h"
20 #include "audio_renderer.h"
21 #include "audio_common_log.h"
22 
23 namespace OHOS {
24 namespace AudioStandard {
25 class OHAudioRendererModeCallback : public AudioRendererWriteCallback {
26 public:
OHAudioRendererModeCallback(OH_AudioRenderer_Callbacks callbacks,OH_AudioRenderer * audioRenderer,void * userData,AudioEncodingType encodingType)27     OHAudioRendererModeCallback(OH_AudioRenderer_Callbacks callbacks,
28         OH_AudioRenderer *audioRenderer, void *userData, AudioEncodingType encodingType)
29         : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData), encodingType_(encodingType)
30     {
31     }
OHAudioRendererModeCallback(OH_AudioRenderer_WriteDataWithMetadataCallback writeDataWithMetadataCallback,OH_AudioRenderer * audioRenderer,void * metadataUserData,AudioEncodingType encodingType)32     OHAudioRendererModeCallback(OH_AudioRenderer_WriteDataWithMetadataCallback writeDataWithMetadataCallback,
33         OH_AudioRenderer *audioRenderer, void *metadataUserData, AudioEncodingType encodingType)
34         : writeDataWithMetadataCallback_(writeDataWithMetadataCallback), ohAudioRenderer_(audioRenderer),
35         metadataUserData_(metadataUserData), encodingType_(encodingType)
36     {
37     }
OHAudioRendererModeCallback(OH_AudioRenderer_OnWriteDataCallback onWriteDataCallback,OH_AudioRenderer * audioRenderer,void * userData,AudioEncodingType encodingType)38     OHAudioRendererModeCallback(OH_AudioRenderer_OnWriteDataCallback onWriteDataCallback,
39         OH_AudioRenderer *audioRenderer, void *userData, AudioEncodingType encodingType)
40         : onWriteDataCallback_(onWriteDataCallback), ohAudioRenderer_(audioRenderer),
41         userData_(userData), encodingType_(encodingType)
42     {
43     }
OHAudioRendererModeCallback(OH_AudioRenderer_OnWriteDataCallbackAdvanced callbackAdvanced,OH_AudioRenderer * audioRenderer,void * userData,AudioEncodingType encodingType)44     OHAudioRendererModeCallback(OH_AudioRenderer_OnWriteDataCallbackAdvanced callbackAdvanced,
45         OH_AudioRenderer *audioRenderer, void *userData, AudioEncodingType encodingType)
46         : onWriteDataAdvancedCallback_(callbackAdvanced), ohAudioRenderer_(audioRenderer), userData_(userData),
47         encodingType_(encodingType)
48     {
49     }
50 
51     void OnWriteData(size_t length) override;
52 
53 private:
54     OH_AudioRenderer_Callbacks callbacks_ = {};
55     OH_AudioRenderer_OnWriteDataCallback onWriteDataCallback_ = nullptr;
56     OH_AudioRenderer_WriteDataWithMetadataCallback writeDataWithMetadataCallback_ = nullptr;
57     OH_AudioRenderer_OnWriteDataCallbackAdvanced onWriteDataAdvancedCallback_ = nullptr;
58     OH_AudioRenderer *ohAudioRenderer_ = nullptr;
59     void *userData_ = nullptr;
60     void *metadataUserData_ = nullptr;
61     AudioEncodingType encodingType_ = ENCODING_INVALID;
62 };
63 
64 class OHAudioRendererDeviceChangeCallback : public AudioRendererOutputDeviceChangeCallback {
65 public:
OHAudioRendererDeviceChangeCallback(OH_AudioRenderer_Callbacks callbacks,OH_AudioRenderer * audioRenderer,void * userData)66     OHAudioRendererDeviceChangeCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer *audioRenderer,
67         void *userData) : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData)
68     {
69     }
70 
71     void OnOutputDeviceChange(const AudioDeviceDescriptor &deviceInfo,
72         const AudioStreamDeviceChangeReason reason) override;
73 private:
74     OH_AudioRenderer_Callbacks callbacks_ = {};
75     OH_AudioRenderer *ohAudioRenderer_ = {};
76     void *userData_ = {};
77 };
78 
79 class OHAudioRendererDeviceChangeCallbackWithInfo : public AudioRendererOutputDeviceChangeCallback {
80 public:
OHAudioRendererDeviceChangeCallbackWithInfo(OH_AudioRenderer_OutputDeviceChangeCallback callback,OH_AudioRenderer * audioRenderer,void * userData)81     OHAudioRendererDeviceChangeCallbackWithInfo(OH_AudioRenderer_OutputDeviceChangeCallback callback,
82         OH_AudioRenderer *audioRenderer, void *userData)
83         : callback_(callback), ohAudioRenderer_(audioRenderer), userData_(userData)
84     {
85     }
86 
87     void OnOutputDeviceChange(const AudioDeviceDescriptor &deviceInfo,
88         const AudioStreamDeviceChangeReason reason) override;
89 private:
90     OH_AudioRenderer_OutputDeviceChangeCallback callback_;
91     OH_AudioRenderer *ohAudioRenderer_;
92     void *userData_;
93 };
94 
95 class OHAudioRendererFastStatusChangeCallback : public AudioRendererFastStatusChangeCallback {
96 public:
OHAudioRendererFastStatusChangeCallback(OH_AudioRenderer_OnFastStatusChange callback,OH_AudioRenderer * audioRenderer,void * userData)97     OHAudioRendererFastStatusChangeCallback(OH_AudioRenderer_OnFastStatusChange callback,
98         OH_AudioRenderer *audioRenderer, void *userData)
99         : callback_(callback), ohAudioRenderer_(audioRenderer), userData_(userData)
100     {
101     }
102 
103     void OnFastStatusChange(FastStatus status) override;
104 private:
105     OH_AudioRenderer_OnFastStatusChange callback_;
106     OH_AudioRenderer *ohAudioRenderer_;
107     void *userData_;
108 };
109 
110 class OHAudioRendererCallback : public AudioRendererCallback {
111 public:
OHAudioRendererCallback(OH_AudioRenderer_Callbacks callbacks,OH_AudioRenderer * audioRenderer,void * userData)112     OHAudioRendererCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer *audioRenderer,
113         void *userData) : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData)
114     {
115     }
OHAudioRendererCallback(OH_AudioRenderer_OnInterruptCallback onInterruptEventCallback,OH_AudioRenderer * audioRenderer,void * userData)116     OHAudioRendererCallback(OH_AudioRenderer_OnInterruptCallback onInterruptEventCallback,
117         OH_AudioRenderer *audioRenderer, void *userData) : onInterruptEventCallback_(onInterruptEventCallback),
118         ohAudioRenderer_(audioRenderer), userData_(userData)
119     {
120     }
121     void OnInterrupt(const InterruptEvent &interruptEvent) override;
OnStateChange(const RendererState state,const StateChangeCmdType cmdType)122     void OnStateChange(const RendererState state, const StateChangeCmdType __attribute__((unused)) cmdType) override
123     {
124         AUDIO_DEBUG_LOG("OHAudioRendererCallback:: OnStateChange");
125     }
126 
127 private:
128     OH_AudioRenderer_Callbacks callbacks_ = {};
129     OH_AudioRenderer_OnInterruptCallback onInterruptEventCallback_ = nullptr;
130     OH_AudioRenderer *ohAudioRenderer_ = {};
131     void *userData_ = {};
132 };
133 
134 class OHServiceDiedCallback : public AudioRendererPolicyServiceDiedCallback {
135 public:
OHServiceDiedCallback(OH_AudioRenderer_Callbacks callbacks,OH_AudioRenderer * audioRenderer,void * userData)136     OHServiceDiedCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer *audioRenderer,
137         void *userData) : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData)
138     {
139     }
OHServiceDiedCallback(OH_AudioRenderer_OnErrorCallback errorCallback,OH_AudioRenderer * audioRenderer,void * userData)140     OHServiceDiedCallback(OH_AudioRenderer_OnErrorCallback errorCallback, OH_AudioRenderer *audioRenderer,
141         void *userData) : errorCallback_(errorCallback), ohAudioRenderer_(audioRenderer), userData_(userData)
142     {
143     }
144 
145     void OnAudioPolicyServiceDied() override;
146 
147 private:
148     OH_AudioRenderer_Callbacks callbacks_ = {};
149     OH_AudioRenderer_OnErrorCallback errorCallback_ = nullptr;
150     OH_AudioRenderer *ohAudioRenderer_ = {};
151     void *userData_ = {};
152 };
153 
154 class OHAudioRendererErrorCallback : public AudioRendererErrorCallback {
155 public:
OHAudioRendererErrorCallback(OH_AudioRenderer_Callbacks callbacks,OH_AudioRenderer * audioRenderer,void * userData)156     OHAudioRendererErrorCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer *audioRenderer,
157         void *userData) : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData)
158     {
159     }
OHAudioRendererErrorCallback(OH_AudioRenderer_OnErrorCallback errorCallback,OH_AudioRenderer * audioRenderer,void * userData)160     OHAudioRendererErrorCallback(OH_AudioRenderer_OnErrorCallback errorCallback, OH_AudioRenderer *audioRenderer,
161         void *userData) : errorCallback_(errorCallback), ohAudioRenderer_(audioRenderer), userData_(userData)
162     {
163     }
164 
165     void OnError(AudioErrors errorCode) override;
166 
167     OH_AudioStream_Result GetErrorResult(AudioErrors errorCode) const;
168 
169 private:
170     OH_AudioRenderer_Callbacks callbacks_ = {};
171     OH_AudioRenderer_OnErrorCallback errorCallback_ = nullptr;
172     OH_AudioRenderer *ohAudioRenderer_ = {};
173     void *userData_ = {};
174 };
175 
176 class OHRendererPositionCallback : public RendererPositionCallback {
177 public:
OHRendererPositionCallback(OH_AudioRenderer_OnMarkReachedCallback callback,OH_AudioRenderer * ohAudioRenderer,void * userData)178     OHRendererPositionCallback(OH_AudioRenderer_OnMarkReachedCallback callback,
179         OH_AudioRenderer *ohAudioRenderer, void *userData)
180         : callback_(callback), ohAudioRenderer_(ohAudioRenderer), userData_(userData)
181     {
182     }
183     void OnMarkReached(const int64_t &framePosition) override;
184 
185 private:
186     OH_AudioRenderer_OnMarkReachedCallback callback_;
187     OH_AudioRenderer *ohAudioRenderer_;
188     void *userData_;
189 };
190 
191 struct RendererCallback {
192     OH_AudioRenderer_Callbacks callbacks = {};
193 
194     OH_AudioRenderer_OnWriteDataCallback onWriteDataCallback = {};
195 
196     OH_AudioRenderer_OnWriteDataCallbackAdvanced onWriteDataCallbackAdavanced = {};
197 
198     OH_AudioRenderer_OnInterruptCallback onInterruptEventCallback = {};
199 
200     OH_AudioRenderer_OnErrorCallback onErrorCallback = {};
201 
202     OH_AudioRenderer_WriteDataWithMetadataCallback writeDataWithMetadataCallback = {};
203 };
204 
205 class OHAudioRenderer {
206 public:
207     OHAudioRenderer();
208     ~OHAudioRenderer();
209     bool Initialize(AudioRendererOptions &rendererOptions);
210     bool Start();
211     bool Pause();
212     bool Stop();
213     bool Flush();
214     bool Release();
215     RendererState GetCurrentState();
216     void GetStreamId(uint32_t& streamId);
217     AudioChannel GetChannelCount();
218     int32_t GetSamplingRate();
219     AudioSampleFormat GetSampleFormat();
220     AudioEncodingType GetEncodingType();
221     AudioPrivacyType GetRendererPrivacy();
222     int64_t GetFramesWritten();
223     void GetRendererInfo(AudioRendererInfo& rendererInfo);
224     bool GetTimestamp(Timestamp &timestamp, Timestamp::Timestampbase base);
225     int32_t GetAudioTimestampInfo(Timestamp &timestamp, Timestamp::Timestampbase base);
226     int32_t GetFrameSizeInCallback();
227     int32_t GetBufferDesc(BufferDesc &bufDesc) const;
228     int32_t Enqueue(const BufferDesc &bufDesc) const;
229     int32_t SetSpeed(float speed);
230     float GetSpeed();
231     AudioChannelLayout GetChannelLayout();
232     AudioEffectMode GetEffectMode();
233     int32_t SetEffectMode(AudioEffectMode effectMode);
234 
235     void SetPreferredFrameSize(int32_t frameSize);
236 
237     void SetRendererOutputDeviceChangeCallback(OH_AudioRenderer_OutputDeviceChangeCallback callback,
238         void *userData);
239     bool IsFastRenderer();
240 
241     void SetRendererFastStatusChangeCallback(OH_AudioRenderer_OnFastStatusChange callback, void *userData);
242 
243     int32_t SetVolume(float volume) const;
244     int32_t SetVolumeWithRamp(float volume, int32_t duration);
245     float GetVolume() const;
246     int32_t SetLoudnessGain(float loudnessGain) const;
247     float GetLoudnessGain() const;
248     int32_t SetRendererPositionCallback(OH_AudioRenderer_OnMarkReachedCallback callback,
249         uint32_t markPosition, void *userData);
250     void UnsetRendererPositionCallback();
251     uint32_t GetUnderflowCount();
252     void SetInterruptMode(InterruptMode mode);
253     void SetSilentModeAndMixWithOthers(bool on);
254     bool GetSilentModeAndMixWithOthers();
255     int32_t SetDefaultOutputDevice(DeviceType deviceType);
256     FastStatus GetFastStatus();
257 
258     void SetRendererWriteDataCallbackType(WriteDataCallbackType writeDataCallbackType);
259     WriteDataCallbackType GetRendererWriteDataCallbackType();
260 
261     void SetRendererInterruptEventCallbackType(InterruptEventCallbackType callbackType);
262     InterruptEventCallbackType GetRendererInterruptEventCallbackType();
263 
264     void SetRendererErrorCallbackType(ErrorCallbackType errorCallbackType);
265     ErrorCallbackType GetRendererErrorCallbackType();
266 
267     void SetRendererCallback(RendererCallback rendererCallbacks, void *userData, void *metadataUserData);
268 
269     StreamUsage GetOriginalStreamUsage();
270 private:
271     std::shared_ptr<AudioRenderer> audioRenderer_;
272     std::shared_ptr<AudioRendererCallback> audioRendererCallback_;
273     std::shared_ptr<OHAudioRendererDeviceChangeCallbackWithInfo> audioRendererDeviceChangeCallbackWithInfo_;
274     std::shared_ptr<OHRendererPositionCallback> rendererPositionCallback_;
275     std::shared_ptr<OHAudioRendererFastStatusChangeCallback> audioRendererFastStatusChangeCallback_;
276     WriteDataCallbackType writeDataCallbackType_ = WRITE_DATA_CALLBACK_WITHOUT_RESULT;
277     InterruptEventCallbackType interruptCallbackType_ = INTERRUPT_EVENT_CALLBACK_COMBINED;
278     ErrorCallbackType errorCallbackType_ = ERROR_CALLBACK_COMBINED;
279     StreamUsage originalStreamUsage_ = STREAM_USAGE_UNKNOWN;
280 
281     void SetWriteDataCallback(RendererCallback rendererCallbacks, void *userData, void *metadataUserData,
282         AudioEncodingType encodingType);
283     void SetInterruptCallback(RendererCallback rendererCallbacks, void *userData);
284     void SetErrorCallback(RendererCallback rendererCallbacks, void *userData);
285 };
286 }  // namespace AudioStandard
287 }  // namespace OHOS
288 
289 #endif // OH_AUDIO_RENDERER_H
290