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