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 PA_RENDERER_STREAM_IMPL_H 17 #define PA_RENDERER_STREAM_IMPL_H 18 19 #include <pulse/pulseaudio.h> 20 #include <mutex> 21 #include "i_renderer_stream.h" 22 23 namespace OHOS { 24 namespace AudioStandard { 25 class PaRendererStreamImpl : public std::enable_shared_from_this<PaRendererStreamImpl>, public IRendererStream { 26 public: 27 PaRendererStreamImpl(pa_stream *paStream, AudioProcessConfig processConfig, pa_threaded_mainloop *mainloop); 28 ~PaRendererStreamImpl(); 29 int32_t InitParams(); 30 int32_t Start() override; 31 int32_t Pause(bool isStandby = false) override; 32 int32_t Flush() override; 33 int32_t Drain() override; 34 int32_t Stop() override; 35 int32_t Release() override; 36 int32_t GetStreamFramesWritten(uint64_t &framesWritten) override; 37 int32_t GetCurrentTimeStamp(uint64_t ×tamp) override; 38 int32_t GetCurrentPosition(uint64_t &framePosition, uint64_t ×tamp, uint64_t &latency) override; 39 int32_t GetLatency(uint64_t &latency) override; 40 int32_t SetRate(int32_t rate) override; 41 int32_t SetAudioEffectMode(int32_t effectMode) override; 42 int32_t GetAudioEffectMode(int32_t &effectMode) override; 43 int32_t SetPrivacyType(int32_t privacyType) override; 44 int32_t GetPrivacyType(int32_t &privacyType) override; 45 46 void RegisterStatusCallback(const std::weak_ptr<IStatusCallback> &callback) override; 47 void RegisterWriteCallback(const std::weak_ptr<IWriteCallback> &callback) override; 48 BufferDesc DequeueBuffer(size_t length) override; 49 int32_t EnqueueBuffer(const BufferDesc &bufferDesc) override; 50 int32_t GetMinimumBufferSize(size_t &minBufferSize) const override; 51 void GetByteSizePerFrame(size_t &byteSizePerFrame) const override; 52 void GetSpanSizePerFrame(size_t &spanSizeInFrame) const override; 53 void SetStreamIndex(uint32_t index) override; 54 uint32_t GetStreamIndex() override; 55 void AbortCallback(int32_t abortTimes) override; 56 // offload 57 int32_t SetOffloadMode(int32_t state, bool isAppBack) override; 58 int32_t UnsetOffloadMode() override; 59 int32_t GetOffloadApproximatelyCacheTime(uint64_t ×tamp, uint64_t &paWriteIndex, 60 uint64_t &cacheTimeDsp, uint64_t &cacheTimePa) override; 61 int32_t OffloadSetVolume(float volume) override; 62 size_t GetWritableSize() override; 63 int32_t UpdateMaxLength(uint32_t maxLength) override; 64 // offload end 65 66 int32_t UpdateSpatializationState(bool spatializationEnabled, bool headTrackingEnabled) override; 67 int32_t Peek(std::vector<char> *audioBuffer, int32_t &index) override; 68 int32_t ReturnIndex(int32_t index) override; 69 AudioProcessConfig GetAudioProcessConfig() const noexcept override; 70 int32_t SetClientVolume(float clientVolume) override; 71 bool IsEffectNone(StreamUsage streamUsage); 72 73 private: 74 static void PAStreamWriteCb(pa_stream *stream, size_t length, void *userdata); 75 static void PAStreamMovedCb(pa_stream *stream, void *userdata); 76 static void PAStreamUnderFlowCb(pa_stream *stream, void *userdata); 77 static void PAStreamSetStartedCb(pa_stream *stream, void *userdata); 78 static void PAStreamStartSuccessCb(pa_stream *stream, int32_t success, void *userdata); 79 static void PAStreamPauseSuccessCb(pa_stream *stream, int32_t success, void *userdata); 80 static void PAStreamFlushSuccessCb(pa_stream *stream, int32_t success, void *userdata); 81 static void PAStreamDrainSuccessCb(pa_stream *stream, int32_t success, void *userdata); 82 static void PAStreamDrainInStopCb(pa_stream *stream, int32_t success, void *userdata); 83 static void PAStreamAsyncStopSuccessCb(pa_stream *stream, int32_t success, void *userdata); 84 static void PAStreamUnderFlowCountAddCb(pa_stream *stream, void *userdata); 85 static void PAStreamUpdateTimingInfoSuccessCb(pa_stream *stream, int32_t success, void *userdata); 86 87 const std::string GetEffectModeName(int32_t effectMode); 88 // offload 89 int32_t OffloadGetPresentationPosition(uint64_t& frames, int64_t& timeSec, int64_t& timeNanoSec); 90 int32_t OffloadSetBufferSize(uint32_t sizeMs); 91 void SyncOffloadMode(); 92 int32_t OffloadUpdatePolicy(AudioOffloadType statePolicy, bool force); 93 void ResetOffload(); 94 int32_t OffloadUpdatePolicyInWrite(); 95 int32_t UpdateEffectSessionInfo(); 96 // offload end 97 98 uint32_t GetEffectChainLatency(); 99 uint32_t GetA2dpOffloadLatency(); 100 101 void UpdatePaTimingInfo(); 102 103 uint32_t streamIndex_ = static_cast<uint32_t>(-1); // invalid index 104 105 pa_stream *paStream_ = nullptr; 106 uint32_t sinkInputIndex_ = 0; 107 AudioProcessConfig processConfig_; 108 std::weak_ptr<IStatusCallback> statusCallback_; 109 std::weak_ptr<IWriteCallback> writeCallback_; 110 int32_t streamCmdStatus_ = 0; 111 int32_t streamDrainStatus_ = 0; 112 int32_t streamFlushStatus_ = 0; 113 State state_ = INVALID; 114 uint32_t underFlowCount_ = 0; 115 bool isDrain_ = false; 116 pa_threaded_mainloop *mainloop_; 117 118 size_t byteSizePerFrame_ = 0; 119 size_t spanSizeInFrame_ = 0; 120 size_t minBufferSize_ = 0; 121 122 size_t totalBytesWritten_ = 0; 123 int32_t renderRate_ = 0; 124 int32_t effectMode_ = 1; 125 std::string effectSceneName_ = ""; 126 int32_t privacyType_ = 0; 127 128 bool isStandbyPause_ = false; 129 130 static constexpr float MAX_STREAM_VOLUME_LEVEL = 1.0f; 131 static constexpr float MIN_STREAM_VOLUME_LEVEL = 0.0f; 132 // Only for debug 133 int32_t abortFlag_ = 0; 134 // offload 135 bool offloadEnable_ = false; 136 int64_t offloadTsOffset_ = 0; 137 uint64_t offloadTsLast_ = 0; 138 AudioOffloadType offloadStatePolicy_ = OFFLOAD_DEFAULT; 139 AudioOffloadType offloadNextStateTargetPolicy_ = OFFLOAD_DEFAULT; 140 time_t lastOffloadUpdateFinishTime_ = 0; 141 // offload end 142 float clientVolume_ = 1.0f; 143 bool initEffectFlag_ = true; 144 145 static inline std::atomic<int32_t> bufferNullCount_ = 0; 146 std::mutex fadingMutex_; 147 std::condition_variable fadingCondition_; 148 149 // record latency 150 uint64_t preLatency_ = 50000; // 50000 default 151 pa_usec_t preTimeGetLatency_ = pa_rtclock_now(); 152 bool firstGetLatency_ = true; 153 pa_usec_t preTimeGetPaLatency_ = pa_rtclock_now(); 154 bool firstGetPaLatency_ = true; 155 bool releasedFlag_ = false; 156 }; 157 } // namespace AudioStandard 158 } // namespace OHOS 159 #endif // PA_RENDERER_STREAM_IMPL_H 160