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
16 #include "audio_errors.h"
17 #include "audio_policy_manager.h"
18 #include "audio_capturer_gateway.h"
19 #include "audio_container_stream_base.h"
20 #include "audio_log.h"
21 #include "audio_capturer.h"
22
23 namespace OHOS {
24 namespace AudioStandard {
25 AudioCapturer::~AudioCapturer() = default;
26
~AudioCapturerGateway()27 AudioCapturerGateway::~AudioCapturerGateway()
28 {
29 CapturerState state = GetStatus();
30 if (state != CAPTURER_RELEASED && state != CAPTURER_NEW) {
31 Release();
32 }
33 }
34
AudioCapturerGateway(AudioStreamType audioStreamType,const AppInfo & appInfo)35 AudioCapturerGateway::AudioCapturerGateway(AudioStreamType audioStreamType, const AppInfo &appInfo)
36 {
37 appInfo_ = appInfo;
38 if (!(appInfo_.appPid)) {
39 appInfo_.appPid = getpid();
40 }
41
42 if (appInfo_.appUid < 0) {
43 appInfo_.appUid = static_cast<int32_t>(getuid());
44 }
45
46 audioStream_ = std::make_shared<AudioContainerCaptureStream>(audioStreamType, AUDIO_MODE_RECORD, appInfo.appUid);
47 if (audioStream_) {
48 AUDIO_DEBUG_LOG("AudioCapturerGateway::Audio stream created");
49 }
50 }
51
GetFrameCount(uint32_t & frameCount) const52 int32_t AudioCapturerGateway::GetFrameCount(uint32_t &frameCount) const
53 {
54 return audioStream_->GetFrameCount(frameCount);
55 }
56
SetParams(const AudioCapturerParams params)57 int32_t AudioCapturerGateway::SetParams(const AudioCapturerParams params)
58 {
59 audioStream_->SetCapturerInfo(capturerInfo_);
60
61 AudioStreamParams audioStreamParams;
62 audioStreamParams.format = params.audioSampleFormat;
63 audioStreamParams.samplingRate = params.samplingRate;
64 audioStreamParams.channels = params.audioChannel;
65 audioStreamParams.encoding = params.audioEncoding;
66
67 audioStream_->SetClientID(appInfo_.appPid, appInfo_.appUid);
68 AUDIO_INFO_LOG("AudioCapturerGateway::SetParams SetAudioStreamInfo");
69 return audioStream_->SetAudioStreamInfo(audioStreamParams);
70 }
71
SetCapturerCallback(const std::shared_ptr<AudioCapturerCallback> & callback)72 int32_t AudioCapturerGateway::SetCapturerCallback(const std::shared_ptr<AudioCapturerCallback> &callback)
73 {
74 // If the client is using the deprecated SetParams API. SetCapturerCallback must be invoked, after SetParams.
75 // In general, callbacks can only be set after the capturer state is PREPARED.
76 CapturerState state = GetStatus();
77 if (state == CAPTURER_NEW || state == CAPTURER_RELEASED) {
78 AUDIO_DEBUG_LOG("AudioCapturerGateway::SetCapturerCallback ncorrect state:%{public}d to register cb", state);
79 return ERR_ILLEGAL_STATE;
80 }
81 if (callback == nullptr) {
82 AUDIO_ERR_LOG("AudioCapturerGateway::SetCapturerCallback callback param is null");
83 return ERR_INVALID_PARAM;
84 }
85
86 // Save and Set reference for stream callback. Order is important here.
87 if (audioStreamCallback_ == nullptr) {
88 audioStreamCallback_ = std::make_shared<AudioStreamCapturerCallback>();
89 if (audioStreamCallback_ == nullptr) {
90 AUDIO_ERR_LOG("AudioCapturerGateway::Failed to allocate memory for audioStreamCallback_");
91 return ERROR;
92 }
93 }
94 AUDIO_ERR_LOG("AudioCapturerGateway::SetCapturerCallback");
95 std::shared_ptr<AudioStreamCapturerCallback> cbStream =
96 std::static_pointer_cast<AudioStreamCapturerCallback>(audioStreamCallback_);
97 cbStream->SaveCallback(callback);
98 (void)audioStream_->SetStreamCallback(audioStreamCallback_);
99
100 return SUCCESS;
101 }
102
GetParams(AudioCapturerParams & params) const103 int32_t AudioCapturerGateway::GetParams(AudioCapturerParams ¶ms) const
104 {
105 AudioStreamParams audioStreamParams;
106 int32_t result = audioStream_->GetAudioStreamInfo(audioStreamParams);
107 if (SUCCESS == result) {
108 params.audioSampleFormat = static_cast<AudioSampleFormat>(audioStreamParams.format);
109 params.samplingRate = static_cast<AudioSamplingRate>(audioStreamParams.samplingRate);
110 params.audioChannel = static_cast<AudioChannel>(audioStreamParams.channels);
111 params.audioEncoding = static_cast<AudioEncodingType>(audioStreamParams.encoding);
112 }
113
114 return result;
115 }
116
GetCapturerInfo(AudioCapturerInfo & capturerInfo) const117 int32_t AudioCapturerGateway::GetCapturerInfo(AudioCapturerInfo &capturerInfo) const
118 {
119 capturerInfo = capturerInfo_;
120
121 return SUCCESS;
122 }
123
GetStreamInfo(AudioStreamInfo & streamInfo) const124 int32_t AudioCapturerGateway::GetStreamInfo(AudioStreamInfo &streamInfo) const
125 {
126 AudioStreamParams audioStreamParams;
127 int32_t result = audioStream_->GetAudioStreamInfo(audioStreamParams);
128 if (SUCCESS == result) {
129 streamInfo.format = static_cast<AudioSampleFormat>(audioStreamParams.format);
130 streamInfo.samplingRate = static_cast<AudioSamplingRate>(audioStreamParams.samplingRate);
131 streamInfo.channels = static_cast<AudioChannel>(audioStreamParams.channels);
132 streamInfo.encoding = static_cast<AudioEncodingType>(audioStreamParams.encoding);
133 }
134
135 return result;
136 }
137
138
SetCapturerPositionCallback(int64_t markPosition,const std::shared_ptr<CapturerPositionCallback> & callback)139 int32_t AudioCapturerGateway::SetCapturerPositionCallback(int64_t markPosition,
140 const std::shared_ptr<CapturerPositionCallback> &callback)
141 {
142 if ((callback == nullptr) || (markPosition <= 0)) {
143 AUDIO_ERR_LOG("AudioCapturerGateway::SetCapturerPositionCallback input param is invalid");
144 return ERR_INVALID_PARAM;
145 }
146
147 audioStream_->SetCapturerPositionCallback(markPosition, callback);
148
149 return SUCCESS;
150 }
151
UnsetCapturerPositionCallback()152 void AudioCapturerGateway::UnsetCapturerPositionCallback()
153 {
154 audioStream_->UnsetCapturerPositionCallback();
155 }
156
SetCapturerPeriodPositionCallback(int64_t frameNumber,const std::shared_ptr<CapturerPeriodPositionCallback> & callback)157 int32_t AudioCapturerGateway::SetCapturerPeriodPositionCallback(int64_t frameNumber,
158 const std::shared_ptr<CapturerPeriodPositionCallback> &callback)
159 {
160 if ((callback == nullptr) || (frameNumber <= 0)) {
161 AUDIO_ERR_LOG("AudioCapturerGateway::SetCapturerPeriodPositionCallback input param is invalid");
162 return ERR_INVALID_PARAM;
163 }
164
165 audioStream_->SetCapturerPeriodPositionCallback(frameNumber, callback);
166
167 return SUCCESS;
168 }
169
UnsetCapturerPeriodPositionCallback()170 void AudioCapturerGateway::UnsetCapturerPeriodPositionCallback()
171 {
172 audioStream_->UnsetCapturerPeriodPositionCallback();
173 }
174
Start() const175 bool AudioCapturerGateway::Start() const
176 {
177 return audioStream_->StartAudioStream();
178 }
179
Read(uint8_t & buffer,size_t userSize,bool isBlockingRead) const180 int32_t AudioCapturerGateway::Read(uint8_t &buffer, size_t userSize, bool isBlockingRead) const
181 {
182 return audioStream_->Read(buffer, userSize, isBlockingRead);
183 }
184
GetStatus() const185 CapturerState AudioCapturerGateway::GetStatus() const
186 {
187 return (CapturerState)audioStream_->GetState();
188 }
189
GetAudioTime(Timestamp & timestamp,Timestamp::Timestampbase base) const190 bool AudioCapturerGateway::GetAudioTime(Timestamp ×tamp, Timestamp::Timestampbase base) const
191 {
192 return audioStream_->GetAudioTime(timestamp, base);
193 }
194
Pause() const195 bool AudioCapturerGateway::Pause() const
196 {
197 return audioStream_->PauseAudioStream();
198 }
199
Stop() const200 bool AudioCapturerGateway::Stop() const
201 {
202 return audioStream_->StopAudioStream();
203 }
204
Flush() const205 bool AudioCapturerGateway::Flush() const
206 {
207 return audioStream_->FlushAudioStream();
208 }
209
Release() const210 bool AudioCapturerGateway::Release() const
211 {
212 return audioStream_->ReleaseAudioStream();
213 }
214
GetBufferSize(size_t & bufferSize) const215 int32_t AudioCapturerGateway::GetBufferSize(size_t &bufferSize) const
216 {
217 return audioStream_->GetBufferSize(bufferSize);
218 }
219
GetAudioStreamId(uint32_t & sessionID) const220 int32_t AudioCapturerGateway::GetAudioStreamId(uint32_t &sessionID) const
221 {
222 return audioStream_->GetAudioSessionID(sessionID);
223 }
224
SetBufferDuration(uint64_t bufferDuration) const225 int32_t AudioCapturerGateway::SetBufferDuration(uint64_t bufferDuration) const
226 {
227 if (bufferDuration < MINIMUM_BUFFER_SIZE_MSEC || bufferDuration > MAXIMUM_BUFFER_SIZE_MSEC) {
228 AUDIO_ERR_LOG("Error: Please set the buffer duration between 5ms ~ 20ms");
229 return ERR_INVALID_PARAM;
230 }
231 return audioStream_->SetBufferSizeInMsec(bufferDuration);
232 }
233
SetApplicationCachePath(const std::string cachePath)234 void AudioCapturerGateway::SetApplicationCachePath(const std::string cachePath)
235 {
236 audioStream_->SetApplicationCachePath(cachePath);
237 }
238
SaveCallback(const std::weak_ptr<AudioCapturerCallback> & callback)239 void AudioStreamCapturerCallback::SaveCallback(const std::weak_ptr<AudioCapturerCallback> &callback)
240 {
241 std::shared_ptr<AudioCapturerCallback> cb = callback.lock();
242 AUDIO_ERR_LOG("AudioCapturerGateway AudioStreamCapturerCallback::SaveCallback cb");
243 callback_ = callback;
244 }
245
OnStateChange(const State state,StateChangeCmdType cmdType)246 void AudioStreamCapturerCallback::OnStateChange(const State state, StateChangeCmdType cmdType)
247 {
248 std::shared_ptr<AudioCapturerCallback> cb = callback_.lock();
249 if (cb == nullptr) {
250 AUDIO_ERR_LOG("AudioStreamCapturerCallback::OnStateChange cb == nullptr.");
251 return;
252 }
253
254 AUDIO_ERR_LOG("AudioCapturerGateway AudioStreamCapturerCallback::OnStateChange cb");
255 cb->OnStateChange(static_cast<CapturerState>(state));
256 }
257
SetCaptureMode(AudioCaptureMode captureMode) const258 int32_t AudioCapturerGateway::SetCaptureMode(AudioCaptureMode captureMode) const
259 {
260 return audioStream_->SetCaptureMode(captureMode);
261 }
262
GetCaptureMode() const263 AudioCaptureMode AudioCapturerGateway::GetCaptureMode() const
264 {
265 return audioStream_->GetCaptureMode();
266 }
267
SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> & callback)268 int32_t AudioCapturerGateway::SetCapturerReadCallback(const std::shared_ptr<AudioCapturerReadCallback> &callback)
269 {
270 return audioStream_->SetCapturerReadCallback(callback);
271 }
272
GetBufferDesc(BufferDesc & bufDesc) const273 int32_t AudioCapturerGateway::GetBufferDesc(BufferDesc &bufDesc) const
274 {
275 return audioStream_->GetBufferDesc(bufDesc);
276 }
277
Enqueue(const BufferDesc & bufDesc) const278 int32_t AudioCapturerGateway::Enqueue(const BufferDesc &bufDesc) const
279 {
280 return audioStream_->Enqueue(bufDesc);
281 }
282
Clear() const283 int32_t AudioCapturerGateway::Clear() const
284 {
285 return audioStream_->Clear();
286 }
287
GetBufQueueState(BufferQueueState & bufState) const288 int32_t AudioCapturerGateway::GetBufQueueState(BufferQueueState &bufState) const
289 {
290 return audioStream_->GetBufQueueState(bufState);
291 }
292
293 } // namespace AudioStandard
294 } // namespace OHOS
295