blob: 2a502af42e451873195a5b5b5885175288916d13 [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 {
zhangzh8711cea2023-10-20 10:47:43 +0800146 Ql_Rxgain_Set(2);
liubin281ac462023-07-19 14:22:54 +0800147 if(-1 == Ql_AudPlayer_Play(play_hdl, databuf, size))
148 break;
149 }
150 printf("aplay Stream end \n");
151 }
152
153 close(fd);
154 break;
155 case 2:
156 if(0 == play_hdl)
157 continue;
158
159 fd = open(MBTK_AUD_DEMO_WAV, O_RDWR);
160 if (fd <= 0)
161 continue;
162
163 if(0 == MBTK_wav_pcm16Le_check(fd))
164 {
zhangzh8711cea2023-10-20 10:47:43 +0800165 Ql_Rxgain_Set(11);
liubin281ac462023-07-19 14:22:54 +0800166 Ql_AudPlayer_PlayFrmFile(play_hdl, fd, 0);
167 }
168 else
169 {
170 printf("aplay file type error\n");
171 }
172 close(fd);
173 break;
174 case 3:
175 if(0 == play_hdl)
176 continue;
177 Ql_AudPlayer_Close(play_hdl);
178 break;
179 case 4:
180 // aplay_thread(MBTK_AUD_DEMO_WAV);
181 Ql_Mp3_To_Play("/data/mp3demo.mp3", play_hdl, 0);
182 break;
183 default:
184 return;
185 }
186
187 sleep(1);
188 }
189
190 printf("aplay exit\n");
191 return ;
192}
193void arec(void)
194{
195 int ret;
196 char operator[10];
197 int opt;
198 int hdl = 0;
199
200 while(1)
201 {
202 printf("=======arec======\n"
203 "\t 0 Open PCM\n"
204 "\t 1 Start Record\n"
205 "\t 2 Get state\n"
206 "\t 3 Pause\n"
207 "\t 4 Resume\n"
208 "\t 5 Stop\n"
209 "\t 6 Close\n"
210 "\t others exit\n\n"
211 "operator >> ");
212
213 fflush(stdin);
214 fgets(operator, sizeof(operator), stdin);
215 opt = atoi(operator);
216 switch (opt)
217 {
218 case 0:
219 hdl = Ql_AudRecorder_Open(NULL, record_cb_func);
220 if (hdl == 0)
221 return ;
222 break;
223 case 1:
224 if(0 == hdl)
225 {
226 printf("audio is not initialized yet.\n");
227 continue;
228 }
229
230 if(0 != record_fd)
231 {
232 printf("audio It's already being recorded.\n");
233 continue;
234 }
235 record_fd = open(MBTK_AUD_DEMO_WAV, O_RDWR|O_CREAT|O_TRUNC, 0644);
236 if (record_fd <= 0)
237 printf("file open error\n");
238
239 if(0 == MBTK_wav_pcm16Le_set(record_fd))
240 {
241 ret = Ql_AudRecorder_StartRecord();
242 if(0 != ret)
243 {
244 printf("audio record error: %d\n", ret);
245 close(record_fd);
246 record_fd = 0;
247 }
248 }
249 else
250 {
251 printf("arec set file header error\n");
252 close(record_fd);
253 record_fd = 0;
254 }
255 break;
256 case 2:
257 // printf("arec state : %d\n", state);
258 break;
259 case 3:
260 break;
261 case 4:
262 break;
263 case 5:
264 break;
265 case 6:
266 Ql_AudRecorder_Close();
267 if(record_fd > 0)
268 {
269 close(record_fd);
270 record_fd = 0;
271 }
272 break;
273 default:
274 return;
275 }
276
277 sleep(1);
278 }
279
280 printf("arec exit\n");
281 return ;
282}
283int main(void)
284{
285 char operator[10];
286 int opt;
287
288 while(1)
289 {
290 printf("=========audio main=========\n"
291 "\t0 exit\n"
292 "\t1 aplay\n"
293 "\t2 arec\n"
294 "\t3 set speaker Volume\n"
295 "\t4 get speaker Volume\n"
296 "\t5 set mic Volume\n"
297 "\t6 get mic Volume\n"
298 "\t7 tts\n"
299 "\t8 tone\n"
300 "operator: >> ");
301
302 fgets(operator, sizeof(operator), stdin);
303 fflush(stdin);
304 opt = atoi(operator);
305 switch (opt)
306 {
307 case 0:
308 printf("main exit\n");
309 return 0;
310 case 1:
311 aplay();
312 break;
313 case 2:
314 arec();
315 break;
316 case 3:
317 mbtk_at_rec(NULL);
318 break;
319 case 4:
320 mbtk_at_play(NULL);
321 break;
322 case 5:
323 break;
324 case 6:
325 break;
326 case 7:
327 break;
328 case 8:
329 break;
330 default:
331 break;
332 }
333
334 sleep(1);
335 }
336
337 return 0;
338}