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 ×tamp, Timestamp::Timestampbase base); 225 int32_t GetAudioTimestampInfo(Timestamp ×tamp, 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