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 #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 #include "audio_info.h"
24 
25 #include "audio_process_in_client.h"
26 #include "audio_stream_tracker.h"
27 #include "i_audio_stream.h"
28 #include "audio_policy_manager.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 {
63 public:
64     FastAudioStream(AudioStreamType eStreamType, AudioMode eMode, int32_t appUid);
65     virtual ~FastAudioStream();
66 
67     void SetClientID(int32_t clientPid, int32_t clientUid, uint32_t appTokenId, uint64_t fullTokenId) override;
68 
69     int32_t UpdatePlaybackCaptureConfig(const AudioPlaybackCaptureConfig &config) override;
70     void SetRendererInfo(const AudioRendererInfo &rendererInfo) override;
71     void SetCapturerInfo(const AudioCapturerInfo &capturerInfo) override;
72     int32_t SetAudioStreamInfo(const AudioStreamParams info,
73         const std::shared_ptr<AudioClientTracker> &proxyObj) override;
74     int32_t GetAudioStreamInfo(AudioStreamParams &info) override;
75     bool CheckRecordingCreate(uint32_t appTokenId, uint64_t appFullTokenId, int32_t appUid,
76         SourceType sourceType = SOURCE_TYPE_MIC) override;
77     bool CheckRecordingStateChange(uint32_t appTokenId, uint64_t appFullTokenId, int32_t appUid,
78         AudioPermissionState state) override;
79     int32_t GetAudioSessionID(uint32_t &sessionID) override;
80     void GetAudioPipeType(AudioPipeType &pipeType) override;
81     State GetState() override;
82     bool GetAudioTime(Timestamp &timestamp, Timestamp::Timestampbase base) override;
83     bool GetAudioPosition(Timestamp &timestamp, Timestamp::Timestampbase base) override;
84     int32_t GetBufferSize(size_t &bufferSize) override;
85     int32_t GetFrameCount(uint32_t &frameCount) override;
86     int32_t GetLatency(uint64_t &latency) override;
87     int32_t SetAudioStreamType(AudioStreamType audioStreamType) override;
88     int32_t SetVolume(float volume) 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     // callback mode api
96     int32_t SetRendererFirstFrameWritingCallback(
97         const std::shared_ptr<AudioRendererFirstFrameWritingCallback> &callback) override;
98     void OnFirstFrameWriting() override;
99     int32_t SetRenderMode(AudioRenderMode renderMode) override;
100     AudioRenderMode GetRenderMode() override;
101     int32_t SetRendererWriteCallback(const std::shared_ptr<AudioRendererWriteCallback> &callback) override;
102     int32_t SetCaptureMode(AudioCaptureMode captureMode) override;
103     AudioCaptureMode GetCaptureMode() override;
104     int32_t SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> &callback) override;
105     int32_t GetBufferDesc(BufferDesc &bufDesc) override;
106     int32_t GetBufQueueState(BufferQueueState &bufState) override;
107     int32_t Enqueue(const BufferDesc &bufDesc) override;
108     int32_t Clear() override;
109     void SetPreferredFrameSize(int32_t frameSize) override;
110     void UpdateLatencyTimestamp(std::string &timestamp, bool isRenderer) override;
111     int32_t SetLowPowerVolume(float volume) override;
112     float GetLowPowerVolume() override;
113     int32_t SetOffloadMode(int32_t state, bool isAppBack) override;
114     int32_t UnsetOffloadMode() override;
115     float GetSingleStreamVolume() override;
116     AudioEffectMode GetAudioEffectMode() override;
117     int32_t SetAudioEffectMode(AudioEffectMode effectMode) override;
118     int64_t GetFramesWritten() override;
119     int64_t GetFramesRead() override;
120 
121     void SetInnerCapturerState(bool isInnerCapturer) override;
122     void SetWakeupCapturerState(bool isWakeupCapturer) override;
123     void SetCapturerSource(int capturerSource) override;
124     void SetPrivacyType(AudioPrivacyType privacyType) override;
125 
126     // Common APIs
127     bool StartAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT,
128         AudioStreamDeviceChangeReasonExt reason = AudioStreamDeviceChangeReasonExt::ExtEnum::UNKNOWN) override;
129     bool PauseAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT) override;
130     bool StopAudioStream() override;
131     bool ReleaseAudioStream(bool releaseRunner = true, bool isSwitchStream = false) override;
132     bool FlushAudioStream() override;
133 
134     // Playback related APIs
135     bool DrainAudioStream(bool stopFlag = false) override;
136     int32_t Write(uint8_t *buffer, size_t buffer_size) override;
137     int32_t Write(uint8_t *pcmBuffer, size_t pcmSize, uint8_t *metaBuffer, size_t metaSize) override;
138     int32_t SetSpeed(float speed) override;
139     float GetSpeed() override;
140     int32_t ChangeSpeed(uint8_t *buffer, int32_t bufferSize, std::unique_ptr<uint8_t[]> &outBuffer,
141         int32_t &outBufferSize) override;
142 
143     // Recording related APIs
144     int32_t Read(uint8_t &buffer, size_t userSize, bool isBlockingRead) override;
145 
146     uint32_t GetUnderflowCount() override;
147     uint32_t GetOverflowCount() override;
148     void SetUnderflowCount(uint32_t underflowCount) override;
149     void SetOverflowCount(uint32_t overflowCount) override;
150 
151     void SetRendererPositionCallback(int64_t markPosition, const std::shared_ptr<RendererPositionCallback> &callback)
152         override;
153     void UnsetRendererPositionCallback() override;
154     void SetRendererPeriodPositionCallback(int64_t markPosition,
155         const std::shared_ptr<RendererPeriodPositionCallback> &callback) override;
156     void UnsetRendererPeriodPositionCallback() override;
157     void SetCapturerPositionCallback(int64_t markPosition, const std::shared_ptr<CapturerPositionCallback> &callback)
158         override;
159     void UnsetCapturerPositionCallback() override;
160     void SetCapturerPeriodPositionCallback(int64_t markPosition,
161         const std::shared_ptr<CapturerPeriodPositionCallback> &callback) override;
162     void UnsetCapturerPeriodPositionCallback() override;
163     int32_t SetRendererSamplingRate(uint32_t sampleRate) override;
164     uint32_t GetRendererSamplingRate() override;
165     int32_t SetBufferSizeInMsec(int32_t bufferSizeInMsec) override;
166     void SetApplicationCachePath(const std::string cachePath) override;
167     int32_t SetChannelBlendMode(ChannelBlendMode blendMode) override;
168     int32_t SetVolumeWithRamp(float volume, int32_t duration) override;
169 
170     void SetStreamTrackerState(bool trackerRegisteredState) override;
171     void GetSwitchInfo(IAudioStream::SwitchInfo& info) override;
172 
173     IAudioStream::StreamClass GetStreamClass() override;
174 
175     bool RestoreAudioStream(bool needStoreState = true) override;
176 
177     bool GetOffloadEnable() override;
178     bool GetSpatializationEnabled() override;
179     bool GetHighResolutionEnabled() override;
180 
181     void SetSilentModeAndMixWithOthers(bool on) override;
182 
183     bool GetSilentModeAndMixWithOthers() override;
184 
185 private:
186     void UpdateRegisterTrackerInfo(AudioRegisterTrackerInfo &registerTrackerInfo);
187     int32_t InitializeAudioProcessConfig(AudioProcessConfig &config, const AudioStreamParams &info);
188 
189     AudioStreamType eStreamType_;
190     AudioMode eMode_;
191     std::shared_ptr<AudioProcessInClient> processClient_ = nullptr;
192     std::shared_ptr<FastAudioStreamRenderCallback> spkProcClientCb_ = nullptr;
193     std::shared_ptr<FastAudioStreamCaptureCallback> micProcClientCb_ = nullptr;
194     std::shared_ptr<AudioRendererFirstFrameWritingCallback> firstFrameWritingCb_ = nullptr;
195     std::unique_ptr<AudioStreamTracker> audioStreamTracker_;
196     AudioRendererInfo rendererInfo_;
197     AudioCapturerInfo capturerInfo_;
198     AudioStreamParams streamInfo_;
199     AudioProcessConfig processconfig_;
200     State state_;
201     uint32_t sessionId_ = 0;
202     std::string cachePath_ = "";
203     uint32_t underflowCount_ = 0;
204     uint32_t overflowCount_ = 0;
205     AudioRenderMode renderMode_;
206     AudioCaptureMode captureMode_;
207     AudioRendererRate renderRate_ = RENDER_RATE_NORMAL;
208     int32_t clientPid_ = 0;
209     int32_t clientUid_ = 0;
210     uint32_t appTokenId_ = 0;
211     uint64_t fullTokenId_ = 0;
212     bool streamTrackerRegistered_ = false;
213     std::shared_ptr<AudioClientTracker> proxyObj_ = nullptr;
214     bool silentModeAndMixWithOthers_ = false;
215 
216     std::mutex setPreferredFrameSizeMutex_;
217     std::optional<int32_t> userSettedPreferredFrameSize_ = std::nullopt;
218 };
219 } // namespace AudioStandard
220 } // namespace OHOS
221 #endif // FAST_AUDIO_STREAM_H
222