1 /*
2 * Copyright (c) 2022-2024 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_capture_interface_impl.h"
17
18 #include <hdf_base.h>
19 #include <unistd.h>
20 #include "sys/time.h"
21 #include <securec.h>
22
23 #include "cJSON.h"
24
25 #include "daudio_constants.h"
26 #include "daudio_events.h"
27 #include "daudio_log.h"
28 #include "daudio_utils.h"
29
30 #undef DH_LOG_TAG
31 #define DH_LOG_TAG "AudioCaptureInterfaceImpl"
32
33 using namespace OHOS::DistributedHardware;
34 namespace OHOS {
35 namespace HDI {
36 namespace DistributedAudio {
37 namespace Audio {
38 namespace V1_0 {
AudioCaptureInterfaceImpl(const std::string & adpName,const AudioDeviceDescriptor & desc,const AudioSampleAttributes & attrs,const sptr<IDAudioCallback> & callback)39 AudioCaptureInterfaceImpl::AudioCaptureInterfaceImpl(const std::string &adpName, const AudioDeviceDescriptor &desc,
40 const AudioSampleAttributes &attrs, const sptr<IDAudioCallback> &callback)
41 : adapterName_(adpName), devDesc_(desc), devAttrs_(attrs), audioExtCallback_(callback)
42 {
43 devAttrs_.frameSize = CalculateFrameSize(attrs.sampleRate, attrs.channelCount, attrs.format,
44 AUDIO_NORMAL_INTERVAL, false);
45 const int32_t sizePerSec = static_cast<int32_t>(attrs.sampleRate * attrs.channelCount) *attrs.format;
46 if (sizePerSec == 0) {
47 DHLOGE("The 'sizePerSec' is zero. In the constructor for x, the denominator of the division is zero.");
48 } else {
49 framePeriodNs_ = (static_cast<int64_t>(devAttrs_.frameSize) * AUDIO_NS_PER_SECOND) / sizePerSec;
50 }
51 DHLOGD("Distributed audio capture constructed, period(%{public}d),frameSize(%{public}d).",
52 attrs.period, devAttrs_.frameSize);
53 DHLOGD("Distributed audio capture constructed, id(%{public}d).", desc.pins);
54 }
55
~AudioCaptureInterfaceImpl()56 AudioCaptureInterfaceImpl::~AudioCaptureInterfaceImpl()
57 {
58 DHLOGD("Distributed audio capture destructed, id(%{public}d).", devDesc_.pins);
59 }
60
GetCapturePosition(uint64_t & frames,AudioTimeStamp & time)61 int32_t AudioCaptureInterfaceImpl::GetCapturePosition(uint64_t &frames, AudioTimeStamp &time)
62 {
63 DHLOGI("Get capture position, not support yet.");
64 (void)frames;
65 (void)time;
66 return HDF_SUCCESS;
67 }
68
CaptureFrame(std::vector<int8_t> & frame,uint64_t & replyBytes)69 int32_t AudioCaptureInterfaceImpl::CaptureFrame(std::vector<int8_t> &frame, uint64_t &replyBytes)
70 {
71 DHLOGD("Capture frame[sampleRate:%{public}d, channelCount: %{public}d, format: %{public}d, frameSize: %{public}d].",
72 devAttrs_.sampleRate, devAttrs_.channelCount, devAttrs_.format, devAttrs_.frameSize);
73 int64_t timeOffset = UpdateTimeOffset(frameIndex_, framePeriodNs_, startTime_);
74
75 int64_t startTime = GetNowTimeUs();
76 std::lock_guard<std::mutex> captureLck(captureMtx_);
77 if (captureStatus_ != CAPTURE_STATUS_START) {
78 DHLOGE("Capture status wrong, return false.");
79 return HDF_FAILURE;
80 }
81 if (audioExtCallback_ == nullptr) {
82 DHLOGE("Callback is nullptr.");
83 return HDF_FAILURE;
84 }
85
86 AudioData audioData;
87 int32_t ret = audioExtCallback_->ReadStreamData(captureId_, audioData);
88 if (ret != HDF_SUCCESS) {
89 DHLOGE("Read stream data failed.");
90 return HDF_FAILURE;
91 }
92 DumpFileUtil::WriteDumpFile(dumpFile_, static_cast<void *>(audioData.data.data()), audioData.data.size());
93 frame.clear();
94 frame.resize(devAttrs_.frameSize, 0);
95 if (!muteState_.load() && memcpy_s(frame.data(), frame.size(), audioData.data.data(), audioData.data.size()) !=
96 EOK) {
97 DHLOGE("Copy capture frame failed");
98 return HDF_FAILURE;
99 }
100 ++frameIndex_;
101 AbsoluteSleep(startTime_ + frameIndex_ * framePeriodNs_ - timeOffset);
102 DHLOGD("Capture audio frame success.");
103 int64_t endTime = GetNowTimeUs();
104 if (IsOutDurationRange(startTime, endTime, lastCaptureStartTime_)) {
105 DHLOGD("This frame spend: %{public}" PRId64" us, interval of two frames: %{public}" PRId64" us",
106 endTime - startTime, startTime - lastCaptureStartTime_);
107 }
108 lastCaptureStartTime_ = startTime;
109 return HDF_SUCCESS;
110 }
111
Start()112 int32_t AudioCaptureInterfaceImpl::Start()
113 {
114 DHLOGI("Start capture.");
115 cJSON *jParam = cJSON_CreateObject();
116 if (jParam == nullptr) {
117 DHLOGE("Failed to create cJSON object.");
118 return HDF_FAILURE;
119 }
120 cJSON_AddStringToObject(jParam, KEY_DH_ID, std::to_string(devDesc_.pins).c_str());
121 char *jsonData = cJSON_PrintUnformatted(jParam);
122 if (jsonData == nullptr) {
123 DHLOGE("Failed to create JSON data.");
124 cJSON_Delete(jParam);
125 return HDF_FAILURE;
126 }
127 std::string content(jsonData);
128 cJSON_Delete(jParam);
129 cJSON_free(jsonData);
130 DAudioEvent event = { HDF_AUDIO_EVENT_START, content };
131 if (audioExtCallback_ == nullptr) {
132 DHLOGE("Callback is nullptr.");
133 return HDF_FAILURE;
134 }
135 if (audioExtCallback_->NotifyEvent(captureId_, event) != HDF_SUCCESS) {
136 DHLOGE("Notify start event failed.");
137 return HDF_FAILURE;
138 }
139 std::lock_guard<std::mutex> captureLck(captureMtx_);
140 captureStatus_ = CAPTURE_STATUS_START;
141 frameIndex_ = 0;
142 startTime_ = 0;
143 DumpFileUtil::OpenDumpFile(DUMP_SERVER_PARA, HDF_CAPTURE_FROM_SA, &dumpFile_);
144 return HDF_SUCCESS;
145 }
146
Stop()147 int32_t AudioCaptureInterfaceImpl::Stop()
148 {
149 DHLOGI("Stop capture.");
150 cJSON *jParam = cJSON_CreateObject();
151 if (jParam == nullptr) {
152 DHLOGE("Failed to create cJSON object.");
153 return HDF_FAILURE;
154 }
155 cJSON_AddStringToObject(jParam, KEY_DH_ID, std::to_string(devDesc_.pins).c_str());
156 char *jsonData = cJSON_PrintUnformatted(jParam);
157 if (jsonData == nullptr) {
158 DHLOGE("Failed to create JSON data.");
159 cJSON_Delete(jParam);
160 return HDF_FAILURE;
161 }
162 cJSON_Delete(jParam);
163 std::string content(jsonData);
164 cJSON_free(jsonData);
165 DAudioEvent event = { HDF_AUDIO_EVENT_STOP, content };
166 if (audioExtCallback_ == nullptr) {
167 DHLOGE("Callback is nullptr.");
168 return HDF_FAILURE;
169 }
170 if (audioExtCallback_->NotifyEvent(captureId_, event) != HDF_SUCCESS) {
171 DHLOGE("Notify stop event failed.");
172 return HDF_FAILURE;
173 }
174 std::lock_guard<std::mutex> captureLck(captureMtx_);
175 captureStatus_ = CAPTURE_STATUS_STOP;
176 DumpFileUtil::CloseDumpFile(&dumpFile_);
177 return HDF_SUCCESS;
178 }
179
Pause()180 int32_t AudioCaptureInterfaceImpl::Pause()
181 {
182 DHLOGI("Pause capture.");
183 std::lock_guard<std::mutex> captureLck(captureMtx_);
184 captureStatus_ = CAPTURE_STATUS_PAUSE;
185 return HDF_SUCCESS;
186 }
187
Resume()188 int32_t AudioCaptureInterfaceImpl::Resume()
189 {
190 return HDF_SUCCESS;
191 }
192
Flush()193 int32_t AudioCaptureInterfaceImpl::Flush()
194 {
195 return HDF_SUCCESS;
196 }
197
TurnStandbyMode()198 int32_t AudioCaptureInterfaceImpl::TurnStandbyMode()
199 {
200 DHLOGI("Turn stand by mode, not support yet.");
201 return HDF_SUCCESS;
202 }
203
AudioDevDump(int32_t range,int32_t fd)204 int32_t AudioCaptureInterfaceImpl::AudioDevDump(int32_t range, int32_t fd)
205 {
206 DHLOGI("Dump audio info, not support yet.");
207 (void)range;
208 (void)fd;
209 return HDF_SUCCESS;
210 }
211
IsSupportsPauseAndResume(bool & supportPause,bool & supportResume)212 int32_t AudioCaptureInterfaceImpl::IsSupportsPauseAndResume(bool &supportPause, bool &supportResume)
213 {
214 DHLOGI("Check whether pause and resume is supported, not support yet.");
215 (void)supportPause;
216 (void)supportResume;
217 return HDF_SUCCESS;
218 }
219
CheckSceneCapability(const AudioSceneDescriptor & scene,bool & supported)220 int32_t AudioCaptureInterfaceImpl::CheckSceneCapability(const AudioSceneDescriptor &scene, bool &supported)
221 {
222 DHLOGI("Check scene capability.");
223 (void)scene;
224 supported = false;
225 return HDF_SUCCESS;
226 }
227
SelectScene(const AudioSceneDescriptor & scene)228 int32_t AudioCaptureInterfaceImpl::SelectScene(const AudioSceneDescriptor &scene)
229 {
230 DHLOGI("Select audio scene, not support yet.");
231 (void)scene;
232 return HDF_SUCCESS;
233 }
234
SetMute(bool mute)235 int32_t AudioCaptureInterfaceImpl::SetMute(bool mute)
236 {
237 DHLOGI("Set audio mute state.");
238 muteState_.store(mute);
239 return HDF_SUCCESS;
240 }
241
GetMute(bool & mute)242 int32_t AudioCaptureInterfaceImpl::GetMute(bool &mute)
243 {
244 DHLOGI("Get audio mute state.");
245 mute = muteState_.load();
246 return HDF_SUCCESS;
247 }
248
SetVolume(float volume)249 int32_t AudioCaptureInterfaceImpl::SetVolume(float volume)
250 {
251 DHLOGI("Can not set vol not by this interface.");
252 (void)volume;
253 return HDF_SUCCESS;
254 }
255
GetVolume(float & volume)256 int32_t AudioCaptureInterfaceImpl::GetVolume(float &volume)
257 {
258 DHLOGI("Can not get vol not by this interface.");
259 (void)volume;
260 return HDF_SUCCESS;
261 }
262
GetGainThreshold(float & min,float & max)263 int32_t AudioCaptureInterfaceImpl::GetGainThreshold(float &min, float &max)
264 {
265 DHLOGI("Get gain threshold, not support yet.");
266 min = 0;
267 max = 0;
268 return HDF_SUCCESS;
269 }
270
SetGain(float gain)271 int32_t AudioCaptureInterfaceImpl::SetGain(float gain)
272 {
273 DHLOGI("Set gain, not support yet.");
274 (void)gain;
275 return HDF_SUCCESS;
276 }
277
GetGain(float & gain)278 int32_t AudioCaptureInterfaceImpl::GetGain(float &gain)
279 {
280 DHLOGI("Get gain, not support yet.");
281 gain = 1.0;
282 return HDF_SUCCESS;
283 }
284
GetFrameSize(uint64_t & size)285 int32_t AudioCaptureInterfaceImpl::GetFrameSize(uint64_t &size)
286 {
287 (void)size;
288 return HDF_SUCCESS;
289 }
290
GetFrameCount(uint64_t & count)291 int32_t AudioCaptureInterfaceImpl::GetFrameCount(uint64_t &count)
292 {
293 (void)count;
294 return HDF_SUCCESS;
295 }
296
SetSampleAttributes(const AudioSampleAttributes & attrs)297 int32_t AudioCaptureInterfaceImpl::SetSampleAttributes(const AudioSampleAttributes &attrs)
298 {
299 DHLOGI("Set sample attributes.");
300 devAttrs_ = attrs;
301 return HDF_SUCCESS;
302 }
303
GetSampleAttributes(AudioSampleAttributes & attrs)304 int32_t AudioCaptureInterfaceImpl::GetSampleAttributes(AudioSampleAttributes &attrs)
305 {
306 DHLOGI("Get sample attributes.");
307 attrs = devAttrs_;
308 return HDF_SUCCESS;
309 }
310
GetCurrentChannelId(uint32_t & channelId)311 int32_t AudioCaptureInterfaceImpl::GetCurrentChannelId(uint32_t &channelId)
312 {
313 DHLOGI("Get current channel id, not support yet.");
314 (void)channelId;
315 return HDF_SUCCESS;
316 }
317
SetExtraParams(const std::string & keyValueList)318 int32_t AudioCaptureInterfaceImpl::SetExtraParams(const std::string &keyValueList)
319 {
320 DHLOGI("Set extra parameters, not support yet.");
321 (void)keyValueList;
322 return HDF_SUCCESS;
323 }
324
GetExtraParams(std::string & keyValueList)325 int32_t AudioCaptureInterfaceImpl::GetExtraParams(std::string &keyValueList)
326 {
327 DHLOGI("Get extra parameters, not support yet.");
328 (void)keyValueList;
329 return HDF_SUCCESS;
330 }
331
ReqMmapBuffer(int32_t reqSize,AudioMmapBufferDescriptor & desc)332 int32_t AudioCaptureInterfaceImpl::ReqMmapBuffer(int32_t reqSize, AudioMmapBufferDescriptor &desc)
333 {
334 DHLOGI("Request mmap buffer, not support yet.");
335 (void)reqSize;
336 (void)desc;
337 return HDF_SUCCESS;
338 }
339
GetMmapPosition(uint64_t & frames,AudioTimeStamp & time)340 int32_t AudioCaptureInterfaceImpl::GetMmapPosition(uint64_t &frames, AudioTimeStamp &time)
341 {
342 DHLOGI("Get mmap position, not support yet.");
343 (void)frames;
344 (void)time;
345 return HDF_SUCCESS;
346 }
347
AddAudioEffect(uint64_t effectid)348 int32_t AudioCaptureInterfaceImpl::AddAudioEffect(uint64_t effectid)
349 {
350 DHLOGI("Add audio effect, not support yet.");
351 (void)effectid;
352 return HDF_SUCCESS;
353 }
354
RemoveAudioEffect(uint64_t effectid)355 int32_t AudioCaptureInterfaceImpl::RemoveAudioEffect(uint64_t effectid)
356 {
357 DHLOGI("Remove audio effect, not support yet.");
358 (void)effectid;
359 return HDF_SUCCESS;
360 }
361
GetFrameBufferSize(uint64_t & bufferSize)362 int32_t AudioCaptureInterfaceImpl::GetFrameBufferSize(uint64_t &bufferSize)
363 {
364 DHLOGI("Get frame buffer size, not support yet.");
365 (void)bufferSize;
366 return HDF_SUCCESS;
367 }
368
SetAttrs(const std::string & adpName,const AudioDeviceDescriptor & desc,const AudioSampleAttributes & attrs,const sptr<IDAudioCallback> & callback,const int32_t dhId)369 void AudioCaptureInterfaceImpl::SetAttrs(const std::string &adpName, const AudioDeviceDescriptor &desc,
370 const AudioSampleAttributes &attrs, const sptr<IDAudioCallback> &callback, const int32_t dhId)
371 {
372 DHLOGI("Set attrs, not support yet.");
373 }
374
SetDumpFlagInner()375 void AudioCaptureInterfaceImpl::SetDumpFlagInner()
376 {
377 dumpFlag_ = true;
378 }
379
GetCaptureDesc()380 const AudioDeviceDescriptor &AudioCaptureInterfaceImpl::GetCaptureDesc()
381 {
382 return devDesc_;
383 }
384 } // V1_0
385 } // Audio
386 } // Distributedaudio
387 } // HDI
388 } // OHOS
389