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 RENDERER_IN_SERVER_H 17 #define RENDERER_IN_SERVER_H 18 19 #include <mutex> 20 #include "i_renderer_stream.h" 21 #include "i_stream_listener.h" 22 #include "oh_audio_buffer.h" 23 #include "i_stream_manager.h" 24 #include "audio_effect.h" 25 #include "audio_ring_cache.h" 26 #include "audio_stream_monitor.h" 27 #include "audio_stream_checker.h" 28 #include "player_dfx_writer.h" 29 30 namespace OHOS { 31 namespace AudioStandard { 32 33 struct RendererLatestInfoForWorkgroup { 34 IStatus status; 35 bool isInSilentState; 36 bool silentModeAndMixWithOthers; 37 bool lastWriteStandbyEnableStatus; 38 float streamVolume; 39 float systemVolume; 40 }; 41 42 class StreamCallbacks : public IStatusCallback, public IWriteCallback { 43 public: 44 explicit StreamCallbacks(uint32_t streamIndex); 45 virtual ~StreamCallbacks(); 46 void OnStatusUpdate(IOperation operation) override; 47 int32_t OnWriteData(size_t length) override; 48 int32_t OnWriteData(int8_t *inputData, size_t requestDataLen) override; 49 int32_t GetAvailableSize(size_t &length) override; 50 std::unique_ptr<AudioRingCache>& GetDupRingBuffer(); 51 private: 52 uint32_t streamIndex_ = 0; 53 int32_t recoveryAntiShakeBufferCount_ = 0; 54 FILE *dumpDupOut_ = nullptr; 55 std::string dumpDupOutFileName_ = ""; 56 std::unique_ptr<AudioRingCache> dupRingBuffer_ = nullptr; 57 }; 58 59 class RendererInServer : public IStatusCallback, public IWriteCallback, 60 public std::enable_shared_from_this<RendererInServer> { 61 public: 62 RendererInServer(AudioProcessConfig processConfig, std::weak_ptr<IStreamListener> streamListener); 63 virtual ~RendererInServer(); 64 void OnStatusUpdate(IOperation operation) override; 65 void OnStatusUpdateExt(IOperation operation, std::shared_ptr<IStreamListener> stateListener); 66 void HandleOperationFlushed(); 67 void HandleOperationStarted(); 68 int32_t OnWriteData(size_t length) override; 69 int32_t OnWriteData(int8_t *inputData, size_t requestDataLen) override; 70 int32_t GetAvailableSize(size_t &length) override; 71 72 int32_t ResolveBuffer(std::shared_ptr<OHAudioBuffer> &buffer); 73 int32_t GetSessionId(uint32_t &sessionId); 74 int32_t Start(); 75 int32_t Pause(); 76 int32_t Flush(); 77 int32_t Drain(bool stopFlag = false); 78 int32_t Stop(); 79 int32_t Release(bool isSwitchStream = false); 80 81 int32_t GetAudioTime(uint64_t &framePos, uint64_t ×tamp); 82 int32_t GetAudioPosition(uint64_t &framePos, uint64_t ×tamp, uint64_t &latency, int32_t base); 83 int32_t GetSpeedPosition(uint64_t &framePos, uint64_t ×tamp, uint64_t &latency, int32_t base); 84 int32_t GetLatency(uint64_t &latency); 85 int32_t SetRate(int32_t rate); 86 int32_t SetLowPowerVolume(float volume); 87 int32_t GetLowPowerVolume(float &volume); 88 int32_t SetAudioEffectMode(int32_t effectMode); 89 int32_t GetAudioEffectMode(int32_t &effectMode); 90 int32_t SetPrivacyType(int32_t privacyType); 91 int32_t GetPrivacyType(int32_t &privacyType); 92 93 int32_t SetOffloadMode(int32_t state, bool isAppBack); 94 int32_t UnsetOffloadMode(); 95 int32_t SetSpeed(float speed); 96 int32_t SetOffloadDataCallbackState(int32_t state); 97 int32_t GetOffloadApproximatelyCacheTime(uint64_t ×tamp, uint64_t &paWriteIndex, 98 uint64_t &cacheTimeDsp, uint64_t &cacheTimePa); 99 int32_t UpdateSpatializationState(bool spatializationEnabled, bool headTrackingEnabled); 100 void CheckAndWriterRenderStreamStandbySysEvent(bool standbyEnable); 101 102 int32_t GetStandbyStatus(bool &isStandby, int64_t &enterStandbyTime); 103 104 int32_t Init(); 105 int32_t ConfigServerBuffer(); 106 int32_t InitBufferStatus(); 107 int32_t UpdateWriteIndex(); 108 BufferDesc DequeueBuffer(size_t length); 109 void VolumeHandle(BufferDesc &desc); 110 int32_t WriteData(); 111 void WriteEmptyData(); 112 int32_t DrainAudioBuffer(); 113 114 // for inner-cap 115 int32_t EnableInnerCap(int32_t innerCapId); 116 int32_t DisableInnerCap(int32_t innerCapId); 117 int32_t InitDupStream(int32_t innerCapId); 118 int32_t DisableAllInnerCap(); 119 std::unique_ptr<AudioRingCache>& GetDupRingBuffer(); 120 121 // for dual tone 122 int32_t EnableDualTone(); 123 int32_t DisableDualTone(); 124 int32_t InitDualToneStream(); 125 126 void GetEAC3ControlParam(); 127 int32_t GetStreamManagerType() const noexcept; 128 int32_t SetSilentModeAndMixWithOthers(bool on); 129 int32_t SetClientVolume(); 130 int32_t SetLoudnessGain(float loudnessGain); 131 int32_t SetMute(bool isMute); 132 int32_t SetDuckFactor(float duckFactor); 133 int32_t SetDefaultOutputDevice(const DeviceType defaultOutputDevice, bool skipForce = false); 134 int32_t SetSourceDuration(int64_t duration); 135 136 void OnDataLinkConnectionUpdate(IOperation operation); 137 int32_t GetActualStreamManagerType() const noexcept; 138 139 bool Dump(std::string &dumpString); 140 void SetNonInterruptMute(const bool muteFlag); 141 RestoreStatus RestoreSession(RestoreInfo restoreInfo); 142 int32_t StopSession(); 143 void dualToneStreamInStart(); 144 bool CollectInfosForWorkgroup(float systemVolume); 145 146 int32_t ResolveBufferBaseAndGetServerSpanSize(std::shared_ptr<OHAudioBufferBase> &buffer, 147 uint32_t &spanSizeInFrame, uint64_t &engineTotalSizeInFrame); 148 149 int32_t SetAudioHapticsSyncId(const int32_t &audioHapticsSyncId); 150 void InitDupBuffer(int32_t innerCapId); 151 152 public: 153 const AudioProcessConfig processConfig_; 154 private: 155 void OnStatusUpdateSub(IOperation operation); 156 bool IsHighResolution() const noexcept; 157 void WriteMuteDataSysEvent(BufferDesc &bufferDesc); 158 bool IsInvalidBuffer(uint8_t *buffer, size_t bufferSize); 159 void ReportDataToResSched(std::unordered_map<std::string, std::string> payload, uint32_t type); 160 void OtherStreamEnqueue(const BufferDesc &bufferDesc); 161 void DoFadingOut(RingBufferWrapper& bufferDesc); 162 int32_t SetStreamVolumeInfoForEnhanceChain(); 163 void StandByCheck(); 164 bool ShouldEnableStandBy(); 165 int32_t OffloadSetVolumeInner(); 166 void InnerCaptureOtherStream(const BufferDesc &bufferDesc, CaptureInfo &captureInfo, int32_t innerCapId); 167 void InnerCaptureEnqueueBuffer(const BufferDesc &bufferDesc, CaptureInfo &captureInfo, int32_t innerCapId); 168 int32_t StartInner(); 169 int32_t StopInner(); 170 int64_t GetLastAudioDuration(); 171 int32_t CreateDupBufferInner(int32_t innerCapId); 172 int32_t WriteDupBufferInner(const BufferDesc &bufferDesc, int32_t innerCapId); 173 void ReConfigDupStreamCallback(); 174 void HandleOperationStopped(RendererStage stage); 175 int32_t StartInnerDuringStandby(); 176 void RecordStandbyTime(bool isStandby, bool isStart); 177 int32_t FlushOhAudioBuffer(); 178 BufferDesc PrepareOutputBuffer(const RingBufferWrapper& ringBufferDesc); 179 void CopyDataToInputBuffer(int8_t* inputData, size_t requestDataLen, 180 const RingBufferWrapper& ringBufferDesc); 181 void ProcessFadeOutIfNeeded(RingBufferWrapper& ringBufferDesc, uint64_t currentReadFrame, 182 uint64_t currentWriteFrame, size_t requestDataInFrame); 183 void UpdateLatestForWorkgroup(float systemVolume); 184 int32_t DisableInnerCapHandle(int32_t innerCapId); 185 int32_t InitDupStreamVolume(uint32_t dupStreamIndex); 186 void ProcessManagerType(); 187 private: 188 std::mutex statusLock_; 189 std::condition_variable statusCv_; 190 std::shared_ptr<IRendererStream> stream_ = nullptr; 191 uint32_t streamIndex_ = -1; 192 std::string traceTag_; 193 mutable int64_t volumeDataCount_ = 0; 194 std::atomic<IStatus> status_ = I_STATUS_IDLE; 195 bool offloadEnable_ = false; 196 std::atomic<bool> standByEnable_ = false; 197 std::atomic<bool> muteFlag_ = false; 198 199 // for inner-cap 200 std::mutex dupMutex_; 201 size_t dupTotalSizeInFrame_ = 0; 202 size_t dupSpanSizeInFrame_ = 0; 203 size_t dupSpanSizeInByte_ = 0; 204 size_t dupByteSizePerFrame_ = 0; 205 FILE *dumpDupIn_ = nullptr; 206 std::string dumpDupInFileName_ = ""; 207 std::map<int32_t, std::shared_ptr<StreamCallbacks>> innerCapIdToDupStreamCallbackMap_; 208 std::unordered_map<int32_t, CaptureInfo> captureInfos_; 209 std::unique_ptr<AudioRingCache> dupRingBuffer_ = nullptr; 210 211 // for dual sink tone 212 std::mutex dualToneMutex_; 213 std::atomic<bool> isDualToneEnabled_ = false; 214 uint32_t dualToneStreamIndex_ = 0; 215 std::shared_ptr<IRendererStream> dualToneStream_ = nullptr; 216 217 std::weak_ptr<IStreamListener> streamListener_; 218 size_t engineTotalSizeInFrame_ = 0; 219 size_t bufferTotalSizeInFrame_ = 0; 220 size_t spanSizeInFrame_ = 0; 221 size_t spanSizeInByte_ = 0; 222 size_t byteSizePerFrame_ = 0; 223 bool isBufferConfiged_ = false; 224 std::atomic<bool> isInited_ = false; 225 std::shared_ptr<OHAudioBufferBase> audioServerBuffer_ = nullptr; 226 std::atomic<size_t> needForceWrite_ = 0; 227 bool afterDrain = false; 228 float lowPowerVolume_ = 1.0f; 229 std::atomic<bool> isMuted_ = false; 230 bool isNeedFade_ = false; 231 float oldAppliedVolume_ = MAX_FLOAT_VOLUME; 232 std::mutex updateIndexLock_; 233 int64_t startedTime_ = 0; 234 int64_t pausedTime_ = 0; 235 int64_t stopedTime_ = 0; 236 int64_t flushedTime_ = 0; 237 int64_t drainedTime_ = 0; 238 uint32_t underrunCount_ = 0; 239 std::atomic<uint32_t> standByCounter_ = 0; 240 int64_t enterStandbyTime_ = 0; 241 int64_t lastWriteTime_ = 0; 242 bool resetTime_ = false; 243 uint64_t resetTimestamp_ = 0; 244 std::mutex writeLock_; 245 FILE *dumpC2S_ = nullptr; // client to server dump file 246 std::string dumpFileName_ = ""; 247 ManagerType managerType_; 248 std::mutex fadeoutLock_; 249 int32_t fadeoutFlag_ = 0; 250 std::time_t startMuteTime_ = 0; 251 bool isInSilentState_ = false; 252 std::atomic<bool> silentModeAndMixWithOthers_ = false; 253 int32_t effectModeWhenDual_ = EFFECT_DEFAULT; 254 int32_t renderEmptyCountForInnerCap_ = 0; 255 256 // only read & write in CheckAndWriterRenderStreamStandbySysEvent 257 bool lastWriteStandbyEnableStatus_ = false; 258 std::set<int32_t> innerCapIds; 259 260 int64_t lastStartTime_{}; 261 int64_t lastStopTime_{}; 262 int64_t lastWriteFrame_{}; 263 int64_t lastWriteMuteFrame_{}; 264 int64_t sourceDuration_ = -1; 265 std::unique_ptr<PlayerDfxWriter> playerDfx_; 266 std::shared_ptr<AudioStreamChecker> audioStreamChecker_ = nullptr; 267 268 float loudnessGain_ = 0.0f; 269 // Only use in Writedate(). Protect by writeMutex_. 270 std::vector<uint8_t> rendererTmpBuffer_; 271 // audio haptics play sync param id 272 std::atomic<int32_t> audioHapticsSyncId_ = 0; 273 274 bool latestForWorkgroupInited_ = false; 275 struct RendererLatestInfoForWorkgroup latestForWorkgroup_; 276 }; 277 } // namespace AudioStandard 278 } // namespace OHOS 279 #endif // RENDERER_IN_SERVER_H 280