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