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