• 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") = 0;
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 I_AUDIO_STREAM_H
16 #define I_AUDIO_STREAM_H
17 
18 #include <map>
19 #include <memory>
20 #include "timestamp.h"
21 #include "audio_capturer.h"
22 #include "audio_renderer.h"
23 #include "audio_stream_manager.h"
24 #include "audio_device_info.h"
25 
26 namespace OHOS {
27 namespace AudioStandard {
28 class AudioStreamCallback {
29 public:
30     virtual ~AudioStreamCallback() = default;
31     /**
32      * Called when stream state is updated.
33      *
34      * @param state Indicates the InterruptEvent information needed by client.
35      * For details, refer InterruptEvent struct in audio_info.h
36      */
37     virtual void OnStateChange(const State state, const StateChangeCmdType cmdType = CMD_FROM_CLIENT) = 0;
38 };
39 
40 class RendererOrCapturerPolicyServiceDiedCallback {
41 public:
42     virtual ~RendererOrCapturerPolicyServiceDiedCallback() = default;
43     /**
44      * Called when AudioPolicyService died.
45      *
46      * since 11
47      */
48     virtual void OnAudioPolicyServiceDied() = 0;
49 };
50 
51 class IAudioStream {
52 public:
53     enum StreamClass : uint32_t {
54         PA_STREAM = 0,
55         FAST_STREAM,
56         VOIP_STREAM,
57     };
58 
59     struct SwitchInfo {
60         AudioStreamParams params;
61         AudioStreamType eStreamType;
62         int32_t appUid;
63         AudioRendererInfo rendererInfo;
64         AudioCapturerInfo capturerInfo;
65         State state;
66         uint32_t sessionId;
67         uint32_t rendererSampleRate;
68         uint32_t underFlowCount = 0;
69         uint32_t overFlowCount = 0;
70         AudioEffectMode effectMode;
71         AudioRenderMode renderMode;
72         AudioCaptureMode captureMode;
73         AudioRendererRate renderRate;
74         int32_t clientPid = 0;
75         int32_t clientUid = 0;
76         std::shared_ptr<AudioClientTracker> proxyObj;
77         AudioPrivacyType privacyType;
78         float volume;
79         float duckVolume = 1.0f;
80         int32_t rendererFlags = AUDIO_FLAG_NORMAL;
81 
82         bool streamTrackerRegistered = false;
83 
84         uint64_t frameMarkPosition = 0;
85         uint64_t framePeriodNumber = 0;
86 
87         uint64_t totalBytesWritten = 0;
88         uint64_t framePeriodWritten = 0;
89         std::shared_ptr<RendererPositionCallback> renderPositionCb;
90         std::shared_ptr<RendererPeriodPositionCallback> renderPeriodPositionCb;
91 
92         uint64_t totalBytesRead = 0;
93         uint64_t framePeriodRead = 0;
94         std::shared_ptr<CapturerPositionCallback> capturePositionCb;
95         std::shared_ptr<CapturerPeriodPositionCallback> capturePeriodPositionCb;
96 
97         // callback info
98         std::shared_ptr<AudioStreamCallback> audioStreamCallback;
99         std::shared_ptr<AudioRendererWriteCallback> rendererWriteCallback;
100         std::shared_ptr<AudioCapturerReadCallback> capturerReadCallback;
101         std::shared_ptr<AudioRendererFirstFrameWritingCallback> rendererFirstFrameWritingCallback;
102 
103         std::optional<int32_t> userSettedPreferredFrameSize = std::nullopt;
104         bool silentModeAndMixWithOthers = false;
105         DeviceType defaultOutputDevice = DEVICE_TYPE_NONE;
106 
107         std::optional<pid_t> lastCallStartByUserTid = std::nullopt;
108         std::vector<std::pair<uint64_t, uint64_t>> lastFramePosAndTimePair = {
109             Timestamp::Timestampbase::BASESIZE, {0, 0}
110         };
111         std::vector<std::pair<uint64_t, uint64_t>> lastFramePosAndTimePairWithSpeed = {
112             Timestamp::Timestampbase::BASESIZE, {0, 0}
113         };
114     };
115 
116     virtual ~IAudioStream() = default;
117 
118     static int32_t GetByteSizePerFrame(const AudioStreamParams &params, size_t &result);
119     static bool IsStreamSupported(int32_t streamFlags, const AudioStreamParams &params);
120     static std::shared_ptr<IAudioStream> GetPlaybackStream(StreamClass streamClass, AudioStreamParams params,
121         AudioStreamType eStreamType, int32_t appUid);
122     static std::shared_ptr<IAudioStream> GetRecordStream(StreamClass streamClass, AudioStreamParams params,
123         AudioStreamType eStreamType, int32_t appUid);
124 
125     static AudioStreamType GetStreamType(ContentType contentType, StreamUsage streamUsage);
126     static std::map<std::pair<ContentType, StreamUsage>, AudioStreamType> CreateStreamMap();
127     static void CreateStreamMap(std::map<std::pair<ContentType, StreamUsage>, AudioStreamType> &streamMap);
IsFastStreamClass(StreamClass streamClass)128     static inline bool IsFastStreamClass(StreamClass streamClass)
129     {
130         if (streamClass == FAST_STREAM || streamClass == VOIP_STREAM) {
131             return true;
132         }
133         return false;
134     }
135 
136     virtual int32_t UpdatePlaybackCaptureConfig(const AudioPlaybackCaptureConfig &config) = 0;
137     virtual void SetClientID(int32_t clientPid, int32_t clientUid, uint32_t appTokenId, uint64_t fullTokenId) = 0;
138     virtual void SetRendererInfo(const AudioRendererInfo &rendererInfo) = 0;
139     virtual void GetRendererInfo(AudioRendererInfo &rendererInfo) = 0;
140     virtual void SetCapturerInfo(const AudioCapturerInfo &capturerInfo) = 0;
141     virtual int32_t SetAudioStreamInfo(const AudioStreamParams info,
142         const std::shared_ptr<AudioClientTracker> &proxyObj,
143         const AudioPlaybackCaptureConfig &config = AudioPlaybackCaptureConfig()) = 0;
144     virtual int32_t GetAudioStreamInfo(AudioStreamParams &info) = 0;
145     virtual int32_t GetAudioSessionID(uint32_t &sessionID) = 0;
146     virtual void GetAudioPipeType(AudioPipeType &pipeType) = 0;
147     virtual State GetState() = 0;
148     virtual bool GetAudioTime(Timestamp &timestamp, Timestamp::Timestampbase base) = 0;
149     virtual bool GetAudioPosition(Timestamp &timestamp, Timestamp::Timestampbase base) = 0;
150     virtual int32_t GetBufferSize(size_t &bufferSize) = 0;
151     virtual int32_t GetFrameCount(uint32_t &frameCount) = 0;
152     virtual int32_t GetLatency(uint64_t &latency) = 0;
153     virtual int32_t SetAudioStreamType(AudioStreamType audioStreamType) = 0;
154     virtual int32_t SetVolume(float volume) = 0;
155     virtual float GetVolume() = 0;
156     virtual int32_t SetLoudnessGain(float loudnessGain) = 0;
157     virtual float GetLoudnessGain() = 0;
158     virtual int32_t SetDuckVolume(float volume) = 0;
159     virtual float GetDuckVolume() = 0;
160     virtual int32_t SetMute(bool mute, StateChangeCmdType cmdType) = 0;
161     virtual bool GetMute() = 0;
162     virtual int32_t SetRenderRate(AudioRendererRate renderRate) = 0;
163     virtual AudioRendererRate GetRenderRate() = 0;
164     virtual int32_t SetStreamCallback(const std::shared_ptr<AudioStreamCallback> &callback) = 0;
165     virtual int32_t SetSpeed(float speed) = 0;
166     virtual int32_t SetPitch(float pitch) = 0;
167     virtual float GetSpeed() = 0;
168 
169     virtual void SetUnderflowCount(uint32_t underflowCount) = 0;
170     virtual void SetOverflowCount(uint32_t overflowCount) = 0;
171 
172     // callback mode api
173     virtual int32_t SetRenderMode(AudioRenderMode renderMode) = 0;
174     virtual AudioRenderMode GetRenderMode() = 0;
175     virtual int32_t SetRendererWriteCallback(const std::shared_ptr<AudioRendererWriteCallback> &callback) = 0;
176 
177     virtual int32_t SetRendererFirstFrameWritingCallback(
178         const std::shared_ptr<AudioRendererFirstFrameWritingCallback> &callback) = 0;
179     virtual void OnFirstFrameWriting() = 0;
180 
181     virtual int32_t SetCaptureMode(AudioCaptureMode captureMode) = 0;
182     virtual AudioCaptureMode GetCaptureMode() = 0;
183     virtual int32_t SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> &callback) = 0;
184 
185     virtual int32_t GetBufferDesc(BufferDesc &bufDesc) = 0;
186     virtual int32_t GetBufQueueState(BufferQueueState &bufState) = 0;
187     virtual int32_t Enqueue(const BufferDesc &bufDesc) = 0;
188     virtual int32_t Clear() = 0;
189 
190     virtual int32_t SetLowPowerVolume(float volume) = 0;
191     virtual float GetLowPowerVolume() = 0;
192     virtual float GetSingleStreamVolume() = 0;
193     virtual int32_t SetOffloadMode(int32_t state, bool isAppBack) = 0;
194     virtual int32_t UnsetOffloadMode() = 0;
195 
196     // for effect
197     virtual AudioEffectMode GetAudioEffectMode() = 0;
198     virtual int32_t SetAudioEffectMode(AudioEffectMode effectMode) = 0;
199 
200     virtual int64_t GetFramesWritten() = 0;
201     virtual int64_t GetFramesRead() = 0;
202 
203     // Common APIs
204     virtual bool StartAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT,
205         AudioStreamDeviceChangeReasonExt reason = AudioStreamDeviceChangeReasonExt::ExtEnum::UNKNOWN) = 0;
206     virtual bool PauseAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT) = 0;
207     virtual bool StopAudioStream() = 0;
208     virtual bool ReleaseAudioStream(bool releaseRunner = true, bool destroyAtOnce = false) = 0;
209     virtual bool FlushAudioStream() = 0;
210 
211     // Playback related APIs
212     virtual bool DrainAudioStream(bool stopFlag = false) = 0;
213     virtual int32_t Write(uint8_t *buffer, size_t buffer_size) = 0;
214     virtual int32_t Write(uint8_t *pcmBuffer, size_t pcmSize, uint8_t *metaBuffer, size_t metaSize) = 0;
215 
216     // Recording related APIs
217     virtual int32_t Read(uint8_t &buffer, size_t userSize, bool isBlockingRead) = 0;
218 
219     // for inner capturer
220     virtual void SetInnerCapturerState(bool isInnerCapturer) = 0;
221     virtual void SetPrivacyType(AudioPrivacyType privacyType) = 0;
222 
223     virtual uint32_t GetUnderflowCount() = 0;
224     virtual uint32_t GetOverflowCount() = 0;
225 
226     virtual void SetRendererPositionCallback(int64_t markPosition,
227         const std::shared_ptr<RendererPositionCallback> &callback) = 0;
228     virtual void UnsetRendererPositionCallback() = 0;
229 
230     virtual void SetRendererPeriodPositionCallback(int64_t markPosition,
231         const std::shared_ptr<RendererPeriodPositionCallback> &callback) = 0;
232     virtual void UnsetRendererPeriodPositionCallback() = 0;
233 
234     virtual void SetCapturerPositionCallback(int64_t markPosition,
235         const std::shared_ptr<CapturerPositionCallback> &callback) = 0;
236     virtual void UnsetCapturerPositionCallback() = 0;
237 
238     virtual void SetCapturerPeriodPositionCallback(int64_t markPosition,
239         const std::shared_ptr<CapturerPeriodPositionCallback> &callback) = 0;
240 
241     virtual void UnsetCapturerPeriodPositionCallback() = 0;
242     virtual int32_t SetRendererSamplingRate(uint32_t sampleRate) = 0;
243     virtual uint32_t GetRendererSamplingRate() = 0;
244     virtual int32_t SetBufferSizeInMsec(int32_t bufferSizeInMsec) = 0;
245     virtual int32_t SetChannelBlendMode(ChannelBlendMode blendMode) = 0;
246     virtual int32_t SetVolumeWithRamp(float volume, int32_t duration) = 0;
247     virtual void SetPreferredFrameSize(int32_t frameSize) = 0;
248     virtual IAudioStream::StreamClass GetStreamClass() = 0;
249     virtual void SetStreamTrackerState(bool trackerRegisteredState) = 0;
250     virtual void GetSwitchInfo(SwitchInfo& info) = 0;
251 
252     // for get pipetype
253     virtual bool GetOffloadEnable() = 0;
254 
255     virtual bool GetSpatializationEnabled() = 0;
256 
257     virtual bool GetHighResolutionEnabled() = 0;
258 
259     //for wakeup capturer
260     virtual void SetWakeupCapturerState(bool isWakeupCapturer) = 0;
261 
262     virtual void SetCapturerSource(int capturerSource) = 0;
263 
264     virtual void UpdateLatencyTimestamp(std::string &timestamp, bool isRenderer) = 0;
265 
266     virtual bool RestoreAudioStream(bool needStoreState = true)
267     {
268         return 0;
269     }
270 
271     virtual void JoinCallbackLoop() = 0;
272 
SetState()273     virtual void SetState() {}
274 
275     bool IsFormatValid(uint8_t format);
276 
277     bool IsRendererChannelValid(uint8_t channel);
278 
279     bool IsCapturerChannelValid(uint8_t channel);
280 
281     bool IsEncodingTypeValid(uint8_t encodingType);
282 
283     bool IsSamplingRateValid(uint32_t samplingRate);
284 
285     bool IsRendererChannelLayoutValid(uint64_t channelLayout);
286 
287     bool IsCapturerChannelLayoutValid(uint64_t channelLayout);
288 
289     bool IsPlaybackChannelRelatedInfoValid(uint8_t channels, uint64_t channelLayout);
290 
291     bool IsRecordChannelRelatedInfoValid(uint8_t channels, uint64_t channelLayout);
292 
293     virtual void SetSilentModeAndMixWithOthers(bool on) = 0;
294 
295     virtual bool GetSilentModeAndMixWithOthers() = 0;
296 
297     virtual int32_t SetDefaultOutputDevice(const DeviceType defaultOutputDevice, bool skipForce = false) = 0;
298 
GetFastStatus()299     virtual FastStatus GetFastStatus() { return FASTSTATUS_NORMAL; };
300 
301     virtual DeviceType GetDefaultOutputDevice() = 0;
302 
303     virtual int32_t GetAudioTimestampInfo(Timestamp &timestamp, Timestamp::Timestampbase base) = 0;
304 
GetTimeStampInfo(Timestamp & timestamp,Timestamp::Timestampbase base)305     virtual bool GetTimeStampInfo(Timestamp &timestamp, Timestamp::Timestampbase base)
306     {
307         return false;
308     }
309 
310     virtual void SetSwitchingStatus(bool isSwitching) = 0;
SetSourceDuration(int64_t duration)311     virtual int32_t SetSourceDuration(int64_t duration) { return 0; }
312 
313     virtual void GetRestoreInfo(RestoreInfo &restoreInfo) = 0;
314 
315     virtual void SetRestoreInfo(RestoreInfo &restoreInfo) = 0;
316 
317     virtual RestoreStatus CheckRestoreStatus() = 0;
318 
319     virtual RestoreStatus SetRestoreStatus(RestoreStatus restoreStatus) = 0;
320 
321     virtual void SetSwitchInfoTimestamp(std::vector<std::pair<uint64_t, uint64_t>> lastFramePosAndTimePair,
322         std::vector<std::pair<uint64_t, uint64_t>> lastFramePosAndTimePairWithSpeed) = 0;
323 
324     virtual void FetchDeviceForSplitStream() = 0;
325 
326     virtual void SetCallStartByUserTid(pid_t tid) = 0;
327 
328     virtual void SetCallbackLoopTid(int32_t tid) = 0;
329 
330     virtual int32_t GetCallbackLoopTid() = 0;
331 
SetOffloadDataCallbackState(int32_t cbState)332     virtual int32_t SetOffloadDataCallbackState(int32_t cbState) { return 0; };
333 
334     virtual bool GetStopFlag() const = 0;
335 
ResetFirstFrameState()336     virtual void ResetFirstFrameState() {}
337 
NotifyRouteUpdate(uint32_t routeFlag,const std::string & networkId)338     virtual void NotifyRouteUpdate(uint32_t routeFlag, const std::string &networkId) {}
339 
SetAudioHapticsSyncId(const int32_t & audioHapticsSyncId)340     virtual void SetAudioHapticsSyncId(const int32_t &audioHapticsSyncId) {}
341 };
342 } // namespace AudioStandard
343 } // namespace OHOS
344 #endif // I_AUDIO_STREAM_H
345