1 /* 2 * Copyright (c) 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_CONTAINER_STREAM_BASE_H 16 #define AUDIO_CONTAINER_STREAM_BASE_H 17 18 #include "audio_container_base.h" 19 #include "audio_renderer.h" 20 #include "timestamp.h" 21 22 namespace OHOS { 23 namespace AudioStandard { 24 static constexpr int32_t MAX_LEN_BUFFERS = 3; 25 26 class AudioContainerStreamBase : public AudioContainerBase { 27 public: 28 AudioContainerStreamBase(AudioStreamType eStreamType, AudioMode eMode); 29 virtual ~AudioContainerStreamBase(); 30 31 int32_t SetAudioStreamInfo(const AudioStreamParams info); 32 int32_t GetAudioStreamInfo(AudioStreamParams &info); 33 bool VerifyClientPermission(const std::string &permissionName, uint32_t appTokenId, int32_t appUid, 34 AudioPermissionState state); 35 36 int32_t GetAudioSessionID(uint32_t &sessionID) const; 37 State GetState(); 38 bool GetAudioTime(Timestamp ×tamp, Timestamp::Timestampbase base); 39 int32_t GetBufferSize(size_t &bufferSize) const; 40 int32_t GetFrameCount(uint32_t &frameCount) const; 41 int32_t GetLatency(uint64_t &latency) const; 42 static AudioStreamType GetStreamType(ContentType contentType, StreamUsage streamUsage); 43 int32_t SetAudioStreamType(AudioStreamType audioStreamType); 44 int32_t SetVolume(float volume); 45 float GetVolume(); 46 int32_t SetRenderRate(AudioRendererRate renderRate); 47 AudioRendererRate GetRenderRate(); 48 int32_t SetStreamCallback(const std::shared_ptr<AudioStreamCallback> &callback); 49 int32_t SetRenderMode(AudioRenderMode renderMode); 50 AudioRenderMode GetRenderMode(); 51 int32_t SetRendererWriteCallback(const std::shared_ptr<AudioRendererWriteCallback> &callback); 52 int32_t SetCaptureMode(AudioCaptureMode captureMode); 53 AudioCaptureMode GetCaptureMode(); 54 int32_t SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> &callback); 55 virtual int32_t GetBufferDesc(BufferDesc &bufDesc); 56 virtual int32_t GetBufQueueState(BufferQueueState &bufState); 57 virtual int32_t Enqueue(const BufferDesc &bufDesc); 58 virtual int32_t Clear(); 59 60 std::vector<AudioSampleFormat> GetSupportedFormats() const; 61 std::vector<AudioEncodingType> GetSupportedEncodingTypes() const; 62 std::vector<AudioSamplingRate> GetSupportedSamplingRates() const; 63 64 // Common APIs 65 virtual bool StartAudioStream(); 66 bool PauseAudioStream(); 67 virtual bool StopAudioStream(); 68 bool ReleaseAudioStream(); 69 bool FlushAudioStream(); 70 71 // Playback related APIs 72 bool DrainAudioStream(); 73 size_t Write(uint8_t *buffer, size_t buffer_size); 74 75 // Recording related APIs 76 int32_t Read(uint8_t &buffer, size_t userSize, bool isBlockingRead); 77 78 void SetApplicationCachePath(const std::string cachePath); 79 80 int32_t trackId_ = 0; 81 AudioStreamType eStreamType_; 82 AudioMode eMode_; 83 State state_; 84 std::atomic<bool> isReadInProgress_; 85 std::atomic<bool> isWriteInProgress_; 86 bool resetTime_; 87 uint64_t resetTimestamp_; 88 struct timespec baseTimestamp_ = {0, 0}; 89 AudioRenderMode renderMode_; 90 AudioCaptureMode captureMode_; 91 std::queue<BufferDesc> freeBufferQ_; 92 std::queue<BufferDesc> filledBufferQ_; 93 std::array<std::unique_ptr<uint8_t[]>, MAX_LEN_BUFFERS> bufferPool_ = {}; 94 std::unique_ptr<std::thread> writeThread_ = nullptr; 95 std::unique_ptr<std::thread> readThread_ = nullptr; 96 bool isReadyToWrite_; 97 bool isReadyToRead_; 98 void WriteBuffers(); 99 void ReadBuffers(); 100 101 static const std::map<std::pair<ContentType, StreamUsage>, AudioStreamType> streamTypeMap_; 102 static std::map<std::pair<ContentType, StreamUsage>, AudioStreamType> CreateStreamMap(); 103 bool isFirstRead_; 104 int32_t sample_rate_ = 0; 105 int32_t format_ = 0; 106 int32_t channelCount_ = 0; 107 std::shared_ptr<AudioRendererWriteCallback> callback_; 108 pthread_cond_t writeCondition_ = PTHREAD_MUTEX_INITIALIZER; 109 pthread_mutex_t writeLock_ = PTHREAD_COND_INITIALIZER; 110 std::mutex mBufferQueueLock; 111 AudioRendererRate renderRate_ = RENDER_RATE_NORMAL; 112 }; 113 114 class AudioContainerCaptureStream : public AudioContainerStreamBase { 115 public: 116 AudioContainerCaptureStream(AudioStreamType eStreamType, AudioMode eMode); 117 virtual ~AudioContainerCaptureStream(); 118 bool StartAudioStream() override; 119 bool StopAudioStream() override; 120 int32_t GetBufferDesc(BufferDesc &bufDesc) override; 121 int32_t GetBufQueueState(BufferQueueState &bufState) override; 122 int32_t Enqueue(const BufferDesc &bufDesc) override; 123 int32_t Clear() override; 124 }; 125 126 class AudioContainerRenderStream : public AudioContainerStreamBase { 127 public: 128 AudioContainerRenderStream(AudioStreamType eStreamType, AudioMode eMode); 129 virtual ~AudioContainerRenderStream(); 130 bool StartAudioStream() override; 131 bool StopAudioStream() override; 132 int32_t GetBufferDesc(BufferDesc &bufDesc) override; 133 int32_t GetBufQueueState(BufferQueueState &bufState) override; 134 int32_t Enqueue(const BufferDesc &bufDesc) override; 135 int32_t Clear() override; 136 }; 137 138 } // namespace AudioStandard 139 } // namespace OHOS 140 #endif // AUDIO_CONTAINER_STREAM_BASE_H