1 /* 2 * Copyright (c) 2023-2025 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 24 #include "audio_process_in_client.h" 25 #include "audio_stream_tracker.h" 26 #include "i_audio_stream.h" 27 #include "audio_policy_manager.h" 28 #include "callback_handler.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, public IHandler, 63 public std::enable_shared_from_this<FastAudioStream>{ 64 public: 65 FastAudioStream(AudioStreamType eStreamType, AudioMode eMode, int32_t appUid); 66 virtual ~FastAudioStream(); 67 68 void SetClientID(int32_t clientPid, int32_t clientUid, uint32_t appTokenId, uint64_t fullTokenId) override; 69 70 int32_t UpdatePlaybackCaptureConfig(const AudioPlaybackCaptureConfig &config) override; 71 void SetRendererInfo(const AudioRendererInfo &rendererInfo) override; 72 void SetCapturerInfo(const AudioCapturerInfo &capturerInfo) override; 73 int32_t SetAudioStreamInfo(const AudioStreamParams info, 74 const std::shared_ptr<AudioClientTracker> &proxyObj, 75 const AudioPlaybackCaptureConfig &config = AudioPlaybackCaptureConfig()) override; 76 int32_t GetAudioStreamInfo(AudioStreamParams &info) override; 77 int32_t GetAudioSessionID(uint32_t &sessionID) override; 78 void GetAudioPipeType(AudioPipeType &pipeType) override; 79 State GetState() override; 80 bool GetAudioTime(Timestamp ×tamp, Timestamp::Timestampbase base) override; 81 bool GetAudioPosition(Timestamp ×tamp, Timestamp::Timestampbase base) override; 82 int32_t GetBufferSize(size_t &bufferSize) override; 83 int32_t GetFrameCount(uint32_t &frameCount) override; 84 int32_t GetLatency(uint64_t &latency) override; 85 int32_t SetAudioStreamType(AudioStreamType audioStreamType) override; 86 int32_t SetVolume(float volume) override; 87 int32_t SetMute(bool mute) override; 88 int32_t SetSourceDuration(int64_t duration) 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 void InitCallbackHandler(); 96 void SafeSendCallbackEvent(uint32_t eventCode, int64_t data); 97 void OnHandle(uint32_t code, int64_t data) override; 98 void HandleStateChangeEvent(int64_t data); 99 int32_t ParamsToStateCmdType(int64_t params, State &state, StateChangeCmdType &cmdType); 100 101 // callback mode api 102 int32_t SetRendererFirstFrameWritingCallback( 103 const std::shared_ptr<AudioRendererFirstFrameWritingCallback> &callback) override; 104 void OnFirstFrameWriting() override; 105 int32_t SetRenderMode(AudioRenderMode renderMode) override; 106 AudioRenderMode GetRenderMode() override; 107 int32_t SetRendererWriteCallback(const std::shared_ptr<AudioRendererWriteCallback> &callback) override; 108 int32_t SetCaptureMode(AudioCaptureMode captureMode) override; 109 AudioCaptureMode GetCaptureMode() override; 110 int32_t SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> &callback) override; 111 int32_t GetBufferDesc(BufferDesc &bufDesc) override; 112 int32_t GetBufQueueState(BufferQueueState &bufState) override; 113 int32_t Enqueue(const BufferDesc &bufDesc) override; 114 int32_t Clear() override; 115 void SetPreferredFrameSize(int32_t frameSize) override; 116 void UpdateLatencyTimestamp(std::string ×tamp, bool isRenderer) override; 117 int32_t SetLowPowerVolume(float volume) override; 118 float GetLowPowerVolume() override; 119 int32_t SetOffloadMode(int32_t state, bool isAppBack) override; 120 int32_t UnsetOffloadMode() override; 121 float GetSingleStreamVolume() override; 122 AudioEffectMode GetAudioEffectMode() override; 123 int32_t SetAudioEffectMode(AudioEffectMode effectMode) override; 124 int64_t GetFramesWritten() override; 125 int64_t GetFramesRead() override; 126 127 void SetInnerCapturerState(bool isInnerCapturer) override; 128 void SetWakeupCapturerState(bool isWakeupCapturer) override; 129 void SetCapturerSource(int capturerSource) override; 130 void SetPrivacyType(AudioPrivacyType privacyType) override; 131 132 // Common APIs 133 bool StartAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT, 134 AudioStreamDeviceChangeReasonExt reason = AudioStreamDeviceChangeReasonExt::ExtEnum::UNKNOWN) override; 135 bool PauseAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT) override; 136 bool StopAudioStream() override; 137 bool ReleaseAudioStream(bool releaseRunner = true, bool isSwitchStream = false) override; 138 bool FlushAudioStream() override; 139 140 // Playback related APIs 141 bool DrainAudioStream(bool stopFlag = false) override; 142 int32_t Write(uint8_t *buffer, size_t buffer_size) override; 143 int32_t Write(uint8_t *pcmBuffer, size_t pcmSize, uint8_t *metaBuffer, size_t metaSize) override; 144 int32_t SetSpeed(float speed) override; 145 float GetSpeed() override; 146 int32_t ChangeSpeed(uint8_t *buffer, int32_t bufferSize, std::unique_ptr<uint8_t[]> &outBuffer, 147 int32_t &outBufferSize) override; 148 149 // Recording related APIs 150 int32_t Read(uint8_t &buffer, size_t userSize, bool isBlockingRead) override; 151 152 uint32_t GetUnderflowCount() override; 153 uint32_t GetOverflowCount() override; 154 void SetUnderflowCount(uint32_t underflowCount) override; 155 void SetOverflowCount(uint32_t overflowCount) override; 156 157 void SetRendererPositionCallback(int64_t markPosition, const std::shared_ptr<RendererPositionCallback> &callback) 158 override; 159 void UnsetRendererPositionCallback() override; 160 void SetRendererPeriodPositionCallback(int64_t markPosition, 161 const std::shared_ptr<RendererPeriodPositionCallback> &callback) override; 162 void UnsetRendererPeriodPositionCallback() override; 163 void SetCapturerPositionCallback(int64_t markPosition, const std::shared_ptr<CapturerPositionCallback> &callback) 164 override; 165 void UnsetCapturerPositionCallback() override; 166 void SetCapturerPeriodPositionCallback(int64_t markPosition, 167 const std::shared_ptr<CapturerPeriodPositionCallback> &callback) override; 168 void UnsetCapturerPeriodPositionCallback() override; 169 int32_t SetRendererSamplingRate(uint32_t sampleRate) override; 170 uint32_t GetRendererSamplingRate() override; 171 int32_t SetBufferSizeInMsec(int32_t bufferSizeInMsec) override; 172 int32_t SetChannelBlendMode(ChannelBlendMode blendMode) override; 173 int32_t SetVolumeWithRamp(float volume, int32_t duration) override; 174 175 void SetStreamTrackerState(bool trackerRegisteredState) override; 176 void GetSwitchInfo(IAudioStream::SwitchInfo& info) override; 177 178 IAudioStream::StreamClass GetStreamClass() override; 179 180 bool RestoreAudioStream(bool needStoreState = true) override; 181 182 bool GetOffloadEnable() override; 183 bool GetSpatializationEnabled() override; 184 bool GetHighResolutionEnabled() override; 185 186 void SetSilentModeAndMixWithOthers(bool on) override; 187 188 bool GetSilentModeAndMixWithOthers() override; 189 190 int32_t SetDefaultOutputDevice(const DeviceType defaultOutputDevice) override; 191 192 DeviceType GetDefaultOutputDevice() override; 193 194 int32_t GetAudioTimestampInfo(Timestamp ×tamp, Timestamp::Timestampbase base) override; 195 196 void SetSwitchingStatus(bool isSwitching) override; 197 198 void GetRestoreInfo(RestoreInfo &restoreInfo) override; 199 void SetRestoreInfo(RestoreInfo &restoreInfo) override; 200 RestoreStatus CheckRestoreStatus() override; 201 RestoreStatus SetRestoreStatus(RestoreStatus restoreStatus) override; 202 void FetchDeviceForSplitStream() override; 203 private: 204 void UpdateRegisterTrackerInfo(AudioRegisterTrackerInfo ®isterTrackerInfo); 205 int32_t InitializeAudioProcessConfig(AudioProcessConfig &config, const AudioStreamParams &info); 206 int32_t SetCallbacksWhenRestore(); 207 208 AudioStreamType eStreamType_; 209 AudioMode eMode_; 210 std::shared_ptr<AudioProcessInClient> processClient_ = nullptr; 211 std::shared_ptr<FastAudioStreamRenderCallback> spkProcClientCb_ = nullptr; 212 std::shared_ptr<FastAudioStreamCaptureCallback> micProcClientCb_ = nullptr; 213 std::shared_ptr<AudioRendererFirstFrameWritingCallback> firstFrameWritingCb_ = nullptr; 214 std::unique_ptr<AudioStreamTracker> audioStreamTracker_; 215 AudioRendererInfo rendererInfo_; 216 AudioCapturerInfo capturerInfo_; 217 AudioStreamParams streamInfo_; 218 AudioProcessConfig processconfig_; 219 State state_; 220 uint32_t sessionId_ = 0; 221 uint32_t underflowCount_ = 0; 222 uint32_t overflowCount_ = 0; 223 AudioRenderMode renderMode_; 224 AudioCaptureMode captureMode_; 225 AudioRendererRate renderRate_ = RENDER_RATE_NORMAL; 226 int32_t clientPid_ = 0; 227 int32_t clientUid_ = 0; 228 uint32_t appTokenId_ = 0; 229 uint64_t fullTokenId_ = 0; 230 bool streamTrackerRegistered_ = false; 231 std::shared_ptr<AudioClientTracker> proxyObj_ = nullptr; 232 bool silentModeAndMixWithOthers_ = false; 233 DeviceType defaultOutputDevice_ = DEVICE_TYPE_NONE; 234 235 std::mutex streamCbMutex_; 236 std::weak_ptr<AudioStreamCallback> streamCallback_; 237 238 bool runnerReleased_ = false; 239 std::mutex runnerMutex_; 240 std::shared_ptr<CallbackHandler> callbackHandler_ = nullptr; 241 242 std::mutex setPreferredFrameSizeMutex_; 243 std::optional<int32_t> userSettedPreferredFrameSize_ = std::nullopt; 244 245 std::mutex switchingMutex_; 246 StreamSwitchingInfo switchingInfo_ {false, INVALID}; 247 enum { 248 STATE_CHANGE_EVENT = 0 249 }; 250 251 enum : int64_t { 252 HANDLER_PARAM_INVALID = -1, 253 HANDLER_PARAM_NEW = 0, 254 HANDLER_PARAM_PREPARED, 255 HANDLER_PARAM_RUNNING, 256 HANDLER_PARAM_STOPPED, 257 HANDLER_PARAM_RELEASED, 258 HANDLER_PARAM_PAUSED, 259 HANDLER_PARAM_STOPPING, 260 HANDLER_PARAM_RUNNING_FROM_SYSTEM, 261 HANDLER_PARAM_PAUSED_FROM_SYSTEM, 262 }; 263 }; 264 } // namespace AudioStandard 265 } // namespace OHOS 266 #endif // FAST_AUDIO_STREAM_H 267