1 /* 2 * Copyright (c) 2023 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 #include "audio_info.h" 24 25 #include "audio_process_in_client.h" 26 #include "audio_stream_tracker.h" 27 #include "i_audio_stream.h" 28 #include "audio_policy_manager.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 { 63 public: 64 FastAudioStream(AudioStreamType eStreamType, AudioMode eMode, int32_t appUid); 65 virtual ~FastAudioStream(); 66 67 void SetClientID(int32_t clientPid, int32_t clientUid, uint32_t appTokenId, uint64_t fullTokenId) override; 68 69 int32_t UpdatePlaybackCaptureConfig(const AudioPlaybackCaptureConfig &config) override; 70 void SetRendererInfo(const AudioRendererInfo &rendererInfo) override; 71 void SetCapturerInfo(const AudioCapturerInfo &capturerInfo) override; 72 int32_t SetAudioStreamInfo(const AudioStreamParams info, 73 const std::shared_ptr<AudioClientTracker> &proxyObj) override; 74 int32_t GetAudioStreamInfo(AudioStreamParams &info) override; 75 bool CheckRecordingCreate(uint32_t appTokenId, uint64_t appFullTokenId, int32_t appUid, 76 SourceType sourceType = SOURCE_TYPE_MIC) override; 77 bool CheckRecordingStateChange(uint32_t appTokenId, uint64_t appFullTokenId, int32_t appUid, 78 AudioPermissionState state) override; 79 int32_t GetAudioSessionID(uint32_t &sessionID) override; 80 void GetAudioPipeType(AudioPipeType &pipeType) override; 81 State GetState() override; 82 bool GetAudioTime(Timestamp ×tamp, Timestamp::Timestampbase base) override; 83 bool GetAudioPosition(Timestamp ×tamp, Timestamp::Timestampbase base) override; 84 int32_t GetBufferSize(size_t &bufferSize) override; 85 int32_t GetFrameCount(uint32_t &frameCount) override; 86 int32_t GetLatency(uint64_t &latency) override; 87 int32_t SetAudioStreamType(AudioStreamType audioStreamType) override; 88 int32_t SetVolume(float volume) 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 // callback mode api 96 int32_t SetRendererFirstFrameWritingCallback( 97 const std::shared_ptr<AudioRendererFirstFrameWritingCallback> &callback) override; 98 void OnFirstFrameWriting() override; 99 int32_t SetRenderMode(AudioRenderMode renderMode) override; 100 AudioRenderMode GetRenderMode() override; 101 int32_t SetRendererWriteCallback(const std::shared_ptr<AudioRendererWriteCallback> &callback) override; 102 int32_t SetCaptureMode(AudioCaptureMode captureMode) override; 103 AudioCaptureMode GetCaptureMode() override; 104 int32_t SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> &callback) override; 105 int32_t GetBufferDesc(BufferDesc &bufDesc) override; 106 int32_t GetBufQueueState(BufferQueueState &bufState) override; 107 int32_t Enqueue(const BufferDesc &bufDesc) override; 108 int32_t Clear() override; 109 void SetPreferredFrameSize(int32_t frameSize) override; 110 void UpdateLatencyTimestamp(std::string ×tamp, bool isRenderer) override; 111 int32_t SetLowPowerVolume(float volume) override; 112 float GetLowPowerVolume() override; 113 int32_t SetOffloadMode(int32_t state, bool isAppBack) override; 114 int32_t UnsetOffloadMode() override; 115 float GetSingleStreamVolume() override; 116 AudioEffectMode GetAudioEffectMode() override; 117 int32_t SetAudioEffectMode(AudioEffectMode effectMode) override; 118 int64_t GetFramesWritten() override; 119 int64_t GetFramesRead() override; 120 121 void SetInnerCapturerState(bool isInnerCapturer) override; 122 void SetWakeupCapturerState(bool isWakeupCapturer) override; 123 void SetCapturerSource(int capturerSource) override; 124 void SetPrivacyType(AudioPrivacyType privacyType) override; 125 126 // Common APIs 127 bool StartAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT, 128 AudioStreamDeviceChangeReasonExt reason = AudioStreamDeviceChangeReasonExt::ExtEnum::UNKNOWN) override; 129 bool PauseAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT) override; 130 bool StopAudioStream() override; 131 bool ReleaseAudioStream(bool releaseRunner = true, bool isSwitchStream = false) override; 132 bool FlushAudioStream() override; 133 134 // Playback related APIs 135 bool DrainAudioStream(bool stopFlag = false) override; 136 int32_t Write(uint8_t *buffer, size_t buffer_size) override; 137 int32_t Write(uint8_t *pcmBuffer, size_t pcmSize, uint8_t *metaBuffer, size_t metaSize) override; 138 int32_t SetSpeed(float speed) override; 139 float GetSpeed() override; 140 int32_t ChangeSpeed(uint8_t *buffer, int32_t bufferSize, std::unique_ptr<uint8_t[]> &outBuffer, 141 int32_t &outBufferSize) override; 142 143 // Recording related APIs 144 int32_t Read(uint8_t &buffer, size_t userSize, bool isBlockingRead) override; 145 146 uint32_t GetUnderflowCount() override; 147 uint32_t GetOverflowCount() override; 148 void SetUnderflowCount(uint32_t underflowCount) override; 149 void SetOverflowCount(uint32_t overflowCount) override; 150 151 void SetRendererPositionCallback(int64_t markPosition, const std::shared_ptr<RendererPositionCallback> &callback) 152 override; 153 void UnsetRendererPositionCallback() override; 154 void SetRendererPeriodPositionCallback(int64_t markPosition, 155 const std::shared_ptr<RendererPeriodPositionCallback> &callback) override; 156 void UnsetRendererPeriodPositionCallback() override; 157 void SetCapturerPositionCallback(int64_t markPosition, const std::shared_ptr<CapturerPositionCallback> &callback) 158 override; 159 void UnsetCapturerPositionCallback() override; 160 void SetCapturerPeriodPositionCallback(int64_t markPosition, 161 const std::shared_ptr<CapturerPeriodPositionCallback> &callback) override; 162 void UnsetCapturerPeriodPositionCallback() override; 163 int32_t SetRendererSamplingRate(uint32_t sampleRate) override; 164 uint32_t GetRendererSamplingRate() override; 165 int32_t SetBufferSizeInMsec(int32_t bufferSizeInMsec) override; 166 void SetApplicationCachePath(const std::string cachePath) override; 167 int32_t SetChannelBlendMode(ChannelBlendMode blendMode) override; 168 int32_t SetVolumeWithRamp(float volume, int32_t duration) override; 169 170 void SetStreamTrackerState(bool trackerRegisteredState) override; 171 void GetSwitchInfo(IAudioStream::SwitchInfo& info) override; 172 173 IAudioStream::StreamClass GetStreamClass() override; 174 175 bool RestoreAudioStream(bool needStoreState = true) override; 176 177 bool GetOffloadEnable() override; 178 bool GetSpatializationEnabled() override; 179 bool GetHighResolutionEnabled() override; 180 181 void SetSilentModeAndMixWithOthers(bool on) override; 182 183 bool GetSilentModeAndMixWithOthers() override; 184 185 private: 186 void UpdateRegisterTrackerInfo(AudioRegisterTrackerInfo ®isterTrackerInfo); 187 int32_t InitializeAudioProcessConfig(AudioProcessConfig &config, const AudioStreamParams &info); 188 189 AudioStreamType eStreamType_; 190 AudioMode eMode_; 191 std::shared_ptr<AudioProcessInClient> processClient_ = nullptr; 192 std::shared_ptr<FastAudioStreamRenderCallback> spkProcClientCb_ = nullptr; 193 std::shared_ptr<FastAudioStreamCaptureCallback> micProcClientCb_ = nullptr; 194 std::shared_ptr<AudioRendererFirstFrameWritingCallback> firstFrameWritingCb_ = nullptr; 195 std::unique_ptr<AudioStreamTracker> audioStreamTracker_; 196 AudioRendererInfo rendererInfo_; 197 AudioCapturerInfo capturerInfo_; 198 AudioStreamParams streamInfo_; 199 AudioProcessConfig processconfig_; 200 State state_; 201 uint32_t sessionId_ = 0; 202 std::string cachePath_ = ""; 203 uint32_t underflowCount_ = 0; 204 uint32_t overflowCount_ = 0; 205 AudioRenderMode renderMode_; 206 AudioCaptureMode captureMode_; 207 AudioRendererRate renderRate_ = RENDER_RATE_NORMAL; 208 int32_t clientPid_ = 0; 209 int32_t clientUid_ = 0; 210 uint32_t appTokenId_ = 0; 211 uint64_t fullTokenId_ = 0; 212 bool streamTrackerRegistered_ = false; 213 std::shared_ptr<AudioClientTracker> proxyObj_ = nullptr; 214 bool silentModeAndMixWithOthers_ = false; 215 216 std::mutex setPreferredFrameSizeMutex_; 217 std::optional<int32_t> userSettedPreferredFrameSize_ = std::nullopt; 218 }; 219 } // namespace AudioStandard 220 } // namespace OHOS 221 #endif // FAST_AUDIO_STREAM_H 222