• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &timestamp, 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