• 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         int32_t rendererFlags = AUDIO_FLAG_NORMAL;
80 
81         bool streamTrackerRegistered = false;
82 
83         uint64_t frameMarkPosition = 0;
84         uint64_t framePeriodNumber = 0;
85 
86         uint64_t totalBytesWritten = 0;
87         uint64_t framePeriodWritten = 0;
88         std::shared_ptr<RendererPositionCallback> renderPositionCb;
89         std::shared_ptr<RendererPeriodPositionCallback> renderPeriodPositionCb;
90 
91         uint64_t totalBytesRead = 0;
92         uint64_t framePeriodRead = 0;
93         std::shared_ptr<CapturerPositionCallback> capturePositionCb;
94         std::shared_ptr<CapturerPeriodPositionCallback> capturePeriodPositionCb;
95 
96         // callback info
97         std::shared_ptr<AudioStreamCallback> audioStreamCallback;
98         std::shared_ptr<AudioRendererWriteCallback> rendererWriteCallback;
99         std::shared_ptr<AudioCapturerReadCallback> capturerReadCallback;
100         std::shared_ptr<AudioRendererFirstFrameWritingCallback> rendererFirstFrameWritingCallback;
101 
102         std::optional<int32_t> userSettedPreferredFrameSize = std::nullopt;
103         bool silentModeAndMixWithOthers = false;
104         DeviceType defaultOutputDevice = DEVICE_TYPE_NONE;
105     };
106 
107     virtual ~IAudioStream() = default;
108 
109     static int32_t GetByteSizePerFrame(const AudioStreamParams &params, size_t &result);
110     static bool IsStreamSupported(int32_t streamFlags, const AudioStreamParams &params);
111     static std::shared_ptr<IAudioStream> GetPlaybackStream(StreamClass streamClass, AudioStreamParams params,
112         AudioStreamType eStreamType, int32_t appUid);
113     static std::shared_ptr<IAudioStream> GetRecordStream(StreamClass streamClass, AudioStreamParams params,
114         AudioStreamType eStreamType, int32_t appUid);
115 
116     static AudioStreamType GetStreamType(ContentType contentType, StreamUsage streamUsage);
117     static std::map<std::pair<ContentType, StreamUsage>, AudioStreamType> CreateStreamMap();
118     static void CreateStreamMap(std::map<std::pair<ContentType, StreamUsage>, AudioStreamType> &streamMap);
IsFastStreamClass(StreamClass streamClass)119     static inline bool IsFastStreamClass(StreamClass streamClass)
120     {
121         if (streamClass == FAST_STREAM || streamClass == VOIP_STREAM) {
122             return true;
123         }
124         return false;
125     }
126 
127     virtual int32_t UpdatePlaybackCaptureConfig(const AudioPlaybackCaptureConfig &config) = 0;
128     virtual void SetClientID(int32_t clientPid, int32_t clientUid, uint32_t appTokenId, uint64_t fullTokenId) = 0;
129     virtual void SetRendererInfo(const AudioRendererInfo &rendererInfo) = 0;
130     virtual void SetCapturerInfo(const AudioCapturerInfo &capturerInfo) = 0;
131     virtual int32_t SetAudioStreamInfo(const AudioStreamParams info,
132         const std::shared_ptr<AudioClientTracker> &proxyObj,
133         const AudioPlaybackCaptureConfig &config = AudioPlaybackCaptureConfig()) = 0;
134     virtual int32_t GetAudioStreamInfo(AudioStreamParams &info) = 0;
135     virtual int32_t GetAudioSessionID(uint32_t &sessionID) = 0;
136     virtual void GetAudioPipeType(AudioPipeType &pipeType) = 0;
137     virtual State GetState() = 0;
138     virtual bool GetAudioTime(Timestamp &timestamp, Timestamp::Timestampbase base) = 0;
139     virtual bool GetAudioPosition(Timestamp &timestamp, Timestamp::Timestampbase base) = 0;
140     virtual int32_t GetBufferSize(size_t &bufferSize) = 0;
141     virtual int32_t GetFrameCount(uint32_t &frameCount) = 0;
142     virtual int32_t GetLatency(uint64_t &latency) = 0;
143     virtual int32_t SetAudioStreamType(AudioStreamType audioStreamType) = 0;
144     virtual int32_t SetVolume(float volume) = 0;
145     virtual float GetVolume() = 0;
146     virtual int32_t SetDuckVolume(float volume) = 0;
147     virtual int32_t SetMute(bool mute) = 0;
148     virtual int32_t SetRenderRate(AudioRendererRate renderRate) = 0;
149     virtual AudioRendererRate GetRenderRate() = 0;
150     virtual int32_t SetStreamCallback(const std::shared_ptr<AudioStreamCallback> &callback) = 0;
151     virtual int32_t SetSpeed(float speed) = 0;
152     virtual float GetSpeed() = 0;
153     virtual int32_t ChangeSpeed(uint8_t *buffer, int32_t bufferSize,
154         std::unique_ptr<uint8_t []> &outBuffer, int32_t &outBufferSize) = 0;
155 
156     virtual void SetUnderflowCount(uint32_t underflowCount) = 0;
157     virtual void SetOverflowCount(uint32_t overflowCount) = 0;
158 
159     // callback mode api
160     virtual int32_t SetRenderMode(AudioRenderMode renderMode) = 0;
161     virtual AudioRenderMode GetRenderMode() = 0;
162     virtual int32_t SetRendererWriteCallback(const std::shared_ptr<AudioRendererWriteCallback> &callback) = 0;
163 
164     virtual int32_t SetRendererFirstFrameWritingCallback(
165         const std::shared_ptr<AudioRendererFirstFrameWritingCallback> &callback) = 0;
166     virtual void OnFirstFrameWriting() = 0;
167 
168     virtual int32_t SetCaptureMode(AudioCaptureMode captureMode) = 0;
169     virtual AudioCaptureMode GetCaptureMode() = 0;
170     virtual int32_t SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> &callback) = 0;
171 
172     virtual int32_t GetBufferDesc(BufferDesc &bufDesc) = 0;
173     virtual int32_t GetBufQueueState(BufferQueueState &bufState) = 0;
174     virtual int32_t Enqueue(const BufferDesc &bufDesc) = 0;
175     virtual int32_t Clear() = 0;
176 
177     virtual int32_t SetLowPowerVolume(float volume) = 0;
178     virtual float GetLowPowerVolume() = 0;
179     virtual float GetSingleStreamVolume() = 0;
180     virtual int32_t SetOffloadMode(int32_t state, bool isAppBack) = 0;
181     virtual int32_t UnsetOffloadMode() = 0;
182 
183     // for effect
184     virtual AudioEffectMode GetAudioEffectMode() = 0;
185     virtual int32_t SetAudioEffectMode(AudioEffectMode effectMode) = 0;
186 
187     virtual int64_t GetFramesWritten() = 0;
188     virtual int64_t GetFramesRead() = 0;
189 
190     // Common APIs
191     virtual bool StartAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT,
192         AudioStreamDeviceChangeReasonExt reason = AudioStreamDeviceChangeReasonExt::ExtEnum::UNKNOWN) = 0;
193     virtual bool PauseAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT) = 0;
194     virtual bool StopAudioStream() = 0;
195     virtual bool ReleaseAudioStream(bool releaseRunner = true, bool destroyAtOnce = false) = 0;
196     virtual bool FlushAudioStream() = 0;
197 
198     // Playback related APIs
199     virtual bool DrainAudioStream(bool stopFlag = false) = 0;
200     virtual int32_t Write(uint8_t *buffer, size_t buffer_size) = 0;
201     virtual int32_t Write(uint8_t *pcmBuffer, size_t pcmSize, uint8_t *metaBuffer, size_t metaSize) = 0;
202 
203     // Recording related APIs
204     virtual int32_t Read(uint8_t &buffer, size_t userSize, bool isBlockingRead) = 0;
205 
206     // for inner capturer
207     virtual void SetInnerCapturerState(bool isInnerCapturer) = 0;
208     virtual void SetPrivacyType(AudioPrivacyType privacyType) = 0;
209 
210     virtual uint32_t GetUnderflowCount() = 0;
211     virtual uint32_t GetOverflowCount() = 0;
212 
213     virtual void SetRendererPositionCallback(int64_t markPosition,
214         const std::shared_ptr<RendererPositionCallback> &callback) = 0;
215     virtual void UnsetRendererPositionCallback() = 0;
216 
217     virtual void SetRendererPeriodPositionCallback(int64_t markPosition,
218         const std::shared_ptr<RendererPeriodPositionCallback> &callback) = 0;
219     virtual void UnsetRendererPeriodPositionCallback() = 0;
220 
221     virtual void SetCapturerPositionCallback(int64_t markPosition,
222         const std::shared_ptr<CapturerPositionCallback> &callback) = 0;
223     virtual void UnsetCapturerPositionCallback() = 0;
224 
225     virtual void SetCapturerPeriodPositionCallback(int64_t markPosition,
226         const std::shared_ptr<CapturerPeriodPositionCallback> &callback) = 0;
227 
228     virtual void UnsetCapturerPeriodPositionCallback() = 0;
229     virtual int32_t SetRendererSamplingRate(uint32_t sampleRate) = 0;
230     virtual uint32_t GetRendererSamplingRate() = 0;
231     virtual int32_t SetBufferSizeInMsec(int32_t bufferSizeInMsec) = 0;
232     virtual int32_t SetChannelBlendMode(ChannelBlendMode blendMode) = 0;
233     virtual int32_t SetVolumeWithRamp(float volume, int32_t duration) = 0;
234     virtual void SetPreferredFrameSize(int32_t frameSize) = 0;
235     virtual IAudioStream::StreamClass GetStreamClass() = 0;
236     virtual void SetStreamTrackerState(bool trackerRegisteredState) = 0;
237     virtual void GetSwitchInfo(SwitchInfo& info) = 0;
238 
239     // for get pipetype
240     virtual bool GetOffloadEnable() = 0;
241 
242     virtual bool GetSpatializationEnabled() = 0;
243 
244     virtual bool GetHighResolutionEnabled() = 0;
245 
246     //for wakeup capturer
247     virtual void SetWakeupCapturerState(bool isWakeupCapturer) = 0;
248 
249     virtual void SetCapturerSource(int capturerSource) = 0;
250 
251     virtual void UpdateLatencyTimestamp(std::string &timestamp, bool isRenderer) = 0;
252 
253     virtual bool RestoreAudioStream(bool needStoreState = true)
254     {
255         return 0;
256     }
257 
SetState()258     virtual void SetState() {}
259 
260     bool IsFormatValid(uint8_t format);
261 
262     bool IsRendererChannelValid(uint8_t channel);
263 
264     bool IsCapturerChannelValid(uint8_t channel);
265 
266     bool IsEncodingTypeValid(uint8_t encodingType);
267 
268     bool IsSamplingRateValid(uint32_t samplingRate);
269 
270     bool IsRendererChannelLayoutValid(uint64_t channelLayout);
271 
272     bool IsCapturerChannelLayoutValid(uint64_t channelLayout);
273 
274     bool IsPlaybackChannelRelatedInfoValid(uint8_t channels, uint64_t channelLayout);
275 
276     bool IsRecordChannelRelatedInfoValid(uint8_t channels, uint64_t channelLayout);
277 
278     virtual void SetSilentModeAndMixWithOthers(bool on) = 0;
279 
280     virtual bool GetSilentModeAndMixWithOthers() = 0;
281 
282     virtual int32_t SetDefaultOutputDevice(const DeviceType defaultOutputDevice) = 0;
283 
284     virtual DeviceType GetDefaultOutputDevice() = 0;
285 
286     virtual int32_t GetAudioTimestampInfo(Timestamp &timestamp, Timestamp::Timestampbase base) = 0;
287 
288     virtual void SetSwitchingStatus(bool isSwitching) = 0;
SetSourceDuration(int64_t duration)289     virtual int32_t SetSourceDuration(int64_t duration) { return 0; }
290 
291     virtual void GetRestoreInfo(RestoreInfo &restoreInfo) = 0;
292 
293     virtual void SetRestoreInfo(RestoreInfo &restoreInfo) = 0;
294 
295     virtual RestoreStatus CheckRestoreStatus() = 0;
296 
297     virtual RestoreStatus SetRestoreStatus(RestoreStatus restoreStatus) = 0;
298 
299     virtual void FetchDeviceForSplitStream() = 0;
300 };
301 } // namespace AudioStandard
302 } // namespace OHOS
303 #endif // I_AUDIO_STREAM_H
304