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 ×tamp, 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