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