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