1 /*
2 * Copyright (c) 2023 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 "OHAudioCapturer.h"
17 #include "audio_errors.h"
18
19 using OHOS::AudioStandard::Timestamp;
20
21 const int64_t SECOND_TO_NANOSECOND = 1000000000;
22
convertCapturer(OH_AudioCapturer * capturer)23 static OHOS::AudioStandard::OHAudioCapturer *convertCapturer(OH_AudioCapturer* capturer)
24 {
25 return (OHOS::AudioStandard::OHAudioCapturer*) capturer;
26 }
27
OH_AudioCapturer_Release(OH_AudioCapturer * capturer)28 OH_AudioStream_Result OH_AudioCapturer_Release(OH_AudioCapturer* capturer)
29 {
30 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
31 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
32 if (audioCapturer->Release()) {
33 return AUDIOSTREAM_SUCCESS;
34 } else {
35 return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
36 }
37 }
38
OH_AudioCapturer_Start(OH_AudioCapturer * capturer)39 OH_AudioStream_Result OH_AudioCapturer_Start(OH_AudioCapturer* capturer)
40 {
41 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
42 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
43 if (audioCapturer->Start()) {
44 return AUDIOSTREAM_SUCCESS;
45 } else {
46 return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
47 }
48 }
49
OH_AudioCapturer_Pause(OH_AudioCapturer * capturer)50 OH_AudioStream_Result OH_AudioCapturer_Pause(OH_AudioCapturer* capturer)
51 {
52 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
53 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
54
55 if (audioCapturer->Pause()) {
56 return AUDIOSTREAM_SUCCESS;
57 } else {
58 return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
59 }
60 }
61
OH_AudioCapturer_Stop(OH_AudioCapturer * capturer)62 OH_AudioStream_Result OH_AudioCapturer_Stop(OH_AudioCapturer* capturer)
63 {
64 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
65 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
66
67 if (audioCapturer->Stop()) {
68 return AUDIOSTREAM_SUCCESS;
69 } else {
70 return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
71 }
72 }
73
OH_AudioCapturer_Flush(OH_AudioCapturer * capturer)74 OH_AudioStream_Result OH_AudioCapturer_Flush(OH_AudioCapturer* capturer)
75 {
76 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
77 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
78
79 if (audioCapturer->Flush()) {
80 return AUDIOSTREAM_SUCCESS;
81 } else {
82 return AUDIOSTREAM_ERROR_ILLEGAL_STATE;
83 }
84 }
85
86
OH_AudioCapturer_GetCurrentState(OH_AudioCapturer * capturer,OH_AudioStream_State * state)87 OH_AudioStream_Result OH_AudioCapturer_GetCurrentState(OH_AudioCapturer* capturer, OH_AudioStream_State* state)
88 {
89 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
90 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
91
92 OHOS::AudioStandard::CapturerState capturerState = audioCapturer->GetCurrentState();
93 *state = (OH_AudioStream_State)capturerState;
94 return AUDIOSTREAM_SUCCESS;
95 }
96
OH_AudioCapturer_GetLatencyMode(OH_AudioCapturer * capturer,OH_AudioStream_LatencyMode * latencyMode)97 OH_AudioStream_Result OH_AudioCapturer_GetLatencyMode(OH_AudioCapturer* capturer,
98 OH_AudioStream_LatencyMode* latencyMode)
99 {
100 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
101 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
102 OHOS::AudioStandard::AudioCapturerInfo capturerInfo;
103 audioCapturer->GetCapturerInfo(capturerInfo);
104 *latencyMode = (OH_AudioStream_LatencyMode)capturerInfo.capturerFlags;
105 return AUDIOSTREAM_SUCCESS;
106 }
107
OH_AudioCapturer_GetStreamId(OH_AudioCapturer * capturer,uint32_t * streamId)108 OH_AudioStream_Result OH_AudioCapturer_GetStreamId(OH_AudioCapturer* capturer, uint32_t* streamId)
109 {
110 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
111 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
112 audioCapturer->GetStreamId(*streamId);
113 return AUDIOSTREAM_SUCCESS;
114 }
115
OH_AudioCapturer_GetChannelCount(OH_AudioCapturer * capturer,int32_t * channelCount)116 OH_AudioStream_Result OH_AudioCapturer_GetChannelCount(OH_AudioCapturer* capturer, int32_t* channelCount)
117 {
118 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
119 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
120 *channelCount = audioCapturer->GetChannelCount();
121 return AUDIOSTREAM_SUCCESS;
122 }
123
OH_AudioCapturer_GetSamplingRate(OH_AudioCapturer * capturer,int32_t * rate)124 OH_AudioStream_Result OH_AudioCapturer_GetSamplingRate(OH_AudioCapturer* capturer, int32_t* rate)
125 {
126 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
127 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
128
129 *rate = audioCapturer->GetSamplingRate();
130 return AUDIOSTREAM_SUCCESS;
131 }
132
OH_AudioCapturer_GetSampleFormat(OH_AudioCapturer * capturer,OH_AudioStream_SampleFormat * sampleFormat)133 OH_AudioStream_Result OH_AudioCapturer_GetSampleFormat(OH_AudioCapturer* capturer,
134 OH_AudioStream_SampleFormat* sampleFormat)
135 {
136 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
137 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
138 *sampleFormat = (OH_AudioStream_SampleFormat)audioCapturer->GetSampleFormat();
139 return AUDIOSTREAM_SUCCESS;
140 }
141
OH_AudioCapturer_GetEncodingType(OH_AudioCapturer * capturer,OH_AudioStream_EncodingType * encodingType)142 OH_AudioStream_Result OH_AudioCapturer_GetEncodingType(OH_AudioCapturer* capturer,
143 OH_AudioStream_EncodingType* encodingType)
144 {
145 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
146 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
147 *encodingType = (OH_AudioStream_EncodingType)audioCapturer->GetEncodingType();
148 return AUDIOSTREAM_SUCCESS;
149 }
150
OH_AudioCapturer_GetCapturerInfo(OH_AudioCapturer * capturer,OH_AudioStream_SourceType * sourceType)151 OH_AudioStream_Result OH_AudioCapturer_GetCapturerInfo(OH_AudioCapturer* capturer,
152 OH_AudioStream_SourceType* sourceType)
153 {
154 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
155 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
156 OHOS::AudioStandard::AudioCapturerInfo capturerInfo;
157 audioCapturer->GetCapturerInfo(capturerInfo);
158 *sourceType = (OH_AudioStream_SourceType)capturerInfo.sourceType;
159 return AUDIOSTREAM_SUCCESS;
160 }
161
OH_AudioCapturer_GetFrameSizeInCallback(OH_AudioCapturer * capturer,int32_t * frameSize)162 OH_AudioStream_Result OH_AudioCapturer_GetFrameSizeInCallback(OH_AudioCapturer* capturer, int32_t* frameSize)
163 {
164 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
165 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
166
167 *frameSize = audioCapturer->GetFrameSizeInCallback();
168 return AUDIOSTREAM_SUCCESS;
169 }
170
OH_AudioCapturer_GetTimestamp(OH_AudioCapturer * capturer,clockid_t clockId,int64_t * framePosition,int64_t * timestamp)171 OH_AudioStream_Result OH_AudioCapturer_GetTimestamp(OH_AudioCapturer* capturer,
172 clockid_t clockId, int64_t* framePosition, int64_t* timestamp)
173 {
174 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
175 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
176
177 Timestamp stamp;
178 Timestamp::Timestampbase base = Timestamp::Timestampbase::MONOTONIC;
179 audioCapturer->GetAudioTime(stamp, base);
180 *framePosition = stamp.framePosition;
181 *timestamp = stamp.time.tv_sec * SECOND_TO_NANOSECOND + stamp.time.tv_nsec;
182 return AUDIOSTREAM_SUCCESS;
183 }
184
OH_AudioCapturer_GetFramesRead(OH_AudioCapturer * capturer,int64_t * frames)185 OH_AudioStream_Result OH_AudioCapturer_GetFramesRead(OH_AudioCapturer* capturer, int64_t* frames)
186 {
187 OHOS::AudioStandard::OHAudioCapturer *audioCapturer = convertCapturer(capturer);
188 CHECK_AND_RETURN_RET_LOG(audioCapturer != nullptr, AUDIOSTREAM_ERROR_INVALID_PARAM, "convert capturer failed");
189
190 *frames = audioCapturer->GetFramesRead();
191 return AUDIOSTREAM_SUCCESS;
192 }
193
194 namespace OHOS {
195 namespace AudioStandard {
OHAudioCapturer()196 OHAudioCapturer::OHAudioCapturer()
197 {
198 AUDIO_INFO_LOG("OHAudioCapturer created!");
199 }
200
~OHAudioCapturer()201 OHAudioCapturer::~OHAudioCapturer()
202 {
203 AUDIO_INFO_LOG("OHAudioCapturer destroyed!");
204 }
205
Initialize(const AudioCapturerOptions & capturerOptions)206 bool OHAudioCapturer::Initialize(const AudioCapturerOptions& capturerOptions)
207 {
208 std::string cacheDir = "/data/storage/el2/base/temp";
209 audioCapturer_ = AudioCapturer::Create(capturerOptions, cacheDir);
210 return audioCapturer_ != nullptr;
211 }
212
Start()213 bool OHAudioCapturer::Start()
214 {
215 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, ERROR, "capturer client is nullptr");
216 return audioCapturer_->Start();
217 }
218
Pause()219 bool OHAudioCapturer::Pause()
220 {
221 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, ERROR, "capturer client is nullptr");
222 return audioCapturer_->Pause();
223 }
224
Stop()225 bool OHAudioCapturer::Stop()
226 {
227 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, ERROR, "capturer client is nullptr");
228 return audioCapturer_->Stop();
229 }
230
Flush()231 bool OHAudioCapturer::Flush()
232 {
233 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, ERROR, "capturer client is nullptr");
234 return audioCapturer_->Flush();
235 }
236
Release()237 bool OHAudioCapturer::Release()
238 {
239 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, ERROR, "capturer client is nullptr");
240 return audioCapturer_->Release();
241 }
242
GetCurrentState()243 CapturerState OHAudioCapturer::GetCurrentState()
244 {
245 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, CAPTURER_INVALID, "capturer client is nullptr");
246 return audioCapturer_->GetStatus();
247 }
248
GetStreamId(uint32_t & streamId)249 void OHAudioCapturer::GetStreamId(uint32_t &streamId)
250 {
251 CHECK_AND_RETURN_LOG(audioCapturer_ != nullptr, "capturer client is nullptr");
252 audioCapturer_->GetAudioStreamId(streamId);
253 }
254
GetChannelCount()255 AudioChannel OHAudioCapturer::GetChannelCount()
256 {
257 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, MONO, "capturer client is nullptr");
258 AudioCapturerParams params;
259 audioCapturer_->GetParams(params);
260 return params.audioChannel;
261 }
262
GetSamplingRate()263 int32_t OHAudioCapturer::GetSamplingRate()
264 {
265 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, MONO, "capturer client is nullptr");
266 AudioCapturerParams params;
267 audioCapturer_->GetParams(params);
268 return params.samplingRate;
269 }
270
GetEncodingType()271 AudioEncodingType OHAudioCapturer::GetEncodingType()
272 {
273 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, ENCODING_INVALID, "capturer client is nullptr");
274 AudioCapturerParams params;
275 audioCapturer_->GetParams(params);
276 return params.audioEncoding;
277 }
278
GetCapturerInfo(AudioCapturerInfo & capturerInfo)279 void OHAudioCapturer::GetCapturerInfo(AudioCapturerInfo& capturerInfo)
280 {
281 CHECK_AND_RETURN_LOG(audioCapturer_ != nullptr, "capturer client is nullptr");
282 audioCapturer_->GetCapturerInfo(capturerInfo);
283 }
284
GetSampleFormat()285 AudioSampleFormat OHAudioCapturer::GetSampleFormat()
286 {
287 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, INVALID_WIDTH, "capturer client is nullptr");
288 AudioCapturerParams params;
289 audioCapturer_->GetParams(params);
290 return params.audioSampleFormat;
291 }
292
SetCapturerCallback(OH_AudioCapturer_Callbacks callbacks,void * userData)293 void OHAudioCapturer::SetCapturerCallback(OH_AudioCapturer_Callbacks callbacks, void* userData)
294 {
295 CHECK_AND_RETURN_LOG(audioCapturer_ != nullptr, "capturer client is nullptr");
296 audioCapturer_->SetCaptureMode(CAPTURE_MODE_CALLBACK);
297 if (callbacks.OH_AudioCapturer_OnReadData != nullptr) {
298 std::shared_ptr<AudioCapturerReadCallback> callback = std::make_shared<OHAudioCapturerModeCallback>(callbacks,
299 (OH_AudioCapturer*)this, userData);
300 audioCapturer_->SetCapturerReadCallback(callback);
301 } else {
302 AUDIO_ERR_LOG("read callback is nullptr");
303 }
304
305 if (callbacks.OH_AudioCapturer_OnInterruptEvent != nullptr) {
306 std::shared_ptr<AudioCapturerCallback> callback = std::make_shared<OHAudioCapturerCallback>(callbacks,
307 (OH_AudioCapturer*)this, userData);
308 audioCapturer_->SetCapturerCallback(callback);
309 } else {
310 AUDIO_ERR_LOG("capturer interrupt event callback is nullptr");
311 }
312 }
313
GetFramesRead()314 int64_t OHAudioCapturer::GetFramesRead()
315 {
316 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, ERROR, "capturer client is nullptr");
317 return audioCapturer_->GetFramesRead();
318 }
319
GetAudioTime(Timestamp & timestamp,Timestamp::Timestampbase base)320 void OHAudioCapturer::GetAudioTime(Timestamp ×tamp, Timestamp::Timestampbase base)
321 {
322 CHECK_AND_RETURN_LOG(audioCapturer_ != nullptr, "capturer client is nullptr");
323 audioCapturer_->GetAudioTime(timestamp, base);
324 }
325
GetFrameSizeInCallback()326 int32_t OHAudioCapturer::GetFrameSizeInCallback()
327 {
328 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, ERROR, "capturer client is nullptr");
329 uint32_t frameSize;
330 audioCapturer_->GetFrameCount(frameSize);
331 return static_cast<int32_t>(frameSize);
332 }
333
GetBufferDesc(BufferDesc & bufDesc) const334 int32_t OHAudioCapturer::GetBufferDesc(BufferDesc &bufDesc) const
335 {
336 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, ERROR, "capturer client is nullptr");
337 return audioCapturer_->GetBufferDesc(bufDesc);
338 }
339
Enqueue(const BufferDesc & bufDesc) const340 int32_t OHAudioCapturer::Enqueue(const BufferDesc &bufDesc) const
341 {
342 CHECK_AND_RETURN_RET_LOG(audioCapturer_ != nullptr, ERROR, "capturer client is nullptr");
343 return audioCapturer_->Enqueue(bufDesc);
344 }
345
OnReadData(size_t length)346 void OHAudioCapturerModeCallback::OnReadData(size_t length)
347 {
348 OHAudioCapturer* audioCapturer = (OHAudioCapturer*)ohAudioCapturer_;
349 CHECK_AND_RETURN_LOG(audioCapturer != nullptr, "capturer client is nullptr");
350 CHECK_AND_RETURN_LOG(callbacks_.OH_AudioCapturer_OnReadData != nullptr, "pointer to the fuction is nullptr");
351 BufferDesc bufDesc;
352 audioCapturer->GetBufferDesc(bufDesc);
353 callbacks_.OH_AudioCapturer_OnReadData(ohAudioCapturer_,
354 userData_,
355 (void*)bufDesc.buffer,
356 bufDesc.bufLength);
357 audioCapturer->Enqueue(bufDesc);
358 }
359
OnInterrupt(const InterruptEvent & interruptEvent)360 void OHAudioCapturerCallback::OnInterrupt(const InterruptEvent &interruptEvent)
361 {
362 CHECK_AND_RETURN_LOG(ohAudioCapturer_ != nullptr, "capturer client is nullptr");
363 CHECK_AND_RETURN_LOG(callbacks_.OH_AudioCapturer_OnInterruptEvent != nullptr, "pointer to the fuction is nullptr");
364
365 OH_AudioInterrupt_ForceType type = (OH_AudioInterrupt_ForceType)(interruptEvent.forceType);
366 OH_AudioInterrupt_Hint hint = OH_AudioInterrupt_Hint(interruptEvent.hintType);
367 callbacks_.OH_AudioCapturer_OnInterruptEvent(ohAudioCapturer_, userData_, type, hint);
368 }
369 } // namespace AudioStandard
370 } // namespace OHOS
371