• 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_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 &timestamp, 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