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_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)27 OHAudioRendererModeCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer* audioRenderer, void* userData) 28 : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData) 29 { 30 } 31 32 void OnWriteData(size_t length) override; 33 34 private: 35 OH_AudioRenderer_Callbacks callbacks_; 36 OH_AudioRenderer* ohAudioRenderer_; 37 void* userData_; 38 }; 39 40 class OHAudioRendererDeviceChangeCallback : public AudioRendererDeviceChangeCallback { 41 public: OHAudioRendererDeviceChangeCallback(OH_AudioRenderer_Callbacks callbacks,OH_AudioRenderer * audioRenderer,void * userData)42 OHAudioRendererDeviceChangeCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer* audioRenderer, 43 void* userData) : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData) 44 { 45 } 46 47 void OnStateChange(const DeviceInfo &deviceInfo) override; RemoveAllCallbacks()48 void RemoveAllCallbacks() override {}; 49 private: 50 OH_AudioRenderer_Callbacks callbacks_; 51 OH_AudioRenderer* ohAudioRenderer_; 52 void* userData_; 53 }; 54 55 class OHAudioRendererDeviceChangeCallbackWithInfo : public AudioRendererOutputDeviceChangeCallback { 56 public: OHAudioRendererDeviceChangeCallbackWithInfo(OH_AudioRenderer_OutputDeviceChangeCallback callback,OH_AudioRenderer * audioRenderer,void * userData)57 OHAudioRendererDeviceChangeCallbackWithInfo(OH_AudioRenderer_OutputDeviceChangeCallback callback, 58 OH_AudioRenderer* audioRenderer, void* userData) 59 : callback_(callback), ohAudioRenderer_(audioRenderer), userData_(userData) 60 { 61 } 62 63 void OnOutputDeviceChange(const DeviceInfo &deviceInfo, const AudioStreamDeviceChangeReason reason) override; 64 private: 65 OH_AudioRenderer_OutputDeviceChangeCallback callback_; 66 OH_AudioRenderer* ohAudioRenderer_; 67 void* userData_; 68 }; 69 70 class OHAudioRendererCallback : public AudioRendererCallback { 71 public: OHAudioRendererCallback(OH_AudioRenderer_Callbacks callbacks,OH_AudioRenderer * audioRenderer,void * userData)72 OHAudioRendererCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer* audioRenderer, 73 void* userData) : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData) 74 { 75 } 76 void OnInterrupt(const InterruptEvent &interruptEvent) override; OnStateChange(const RendererState state,const StateChangeCmdType cmdType)77 void OnStateChange(const RendererState state, const StateChangeCmdType __attribute__((unused)) cmdType) override 78 { 79 AUDIO_DEBUG_LOG("OHAudioRendererCallback:: OnStateChange"); 80 } 81 82 private: 83 OH_AudioRenderer_Callbacks callbacks_; 84 OH_AudioRenderer* ohAudioRenderer_; 85 void* userData_; 86 }; 87 88 class OHServiceDiedCallback : public AudioRendererPolicyServiceDiedCallback { 89 public: OHServiceDiedCallback(OH_AudioRenderer_Callbacks callbacks,OH_AudioRenderer * audioRenderer,void * userData)90 OHServiceDiedCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer* audioRenderer, 91 void* userData) : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData) 92 { 93 } 94 95 void OnAudioPolicyServiceDied() override; 96 97 private: 98 OH_AudioRenderer_Callbacks callbacks_; 99 OH_AudioRenderer* ohAudioRenderer_; 100 void* userData_; 101 }; 102 103 class OHAudioRendererErrorCallback : public AudioRendererErrorCallback { 104 public: OHAudioRendererErrorCallback(OH_AudioRenderer_Callbacks callbacks,OH_AudioRenderer * audioRenderer,void * userData)105 OHAudioRendererErrorCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer* audioRenderer, 106 void* userData) : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData) 107 { 108 } 109 110 void OnError(AudioErrors errorCode) override; 111 112 OH_AudioStream_Result GetErrorResult(AudioErrors errorCode) const; 113 114 private: 115 OH_AudioRenderer_Callbacks callbacks_; 116 OH_AudioRenderer* ohAudioRenderer_; 117 void* userData_; 118 }; 119 class OHAudioRenderer { 120 public: 121 OHAudioRenderer(); 122 ~OHAudioRenderer(); 123 bool Initialize(const AudioRendererOptions &rendererOptions); 124 bool Start(); 125 bool Pause(); 126 bool Stop(); 127 bool Flush(); 128 bool Release(); 129 RendererState GetCurrentState(); 130 void GetStreamId(uint32_t& streamId); 131 AudioChannel GetChannelCount(); 132 int32_t GetSamplingRate(); 133 AudioSampleFormat GetSampleFormat(); 134 AudioEncodingType GetEncodingType(); 135 int64_t GetFramesWritten(); 136 void GetRendererInfo(AudioRendererInfo& rendererInfo); 137 bool GetAudioTime(Timestamp ×tamp, Timestamp::Timestampbase base); 138 int32_t GetFrameSizeInCallback(); 139 int32_t GetBufferDesc(BufferDesc &bufDesc) const; 140 int32_t Enqueue(const BufferDesc &bufDesc) const; 141 int32_t SetSpeed(float speed); 142 float GetSpeed(); 143 144 void SetRendererCallback(OH_AudioRenderer_Callbacks callbacks, void* userData); 145 void SetPreferredFrameSize(int32_t frameSize); 146 147 void SetRendererOutputDeviceChangeCallback(OH_AudioRenderer_OutputDeviceChangeCallback callback, 148 void *userData); 149 bool IsFastRenderer(); 150 private: 151 std::unique_ptr<AudioRenderer> audioRenderer_; 152 std::shared_ptr<AudioRendererCallback> audioRendererCallback_; 153 std::shared_ptr<OHAudioRendererDeviceChangeCallbackWithInfo> audioRendererDeviceChangeCallbackWithInfo_; 154 }; 155 } // namespace AudioStandard 156 } // namespace OHOS 157 158 #endif // OH_AUDIO_RENDERER_H 159