1 /*
2  * Copyright (c) 2022-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 <dlfcn.h>
17 #include <limits.h>
18 #include <pthread.h>
19 #include <securec.h>
20 #include <signal.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <sys/mman.h>
25 #include <sys/stat.h>
26 #include <unistd.h>
27 #include "framework_common.h"
28 #include "hdf_base.h"
29 #include "hdf_io_service_if.h"
30 #include "hdf_service_status.h"
31 #include "inttypes.h"
32 #include "ioservstat_listener.h"
33 #include "osal_mem.h"
34 #include "svcmgr_ioservice.h"
35 #include "v4_0/iaudio_manager.h"
36 #include "v4_0/audio_types.h"
37 
38 #define MOVE_LEFT_NUM                   8
39 #define AUDIO_CHANNELCOUNT              2
40 #define AUDIO_SAMPLE_RATE_48K           48000
41 #define PATH_LEN                        256
42 #define BUFFER_PERIOD_SIZE              3840
43 #define DEEP_BUFFER_RENDER_PERIOD_SIZE  4096
44 #define DEEP_BUFFER_RENDER_PERIOD_COUNT 8
45 #define INT_32_MAX                      0x7fffffff
46 #define BUFFER_SIZE_BASE                1024
47 #define PCM_8_BIT                       8
48 #define PCM_16_BIT                      16
49 #define AUDIO_TOTALSIZE_15M             (1024 * 15)
50 #define AUDIO_RECORD_INTERVAL_512KB     512
51 #define MAX_AUDIO_ADAPTER_DESC          5
52 #define FILE_CAPTURE_SIZE               (1024 * 1024 * 3) // 3M
53 #define BUFFER_LEN                      256
54 #define EXT_PARAMS_MAXLEN               107
55 #define ONE_MS                          1000
56 #define BITS_TO_FROMAT                  3
57 #ifndef AUDIO_FEATURE_COMMUNITY
58 #define AUDIO_CAPTURE_STREAM_ID         14
59 #define AUDIO_ROUTE_NODE_LEN            1
60 #else
61 #define AUDIO_BUFF_SIZE                 (1024 * 16)
62 #endif
63 
64 struct IAudioAdapter *g_adapter = NULL;
65 struct AudioDeviceDescriptor g_devDesc;
66 struct AudioSampleAttributes g_attrs;
67 struct IAudioCapture *g_capture = NULL;
68 static struct IAudioManager *g_audioManager = NULL;
69 static struct StrParaCapture g_str;
70 uint32_t g_captureId = 0;
71 
72 pthread_t g_tids;
73 FILE *g_file;
74 char *g_frame;
75 char g_path[PATH_MAX] = {'\0'};
76 char g_adapterName[PATH_LEN] = {0};
77 
78 enum AudioCaptureMode {
79     CAPTURE_POLL = 1,
80     CAPTURE_INTERUPT,
81 };
82 
83 int g_captureModeFlag = CAPTURE_POLL;
84 
85 #ifndef __LITEOS__
86 int g_receiveFrameCount = 0;
87 uint64_t g_totalSize = 0;
88 struct ISvcMgrIoservice *g_servmgr = NULL;
89 struct ServiceStatusListener *g_listener = NULL;
90 #endif
91 
92 enum CaptureMenuId {
93     CAPTURE_START = 1,
94     CAPTURE_STOP,
95     CAPTURE_RESUME,
96     CAPTURE_PAUSE,
97     SET_CAPTURE_VOLUME,
98     SET_CAPTURE_GAIN,
99     SET_CAPTURE_MUTE,
100     SET_CAPTURE_ATTRIBUTES,
101     SET_CAPTURE_SLECET_SCENE,
102     GET_CAPTURE_EXT_PARAMS,
103     GET_CAPTURE_POSITION,
104 };
105 
106 enum CaptureInputType {
107     INPUT_INT = 0,
108     INPUT_FLOAT,
109     INPUT_UINT32,
110 };
111 
112 typedef int32_t (*AudioCaptureOperation)(struct IAudioCapture **);
113 
114 struct ProcessCaptureMenuSwitchList {
115     enum CaptureMenuId cmd;
116     AudioCaptureOperation operation;
117 };
118 
119 static int32_t g_closeEnd = 0;
120 bool g_isDirect = true;
121 static int g_voiceCallType = 0;
122 
CheckInputName(int type,void * val)123 static int32_t CheckInputName(int type, void *val)
124 {
125     if (val == NULL) {
126         return HDF_FAILURE;
127     }
128 
129     int ret;
130     int capInputInt = 0;
131     float capInputFloat = 0.0;
132     uint32_t capInputUint = 0;
133 
134     printf("\n");
135     switch (type) {
136         case INPUT_INT:
137             ret = scanf_s("%d", &capInputInt);
138             if (capInputInt < 0 || capInputInt > GET_CAPTURE_POSITION + 1) {
139                 if (g_frame != NULL) {
140                     OsalMemFree(g_frame);
141                     g_frame = NULL;
142                 }
143                 AUDIO_FUNC_LOGE("Input failure");
144                 return HDF_FAILURE;
145             }
146             *(int *)val = capInputInt;
147             break;
148         case INPUT_FLOAT:
149             ret = scanf_s("%f", &capInputFloat);
150             *(float *)val = capInputFloat;
151             break;
152         case INPUT_UINT32:
153             ret = scanf_s("%u", &capInputUint);
154             if (capInputUint > 0xFFFFFFFF) {
155                 return HDF_FAILURE;
156             }
157             *(uint32_t *)val = capInputUint;
158             break;
159         default:
160             ret = EOF;
161             break;
162     }
163     if (ret == 0) {
164         CleanStdin();
165     } else if (ret == EOF) {
166         AUDIO_FUNC_LOGE("Input error occurs!");
167         return HDF_FAILURE;
168     }
169     return HDF_SUCCESS;
170 }
171 
InitAttrsCapture(struct AudioSampleAttributes * captureAttrs)172 static int32_t InitAttrsCapture(struct AudioSampleAttributes *captureAttrs)
173 {
174     if (captureAttrs == NULL) {
175         return HDF_FAILURE;
176     }
177     /* Initialization of audio parameters for playback */
178     captureAttrs->format = AUDIO_FORMAT_TYPE_PCM_16_BIT;
179     captureAttrs->channelCount = AUDIO_CHANNELCOUNT;
180     captureAttrs->sampleRate = AUDIO_SAMPLE_RATE_48K;
181     captureAttrs->interleaved = 0;
182     captureAttrs->type = AUDIO_IN_MEDIA;
183     captureAttrs->period = BUFFER_PERIOD_SIZE;
184     captureAttrs->frameSize = PCM_16_BIT * captureAttrs->channelCount / PCM_8_BIT;
185     captureAttrs->isBigEndian = false;
186     captureAttrs->isSignedData = true;
187     captureAttrs->startThreshold = DEEP_BUFFER_RENDER_PERIOD_SIZE / (captureAttrs->frameSize);
188     captureAttrs->stopThreshold = INT_32_MAX;
189 #ifndef AUDIO_FEATURE_COMMUNITY
190     captureAttrs->silenceThreshold = 0;
191     captureAttrs->streamId = AUDIO_CAPTURE_STREAM_ID;
192 #else
193     captureAttrs->silenceThreshold = AUDIO_BUFF_SIZE;
194 #endif
195     captureAttrs->sourceType = g_voiceCallType;
196     return 0;
197 }
198 
InitDevDescCapture(struct AudioDeviceDescriptor * devDesc,uint32_t portId)199 static int32_t InitDevDescCapture(struct AudioDeviceDescriptor *devDesc, uint32_t portId)
200 {
201     if (devDesc == NULL) {
202         return HDF_FAILURE;
203     }
204     /* Initialization of audio parameters for playback */
205     devDesc->portId = portId;
206     devDesc->pins = PIN_IN_MIC;
207     devDesc->desc = strdup("devName");
208     return HDF_SUCCESS;
209 }
210 
StreamClose(int32_t sig)211 void StreamClose(int32_t sig)
212 {
213     /* allow the stream to be closed gracefully */
214     (void)signal(sig, SIG_IGN);
215     g_closeEnd = 1;
216 }
217 
PcmFramesToBytes(const struct AudioSampleAttributes attrs)218 static uint32_t PcmFramesToBytes(const struct AudioSampleAttributes attrs)
219 {
220     return DEEP_BUFFER_RENDER_PERIOD_SIZE * attrs.channelCount * (PcmFormatToBits(attrs.format) >> BITS_TO_FROMAT);
221 }
222 
StopButtonCapture(struct IAudioCapture ** captureS)223 static int32_t StopButtonCapture(struct IAudioCapture **captureS)
224 {
225     if (captureS == NULL) {
226         return HDF_FAILURE;
227     }
228 
229     if (!g_closeEnd) {
230         g_closeEnd = true;
231         usleep(100000); // sleep 100000us
232     }
233 
234     struct IAudioCapture *capture = *captureS;
235     if (capture == NULL) {
236         return HDF_FAILURE;
237     }
238 
239     int ret = capture->Stop((void *)capture);
240     if (ret < 0) {
241         AUDIO_FUNC_LOGE("Stop capture!");
242     }
243 
244     if (g_adapter == NULL || g_adapter->DestroyCapture == NULL) {
245         return HDF_FAILURE;
246     }
247 
248     ret = g_adapter->DestroyCapture(g_adapter, g_captureId);
249     if (ret < 0) {
250         AUDIO_FUNC_LOGE("Capture already destroy!");
251     }
252 
253     IAudioCaptureRelease(capture, g_isDirect);
254     *captureS = NULL;
255     g_capture = NULL;
256     if (g_frame != NULL) {
257         OsalMemFree(g_frame);
258         g_frame = NULL;
259     }
260 
261     if (AddWavFileHeader(g_file, &g_str) < 0) {
262         AUDIO_FUNC_LOGE("AddWavFileHeader Fail");
263         return HDF_FAILURE;
264     }
265 
266     FileClose(&g_file);
267 
268     if (g_captureModeFlag == CAPTURE_INTERUPT) {
269         AUDIO_FUNC_LOGE("litoOs  not support!");
270     }
271     printf("Stop Successful\n");
272     return HDF_SUCCESS;
273 }
274 
FrameStartCaptureMmap(const struct StrParaCapture * param)275 static int32_t FrameStartCaptureMmap(const struct StrParaCapture *param)
276 {
277     if (param == NULL) {
278         return HDF_FAILURE;
279     }
280     const struct StrParaCapture *strParam = param;
281     struct IAudioCapture *capture = strParam->capture;
282     struct AudioMmapBufferDescriptor mmapDesc;
283     // Modify file size
284 
285     int fd = fileno(strParam->file);
286     if (fd == -1) {
287         printf("fileno failed, fd is %d\n", fd);
288         return HDF_FAILURE;
289     }
290     ftruncate(fd, FILE_CAPTURE_SIZE);
291     // Init param
292     mmapDesc.memoryFd = 0; // default 0
293     mmapDesc.filePath = strdup(g_path);
294     mmapDesc.isShareable = 1;                                        // 1:Shareable ,0:Don't share
295     mmapDesc.transferFrameSize = DEEP_BUFFER_RENDER_PERIOD_SIZE / 4; // One frame size 4 bit
296     mmapDesc.offset = 0;                                             // Recording must be 0
297     // start
298     if (capture == NULL || capture->ReqMmapBuffer == NULL) {
299         free(mmapDesc.filePath);
300         return HDF_FAILURE;
301     }
302     int32_t ret = capture->ReqMmapBuffer(capture, FILE_CAPTURE_SIZE, &mmapDesc);
303     if (ret < 0) {
304         free(mmapDesc.filePath);
305         printf("Request map fail,please check.\n");
306         return HDF_FAILURE;
307     }
308     free(mmapDesc.filePath);
309     return HDF_SUCCESS;
310 }
311 
WriteDataToFile(FILE * file,char * buffer,uint64_t replyBytes,uint32_t * failCount,uint64_t * totalSize)312 static int32_t WriteDataToFile(FILE *file, char *buffer, uint64_t replyBytes, uint32_t *failCount, uint64_t *totalSize)
313 {
314     if (file == NULL || buffer == NULL || failCount == NULL || totalSize == NULL) {
315         AUDIO_FUNC_LOGE("WriteDataToFile params is null!");
316         return HDF_FAILURE;
317     }
318     *failCount = 0;
319 
320     (void)fwrite(buffer, (size_t)replyBytes, 1, file);
321 
322     *totalSize += (replyBytes / BUFFER_SIZE_BASE);       // 1024 = 1Kb
323     if (*totalSize % AUDIO_RECORD_INTERVAL_512KB < 24) { // 512KB
324         printf("\nRecording,the audio file size is %" PRIu64 "Kb\n", *totalSize);
325     }
326     return HDF_SUCCESS;
327 }
328 
FrameStartCapture(const struct StrParaCapture * param)329 static int32_t FrameStartCapture(const struct StrParaCapture *param)
330 {
331     if (param == NULL) {
332         return HDF_FAILURE;
333     }
334 #ifndef AUDIO_FEATURE_COMMUNITY
335     uint32_t bufferSize = BUFFER_PERIOD_SIZE;
336     uint64_t requestBytes = BUFFER_PERIOD_SIZE;
337 #else
338     uint32_t bufferSize = AUDIO_BUFF_SIZE;
339     uint64_t requestBytes = AUDIO_BUFF_SIZE;
340 #endif
341     uint64_t totalSize = 0;
342     uint32_t failCount = 0;
343 
344     struct IAudioCapture *capture = param->capture;
345     if (capture == NULL || capture->CaptureFrame == NULL) {
346         return HDF_FAILURE;
347     }
348 
349     char *frame = (char *)OsalMemCalloc(bufferSize);
350     if (frame == NULL) {
351         return HDF_FAILURE;
352     }
353 
354     do {
355         int32_t ret = capture->CaptureFrame(capture, (int8_t *)frame, &bufferSize, &requestBytes);
356         if (ret < 0) {
357             if (ret == HDF_ERR_INVALID_OBJECT) {
358                 AUDIO_FUNC_LOGE("Record already stop!");
359                 break;
360             }
361             usleep(ONE_MS);
362             if (failCount++ >= 300000) { // Try 300000 times for CaptureFrame fail
363                 OsalMemFree(frame);
364                 return HDF_FAILURE;
365             }
366             continue;
367         }
368         if (WriteDataToFile(param->file, frame, bufferSize, &failCount, &totalSize) < 0) {
369             OsalMemFree(frame);
370             return HDF_FAILURE;
371         }
372     } while ((totalSize <= AUDIO_TOTALSIZE_15M) && (!g_closeEnd)); // 15 * 1024 = 15M
373 
374     OsalMemFree(frame);
375 
376     if (!g_closeEnd) {
377         if (StopButtonCapture(&g_capture) < 0) {
378             return HDF_FAILURE;
379         }
380     }
381     return HDF_SUCCESS;
382 }
383 
PrintPlayMode(void)384 static void PrintPlayMode(void)
385 {
386     printf(" ============= Play Capture start Mode ==========\n");
387     printf("| 1. Capture non-mmap                           |\n");
388     printf("| 2. Capture mmap                               |\n");
389     printf(" ================================================\n");
390 }
391 
SelectRecordMode(int32_t * recordModeFlag)392 static int32_t SelectRecordMode(int32_t *recordModeFlag)
393 {
394     if (recordModeFlag == NULL) {
395         AUDIO_FUNC_LOGE("recordModeFlag is null");
396         return HDF_FAILURE;
397     }
398     int choice = 0;
399 
400     system("clear");
401 
402     PrintPlayMode();
403 
404     printf("Please enter your choice:");
405 
406     int32_t ret = CheckInputName(INPUT_INT, (void *)&choice);
407     if (ret < 0) {
408         AUDIO_FUNC_LOGE("CheckInputName Fail");
409         return HDF_FAILURE;
410     } else {
411         *recordModeFlag = choice;
412     }
413     return HDF_SUCCESS;
414 }
415 
StartPlayThread(int32_t recordModeFlag)416 static int32_t StartPlayThread(int32_t recordModeFlag)
417 {
418     pthread_attr_t tidsAttr;
419     pthread_attr_init(&tidsAttr);
420     pthread_attr_setdetachstate(&tidsAttr, PTHREAD_CREATE_DETACHED);
421     switch (recordModeFlag) {
422         case 1: // 1. Stander Loading
423             if (pthread_create(&g_tids, &tidsAttr, (void *)(&FrameStartCapture), &g_str) != 0) {
424                 AUDIO_FUNC_LOGE("Create Thread Fail");
425                 return HDF_FAILURE;
426             }
427             break;
428         case 2: // 2. Low latency Loading
429             if (pthread_create(&g_tids, &tidsAttr, (void *)(&FrameStartCaptureMmap), &g_str) != 0) {
430                 AUDIO_FUNC_LOGE("Create Thread Fail");
431                 return HDF_FAILURE;
432             }
433             break;
434         default:
435             printf("Input error,Switched to non-mmap Mode for you,");
436             SystemInputFail();
437             if (pthread_create(&g_tids, &tidsAttr, (void *)(&FrameStartCapture), &g_str) != 0) {
438                 AUDIO_FUNC_LOGE("Create Thread Fail");
439                 return HDF_FAILURE;
440             }
441             break;
442     }
443     return HDF_SUCCESS;
444 }
445 
CaptureChoiceModeAndRecording(struct StrParaCapture * strParam,struct IAudioCapture * capture,int32_t recordModeFlag)446 static int32_t CaptureChoiceModeAndRecording(
447     struct StrParaCapture *strParam, struct IAudioCapture *capture, int32_t recordModeFlag)
448 {
449     if (strParam == NULL || capture == NULL) {
450         AUDIO_FUNC_LOGE("InitCaptureStrParam is NULL");
451         return HDF_FAILURE;
452     }
453 
454     (void)memset_s(strParam, sizeof(struct StrParaCapture), 0, sizeof(struct StrParaCapture));
455 
456     strParam->capture = capture;
457     strParam->file = g_file;
458     strParam->attrs = g_attrs;
459     strParam->frame = g_frame;
460 
461     if (g_captureModeFlag == CAPTURE_INTERUPT) {
462         printf("not suport liteos!");
463     } else {
464         if (StartPlayThread(recordModeFlag) < 0) {
465             AUDIO_FUNC_LOGE("Create Thread Fail");
466             return HDF_FAILURE;
467         }
468     }
469     return HDF_SUCCESS;
470 }
471 
RecordingAudioInitFile(void)472 static int32_t RecordingAudioInitFile(void)
473 {
474     if (g_file != NULL) {
475         AUDIO_FUNC_LOGE("the capture is recording, please stop first");
476         return HDF_FAILURE;
477     }
478     g_closeEnd = false;
479 
480     g_file = fopen(g_path, "wb+");
481     if (g_file == NULL) {
482         printf("capture failed to open '%s'\n", g_path);
483         return HDF_FAILURE;
484     }
485 
486     int32_t ret = fseek(g_file, WAV_HEAD_OFFSET, SEEK_SET);
487     if (ret != 0) {
488         printf("capture write wav file head error");
489         return HDF_FAILURE;
490     }
491 
492     char pathBuf[PATH_MAX] = {'\0'};
493     if (realpath(g_path, pathBuf) == NULL) {
494         AUDIO_FUNC_LOGE("realpath failed.");
495         return HDF_FAILURE;
496     }
497 
498     (void)memcpy_s(g_path, PATH_MAX, pathBuf, PATH_MAX);
499 
500     (void)chmod(g_path, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
501 
502     return HDF_SUCCESS;
503 }
504 
505 #ifndef AUDIO_FEATURE_COMMUNITY
UpdateAudioRoute(void)506 static int32_t UpdateAudioRoute(void)
507 {
508     struct AudioRouteNode source = {
509         .ext.device.type = PIN_IN_MIC,
510         .ext.device.desc = (char *)"pin_in_mic",
511         .ext.device.moduleId = 0,
512         .portId = 0,
513         .role = AUDIO_PORT_SOURCE_ROLE,
514         .type = AUDIO_PORT_DEVICE_TYPE,
515     };
516 
517     struct AudioRouteNode sink = {
518         .portId = 0,
519         .role = AUDIO_PORT_SINK_ROLE,
520         .type = AUDIO_PORT_MIX_TYPE,
521         .ext.mix.moduleId = 0,
522         .ext.mix.streamId = AUDIO_CAPTURE_STREAM_ID,
523         .ext.device.desc = (char *)"",
524     };
525 
526     struct AudioRoute route = {
527         .sources = &source,
528         .sourcesLen = AUDIO_ROUTE_NODE_LEN,
529         .sinks = &sink,
530         .sinksLen = AUDIO_ROUTE_NODE_LEN,
531     };
532 
533     int routeHandle = 0;
534     int32_t ret = g_adapter->UpdateAudioRoute(g_adapter, &route, &routeHandle);
535     if (ret < 0) {
536         AUDIO_FUNC_LOGE("UpdateAudioRoute failed");
537     }
538     return ret;
539 }
540 #endif
541 
RecordingAudioInitCapture(struct IAudioCapture ** captureTemp)542 static int32_t RecordingAudioInitCapture(struct IAudioCapture **captureTemp)
543 {
544     if (captureTemp == NULL) {
545         AUDIO_FUNC_LOGE("captureTemp is null");
546         return HDF_FAILURE;
547     }
548 
549     struct IAudioCapture *capture = NULL;
550     int32_t ret = g_adapter->CreateCapture(g_adapter, &g_devDesc, &g_attrs, &capture, &g_captureId);
551     if (capture == NULL || ret < 0) {
552         return HDF_FAILURE;
553     }
554 #ifndef AUDIO_FEATURE_COMMUNITY
555     if (UpdateAudioRoute() < 0) {
556         return HDF_FAILURE;
557     }
558 #endif
559 
560     ret = capture->Start((void *)capture);
561     if (ret < 0) {
562         g_adapter->DestroyCapture(g_adapter, g_captureId);
563         IAudioCaptureRelease(capture, g_isDirect);
564         return HDF_FAILURE;
565     }
566 
567     uint32_t bufferSize = PcmFramesToBytes(g_attrs);
568     g_frame = (char *)OsalMemCalloc(bufferSize);
569     if (g_frame == NULL) {
570         g_adapter->DestroyCapture(g_adapter, g_captureId);
571         IAudioCaptureRelease(capture, g_isDirect);
572         return HDF_FAILURE;
573     }
574     *captureTemp = capture;
575     return HDF_SUCCESS;
576 }
577 
StartButtonCapture(struct IAudioCapture ** captureS)578 static int32_t StartButtonCapture(struct IAudioCapture **captureS)
579 {
580     if (captureS == NULL || g_adapter == NULL || g_adapter->CreateCapture == NULL) {
581         return HDF_FAILURE;
582     }
583 
584     if (RecordingAudioInitFile() < 0) {
585         AUDIO_FUNC_LOGE("RecordingAudioInitFile Fail");
586         return HDF_FAILURE;
587     }
588 
589     int32_t recordModeFlag = 0;
590     if (SelectRecordMode(&recordModeFlag) < 0) {
591         AUDIO_FUNC_LOGE("SelectRecordMode Fail");
592         FileClose(&g_file);
593         return HDF_FAILURE;
594     }
595 
596     struct IAudioCapture *capture = NULL;
597     if (RecordingAudioInitCapture(&capture) < 0) {
598         AUDIO_FUNC_LOGE("PlayingAudioInitCapture Fail");
599         FileClose(&g_file);
600         return HDF_FAILURE;
601     }
602 
603     if (CaptureChoiceModeAndRecording(&g_str, capture, recordModeFlag) < 0) {
604         AUDIO_FUNC_LOGE("CaptureChoiceModeAndRecording failed");
605         FileClose(&g_file);
606         if (g_adapter != NULL && g_adapter->DestroyCapture != NULL) {
607             g_adapter->DestroyCapture(g_adapter, g_captureId);
608         }
609         IAudioCaptureRelease(capture, g_isDirect);
610         return HDF_FAILURE;
611     }
612     *captureS = capture;
613     printf("Start Successful\n");
614     return HDF_SUCCESS;
615 }
616 
SelectLoadingMode(void)617 static int32_t SelectLoadingMode(void)
618 {
619     system("clear");
620     int choice = 0;
621 
622     PrintLoadModeMenu();
623     printf("Please enter your choice: ");
624 
625     int32_t ret = CheckInputName(INPUT_INT, (void *)&choice);
626     if (ret < 0) {
627         return HDF_FAILURE;
628     }
629     switch (choice) {
630         case 1: // 1. Capture Passthrough Loading
631             g_isDirect = true;
632             break;
633         case 2: // 2. Capture IPC Loading
634             g_isDirect = false;
635             break;
636         default:
637             printf("Input error, Switched to direct loading in for you.\n");
638             SystemInputFail();
639             g_isDirect = true;
640             break;
641     }
642     return HDF_SUCCESS;
643 }
644 
SelectAudioInputType(void)645 static int32_t SelectAudioInputType(void)
646 {
647     system("clear");
648     int choice = 0;
649     g_voiceCallType = 0;
650 
651     PrintAudioInputTypeMenu();
652     printf("Please enter your choice: ");
653 
654     int32_t ret = CheckInputName(INPUT_INT, (void *)&choice);
655     if (ret < 0) {
656         return HDF_FAILURE;
657     }
658 
659     if ((choice >= 0) && (choice <= 7)) { // 7. the max value of audio input type
660         g_voiceCallType = 1 << choice;
661     }
662 
663     return HDF_SUCCESS;
664 }
665 
AudioAdapterDescriptorFree(struct AudioAdapterDescriptor * captureDataBlock,bool freeSelf)666 void AudioAdapterDescriptorFree(struct AudioAdapterDescriptor *captureDataBlock, bool freeSelf)
667 {
668     if (captureDataBlock == NULL) {
669         return;
670     }
671 
672     if (captureDataBlock->adapterName != NULL) {
673         OsalMemFree(captureDataBlock->adapterName);
674         captureDataBlock->adapterName = NULL;
675     }
676 
677     if (captureDataBlock->ports != NULL) {
678         OsalMemFree(captureDataBlock->ports);
679     }
680 
681     if (freeSelf) {
682         OsalMemFree(captureDataBlock);
683     }
684 }
685 
ReleaseAdapterDescs(struct AudioAdapterDescriptor ** descs,uint32_t descsLen)686 static void ReleaseAdapterDescs(struct AudioAdapterDescriptor **descs, uint32_t descsLen)
687 {
688     if (descsLen > 0 && descs != NULL && (*descs) != NULL) {
689         for (uint32_t i = 0; i < descsLen; i++) {
690             AudioAdapterDescriptorFree(&(*descs)[i], false);
691         }
692         OsalMemFree(*descs);
693         *descs = NULL;
694     }
695 }
696 
GetManagerAndLoadAdapter(struct AudioPort * capturePort)697 static int32_t GetManagerAndLoadAdapter(struct AudioPort *capturePort)
698 {
699     int32_t adapterIndex = 0;
700     uint32_t adapterNum = MAX_AUDIO_ADAPTER_DESC;
701 
702     if (capturePort == NULL) {
703         AUDIO_FUNC_LOGE("The Parameter is NULL");
704         return HDF_FAILURE;
705     }
706 
707     struct IAudioManager *audioManager = IAudioManagerGet(g_isDirect);
708     if (audioManager == NULL) {
709         AUDIO_FUNC_LOGE("Get audio Manager Fail");
710         return HDF_FAILURE;
711     }
712 
713     g_audioManager = audioManager;
714     struct AudioAdapterDescriptor *captureDescs = (struct AudioAdapterDescriptor *)OsalMemCalloc(
715         sizeof(struct AudioAdapterDescriptor) * (MAX_AUDIO_ADAPTER_DESC));
716     if (captureDescs == NULL) {
717         return HDF_FAILURE;
718     }
719     int32_t ret = audioManager->GetAllAdapters(audioManager, captureDescs, &adapterNum);
720     if (ret < 0 || adapterNum == 0) {
721         AUDIO_FUNC_LOGE("Get All Adapters Fail");
722         ReleaseAdapterDescs(&captureDescs, MAX_AUDIO_ADAPTER_DESC);
723         return HDF_ERR_NOT_SUPPORT;
724     }
725     if (SelectAudioCard(captureDescs, adapterNum, &adapterIndex) != HDF_SUCCESS) {
726         ReleaseAdapterDescs(&captureDescs, MAX_AUDIO_ADAPTER_DESC);
727         return HDF_ERR_NOT_SUPPORT;
728     }
729     if (strcpy_s(g_adapterName, PATH_LEN, captureDescs[adapterIndex - 1].adapterName) < 0) {
730         ReleaseAdapterDescs(&captureDescs, MAX_AUDIO_ADAPTER_DESC);
731         return HDF_ERR_NOT_SUPPORT;
732     }
733     if (SwitchAudioPort(&captureDescs[adapterIndex - 1], PORT_IN, capturePort) != HDF_SUCCESS) {
734         ReleaseAdapterDescs(&captureDescs, MAX_AUDIO_ADAPTER_DESC);
735         return HDF_ERR_NOT_SUPPORT;
736     }
737     if (audioManager->LoadAdapter(audioManager, &captureDescs[adapterIndex - 1], &g_adapter) != HDF_SUCCESS) {
738         AUDIO_FUNC_LOGE("Load Adapter Fail");
739         ReleaseAdapterDescs(&captureDescs, MAX_AUDIO_ADAPTER_DESC);
740         return HDF_ERR_NOT_SUPPORT;
741     }
742 
743     ReleaseAdapterDescs(&captureDescs, MAX_AUDIO_ADAPTER_DESC);
744 
745     return HDF_SUCCESS;
746 }
747 
InitCaptureParam(uint32_t portId)748 static int32_t InitCaptureParam(uint32_t portId)
749 {
750     if (g_adapter == NULL || g_adapter->InitAllPorts == NULL) {
751         AUDIO_FUNC_LOGE("g_adapter is NULL.");
752         return HDF_FAILURE;
753     }
754 
755     // Initialization port information, can fill through mode and other parameters
756     (void)g_adapter->InitAllPorts(g_adapter);
757 
758     // User needs to set
759     if (InitAttrsCapture(&g_attrs) < 0) {
760         AUDIO_FUNC_LOGE("InitDevDescCapture failed.");
761         return HDF_FAILURE;
762     }
763 
764     // Specify a hardware device
765     if (InitDevDescCapture(&g_devDesc, portId) < 0) {
766         AUDIO_FUNC_LOGE("InitDevDescCapture failed.");
767         return HDF_FAILURE;
768     }
769     return HDF_SUCCESS;
770 }
771 
CaptureGetAdapterAndInitEnvParams(void)772 static int32_t CaptureGetAdapterAndInitEnvParams(void)
773 {
774     struct AudioPort capturePort;
775 
776     int32_t ret = GetManagerAndLoadAdapter(&capturePort);
777     if (ret < 0) {
778         return ret;
779     }
780 
781     if (InitCaptureParam(capturePort.portId) < 0) {
782         g_audioManager->UnloadAdapter(g_audioManager, g_adapterName);
783         IAudioAdapterRelease(g_adapter, g_isDirect);
784         g_adapter = NULL;
785         return HDF_FAILURE;
786     }
787     return HDF_SUCCESS;
788 }
789 
InitParam(void)790 static int32_t InitParam(void)
791 {
792     if (SelectLoadingMode() < 0) {
793         AUDIO_FUNC_LOGE("SelectLoadingMode failed!");
794         return HDF_FAILURE;
795     }
796 
797     if (SelectAudioInputType() < 0) {
798         AUDIO_FUNC_LOGE("SelectAudioInputType failed!");
799         return HDF_FAILURE;
800     }
801 
802     if (CaptureGetAdapterAndInitEnvParams() < 0) {
803         AUDIO_FUNC_LOGE("GetCaptureProxyManagerFunc Fail");
804         if (g_audioManager != NULL) {
805             IAudioManagerRelease(g_audioManager, g_isDirect);
806             g_audioManager = NULL;
807         }
808         return HDF_FAILURE;
809     }
810     return HDF_SUCCESS;
811 }
812 
SetCaptureMute(struct IAudioCapture ** capture)813 static int32_t SetCaptureMute(struct IAudioCapture **capture)
814 {
815     (void)capture;
816     int32_t val = 0;
817     bool isMute = false;
818     if (g_capture == NULL || g_capture->GetMute == NULL) {
819         return HDF_FAILURE;
820     }
821 
822     int32_t ret = g_capture->GetMute((void *)g_capture, &isMute);
823     if (ret < 0) {
824         AUDIO_FUNC_LOGE("The current mute state was not obtained!");
825     }
826 
827     printf("Now %s ,Do you need to set mute status(1/0):\n", isMute ? "mute" : "not mute");
828 
829     ret = CheckInputName(INPUT_INT, (void *)&val);
830     if (ret < 0) {
831         AUDIO_FUNC_LOGE("CheckInputName failed!");
832         return HDF_FAILURE;
833     }
834 
835     if (g_capture == NULL || g_capture->SetMute == NULL) {
836         AUDIO_FUNC_LOGE("Record already complete,Please record againand,");
837         SystemInputFail();
838         return HDF_FAILURE;
839     }
840 
841     if (val == 1) {
842         ret = g_capture->SetMute((void *)g_capture, !isMute);
843     }
844     return ret;
845 }
846 
SetCaptureVolume(struct IAudioCapture ** capture)847 static int32_t SetCaptureVolume(struct IAudioCapture **capture)
848 {
849     (void)capture;
850     float val = 0.5;
851     if (g_capture == NULL || g_capture->GetVolume == NULL) {
852         return HDF_FAILURE;
853     }
854 
855     int32_t ret = g_capture->GetVolume((void *)g_capture, &val);
856     if (ret < 0) {
857         AUDIO_FUNC_LOGE("Get current volume failed,");
858         SystemInputFail();
859         return ret;
860     }
861 
862     printf("Now the volume is %f ,Please enter the volume value you want to set (0.0-1.0):\n", val);
863 
864     ret = CheckInputName(INPUT_FLOAT, (void *)&val);
865     if (ret < 0) {
866         return HDF_FAILURE;
867     }
868 
869     if (val < 0.0 || val > 1.0) {
870         AUDIO_FUNC_LOGE("Invalid volume value,");
871         SystemInputFail();
872         return HDF_FAILURE;
873     }
874 
875     if (g_capture == NULL || g_capture->SetVolume == NULL) {
876         AUDIO_FUNC_LOGE("Record already complete,Please record againand,");
877         SystemInputFail();
878         return HDF_FAILURE;
879     }
880 
881     ret = g_capture->SetVolume((void *)g_capture, val);
882     if (ret < 0) {
883         AUDIO_FUNC_LOGE("set volume fail,");
884         SystemInputFail();
885     }
886     return ret;
887 }
888 
SetCaptureGain(struct IAudioCapture ** capture)889 static int32_t SetCaptureGain(struct IAudioCapture **capture)
890 {
891     (void)capture;
892     float val = 1.0;
893 
894     if (g_capture == NULL || g_capture->GetGain == NULL) {
895         return HDF_FAILURE;
896     }
897 
898     int32_t ret = g_capture->GetGain((void *)g_capture, &val);
899     if (ret < 0) {
900         AUDIO_FUNC_LOGE("Get current gain failed,");
901         SystemInputFail();
902         return HDF_FAILURE;
903     }
904 
905     printf("Now the gain is %f, Please enter the gain value you want to set (0.0-15.0):\n", val);
906 
907     ret = CheckInputName(INPUT_FLOAT, (void *)&val);
908     if (ret < 0) {
909         return HDF_FAILURE;
910     }
911 
912     // gain is 0.0 ~ 15.0
913     if (val < 0.0 || val > 15.0) {
914         AUDIO_FUNC_LOGE("Invalid gain value,");
915         SystemInputFail();
916         return HDF_FAILURE;
917     }
918 
919     if (g_capture == NULL || g_capture->SetGain == NULL) {
920         AUDIO_FUNC_LOGE("Record already complete,Please record againand,");
921         SystemInputFail();
922         return HDF_FAILURE;
923     }
924 
925     ret = g_capture->SetGain((void *)g_capture, val);
926     if (ret < 0) {
927         AUDIO_FUNC_LOGE("Set capture gain failed,");
928         SystemInputFail();
929     }
930     return ret;
931 }
932 
SetCaptyrePause(struct IAudioCapture ** capture)933 static int32_t SetCaptyrePause(struct IAudioCapture **capture)
934 {
935     (void)capture;
936     int32_t ret;
937     if (g_capture == NULL || g_capture->Pause == NULL) {
938         return HDF_FAILURE;
939     }
940 
941     ret = g_capture->Pause((void *)g_capture);
942     if (ret != 0) {
943         return HDF_FAILURE;
944     }
945     return HDF_SUCCESS;
946 }
947 
SetCaptureResume(struct IAudioCapture ** capture)948 static int32_t SetCaptureResume(struct IAudioCapture **capture)
949 {
950     (void)capture;
951 
952     if (g_capture == NULL || g_capture->Resume == NULL) {
953         return HDF_FAILURE;
954     }
955 
956     if (g_capture->Resume((void *)g_capture) != 0) {
957         return HDF_FAILURE;
958     }
959     return HDF_SUCCESS;
960 }
961 
PrintAttributesFromat(void)962 static void PrintAttributesFromat(void)
963 {
964     printf(" ============= Capture Sample Attributes Fromat =============== \n");
965     printf("| 1. Capture AUDIO_FORMAT_TYPE_PCM_8_BIT                            |\n");
966     printf("| 2. Capture AUDIO_FORMAT_TYPE_PCM_16_BIT                           |\n");
967     printf("| 3. Capture AUDIO_FORMAT_TYPE_PCM_24_BIT                           |\n");
968     printf("| 4. Capture AUDIO_FORMAT_TYPE_PCM_32_BIT                           |\n");
969     printf(" ============================================================== \n");
970 }
971 
SelectAttributesFomat(uint32_t * fomat)972 static int32_t SelectAttributesFomat(uint32_t *fomat)
973 {
974     if (fomat == NULL) {
975         return HDF_FAILURE;
976     }
977 
978     int val = 0;
979 
980     PrintAttributesFromat();
981 
982     printf("Please select audio format,If not selected, the default is 16bit:");
983 
984     if (CheckInputName(INPUT_INT, (void *)&val) < 0) {
985         return HDF_FAILURE;
986     }
987     switch (val) {
988         case AUDIO_FORMAT_TYPE_PCM_8_BIT:
989             *fomat = AUDIO_FORMAT_TYPE_PCM_8_BIT;
990             break;
991         case AUDIO_FORMAT_TYPE_PCM_16_BIT:
992             *fomat = AUDIO_FORMAT_TYPE_PCM_16_BIT;
993             break;
994         case AUDIO_FORMAT_TYPE_PCM_24_BIT:
995             *fomat = AUDIO_FORMAT_TYPE_PCM_24_BIT;
996             break;
997         case AUDIO_FORMAT_TYPE_PCM_32_BIT:
998             *fomat = AUDIO_FORMAT_TYPE_PCM_32_BIT;
999             break;
1000         default:
1001             *fomat = AUDIO_FORMAT_TYPE_PCM_16_BIT;
1002             break;
1003     }
1004     return HDF_SUCCESS;
1005 }
1006 
SetCaptureAttributes(struct IAudioCapture ** capture)1007 static int32_t SetCaptureAttributes(struct IAudioCapture **capture)
1008 {
1009     (void)capture;
1010 
1011     struct AudioSampleAttributes captureAttrs;
1012 
1013     if (g_capture == NULL || g_capture->GetSampleAttributes == NULL) {
1014         AUDIO_FUNC_LOGE("pointer is NULL");
1015         return HDF_FAILURE;
1016     }
1017 
1018     int32_t ret = g_capture->GetSampleAttributes((void *)g_capture, &captureAttrs);
1019     if (ret < 0) {
1020         AUDIO_FUNC_LOGE("GetCaptureAttributes failed\n");
1021     } else {
1022         printf("Current sample attributes:\n");
1023         printf("audioType is %u\nfomat is %u\nsampleRate is %u\nchannalCount is"
1024                "%u\nperiod is %u\nframesize is %u\nbigEndian is %u\nSignedData is %u\n",
1025             captureAttrs.type, captureAttrs.format, captureAttrs.sampleRate, captureAttrs.channelCount,
1026             captureAttrs.period, captureAttrs.frameSize, captureAttrs.isBigEndian, captureAttrs.isSignedData);
1027     }
1028 
1029     printf("Set Sample Attributes,");
1030 
1031     SystemInputFail();
1032 
1033     system("clear");
1034 
1035     printf("The sample attributes you want to set,Step by step, please.\n");
1036 
1037     ret = SelectAttributesFomat((uint32_t *)(&captureAttrs.format));
1038     if (ret < 0) {
1039         AUDIO_FUNC_LOGE("SetCaptureAttributes format failed");
1040         return HDF_FAILURE;
1041     }
1042 
1043     printf("\nPlease input sample rate(48000,44100,32000...):");
1044 
1045     ret = CheckInputName(INPUT_UINT32, (void *)(&captureAttrs.sampleRate));
1046     if (ret < 0) {
1047         return HDF_FAILURE;
1048     }
1049 
1050     printf("\nPlease input bigEndian(false=0/true=1):");
1051 
1052     ret = CheckInputName(INPUT_UINT32, (void *)(&captureAttrs.isBigEndian));
1053     if (ret < 0) {
1054         return HDF_FAILURE;
1055     }
1056     if (g_capture == NULL || g_capture->SetSampleAttributes == NULL) {
1057         AUDIO_FUNC_LOGE("Record already complete,Please record againand set the attrbutes,");
1058         SystemInputFail();
1059         return HDF_FAILURE;
1060     }
1061 
1062     ret = g_capture->SetSampleAttributes((void *)g_capture, &captureAttrs);
1063     if (ret < 0) {
1064         AUDIO_FUNC_LOGE("Set capture attributes failed,");
1065         SystemInputFail();
1066     }
1067     return ret;
1068 }
1069 
PrintCaptureSelectPin(struct AudioSceneDescriptor * scene)1070 static int32_t PrintCaptureSelectPin(struct AudioSceneDescriptor *scene)
1071 {
1072     system("clear");
1073     printf(" ==================== Select Pin =====================  \n");
1074     printf("| 0. MIC                                                |\n");
1075     printf("| 1. MIC HeadSet                                        |\n");
1076     printf(" =====================================================  \n");
1077 
1078     printf("Please input your choice:\n");
1079     int32_t val = 0;
1080     int32_t ret = CheckInputName(INPUT_INT, (void *)&val);
1081     if (ret < 0) {
1082         AUDIO_FUNC_LOGE("Invalid value!");
1083         SystemInputFail();
1084         return HDF_FAILURE;
1085     }
1086 
1087     if (val == 1) {
1088         scene->desc.pins = PIN_IN_HS_MIC;
1089     } else {
1090         scene->desc.pins = PIN_IN_MIC;
1091     }
1092 
1093     return HDF_SUCCESS;
1094 }
1095 
SelectSceneMenu(void)1096 static void SelectSceneMenu(void)
1097 {
1098     printf(" ====================  Select Scene ==================== \n");
1099     printf("0 is Midea.                                             |\n");
1100     printf("1 is Communication.                                     |\n");
1101     printf("2 is Voice-all.                                         |\n");
1102     printf(" ======================================================= \n");
1103 }
1104 
SelectCaptureScene(struct IAudioCapture ** capture)1105 static int32_t SelectCaptureScene(struct IAudioCapture **capture)
1106 {
1107     (void)capture;
1108     int32_t val = 0;
1109     struct AudioSceneDescriptor captureScene;
1110     system("clear");
1111     SelectSceneMenu();
1112     printf("Please input your choice:\n");
1113 
1114     int32_t ret = CheckInputName(INPUT_INT, (void *)&val);
1115     if (ret < 0) {
1116         AUDIO_FUNC_LOGE("Invalid value,");
1117         SystemInputFail();
1118         return HDF_FAILURE;
1119     }
1120 
1121     switch (val) {
1122         case AUDIO_IN_MEDIA:
1123             captureScene.scene.id = AUDIO_IN_MEDIA;
1124             break;
1125         case AUDIO_IN_COMMUNICATION:
1126             captureScene.scene.id = AUDIO_IN_COMMUNICATION;
1127             break;
1128         case AUDIO_IN_CALL - 1:
1129             captureScene.scene.id = AUDIO_IN_CALL;
1130             break;
1131         default:
1132             AUDIO_FUNC_LOGE("Select Scene invaild.");
1133             return HDF_FAILURE;
1134     }
1135     ret = PrintCaptureSelectPin(&captureScene);
1136     if (ret != HDF_SUCCESS) {
1137         AUDIO_FUNC_LOGE("Select pin failed");
1138         return HDF_FAILURE;
1139     }
1140 
1141     captureScene.desc.desc = "mic";
1142 
1143     if (g_capture == NULL || g_capture->SelectScene == NULL) {
1144         AUDIO_FUNC_LOGE("Record already stop,");
1145         SystemInputFail();
1146         return HDF_FAILURE;
1147     }
1148 
1149     ret = g_capture->SelectScene((void *)g_capture, &captureScene);
1150     if (ret < 0) {
1151         AUDIO_FUNC_LOGE("Select scene fail");
1152     }
1153     return ret;
1154 }
1155 
GetCaptureExtParams(struct IAudioCapture ** capture)1156 static int32_t GetCaptureExtParams(struct IAudioCapture **capture)
1157 {
1158     (void)capture;
1159     char keyValueList[BUFFER_LEN] = {0};
1160 
1161     if (g_capture == NULL || g_capture->GetExtraParams == NULL) {
1162         return HDF_FAILURE;
1163     }
1164 
1165     int32_t ret = g_capture->GetExtraParams((void *)g_capture, keyValueList, EXT_PARAMS_MAXLEN);
1166     if (ret < 0) {
1167         AUDIO_FUNC_LOGE("Get EXT params failed!");
1168         SystemInputFail();
1169         return HDF_FAILURE;
1170     }
1171     printf("keyValueList = %s\n", keyValueList);
1172     return HDF_SUCCESS;
1173 }
1174 
GetCaptureMmapPosition(struct IAudioCapture ** capture)1175 static int32_t GetCaptureMmapPosition(struct IAudioCapture **capture)
1176 {
1177     (void)capture;
1178 
1179     if (g_capture == NULL || g_capture->GetMmapPosition == NULL) {
1180         return HDF_FAILURE;
1181     }
1182 
1183     uint64_t frames = 0;
1184     struct AudioTimeStamp time;
1185     time.tvNSec = 0;
1186     time.tvSec = 0;
1187 
1188     int32_t ret = g_capture->GetMmapPosition((void *)g_capture, &frames, &time);
1189     if (ret < 0) {
1190         AUDIO_FUNC_LOGE("Get current Mmap frames Position failed!");
1191         SystemInputFail();
1192         return HDF_FAILURE;
1193     }
1194     printf("Now the Position is %" PRIu64 "\n", frames);
1195     SystemInputFail();
1196     return HDF_SUCCESS;
1197 }
1198 
PrintMenu2(void)1199 static void PrintMenu2(void)
1200 {
1201     printf(" ================== Play Capture Menu ================== \n");
1202     printf("| 1. Capture Start                                      |\n");
1203     printf("| 2. Capture Stop                                       |\n");
1204     printf("| 3. Capture Resume                                     |\n");
1205     printf("| 4. Capture Pause                                      |\n");
1206     printf("| 5. Capture SetVolume                                  |\n");
1207     printf("| 6. Capture SetGain                                    |\n");
1208     printf("| 7. Capture SetMute                                    |\n");
1209     printf("| 8. Capture SetAttributes                              |\n");
1210     printf("| 9. Capture SelectScene                                |\n");
1211     printf("| 10. Capture GetExtParams                              |\n");
1212     printf("| 11. Capture getMmapPosition                           |\n");
1213     printf("| 12.Exit                                               |\n");
1214     printf(" ======================================================= \n");
1215 }
1216 
1217 static struct ProcessCaptureMenuSwitchList g_processCaptureMenuSwitchList[] = {
1218     {CAPTURE_START,            StartButtonCapture    },
1219     {CAPTURE_STOP,             StopButtonCapture     },
1220     {CAPTURE_RESUME,           SetCaptureResume      },
1221     {CAPTURE_PAUSE,            SetCaptyrePause       },
1222     {SET_CAPTURE_VOLUME,       SetCaptureVolume      },
1223     {SET_CAPTURE_GAIN,         SetCaptureGain        },
1224     {SET_CAPTURE_MUTE,         SetCaptureMute        },
1225     {SET_CAPTURE_ATTRIBUTES,   SetCaptureAttributes  },
1226     {SET_CAPTURE_SLECET_SCENE, SelectCaptureScene    },
1227     {GET_CAPTURE_EXT_PARAMS,   GetCaptureExtParams   },
1228     {GET_CAPTURE_POSITION,     GetCaptureMmapPosition},
1229 };
1230 
ProcessMenu(int32_t choice)1231 static void ProcessMenu(int32_t choice)
1232 {
1233     if (choice == GET_CAPTURE_POSITION + 1) {
1234         return;
1235     }
1236 
1237     if (g_capture == NULL && choice != 1) {
1238         AUDIO_FUNC_LOGE("this capture already release,");
1239         SystemInputFail();
1240         return;
1241     }
1242 
1243     for (int32_t i = CAPTURE_START; i <= GET_CAPTURE_POSITION; ++i) {
1244         if ((choice == (int32_t)g_processCaptureMenuSwitchList[i - 1].cmd) &&
1245             (g_processCaptureMenuSwitchList[i - 1].operation != NULL)) {
1246             g_processCaptureMenuSwitchList[i - 1].operation(&g_capture);
1247         }
1248     }
1249 }
1250 
PrintMenu0(void)1251 static void PrintMenu0(void)
1252 {
1253     printf(" ============== Play Capture select ===========\n");
1254     printf("| 1. Capture Poll                             |\n");
1255     printf("| 2. Capture Interrupt                        |\n");
1256     printf(" ==============================================\n");
1257 }
1258 
Choice0(void)1259 static void Choice0(void)
1260 {
1261     int choice = 0;
1262 
1263     system("clear");
1264 
1265     PrintMenu0();
1266 
1267     printf("Please enter your choice:");
1268 
1269     int32_t ret = CheckInputName(INPUT_INT, (void *)&choice);
1270     if (ret < 0) {
1271         return;
1272     }
1273 
1274     switch (choice) {
1275         case CAPTURE_POLL:
1276             g_captureModeFlag = CAPTURE_POLL;
1277             break;
1278         case CAPTURE_INTERUPT:
1279             g_captureModeFlag = CAPTURE_INTERUPT;
1280             break;
1281         default:
1282             printf("Input error,Switched to Poll mode in for you,");
1283             SystemInputFail();
1284             break;
1285     }
1286     return;
1287 }
1288 
Choice(void)1289 static void Choice(void)
1290 {
1291     int32_t option = 0;
1292     while (option < GET_CAPTURE_POSITION + 1 && option >= 0) {
1293         system("clear");
1294         PrintMenu2();
1295         printf("your choice is:\n");
1296 
1297         int32_t ret = CheckInputName(INPUT_INT, (void *)&option);
1298         if (ret < 0) {
1299             continue;
1300         }
1301         if (option < CAPTURE_START || option > GET_CAPTURE_POSITION + 1) {
1302             printf("You input is wrong,");
1303             option = 0;
1304             SystemInputFail();
1305             continue;
1306         }
1307         ProcessMenu(option);
1308     }
1309 }
1310 
CheckAndOpenFile(int32_t argc,char const * argv[])1311 static int32_t CheckAndOpenFile(int32_t argc, char const *argv[])
1312 {
1313     if (argc < 2 || argv == NULL || argv[0] == NULL) { // The parameter number is not greater than 2
1314         printf("usage:[1]sample [2]/data/test.wav\n");
1315         return HDF_FAILURE;
1316     }
1317 
1318     if (argv[1] == NULL || strlen(argv[1]) == 0) {
1319         return HDF_FAILURE;
1320     }
1321 
1322     int32_t ret = strncpy_s(g_path, PATH_LEN - 1, argv[1], strlen(argv[1]) + 1);
1323     if (ret != 0) {
1324         AUDIO_FUNC_LOGE("copy fail");
1325         return HDF_FAILURE;
1326     }
1327 
1328     return HDF_SUCCESS;
1329 }
1330 
main(int32_t argc,char const * argv[])1331 int32_t main(int32_t argc, char const *argv[])
1332 {
1333     int32_t ret = CheckAndOpenFile(argc, argv);
1334     if (ret != HDF_SUCCESS) {
1335         return ret;
1336     }
1337 
1338     if (InitParam() < 0) { // init
1339         AUDIO_FUNC_LOGE("InitParam Fail");
1340         return HDF_FAILURE;
1341     }
1342     Choice0();
1343 
1344     Choice();
1345     if (g_capture != NULL && g_adapter != NULL) {
1346         StopButtonCapture(&g_capture);
1347     }
1348 
1349     if (g_audioManager != NULL && g_audioManager->UnloadAdapter != NULL) {
1350         g_audioManager->UnloadAdapter(g_audioManager, g_adapterName);
1351         IAudioAdapterRelease(g_adapter, g_isDirect);
1352         g_adapter = NULL;
1353         IAudioManagerRelease(g_audioManager, g_isDirect);
1354         g_audioManager = NULL;
1355     }
1356     printf("Record file path:%s\n", g_path);
1357     return 0;
1358 }
1359