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 ¶ms, size_t &result); 119 static bool IsStreamSupported(int32_t streamFlags, const AudioStreamParams ¶ms); 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 ×tamp, Timestamp::Timestampbase base) = 0; 149 virtual bool GetAudioPosition(Timestamp ×tamp, 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 ×tamp, 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 ×tamp, Timestamp::Timestampbase base) = 0; 304 GetTimeStampInfo(Timestamp & timestamp,Timestamp::Timestampbase base)305 virtual bool GetTimeStampInfo(Timestamp ×tamp, 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