blob: 3391a8403e7478bf69f6cc6d59831781151c1d50 [file] [log] [blame]
liubin281ac462023-07-19 14:22:54 +08001#include "mbtk_type.h"
2#include <fcntl.h>
3#include <stdint.h>
4#include <limits.h>
5#include <termios.h>
6#include <stdarg.h>
7// #include "ql_at.h"
8#include "ql/ql_audio.h"
9// #include "mopen_tts.h"
10
11#define MBTK_AUD_DEMO_WAV "/data/demo.wav"
12
13static int record_fd = 0;
14
15int Ql_cb_playback(int hdl, int result)
16{
17 printf("%s: hdl=%d, result=%d\n\r", __func__, hdl, result);
18 if (result == AUD_PLAYER_FINISHED || result == AUD_PLAYER_NODATA)
19 {
20 printf("%s: play finished\n\r", __func__);
21 }
22 return 0;
23}
24
25void record_cb_func(int cb_result, char* databuf, unsigned int len)
26{
27 int rc;
28
29 if(NULL != databuf && len > 0 && record_fd > 0)
30 {
31 //for debug:save into file
32 rc = write(record_fd, databuf, len);
33 if (rc < 0) {
34 printf("%s: error writing to file!\n", __FUNCTION__);
35 } else if (rc < len) {
36 printf("%s: wrote less the buffer size!\n", __FUNCTION__);
37 }
38 }
39}
40int MBTK_wav_pcm16Le_check(int fd)
41{
42 struct wav_header hdr;
43
44 if (fd <= 0)
45 return -1;
46
47 if (read(fd, &hdr, sizeof(hdr)) != sizeof(hdr))
48 {
49 printf("\n%s: cannot read header\n", __FUNCTION__);
50 return -1;
51 }
52
53 if ((hdr.riff_id != ID_RIFF)
54 || (hdr.riff_fmt != ID_WAVE)
55 || (hdr.fmt_id != ID_FMT))
56 {
57 printf("\n%s: is not a riff/wave file\n", __FUNCTION__);
58 return -1;
59 }
60
61 if ((hdr.audio_format != FORMAT_PCM) || (hdr.fmt_sz != 16)) {
62 printf("\n%s: is not pcm format\n", __FUNCTION__);
63 return -1;
64 }
65
66 if (hdr.bits_per_sample != 16) {
67 printf("\n%s: is not 16bit per sample\n", __FUNCTION__);
68 return -1;
69 }
70
71 return 0;
72}
73
74int MBTK_wav_pcm16Le_set(int fd)
75{
76 struct wav_header hdr;
77
78 if (fd <= 0)
79 return -1;
80
81 memset(&hdr, 0, sizeof(struct wav_header));
82
83 hdr.riff_id = ID_RIFF;
84 hdr.riff_fmt = ID_WAVE;
85 hdr.fmt_id = ID_FMT;
86 hdr.fmt_sz = 16;
87 hdr.audio_format = FORMAT_PCM;
88 hdr.num_channels = 1;
89 hdr.sample_rate = 8000;
90 hdr.bits_per_sample = 16;
91 hdr.byte_rate = (8000 * 1 * hdr.bits_per_sample) / 8;
92 hdr.block_align = (hdr.bits_per_sample * 1) / 8;
93 hdr.data_id = ID_DATA;
94 hdr.data_sz = 0;
95
96 hdr.riff_sz = hdr.data_sz + 44 - 8;
97 if (write(fd, &hdr, sizeof(hdr)) != sizeof(hdr)) {
98 return -1;
99 }
100
101 return 0;
102}
103void aplay(void)
104{
105 char operator[10];
106 char databuf[1024];
107 int opt = 0;
108 int fd = 0;
109 int size = 0;
110 int state;
111 int play_hdl = 0;
112
113 while(1)
114 {
115 printf("=========aplay========\n"
116 "\t 0 Open PCM\n"
117 "\t 1 Play Stream\n"
118 "\t 2 Play file\n"
119 "\t 3 Close\n"
120 "\t others exit\n\n"
121 "operator >> ");
122
123 fflush(stdin);
124 fgets(operator, sizeof(operator), stdin);
125 opt = atoi(operator);
126 switch (opt)
127 {
128 case 0:
129 play_hdl = Ql_AudPlayer_Open(NULL, Ql_cb_playback);
130 if(0 == play_hdl)
131 printf("Ql_AudPlayer_Open fail\n");
132 break;
133 case 1:
134 if(0 == play_hdl)
135 continue;
136
137 fd = open(MBTK_AUD_DEMO_WAV, O_RDWR);
138 if (fd <= 0)
139 continue;
140
141 if(0 == MBTK_wav_pcm16Le_check(fd))
142 {
143 memset(databuf, 0, sizeof(databuf));
144 while(0 < (size = read(fd, databuf, sizeof(databuf))))
145 {
146 if(-1 == Ql_AudPlayer_Play(play_hdl, databuf, size))
147 break;
148 }
149 printf("aplay Stream end \n");
150 }
151
152 close(fd);
153 break;
154 case 2:
155 if(0 == play_hdl)
156 continue;
157
158 fd = open(MBTK_AUD_DEMO_WAV, O_RDWR);
159 if (fd <= 0)
160 continue;
161
162 if(0 == MBTK_wav_pcm16Le_check(fd))
163 {
164 Ql_AudPlayer_PlayFrmFile(play_hdl, fd, 0);
165 }
166 else
167 {
168 printf("aplay file type error\n");
169 }
170 close(fd);
171 break;
172 case 3:
173 if(0 == play_hdl)
174 continue;
175 Ql_AudPlayer_Close(play_hdl);
176 break;
177 case 4:
178 // aplay_thread(MBTK_AUD_DEMO_WAV);
179 Ql_Mp3_To_Play("/data/mp3demo.mp3", play_hdl, 0);
180 break;
181 default:
182 return;
183 }
184
185 sleep(1);
186 }
187
188 printf("aplay exit\n");
189 return ;
190}
191void arec(void)
192{
193 int ret;
194 char operator[10];
195 int opt;
196 int hdl = 0;
197
198 while(1)
199 {
200 printf("=======arec======\n"
201 "\t 0 Open PCM\n"
202 "\t 1 Start Record\n"
203 "\t 2 Get state\n"
204 "\t 3 Pause\n"
205 "\t 4 Resume\n"
206 "\t 5 Stop\n"
207 "\t 6 Close\n"
208 "\t others exit\n\n"
209 "operator >> ");
210
211 fflush(stdin);
212 fgets(operator, sizeof(operator), stdin);
213 opt = atoi(operator);
214 switch (opt)
215 {
216 case 0:
217 hdl = Ql_AudRecorder_Open(NULL, record_cb_func);
218 if (hdl == 0)
219 return ;
220 break;
221 case 1:
222 if(0 == hdl)
223 {
224 printf("audio is not initialized yet.\n");
225 continue;
226 }
227
228 if(0 != record_fd)
229 {
230 printf("audio It's already being recorded.\n");
231 continue;
232 }
233 record_fd = open(MBTK_AUD_DEMO_WAV, O_RDWR|O_CREAT|O_TRUNC, 0644);
234 if (record_fd <= 0)
235 printf("file open error\n");
236
237 if(0 == MBTK_wav_pcm16Le_set(record_fd))
238 {
239 ret = Ql_AudRecorder_StartRecord();
240 if(0 != ret)
241 {
242 printf("audio record error: %d\n", ret);
243 close(record_fd);
244 record_fd = 0;
245 }
246 }
247 else
248 {
249 printf("arec set file header error\n");
250 close(record_fd);
251 record_fd = 0;
252 }
253 break;
254 case 2:
255 // printf("arec state : %d\n", state);
256 break;
257 case 3:
258 break;
259 case 4:
260 break;
261 case 5:
262 break;
263 case 6:
264 Ql_AudRecorder_Close();
265 if(record_fd > 0)
266 {
267 close(record_fd);
268 record_fd = 0;
269 }
270 break;
271 default:
272 return;
273 }
274
275 sleep(1);
276 }
277
278 printf("arec exit\n");
279 return ;
280}
281int main(void)
282{
283 char operator[10];
284 int opt;
285
286 while(1)
287 {
288 printf("=========audio main=========\n"
289 "\t0 exit\n"
290 "\t1 aplay\n"
291 "\t2 arec\n"
292 "\t3 set speaker Volume\n"
293 "\t4 get speaker Volume\n"
294 "\t5 set mic Volume\n"
295 "\t6 get mic Volume\n"
296 "\t7 tts\n"
297 "\t8 tone\n"
298 "operator: >> ");
299
300 fgets(operator, sizeof(operator), stdin);
301 fflush(stdin);
302 opt = atoi(operator);
303 switch (opt)
304 {
305 case 0:
306 printf("main exit\n");
307 return 0;
308 case 1:
309 aplay();
310 break;
311 case 2:
312 arec();
313 break;
314 case 3:
315 mbtk_at_rec(NULL);
316 break;
317 case 4:
318 mbtk_at_play(NULL);
319 break;
320 case 5:
321 break;
322 case 6:
323 break;
324 case 7:
325 break;
326 case 8:
327 break;
328 default:
329 break;
330 }
331
332 sleep(1);
333 }
334
335 return 0;
336}