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 DeviceInfo &deviceInfo, const AudioStreamDeviceChangeReason reason) override;
65 private:
66     OH_AudioRenderer_Callbacks callbacks_;
67     OH_AudioRenderer *ohAudioRenderer_;
68     void *userData_;
69 };
70 
71 class OHAudioRendererDeviceChangeCallbackWithInfo : public AudioRendererOutputDeviceChangeCallback {
72 public:
OHAudioRendererDeviceChangeCallbackWithInfo(OH_AudioRenderer_OutputDeviceChangeCallback callback,OH_AudioRenderer * audioRenderer,void * userData)73     OHAudioRendererDeviceChangeCallbackWithInfo(OH_AudioRenderer_OutputDeviceChangeCallback callback,
74         OH_AudioRenderer *audioRenderer, void *userData)
75         : callback_(callback), ohAudioRenderer_(audioRenderer), userData_(userData)
76     {
77     }
78 
79     void OnOutputDeviceChange(const DeviceInfo &deviceInfo, const AudioStreamDeviceChangeReason reason) override;
80 private:
81     OH_AudioRenderer_OutputDeviceChangeCallback callback_;
82     OH_AudioRenderer *ohAudioRenderer_;
83     void *userData_;
84 };
85 
86 class OHAudioRendererCallback : public AudioRendererCallback {
87 public:
OHAudioRendererCallback(OH_AudioRenderer_Callbacks callbacks,OH_AudioRenderer * audioRenderer,void * userData)88     OHAudioRendererCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer *audioRenderer,
89         void *userData) : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData)
90     {
91     }
92     void OnInterrupt(const InterruptEvent &interruptEvent) override;
OnStateChange(const RendererState state,const StateChangeCmdType cmdType)93     void OnStateChange(const RendererState state, const StateChangeCmdType __attribute__((unused)) cmdType) override
94     {
95         AUDIO_DEBUG_LOG("OHAudioRendererCallback:: OnStateChange");
96     }
97 
98 private:
99     OH_AudioRenderer_Callbacks callbacks_;
100     OH_AudioRenderer *ohAudioRenderer_;
101     void *userData_;
102 };
103 
104 class OHServiceDiedCallback : public AudioRendererPolicyServiceDiedCallback {
105 public:
OHServiceDiedCallback(OH_AudioRenderer_Callbacks callbacks,OH_AudioRenderer * audioRenderer,void * userData)106     OHServiceDiedCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer *audioRenderer,
107         void *userData) : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData)
108     {
109     }
110 
111     void OnAudioPolicyServiceDied() override;
112 
113 private:
114     OH_AudioRenderer_Callbacks callbacks_;
115     OH_AudioRenderer *ohAudioRenderer_;
116     void *userData_;
117 };
118 
119 class OHAudioRendererErrorCallback : public AudioRendererErrorCallback {
120 public:
OHAudioRendererErrorCallback(OH_AudioRenderer_Callbacks callbacks,OH_AudioRenderer * audioRenderer,void * userData)121     OHAudioRendererErrorCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer *audioRenderer,
122         void *userData) : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData)
123     {
124     }
125 
126     void OnError(AudioErrors errorCode) override;
127 
128     OH_AudioStream_Result GetErrorResult(AudioErrors errorCode) const;
129 
130 private:
131     OH_AudioRenderer_Callbacks callbacks_;
132     OH_AudioRenderer *ohAudioRenderer_;
133     void *userData_;
134 };
135 
136 class OHRendererPositionCallback : public RendererPositionCallback {
137 public:
OHRendererPositionCallback(OH_AudioRenderer_OnMarkReachedCallback callback,OH_AudioRenderer * ohAudioRenderer,void * userData)138     OHRendererPositionCallback(OH_AudioRenderer_OnMarkReachedCallback callback,
139         OH_AudioRenderer* ohAudioRenderer, void* userData)
140         : callback_(callback), ohAudioRenderer_(ohAudioRenderer), userData_(userData)
141     {
142     }
143     void OnMarkReached(const int64_t &framePosition) override;
144 
145 private:
146     OH_AudioRenderer_OnMarkReachedCallback callback_;
147     OH_AudioRenderer* ohAudioRenderer_;
148     void* userData_;
149 };
150 
151 struct RendererCallback {
152     OH_AudioRenderer_Callbacks callbacks;
153 
154     OH_AudioRenderer_OnWriteDataCallback onWriteDataCallback;
155 
156     OH_AudioRenderer_WriteDataWithMetadataCallback writeDataWithMetadataCallback;
157 };
158 
159 class OHAudioRenderer {
160     public:
161         OHAudioRenderer();
162         ~OHAudioRenderer();
163         bool Initialize(AudioRendererOptions &rendererOptions);
164         bool Start();
165         bool Pause();
166         bool Stop();
167         bool Flush();
168         bool Release();
169         RendererState GetCurrentState();
170         void GetStreamId(uint32_t& streamId);
171         AudioChannel GetChannelCount();
172         int32_t GetSamplingRate();
173         AudioSampleFormat GetSampleFormat();
174         AudioEncodingType GetEncodingType();
175         AudioPrivacyType GetRendererPrivacy();
176         int64_t GetFramesWritten();
177         void GetRendererInfo(AudioRendererInfo& rendererInfo);
178         bool GetAudioTime(Timestamp &timestamp, Timestamp::Timestampbase base);
179         int32_t GetFrameSizeInCallback();
180         int32_t GetBufferDesc(BufferDesc &bufDesc) const;
181         int32_t Enqueue(const BufferDesc &bufDesc) const;
182         int32_t SetSpeed(float speed);
183         float GetSpeed();
184         AudioChannelLayout GetChannelLayout();
185         AudioEffectMode GetEffectMode();
186         int32_t SetEffectMode(AudioEffectMode effectMode);
187 
188         void SetPreferredFrameSize(int32_t frameSize);
189 
190         void SetRendererOutputDeviceChangeCallback(OH_AudioRenderer_OutputDeviceChangeCallback callback,
191             void *userData);
192         bool IsFastRenderer();
193 
194         uint32_t GetUnderflowCount();
195         int32_t SetVolume(float volume) const;
196         int32_t SetVolumeWithRamp(float volume, int32_t duration);
197         float GetVolume() const;
198         int32_t SetRendererPositionCallback(OH_AudioRenderer_OnMarkReachedCallback callback,
199             uint32_t markPosition, void* userData);
200         void UnsetRendererPositionCallback();
201         void SetInterruptMode(InterruptMode mode);
202         int32_t SetDefaultOutputDevice(DeviceType deviceType);
203 
204         void SetRendererCallbackType(WriteDataCallbackType writeDataCallbackType);
205         WriteDataCallbackType GetRendererCallbackType();
206 
207         void SetRendererCallback(RendererCallback rendererCallbacks, void *userData, void *metadataUserData);
208         void SetSilentModeAndMixWithOthers(bool on);
209         bool GetSilentModeAndMixWithOthers();
210     private:
211         std::unique_ptr<AudioRenderer> audioRenderer_;
212         std::shared_ptr<AudioRendererCallback> audioRendererCallback_;
213         std::shared_ptr<OHAudioRendererDeviceChangeCallbackWithInfo> audioRendererDeviceChangeCallbackWithInfo_;
214         std::shared_ptr<OHRendererPositionCallback> rendererPositionCallback_;
215         WriteDataCallbackType writeDataCallbackType_ = WRITE_DATA_CALLBACK_WITHOUT_RESULT;
216 
217         void SetWriteDataCallback(RendererCallback rendererCallbacks, void *userData, void *metadataUserData,
218             AudioEncodingType encodingType);
219         void SetInterruptCallback(RendererCallback rendererCallbacks, void *userData);
220         void SetErrorCallback(RendererCallback rendererCallbacks, void *userData);
221 };
222 }  // namespace AudioStandard
223 }  // namespace OHOS
224 
225 #endif // OH_AUDIO_RENDERER_H
226