1 /* 2 * Copyright (c) 2021-2022 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 AUDIO_STREAM_H 16 #define 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 #include "audio_channel_blend.h" 25 #include "audio_service_client.h" 26 #include "audio_stream_tracker.h" 27 #include "volume_ramp.h" 28 #include "audio_format_converter_3DA.h" 29 #ifdef SONIC_ENABLE 30 #include "sonic.h" 31 #include "audio_speed.h" 32 #endif 33 34 namespace OHOS { 35 namespace AudioStandard { 36 static constexpr int32_t MAX_WRITECB_NUM_BUFFERS = 1; 37 static constexpr int32_t MAX_READCB_NUM_BUFFERS = 3; 38 static constexpr int32_t ONE_MINUTE = 60; 39 class AudioStreamPolicyServiceDiedCallbackImpl; 40 41 class AudioStream : public AudioServiceClient { 42 public: 43 AudioStream(AudioStreamType eStreamType, AudioMode eMode, int32_t appUid); 44 virtual ~AudioStream(); 45 46 void SetRendererInfo(const AudioRendererInfo &rendererInfo) override; 47 void SetCapturerInfo(const AudioCapturerInfo &capturerInfo) override; 48 int32_t SetAudioStreamInfo(const AudioStreamParams info, 49 const std::shared_ptr<AudioClientTracker> &proxyObj) override; 50 int32_t GetAudioStreamInfo(AudioStreamParams &info) override; 51 int32_t GetAudioSessionID(uint32_t &sessionID) override; 52 State GetState() override; 53 bool GetAudioTime(Timestamp ×tamp, Timestamp::Timestampbase base) override; 54 bool GetAudioPosition(Timestamp ×tamp, Timestamp::Timestampbase base) override; 55 int32_t GetBufferSize(size_t &bufferSize) override; 56 int32_t GetFrameCount(uint32_t &frameCount) override; 57 int32_t GetLatency(uint64_t &latency) override; 58 int32_t SetAudioStreamType(AudioStreamType audioStreamType) override; 59 int32_t SetVolume(float volume) override; 60 float GetVolume() override; 61 int32_t SetRenderRate(AudioRendererRate renderRate) override; 62 AudioRendererRate GetRenderRate() override; 63 int32_t SetStreamCallback(const std::shared_ptr<AudioStreamCallback> &callback) override; 64 void SetPreferredFrameSize(int32_t frameSize) override; 65 // callback mode api 66 int32_t SetRenderMode(AudioRenderMode renderMode) override; 67 AudioRenderMode GetRenderMode() override; 68 int32_t SetRendererWriteCallback(const std::shared_ptr<AudioRendererWriteCallback> &callback) override; 69 int32_t SetCaptureMode(AudioCaptureMode captureMode) override; 70 AudioCaptureMode GetCaptureMode() override; 71 int32_t SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> &callback) override; 72 int32_t GetBufferDesc(BufferDesc &bufDesc) override; 73 int32_t GetBufQueueState(BufferQueueState &bufState) override; 74 int32_t Enqueue(const BufferDesc &bufDesc) override; 75 int32_t Clear() override; 76 void SubmitAllFreeBuffers(); 77 78 void SetInnerCapturerState(bool isInnerCapturer) override; 79 void SetPrivacyType(AudioPrivacyType privacyType) override; 80 81 int32_t SetLowPowerVolume(float volume) override; 82 float GetLowPowerVolume() override; 83 int32_t SetOffloadMode(int32_t state, bool isAppBack) override; 84 int32_t UnsetOffloadMode() override; 85 float GetSingleStreamVolume() override; 86 AudioEffectMode GetAudioEffectMode() override; 87 int32_t SetAudioEffectMode(AudioEffectMode effectMode) override; 88 int64_t GetFramesWritten() override; 89 int64_t GetFramesRead() override; 90 91 std::vector<AudioSampleFormat> GetSupportedFormats() const; 92 std::vector<AudioEncodingType> GetSupportedEncodingTypes() const; 93 std::vector<AudioSamplingRate> GetSupportedSamplingRates() const; 94 95 // Common APIs 96 bool StartAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT) override; 97 bool PauseAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT) override; 98 bool StopAudioStream() override; 99 bool ReleaseAudioStream(bool releaseRunner = true) override; 100 bool FlushAudioStream() override; 101 102 // Playback related APIs 103 bool DrainAudioStream() override; 104 int32_t Write(uint8_t *buffer, size_t buffer_size) override; 105 int32_t Write(uint8_t *pcmBuffer, size_t pcmSize, uint8_t *metaBuffer, size_t metaSize) override; 106 int32_t SetSpeed(float speed) override; 107 float GetSpeed() override; 108 int32_t ChangeSpeed(uint8_t *buffer, int32_t bufferSize, 109 std::unique_ptr<uint8_t []> &outBuffer, int32_t &outBufferSize) override; 110 int32_t WriteSpeedBuffer(int32_t bufferSize, uint8_t *speedBuffer, size_t speedBufferSize) override; 111 int32_t GetStreamBufferCB(StreamBuffer &stream, std::unique_ptr<uint8_t[]> &speedBuffer, int32_t &speedBufferSize); 112 113 // Recording related APIs 114 int32_t Read(uint8_t &buffer, size_t userSize, bool isBlockingRead) override; 115 void SetStreamTrackerState(bool trackerRegisteredState) override; 116 void GetSwitchInfo(SwitchInfo& info) override; 117 int32_t SetChannelBlendMode(ChannelBlendMode blendMode) override; 118 int32_t SetVolumeWithRamp(float volume, int32_t duration) override; 119 120 int32_t RegisterRendererOrCapturerPolicyServiceDiedCB( 121 const std::shared_ptr<RendererOrCapturerPolicyServiceDiedCallback> &callback) override; 122 int32_t RemoveRendererOrCapturerPolicyServiceDiedCB() override; 123 124 bool RestoreAudioStream() override; 125 126 private: 127 enum { 128 BIN_TEST_MODE = 1, //for bin file test 129 JS_TEST_MODE, //for js app test 130 }; 131 132 void OpenDumpFile(); 133 void ProcessDataByAudioBlend(uint8_t *buffer, size_t bufferSize); 134 void ProcessDataByVolumeRamp(uint8_t *buffer, size_t bufferSize); 135 void RegisterTracker(const std::shared_ptr<AudioClientTracker> &proxyObj); 136 void WriteMuteDataSysEvent(uint8_t *buffer, size_t bufferSize); 137 int32_t InitFromParams(AudioStreamParams ¶m); 138 139 int32_t RegisterAudioStreamPolicyServerDiedCb(); 140 int32_t UnregisterAudioStreamPolicyServerDiedCb(); 141 142 int32_t NotifyCapturerAdded(uint32_t sessionID) override; 143 144 AudioStreamType eStreamType_; 145 AudioMode eMode_; 146 State state_; 147 bool resetTime_; 148 uint64_t resetTimestamp_; 149 struct timespec baseTimestamp_ = {0}; 150 AudioRenderMode renderMode_; 151 AudioCaptureMode captureMode_; 152 std::queue<BufferDesc> freeBufferQ_; 153 std::queue<BufferDesc> filledBufferQ_; 154 std::array<std::unique_ptr<uint8_t[]>, MAX_WRITECB_NUM_BUFFERS> writeBufferPool_ = {}; 155 std::array<std::unique_ptr<uint8_t[]>, MAX_READCB_NUM_BUFFERS> readBufferPool_ = {}; 156 std::unique_ptr<std::thread> writeThread_ = nullptr; 157 std::unique_ptr<std::thread> readThread_ = nullptr; 158 bool isReadyToWrite_; 159 bool isReadyToRead_; 160 void WriteCbTheadLoop(); 161 void ReadCbThreadLoop(); 162 std::unique_ptr<AudioStreamTracker> audioStreamTracker_; 163 AudioRendererInfo rendererInfo_; 164 AudioCapturerInfo capturerInfo_; 165 uint32_t sessionId_; 166 167 bool isFirstRead_; 168 bool isFirstWrite_; 169 bool isPausing_; 170 171 std::mutex bufferQueueLock_; 172 std::condition_variable bufferQueueCV_; 173 AudioStreamParams streamParams_; 174 AudioStreamParams streamOriginParams_; 175 AudioBlend audioBlend_; 176 VolumeRamp volumeRamp_; 177 FILE *pfd_; 178 bool streamTrackerRegistered_ = false; 179 std::time_t startMuteTime_ = 0; 180 bool isUpEvent_ = false; 181 182 float speed_ = 1.0; 183 #ifdef SONIC_ENABLE 184 size_t bufferSize_; 185 std::unique_ptr<AudioSpeed> audioSpeed_ = nullptr; 186 #endif 187 std::unique_ptr<AudioFormatConverter3DA> converter_; 188 189 std::shared_ptr<AudioStreamPolicyServiceDiedCallbackImpl> audioStreamPolicyServiceDiedCB_ = nullptr; 190 std::shared_ptr<AudioClientTracker> proxyObj_ = nullptr; 191 }; 192 193 class AudioStreamPolicyServiceDiedCallbackImpl : public AudioStreamPolicyServiceDiedCallback { 194 public: 195 AudioStreamPolicyServiceDiedCallbackImpl(); 196 virtual ~AudioStreamPolicyServiceDiedCallbackImpl(); 197 void OnAudioPolicyServiceDied() override; 198 void SaveRendererOrCapturerPolicyServiceDiedCB( 199 const std::shared_ptr<RendererOrCapturerPolicyServiceDiedCallback> &callback); 200 void RemoveRendererOrCapturerPolicyServiceDiedCB(); 201 202 private: 203 std::mutex mutex_; 204 std::shared_ptr<RendererOrCapturerPolicyServiceDiedCallback> policyServiceDiedCallback_; 205 }; 206 } // namespace AudioStandard 207 } // namespace OHOS 208 #endif // AUDIO_STREAM_H 209