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