1 /*
2  * Copyright (C) 2015-2020 Alibaba Group Holding Limited
3  *
4  */
5 
6 #include <stdio.h>
7 #include <stdint.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <math.h>
11 
12 #include "uvoice_types.h"
13 #include "uvoice_recorder.h"
14 
15 #include "uvoice_os.h"
16 
17 
18 #define APP_LOGI(fmt, ...)    printf("%s: "fmt, __func__, ##__VA_ARGS__)
19 #define APP_LOGE(fmt, ...)    printf("%s: "fmt, __func__, ##__VA_ARGS__)
20 
21 
22 static uvoice_recorder_t *uvocrecorder;
23 static os_task_t record_task;
24 
25 static int rec_rate;
26 static int rec_channels;
27 static int rec_bits;
28 static int rec_frames;
29 static int rec_bitrate;
30 static char rec_sink[64];
31 
get_format_from_name(char * name,media_format_t * format)32 static int get_format_from_name(char *name, media_format_t *format)
33 {
34     if (!name || !format) {
35         APP_LOGE("arg null !\n");
36         return -1;
37     }
38 
39     if (strstr(name, ".mp3") || strstr(name, ".MP3"))
40         *format = MEDIA_FMT_MP3;
41     else if (strstr(name, ".wav") || strstr(name, ".WAV"))
42         *format = MEDIA_FMT_WAV;
43     else if (strstr(name, ".aac") || strstr(name, ".AAC"))
44         *format = MEDIA_FMT_AAC;
45     else if (strstr(name, ".m4a") || strstr(name, ".M4A"))
46         *format = MEDIA_FMT_M4A;
47     else if (strstr(name, ".pcm") || strstr(name, ".PCM"))
48         *format = MEDIA_FMT_PCM;
49     else if (strstr(name, ".spx") || strstr(name, ".SPX"))
50         *format = MEDIA_FMT_SPX;
51     else if (strstr(name, ".ogg") || strstr(name, ".OGG"))
52         *format = MEDIA_FMT_OGG;
53     else if (strstr(name, ".amrwb") || strstr(name, ".AMRWB"))
54         *format = MEDIA_FMT_AMRWB;
55     else if (strstr(name, ".amr") || strstr(name, ".AMR"))
56         *format = MEDIA_FMT_AMR;
57     else if (strstr(name, ".opus") || strstr(name, ".OPUS"))
58         *format = MEDIA_FMT_OPS;
59     else if (strstr(name, ".flac") || strstr(name, ".FLAC"))
60         *format = MEDIA_FMT_FLAC;
61 
62     return 0;
63 }
64 
record_to_file(void)65 static void record_to_file(void)
66 {
67     uvocrecorder->set_sink(MEDIA_FMT_UNKNOWN, rec_rate, rec_channels,
68         rec_bits, rec_frames, rec_bitrate, rec_sink);
69     uvocrecorder->start();
70     os_task_exit(NULL);
71 }
72 
uvoice_record_test(int argc,char ** argv)73 void uvoice_record_test(int argc, char **argv)
74 {
75     if (!uvocrecorder) {
76         uvocrecorder = uvoice_recorder_create();
77         if (!uvocrecorder) {
78             APP_LOGE("create media recorder failed !\n");
79             return;
80         }
81     }
82 
83     if (argc < 2 || strcmp(argv[0], "record"))
84         return;
85 
86     if (!strcmp(argv[1], "stop")) {
87         uvocrecorder->stop();
88     } else if (!strcmp(argv[1], "start")) {
89         uvocrecorder->start();
90     } else if (!strcmp(argv[1], "clear")) {
91         uvocrecorder->clr_sink();
92     } else if (!strcmp(argv[1], "progress")) {
93         int position = 0;
94         uvocrecorder->get_position(&position);
95         printf("progress: %d\n", position);
96     } else if (!strcmp(argv[1], "state")) {
97         recorder_state_t state = -1;
98         uvocrecorder->get_state(&state);
99         printf("state %d\n", state);
100     } else if (!strcmp(argv[1], "ns")) {
101         if (argc < 3)
102             return;
103         if (!strcmp(argv[2], "enable"))
104             uvocrecorder->ns_enable(1);
105         else if (!strcmp(argv[2], "disable"))
106             uvocrecorder->ns_enable(0);
107     } else if (!strcmp(argv[1], "ec")) {
108         if (argc < 3)
109             return;
110         if (!strcmp(argv[2], "enable"))
111             uvocrecorder->ec_enable(1);
112         else if (!strcmp(argv[2], "disable"))
113             uvocrecorder->ec_enable(0);
114     } else if (!strcmp(argv[1], "agc")) {
115         if (argc < 3)
116             return;
117         if (!strcmp(argv[2], "enable"))
118             uvocrecorder->agc_enable(1);
119         else if (!strcmp(argv[2], "disable"))
120             uvocrecorder->agc_enable(0);
121     } else if (!strcmp(argv[1], "vad")) {
122         if (argc < 3)
123             return;
124         if (!strcmp(argv[2], "enable"))
125             uvocrecorder->vad_enable(1);
126         else if (!strcmp(argv[2], "disable"))
127             uvocrecorder->vad_enable(0);
128     } else {
129         if (argc < 7)
130             return;
131         rec_rate = atoi(argv[1]);
132         rec_channels = atoi(argv[2]);
133         rec_bits = atoi(argv[3]);
134         rec_frames = atoi(argv[4]);
135         rec_bitrate = atoi(argv[5]);
136         memset(rec_sink, 0, sizeof(rec_sink));
137         snprintf(rec_sink, sizeof(rec_sink), "%s", argv[6]);
138 
139         os_task_create(&record_task,
140             "reord test task",
141             record_to_file, NULL, 4096, 0);
142     }
143 }
144 
145