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