• 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_channel_blend.h"
25 #include "audio_service_client.h"
26 #include "audio_stream_tracker.h"
27 #include "volume_ramp.h"
28 #include "audio_format_converter_3DA.h"
29 #ifdef SONIC_ENABLE
30 #include "sonic.h"
31 #include "audio_speed.h"
32 #endif
33 
34 namespace OHOS {
35 namespace AudioStandard {
36 static constexpr int32_t MAX_WRITECB_NUM_BUFFERS = 1;
37 static constexpr int32_t MAX_READCB_NUM_BUFFERS = 3;
38 static constexpr int32_t ONE_MINUTE = 60;
39 class AudioStreamPolicyServiceDiedCallbackImpl;
40 
41 class AudioStream : public AudioServiceClient {
42 public:
43     AudioStream(AudioStreamType eStreamType, AudioMode eMode, int32_t appUid);
44     virtual ~AudioStream();
45 
46     void SetRendererInfo(const AudioRendererInfo &rendererInfo) override;
47     void SetCapturerInfo(const AudioCapturerInfo &capturerInfo) override;
48     int32_t SetAudioStreamInfo(const AudioStreamParams info,
49         const std::shared_ptr<AudioClientTracker> &proxyObj) override;
50     int32_t GetAudioStreamInfo(AudioStreamParams &info) override;
51     int32_t GetAudioSessionID(uint32_t &sessionID) override;
52     State GetState() override;
53     bool GetAudioTime(Timestamp &timestamp, Timestamp::Timestampbase base) override;
54     bool GetAudioPosition(Timestamp &timestamp, Timestamp::Timestampbase base) override;
55     int32_t GetBufferSize(size_t &bufferSize) override;
56     int32_t GetFrameCount(uint32_t &frameCount) override;
57     int32_t GetLatency(uint64_t &latency) override;
58     int32_t SetAudioStreamType(AudioStreamType audioStreamType) override;
59     int32_t SetVolume(float volume) override;
60     float GetVolume() override;
61     int32_t SetRenderRate(AudioRendererRate renderRate) override;
62     AudioRendererRate GetRenderRate() override;
63     int32_t SetStreamCallback(const std::shared_ptr<AudioStreamCallback> &callback) override;
64     void SetPreferredFrameSize(int32_t frameSize) override;
65     // callback mode api
66     int32_t SetRenderMode(AudioRenderMode renderMode) override;
67     AudioRenderMode GetRenderMode() override;
68     int32_t SetRendererWriteCallback(const std::shared_ptr<AudioRendererWriteCallback> &callback) override;
69     int32_t SetCaptureMode(AudioCaptureMode captureMode) override;
70     AudioCaptureMode GetCaptureMode() override;
71     int32_t SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> &callback) override;
72     int32_t GetBufferDesc(BufferDesc &bufDesc) override;
73     int32_t GetBufQueueState(BufferQueueState &bufState) override;
74     int32_t Enqueue(const BufferDesc &bufDesc) override;
75     int32_t Clear() override;
76     void SubmitAllFreeBuffers();
77 
78     void SetInnerCapturerState(bool isInnerCapturer) override;
79     void SetPrivacyType(AudioPrivacyType privacyType) override;
80 
81     int32_t SetLowPowerVolume(float volume) override;
82     float GetLowPowerVolume() override;
83     int32_t SetOffloadMode(int32_t state, bool isAppBack) override;
84     int32_t UnsetOffloadMode() override;
85     float GetSingleStreamVolume() override;
86     AudioEffectMode GetAudioEffectMode() override;
87     int32_t SetAudioEffectMode(AudioEffectMode effectMode) override;
88     int64_t GetFramesWritten() override;
89     int64_t GetFramesRead() override;
90 
91     std::vector<AudioSampleFormat> GetSupportedFormats() const;
92     std::vector<AudioEncodingType> GetSupportedEncodingTypes() const;
93     std::vector<AudioSamplingRate> GetSupportedSamplingRates() const;
94 
95     // Common APIs
96     bool StartAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT) override;
97     bool PauseAudioStream(StateChangeCmdType cmdType = CMD_FROM_CLIENT) override;
98     bool StopAudioStream() override;
99     bool ReleaseAudioStream(bool releaseRunner = true) override;
100     bool FlushAudioStream() override;
101 
102     // Playback related APIs
103     bool DrainAudioStream() override;
104     int32_t Write(uint8_t *buffer, size_t buffer_size) override;
105     int32_t Write(uint8_t *pcmBuffer, size_t pcmSize, uint8_t *metaBuffer, size_t metaSize) override;
106     int32_t SetSpeed(float speed) override;
107     float GetSpeed() override;
108     int32_t ChangeSpeed(uint8_t *buffer, int32_t bufferSize,
109         std::unique_ptr<uint8_t []> &outBuffer, int32_t &outBufferSize) override;
110     int32_t WriteSpeedBuffer(int32_t bufferSize, uint8_t *speedBuffer, size_t speedBufferSize) override;
111     int32_t GetStreamBufferCB(StreamBuffer &stream, std::unique_ptr<uint8_t[]> &speedBuffer, int32_t &speedBufferSize);
112 
113     // Recording related APIs
114     int32_t Read(uint8_t &buffer, size_t userSize, bool isBlockingRead) override;
115     void SetStreamTrackerState(bool trackerRegisteredState) override;
116     void GetSwitchInfo(SwitchInfo& info) override;
117     int32_t SetChannelBlendMode(ChannelBlendMode blendMode) override;
118     int32_t SetVolumeWithRamp(float volume, int32_t duration) override;
119 
120     int32_t RegisterRendererOrCapturerPolicyServiceDiedCB(
121         const std::shared_ptr<RendererOrCapturerPolicyServiceDiedCallback> &callback) override;
122     int32_t RemoveRendererOrCapturerPolicyServiceDiedCB() override;
123 
124     bool RestoreAudioStream() override;
125 
126 private:
127     enum {
128         BIN_TEST_MODE = 1,   //for bin file test
129         JS_TEST_MODE,        //for js app test
130     };
131 
132     void OpenDumpFile();
133     void ProcessDataByAudioBlend(uint8_t *buffer, size_t bufferSize);
134     void ProcessDataByVolumeRamp(uint8_t *buffer, size_t bufferSize);
135     void RegisterTracker(const std::shared_ptr<AudioClientTracker> &proxyObj);
136     void WriteMuteDataSysEvent(uint8_t *buffer, size_t bufferSize);
137     int32_t InitFromParams(AudioStreamParams &param);
138 
139     int32_t RegisterAudioStreamPolicyServerDiedCb();
140     int32_t UnregisterAudioStreamPolicyServerDiedCb();
141 
142     int32_t NotifyCapturerAdded(uint32_t sessionID) override;
143 
144     AudioStreamType eStreamType_;
145     AudioMode eMode_;
146     State state_;
147     bool resetTime_;
148     uint64_t resetTimestamp_;
149     struct timespec baseTimestamp_ = {0};
150     AudioRenderMode renderMode_;
151     AudioCaptureMode captureMode_;
152     std::queue<BufferDesc> freeBufferQ_;
153     std::queue<BufferDesc> filledBufferQ_;
154     std::array<std::unique_ptr<uint8_t[]>, MAX_WRITECB_NUM_BUFFERS> writeBufferPool_ = {};
155     std::array<std::unique_ptr<uint8_t[]>, MAX_READCB_NUM_BUFFERS> readBufferPool_ = {};
156     std::unique_ptr<std::thread> writeThread_ = nullptr;
157     std::unique_ptr<std::thread> readThread_ = nullptr;
158     bool isReadyToWrite_;
159     bool isReadyToRead_;
160     void WriteCbTheadLoop();
161     void ReadCbThreadLoop();
162     std::unique_ptr<AudioStreamTracker> audioStreamTracker_;
163     AudioRendererInfo rendererInfo_;
164     AudioCapturerInfo capturerInfo_;
165     uint32_t sessionId_;
166 
167     bool isFirstRead_;
168     bool isFirstWrite_;
169     bool isPausing_;
170 
171     std::mutex bufferQueueLock_;
172     std::condition_variable bufferQueueCV_;
173     AudioStreamParams streamParams_;
174     AudioStreamParams streamOriginParams_;
175     AudioBlend audioBlend_;
176     VolumeRamp volumeRamp_;
177     FILE *pfd_;
178     bool streamTrackerRegistered_ = false;
179     std::time_t startMuteTime_ = 0;
180     bool isUpEvent_ = false;
181 
182     float speed_ = 1.0;
183 #ifdef SONIC_ENABLE
184     size_t bufferSize_;
185     std::unique_ptr<AudioSpeed> audioSpeed_ = nullptr;
186 #endif
187     std::unique_ptr<AudioFormatConverter3DA> converter_;
188 
189     std::shared_ptr<AudioStreamPolicyServiceDiedCallbackImpl> audioStreamPolicyServiceDiedCB_ = nullptr;
190     std::shared_ptr<AudioClientTracker> proxyObj_ = nullptr;
191 };
192 
193 class AudioStreamPolicyServiceDiedCallbackImpl : public AudioStreamPolicyServiceDiedCallback {
194 public:
195     AudioStreamPolicyServiceDiedCallbackImpl();
196     virtual ~AudioStreamPolicyServiceDiedCallbackImpl();
197     void OnAudioPolicyServiceDied() override;
198     void SaveRendererOrCapturerPolicyServiceDiedCB(
199         const std::shared_ptr<RendererOrCapturerPolicyServiceDiedCallback> &callback);
200     void RemoveRendererOrCapturerPolicyServiceDiedCB();
201 
202 private:
203     std::mutex mutex_;
204     std::shared_ptr<RendererOrCapturerPolicyServiceDiedCallback> policyServiceDiedCallback_;
205 };
206 } // namespace AudioStandard
207 } // namespace OHOS
208 #endif // AUDIO_STREAM_H
209