• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &timestamp);
82     int32_t GetAudioPosition(uint64_t &framePos, uint64_t &timestamp, uint64_t &latency, int32_t base);
83     int32_t GetSpeedPosition(uint64_t &framePos, uint64_t &timestamp, 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 &timestamp, 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