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