• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2025 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 #ifndef FAST_AUDIO_STREAM_H
16 #define FAST_AUDIO_STREAM_H
17 
18 #include <mutex>
19 #include <condition_variable>
20 #include "timestamp.h"
21 #include "event_handler.h"
22 #include "event_runner.h"
23 
24 #include "audio_process_in_client.h"
25 #include "audio_stream_tracker.h"
26 #include "i_audio_stream.h"
27 #include "audio_policy_manager.h"
28 #include "callback_handler.h"
29 
30 namespace OHOS {
31 namespace AudioStandard {
32 class FastPolicyServiceDiedCallbackImpl;
33 class FastAudioStreamRenderCallback : public AudioDataCallback {
34 public:
FastAudioStreamRenderCallback(const std::shared_ptr<AudioRendererWriteCallback> & callback,IAudioStream & audioStream)35     FastAudioStreamRenderCallback(const std::shared_ptr<AudioRendererWriteCallback> &callback,
36         IAudioStream &audioStream)
37         : rendererWriteCallback_(callback), audioStreamImpl_(audioStream), hasFirstFrameWrited_(false) {};
38     virtual ~FastAudioStreamRenderCallback() = default;
39 
40     void OnHandleData(size_t length) override;
41     std::shared_ptr<AudioRendererWriteCallback> GetRendererWriteCallback() const;
42 
43     void ResetFirstFrameState();
44 private:
45     std::shared_ptr<AudioRendererWriteCallback> rendererWriteCallback_ = nullptr;
46     IAudioStream &audioStreamImpl_;
47     bool hasFirstFrameWrited_ = false;
48 };
49 
50 class FastAudioStreamCaptureCallback : public AudioDataCallback {
51 public:
FastAudioStreamCaptureCallback(const std::shared_ptr<AudioCapturerReadCallback> & callback)52     FastAudioStreamCaptureCallback(const std::shared_ptr<AudioCapturerReadCallback> &callback)
53         : captureCallback_(callback) {};
54     virtual ~FastAudioStreamCaptureCallback() = default;
55 
56     void OnHandleData(size_t length) override;
57     std::shared_ptr<AudioCapturerReadCallback> GetCapturerReadCallback() const;
58 private:
59     std::shared_ptr<AudioCapturerReadCallback> captureCallback_ = nullptr;
60 };
61 
62 class FastAudioStream : public IAudioStream,  public IHandler,
63     public std::enable_shared_from_this<FastAudioStream>{
64 public:
65     FastAudioStream(AudioStreamType eStreamType, AudioMode eMode, int32_t appUid);
66     virtual ~FastAudioStream();
67 
68     void SetClientID(int32_t clientPid, int32_t clientUid, uint32_t appTokenId, uint64_t fullTokenId) override;
69 
70     int32_t UpdatePlaybackCaptureConfig(const AudioPlaybackCaptureConfig &config) override;
71     void SetRendererInfo(const AudioRendererInfo &rendererInfo) override;
72     void SetCapturerInfo(const AudioCapturerInfo &capturerInfo) override;
73     int32_t SetAudioStreamInfo(const AudioStreamParams info,
74         const std::shared_ptr<AudioClientTracker> &proxyObj,
75         const AudioPlaybackCaptureConfig &config = AudioPlaybackCaptureConfig()) override;
76     int32_t GetAudioStreamInfo(AudioStreamParams &info) override;
77     int32_t GetAudioSessionID(uint32_t &sessionID) override;
78     void GetAudioPipeType(AudioPipeType &pipeType) override;
79     State GetState() override;
80     bool GetAudioTime(Timestamp &timestamp, Timestamp::Timestampbase base) override;
81     bool GetAudioPosition(Timestamp &timestamp, Timestamp::Timestampbase base) override;
82     int32_t GetBufferSize(size_t &bufferSize) override;
83     int32_t GetFrameCount(uint32_t &frameCount) override;
84     int32_t GetLatency(uint64_t &latency) override;
85     int32_t SetAudioStreamType(AudioStreamType audioStreamType) override;
86     int32_t SetVolume(float volume) override;
87     int32_t SetMute(bool mute) override;
88     int32_t SetSourceDuration(int64_t duration) override;
89     float GetVolume() override;
90     int32_t SetDuckVolume(float volume) override;
91     int32_t SetRenderRate(AudioRendererRate renderRate) override;
92     AudioRendererRate GetRenderRate() override;
93     int32_t SetStreamCallback(const std::shared_ptr<AudioStreamCallback> &callback) override;
94 
95     void InitCallbackHandler();
96     void SafeSendCallbackEvent(uint32_t eventCode, int64_t data);
97     void OnHandle(uint32_t code, int64_t data) override;
98     void HandleStateChangeEvent(int64_t data);
99     int32_t ParamsToStateCmdType(int64_t params, State &state, StateChangeCmdType &cmdType);
100 
101     // callback mode api
102     int32_t SetRendererFirstFrameWritingCallback(
103         const std::shared_ptr<AudioRendererFirstFrameWritingCallback> &callback) override;
104     void OnFirstFrameWriting() override;
105     int32_t SetRenderMode(AudioRenderMode renderMode) override;
106     AudioRenderMode GetRenderMode() override;
107     int32_t SetRendererWriteCallback(const std::shared_ptr<AudioRendererWriteCallback> &callback) override;
108     int32_t SetCaptureMode(AudioCaptureMode captureMode) override;
109     AudioCaptureMode GetCaptureMode() override;
110     int32_t SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> &callback) override;
111     int32_t GetBufferDesc(BufferDesc &bufDesc) override;
112     int32_t GetBufQueueState(BufferQueueState &bufState) override;
113     int32_t Enqueue(const BufferDesc &bufDesc) override;
114     int32_t Clear() override;
115     void SetPreferredFrameSize(int32_t frameSize) override;
116     void UpdateLatencyTimestamp(std::string &timestamp, bool isRenderer) override;
117     int32_t SetLowPowerVolume(float volume) override;
118     float GetLowPowerVolume() override;
119     int32_t SetOffloadMode(int32_t state, bool isAppBack) override;
120     int32_t UnsetOffloadMode() override;
121     float GetSingleStreamVolume() override;
122     AudioEffectMode GetAudioEffectMode() override;
123     int32_t SetAudioEffectMode(AudioEffectMode effectMode) override;
124     int64_t GetFramesWritten() override;
125     int64_t GetFramesRead() override;
126 
127     void SetInnerCapturerState(bool isInnerCapturer) override;
128     void SetWakeupCapturerState(bool isWakeupCapturer) override;
129     void SetCapturerSource(int capturerSource) override;
130     void SetPrivacyType(AudioPrivacyType privacyType) override;
131 
132     // Common APIs
133     bool StartAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT,
134         AudioStreamDeviceChangeReasonExt reason = AudioStreamDeviceChangeReasonExt::ExtEnum::UNKNOWN) override;
135     bool PauseAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT) override;
136     bool StopAudioStream() override;
137     bool ReleaseAudioStream(bool releaseRunner = true, bool isSwitchStream = false) override;
138     bool FlushAudioStream() override;
139 
140     // Playback related APIs
141     bool DrainAudioStream(bool stopFlag = false) override;
142     int32_t Write(uint8_t *buffer, size_t buffer_size) override;
143     int32_t Write(uint8_t *pcmBuffer, size_t pcmSize, uint8_t *metaBuffer, size_t metaSize) override;
144     int32_t SetSpeed(float speed) override;
145     float GetSpeed() override;
146     int32_t ChangeSpeed(uint8_t *buffer, int32_t bufferSize, std::unique_ptr<uint8_t[]> &outBuffer,
147         int32_t &outBufferSize) override;
148 
149     // Recording related APIs
150     int32_t Read(uint8_t &buffer, size_t userSize, bool isBlockingRead) override;
151 
152     uint32_t GetUnderflowCount() override;
153     uint32_t GetOverflowCount() override;
154     void SetUnderflowCount(uint32_t underflowCount) override;
155     void SetOverflowCount(uint32_t overflowCount) override;
156 
157     void SetRendererPositionCallback(int64_t markPosition, const std::shared_ptr<RendererPositionCallback> &callback)
158         override;
159     void UnsetRendererPositionCallback() override;
160     void SetRendererPeriodPositionCallback(int64_t markPosition,
161         const std::shared_ptr<RendererPeriodPositionCallback> &callback) override;
162     void UnsetRendererPeriodPositionCallback() override;
163     void SetCapturerPositionCallback(int64_t markPosition, const std::shared_ptr<CapturerPositionCallback> &callback)
164         override;
165     void UnsetCapturerPositionCallback() override;
166     void SetCapturerPeriodPositionCallback(int64_t markPosition,
167         const std::shared_ptr<CapturerPeriodPositionCallback> &callback) override;
168     void UnsetCapturerPeriodPositionCallback() override;
169     int32_t SetRendererSamplingRate(uint32_t sampleRate) override;
170     uint32_t GetRendererSamplingRate() override;
171     int32_t SetBufferSizeInMsec(int32_t bufferSizeInMsec) override;
172     int32_t SetChannelBlendMode(ChannelBlendMode blendMode) override;
173     int32_t SetVolumeWithRamp(float volume, int32_t duration) override;
174 
175     void SetStreamTrackerState(bool trackerRegisteredState) override;
176     void GetSwitchInfo(IAudioStream::SwitchInfo& info) override;
177 
178     IAudioStream::StreamClass GetStreamClass() override;
179 
180     bool RestoreAudioStream(bool needStoreState = true) override;
181 
182     bool GetOffloadEnable() override;
183     bool GetSpatializationEnabled() override;
184     bool GetHighResolutionEnabled() override;
185 
186     void SetSilentModeAndMixWithOthers(bool on) override;
187 
188     bool GetSilentModeAndMixWithOthers() override;
189 
190     int32_t SetDefaultOutputDevice(const DeviceType defaultOutputDevice) override;
191 
192     DeviceType GetDefaultOutputDevice() override;
193 
194     int32_t GetAudioTimestampInfo(Timestamp &timestamp, Timestamp::Timestampbase base) override;
195 
196     void SetSwitchingStatus(bool isSwitching) override;
197 
198     void GetRestoreInfo(RestoreInfo &restoreInfo) override;
199     void SetRestoreInfo(RestoreInfo &restoreInfo) override;
200     RestoreStatus CheckRestoreStatus() override;
201     RestoreStatus SetRestoreStatus(RestoreStatus restoreStatus) override;
202     void FetchDeviceForSplitStream() override;
203 private:
204     void UpdateRegisterTrackerInfo(AudioRegisterTrackerInfo &registerTrackerInfo);
205     int32_t InitializeAudioProcessConfig(AudioProcessConfig &config, const AudioStreamParams &info);
206     int32_t SetCallbacksWhenRestore();
207 
208     AudioStreamType eStreamType_;
209     AudioMode eMode_;
210     std::shared_ptr<AudioProcessInClient> processClient_ = nullptr;
211     std::shared_ptr<FastAudioStreamRenderCallback> spkProcClientCb_ = nullptr;
212     std::shared_ptr<FastAudioStreamCaptureCallback> micProcClientCb_ = nullptr;
213     std::shared_ptr<AudioRendererFirstFrameWritingCallback> firstFrameWritingCb_ = nullptr;
214     std::unique_ptr<AudioStreamTracker> audioStreamTracker_;
215     AudioRendererInfo rendererInfo_;
216     AudioCapturerInfo capturerInfo_;
217     AudioStreamParams streamInfo_;
218     AudioProcessConfig processconfig_;
219     State state_;
220     uint32_t sessionId_ = 0;
221     uint32_t underflowCount_ = 0;
222     uint32_t overflowCount_ = 0;
223     AudioRenderMode renderMode_;
224     AudioCaptureMode captureMode_;
225     AudioRendererRate renderRate_ = RENDER_RATE_NORMAL;
226     int32_t clientPid_ = 0;
227     int32_t clientUid_ = 0;
228     uint32_t appTokenId_ = 0;
229     uint64_t fullTokenId_ = 0;
230     bool streamTrackerRegistered_ = false;
231     std::shared_ptr<AudioClientTracker> proxyObj_ = nullptr;
232     bool silentModeAndMixWithOthers_ = false;
233     DeviceType defaultOutputDevice_ = DEVICE_TYPE_NONE;
234 
235     std::mutex streamCbMutex_;
236     std::weak_ptr<AudioStreamCallback> streamCallback_;
237 
238     bool runnerReleased_ = false;
239     std::mutex runnerMutex_;
240     std::shared_ptr<CallbackHandler> callbackHandler_ = nullptr;
241 
242     std::mutex setPreferredFrameSizeMutex_;
243     std::optional<int32_t> userSettedPreferredFrameSize_ = std::nullopt;
244 
245     std::mutex switchingMutex_;
246     StreamSwitchingInfo switchingInfo_ {false, INVALID};
247     enum {
248         STATE_CHANGE_EVENT = 0
249     };
250 
251     enum : int64_t {
252         HANDLER_PARAM_INVALID = -1,
253         HANDLER_PARAM_NEW = 0,
254         HANDLER_PARAM_PREPARED,
255         HANDLER_PARAM_RUNNING,
256         HANDLER_PARAM_STOPPED,
257         HANDLER_PARAM_RELEASED,
258         HANDLER_PARAM_PAUSED,
259         HANDLER_PARAM_STOPPING,
260         HANDLER_PARAM_RUNNING_FROM_SYSTEM,
261         HANDLER_PARAM_PAUSED_FROM_SYSTEM,
262     };
263 };
264 } // namespace AudioStandard
265 } // namespace OHOS
266 #endif // FAST_AUDIO_STREAM_H
267