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_service_client.h" 25 #include "audio_stream_tracker.h" 26 27 namespace OHOS { 28 namespace AudioStandard { 29 static constexpr int32_t MAX_WRITECB_NUM_BUFFERS = 1; 30 static constexpr int32_t MAX_READCB_NUM_BUFFERS = 3; 31 32 class AudioStream : public AudioServiceClient { 33 public: 34 AudioStream(AudioStreamType eStreamType, AudioMode eMode, int32_t appUid); 35 virtual ~AudioStream(); 36 37 void SetRendererInfo(const AudioRendererInfo &rendererInfo) override; 38 void SetCapturerInfo(const AudioCapturerInfo &capturerInfo) override; 39 int32_t SetAudioStreamInfo(const AudioStreamParams info, 40 const std::shared_ptr<AudioClientTracker> &proxyObj) override; 41 int32_t GetAudioStreamInfo(AudioStreamParams &info) override; 42 int32_t GetAudioSessionID(uint32_t &sessionID) override; 43 State GetState() override; 44 bool GetAudioTime(Timestamp ×tamp, Timestamp::Timestampbase base) override; 45 int32_t GetBufferSize(size_t &bufferSize) override; 46 int32_t GetFrameCount(uint32_t &frameCount) override; 47 int32_t GetLatency(uint64_t &latency) override; 48 int32_t SetAudioStreamType(AudioStreamType audioStreamType) override; 49 int32_t SetVolume(float volume) override; 50 float GetVolume() override; 51 int32_t SetRenderRate(AudioRendererRate renderRate) override; 52 AudioRendererRate GetRenderRate() override; 53 int32_t SetStreamCallback(const std::shared_ptr<AudioStreamCallback> &callback) override; 54 55 // callback mode api 56 int32_t SetRenderMode(AudioRenderMode renderMode) override; 57 AudioRenderMode GetRenderMode() override; 58 int32_t SetRendererWriteCallback(const std::shared_ptr<AudioRendererWriteCallback> &callback) override; 59 int32_t SetCaptureMode(AudioCaptureMode captureMode) override; 60 AudioCaptureMode GetCaptureMode() override; 61 int32_t SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> &callback) override; 62 int32_t GetBufferDesc(BufferDesc &bufDesc) override; 63 int32_t GetBufQueueState(BufferQueueState &bufState) override; 64 int32_t Enqueue(const BufferDesc &bufDesc) override; 65 int32_t Clear() override; 66 void SubmitAllFreeBuffers(); 67 68 void SetInnerCapturerState(bool isInnerCapturer) override; 69 void SetPrivacyType(AudioPrivacyType privacyType) override; 70 71 int32_t SetLowPowerVolume(float volume) override; 72 float GetLowPowerVolume() override; 73 float GetSingleStreamVolume() override; 74 AudioEffectMode GetAudioEffectMode() override; 75 int32_t SetAudioEffectMode(AudioEffectMode effectMode) override; 76 int64_t GetFramesWritten() override; 77 int64_t GetFramesRead() override; 78 79 std::vector<AudioSampleFormat> GetSupportedFormats() const; 80 std::vector<AudioEncodingType> GetSupportedEncodingTypes() const; 81 std::vector<AudioSamplingRate> GetSupportedSamplingRates() const; 82 83 // Common APIs 84 bool StartAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT) override; 85 bool PauseAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT) override; 86 bool StopAudioStream() override; 87 bool ReleaseAudioStream(bool releaseRunner = true) override; 88 bool FlushAudioStream() override; 89 90 // Playback related APIs 91 bool DrainAudioStream() override; 92 size_t Write(uint8_t *buffer, size_t buffer_size) override; 93 94 // Recording related APIs 95 int32_t Read(uint8_t &buffer, size_t userSize, bool isBlockingRead) override; 96 97 void SetStreamTrackerState(bool trackerRegisteredState) override; 98 void GetSwitchInfo(SwitchInfo& info) override; 99 100 private: 101 void RegisterTracker(const std::shared_ptr<AudioClientTracker> &proxyObj); 102 AudioStreamType eStreamType_; 103 AudioMode eMode_; 104 State state_; 105 bool resetTime_; 106 uint64_t resetTimestamp_; 107 struct timespec baseTimestamp_ = {0}; 108 AudioRenderMode renderMode_; 109 AudioCaptureMode captureMode_; 110 std::queue<BufferDesc> freeBufferQ_; 111 std::queue<BufferDesc> filledBufferQ_; 112 std::array<std::unique_ptr<uint8_t[]>, MAX_WRITECB_NUM_BUFFERS> writeBufferPool_ = {}; 113 std::array<std::unique_ptr<uint8_t[]>, MAX_READCB_NUM_BUFFERS> readBufferPool_ = {}; 114 std::unique_ptr<std::thread> writeThread_ = nullptr; 115 std::unique_ptr<std::thread> readThread_ = nullptr; 116 bool isReadyToWrite_; 117 bool isReadyToRead_; 118 void WriteCbTheadLoop(); 119 void ReadCbThreadLoop(); 120 std::unique_ptr<AudioStreamTracker> audioStreamTracker_; 121 AudioRendererInfo rendererInfo_; 122 AudioCapturerInfo capturerInfo_; 123 uint32_t sessionId_; 124 125 bool isFirstRead_; 126 bool isFirstWrite_; 127 128 std::mutex bufferQueueLock_; 129 std::condition_variable bufferQueueCV_; 130 131 bool streamTrackerRegistered_ = false; 132 }; 133 } // namespace AudioStandard 134 } // namespace OHOS 135 #endif // AUDIO_STREAM_H 136