• 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     }
44 
45     void OnWriteData(size_t length) override;
46 
47 private:
48     OH_AudioRenderer_Callbacks callbacks_ = {};
49     OH_AudioRenderer_OnWriteDataCallback onWriteDataCallback_ = nullptr;
50     OH_AudioRenderer_WriteDataWithMetadataCallback writeDataWithMetadataCallback_ = nullptr;
51     OH_AudioRenderer *ohAudioRenderer_ = nullptr;
52     void *userData_ = nullptr;
53     void *metadataUserData_ = nullptr;
54     AudioEncodingType encodingType_ = ENCODING_INVALID;
55 };
56 
57 class OHAudioRendererDeviceChangeCallback : public AudioRendererOutputDeviceChangeCallback {
58 public:
OHAudioRendererDeviceChangeCallback(OH_AudioRenderer_Callbacks callbacks,OH_AudioRenderer * audioRenderer,void * userData)59     OHAudioRendererDeviceChangeCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer *audioRenderer,
60         void *userData) : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData)
61     {
62     }
63 
64     void OnOutputDeviceChange(const AudioDeviceDescriptor &deviceInfo,
65         const AudioStreamDeviceChangeReason reason) override;
66 private:
67     OH_AudioRenderer_Callbacks callbacks_;
68     OH_AudioRenderer *ohAudioRenderer_;
69     void *userData_;
70 };
71 
72 class OHAudioRendererDeviceChangeCallbackWithInfo : public AudioRendererOutputDeviceChangeCallback {
73 public:
OHAudioRendererDeviceChangeCallbackWithInfo(OH_AudioRenderer_OutputDeviceChangeCallback callback,OH_AudioRenderer * audioRenderer,void * userData)74     OHAudioRendererDeviceChangeCallbackWithInfo(OH_AudioRenderer_OutputDeviceChangeCallback callback,
75         OH_AudioRenderer *audioRenderer, void *userData)
76         : callback_(callback), ohAudioRenderer_(audioRenderer), userData_(userData)
77     {
78     }
79 
80     void OnOutputDeviceChange(const AudioDeviceDescriptor &deviceInfo,
81         const AudioStreamDeviceChangeReason reason) override;
82 private:
83     OH_AudioRenderer_OutputDeviceChangeCallback callback_;
84     OH_AudioRenderer *ohAudioRenderer_;
85     void *userData_;
86 };
87 
88 class OHAudioRendererCallback : public AudioRendererCallback {
89 public:
OHAudioRendererCallback(OH_AudioRenderer_Callbacks callbacks,OH_AudioRenderer * audioRenderer,void * userData)90     OHAudioRendererCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer *audioRenderer,
91         void *userData) : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData)
92     {
93     }
OHAudioRendererCallback(OH_AudioRenderer_OnInterruptCallback onInterruptEventCallback,OH_AudioRenderer * audioRenderer,void * userData)94     OHAudioRendererCallback(OH_AudioRenderer_OnInterruptCallback onInterruptEventCallback,
95         OH_AudioRenderer *audioRenderer, void *userData) : onInterruptEventCallback_(onInterruptEventCallback),
96         ohAudioRenderer_(audioRenderer), userData_(userData)
97     {
98     }
99     void OnInterrupt(const InterruptEvent &interruptEvent) override;
OnStateChange(const RendererState state,const StateChangeCmdType cmdType)100     void OnStateChange(const RendererState state, const StateChangeCmdType __attribute__((unused)) cmdType) override
101     {
102         AUDIO_DEBUG_LOG("OHAudioRendererCallback:: OnStateChange");
103     }
104 
105 private:
106     OH_AudioRenderer_Callbacks callbacks_;
107     OH_AudioRenderer_OnInterruptCallback onInterruptEventCallback_ = nullptr;
108     OH_AudioRenderer *ohAudioRenderer_;
109     void *userData_;
110 };
111 
112 class OHServiceDiedCallback : public AudioRendererPolicyServiceDiedCallback {
113 public:
OHServiceDiedCallback(OH_AudioRenderer_Callbacks callbacks,OH_AudioRenderer * audioRenderer,void * userData)114     OHServiceDiedCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer *audioRenderer,
115         void *userData) : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData)
116     {
117     }
OHServiceDiedCallback(OH_AudioRenderer_OnErrorCallback errorCallback,OH_AudioRenderer * audioRenderer,void * userData)118     OHServiceDiedCallback(OH_AudioRenderer_OnErrorCallback errorCallback, OH_AudioRenderer *audioRenderer,
119         void *userData) : errorCallback_(errorCallback), ohAudioRenderer_(audioRenderer), userData_(userData)
120     {
121     }
122 
123     void OnAudioPolicyServiceDied() override;
124 
125 private:
126     OH_AudioRenderer_Callbacks callbacks_;
127     OH_AudioRenderer_OnErrorCallback errorCallback_ = nullptr;
128     OH_AudioRenderer *ohAudioRenderer_;
129     void *userData_;
130 };
131 
132 class OHAudioRendererErrorCallback : public AudioRendererErrorCallback {
133 public:
OHAudioRendererErrorCallback(OH_AudioRenderer_Callbacks callbacks,OH_AudioRenderer * audioRenderer,void * userData)134     OHAudioRendererErrorCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer *audioRenderer,
135         void *userData) : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData)
136     {
137     }
OHAudioRendererErrorCallback(OH_AudioRenderer_OnErrorCallback errorCallback,OH_AudioRenderer * audioRenderer,void * userData)138     OHAudioRendererErrorCallback(OH_AudioRenderer_OnErrorCallback errorCallback, OH_AudioRenderer *audioRenderer,
139         void *userData) : errorCallback_(errorCallback), ohAudioRenderer_(audioRenderer), userData_(userData)
140     {
141     }
142 
143     void OnError(AudioErrors errorCode) override;
144 
145     OH_AudioStream_Result GetErrorResult(AudioErrors errorCode) const;
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 OHRendererPositionCallback : public RendererPositionCallback {
155 public:
OHRendererPositionCallback(OH_AudioRenderer_OnMarkReachedCallback callback,OH_AudioRenderer * ohAudioRenderer,void * userData)156     OHRendererPositionCallback(OH_AudioRenderer_OnMarkReachedCallback callback,
157         OH_AudioRenderer *ohAudioRenderer, void *userData)
158         : callback_(callback), ohAudioRenderer_(ohAudioRenderer), userData_(userData)
159     {
160     }
161     void OnMarkReached(const int64_t &framePosition) override;
162 
163 private:
164     OH_AudioRenderer_OnMarkReachedCallback callback_;
165     OH_AudioRenderer *ohAudioRenderer_;
166     void *userData_;
167 };
168 
169 struct RendererCallback {
170     OH_AudioRenderer_Callbacks callbacks;
171 
172     OH_AudioRenderer_OnWriteDataCallback onWriteDataCallback;
173 
174     OH_AudioRenderer_OnInterruptCallback onInterruptEventCallback;
175 
176     OH_AudioRenderer_OnErrorCallback onErrorCallback;
177 
178     OH_AudioRenderer_WriteDataWithMetadataCallback writeDataWithMetadataCallback;
179 };
180 
181 class OHAudioRenderer {
182     public:
183         OHAudioRenderer();
184         ~OHAudioRenderer();
185         bool Initialize(AudioRendererOptions &rendererOptions);
186         bool Start();
187         bool Pause();
188         bool Stop();
189         bool Flush();
190         bool Release();
191         RendererState GetCurrentState();
192         void GetStreamId(uint32_t& streamId);
193         AudioChannel GetChannelCount();
194         int32_t GetSamplingRate();
195         AudioSampleFormat GetSampleFormat();
196         AudioEncodingType GetEncodingType();
197         AudioPrivacyType GetRendererPrivacy();
198         int64_t GetFramesWritten();
199         void GetRendererInfo(AudioRendererInfo& rendererInfo);
200         bool GetTimestamp(Timestamp &timestamp, Timestamp::Timestampbase base);
201         int32_t GetAudioTimestampInfo(Timestamp &timestamp, Timestamp::Timestampbase base);
202         int32_t GetFrameSizeInCallback();
203         int32_t GetBufferDesc(BufferDesc &bufDesc) const;
204         int32_t Enqueue(const BufferDesc &bufDesc) const;
205         int32_t SetSpeed(float speed);
206         float GetSpeed();
207         AudioChannelLayout GetChannelLayout();
208         AudioEffectMode GetEffectMode();
209         int32_t SetEffectMode(AudioEffectMode effectMode);
210 
211         void SetPreferredFrameSize(int32_t frameSize);
212 
213         void SetRendererOutputDeviceChangeCallback(OH_AudioRenderer_OutputDeviceChangeCallback callback,
214             void *userData);
215         bool IsFastRenderer();
216 
217         int32_t SetVolume(float volume) const;
218         int32_t SetVolumeWithRamp(float volume, int32_t duration);
219         float GetVolume() const;
220         int32_t SetRendererPositionCallback(OH_AudioRenderer_OnMarkReachedCallback callback,
221             uint32_t markPosition, void *userData);
222         void UnsetRendererPositionCallback();
223         uint32_t GetUnderflowCount();
224         void SetInterruptMode(InterruptMode mode);
225         void SetSilentModeAndMixWithOthers(bool on);
226         bool GetSilentModeAndMixWithOthers();
227         int32_t SetDefaultOutputDevice(DeviceType deviceType);
228 
229         void SetRendererWriteDataCallbackType(WriteDataCallbackType writeDataCallbackType);
230         WriteDataCallbackType GetRendererWriteDataCallbackType();
231 
232         void SetRendererInterruptEventCallbackType(InterruptEventCallbackType InterruptEventCallbackType);
233         InterruptEventCallbackType GetRendererInterruptEventCallbackType();
234 
235         void SetRendererErrorCallbackType(ErrorCallbackType errorCallbackType);
236         ErrorCallbackType GetRendererErrorCallbackType();
237 
238         void SetRendererCallback(RendererCallback rendererCallbacks, void *userData, void *metadataUserData);
239     private:
240         std::shared_ptr<AudioRenderer> audioRenderer_;
241         std::shared_ptr<AudioRendererCallback> audioRendererCallback_;
242         std::shared_ptr<OHAudioRendererDeviceChangeCallbackWithInfo> audioRendererDeviceChangeCallbackWithInfo_;
243         std::shared_ptr<OHRendererPositionCallback> rendererPositionCallback_;
244         WriteDataCallbackType writeDataCallbackType_ = WRITE_DATA_CALLBACK_WITHOUT_RESULT;
245         InterruptEventCallbackType interruptEventCallbackType_ = INTERRUPT_EVENT_CALLBACK_WITHOUT_RESULT;
246         ErrorCallbackType errorCallbackType_ = ERROR_CALLBACK_WITHOUT_RESULT;
247 
248         void SetWriteDataCallback(RendererCallback rendererCallbacks, void *userData, void *metadataUserData,
249             AudioEncodingType encodingType);
250         void SetInterruptCallback(RendererCallback rendererCallbacks, void *userData);
251         void SetErrorCallback(RendererCallback rendererCallbacks, void *userData);
252 };
253 }  // namespace AudioStandard
254 }  // namespace OHOS
255 
256 #endif // OH_AUDIO_RENDERER_H
257