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