Mercurial > hg > audiostuff
comparison spandsp-0.0.3/spandsp-0.0.3/tests/adsi_tests.c @ 5:f762bf195c4b
import spandsp-0.0.3
author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
---|---|
date | Fri, 25 Jun 2010 16:00:21 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
4:26cd8f1ef0b1 | 5:f762bf195c4b |
---|---|
1 /* | |
2 * SpanDSP - a series of DSP components for telephony | |
3 * | |
4 * adsi_tests.c - tests for analogue display service handling. | |
5 * | |
6 * Written by Steve Underwood <steveu@coppice.org> | |
7 * | |
8 * Copyright (C) 2003 Steve Underwood | |
9 * | |
10 * All rights reserved. | |
11 * | |
12 * This program is free software; you can redistribute it and/or modify | |
13 * it under the terms of the GNU General Public License version 2, as | |
14 * published by the Free Software Foundation. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
24 * | |
25 * $Id: adsi_tests.c,v 1.28 2006/11/19 14:07:26 steveu Exp $ | |
26 */ | |
27 | |
28 /*! \page adsi_tests_page ADSI tests | |
29 \section adsi_tests_page_sec_1 What does it do? | |
30 These tests exercise the ADSI module, for all supported standards. A transmit | |
31 and a receive instance of the ADSI module are connected together. A quantity | |
32 of messages is passed between these instances, and checked for accuracy at | |
33 the receiver. Since the FSK modems used for this are exercised fully by other | |
34 tests, these tests do not include line modelling. | |
35 | |
36 \section adsi_tests_page_sec_2 How does it work? | |
37 */ | |
38 | |
39 #ifdef HAVE_CONFIG_H | |
40 #include "config.h" | |
41 #endif | |
42 | |
43 #include <inttypes.h> | |
44 #include <stdlib.h> | |
45 #include <stdio.h> | |
46 #include <string.h> | |
47 #include <strings.h> | |
48 #if defined(HAVE_TGMATH_H) | |
49 #include <tgmath.h> | |
50 #endif | |
51 #if defined(HAVE_MATH_H) | |
52 #include <math.h> | |
53 #endif | |
54 #include <assert.h> | |
55 #include <audiofile.h> | |
56 #include <tiffio.h> | |
57 | |
58 #include "spandsp.h" | |
59 | |
60 #define OUT_FILE_NAME "adsi.wav" | |
61 | |
62 #define BLOCK_LEN 160 | |
63 | |
64 char *decode_test_file = NULL; | |
65 | |
66 int errors = 0; | |
67 | |
68 adsi_rx_state_t rx_adsi; | |
69 adsi_tx_state_t tx_adsi; | |
70 | |
71 int current_standard = 0; | |
72 int good_message_received; | |
73 | |
74 int adsi_create_message(adsi_tx_state_t *s, uint8_t *msg); | |
75 | |
76 int adsi_create_message(adsi_tx_state_t *s, uint8_t *msg) | |
77 { | |
78 const char *t; | |
79 int len; | |
80 static int cycle = 0; | |
81 | |
82 len = 0; | |
83 switch (current_standard) | |
84 { | |
85 case ADSI_STANDARD_CLASS: | |
86 if (cycle > 3) | |
87 cycle = 0; | |
88 switch (cycle) | |
89 { | |
90 case 0: | |
91 len = adsi_add_field(s, msg, -1, CLASS_MDMF_CALLERID, NULL, 0); | |
92 /* Date and time as MMDDHHMM */ | |
93 len = adsi_add_field(s, msg, len, MCLASS_DATETIME, (uint8_t *) "10011750", 8); | |
94 len = adsi_add_field(s, msg, len, MCLASS_CALLER_NUMBER, (uint8_t *) "12345678", 8); | |
95 len = adsi_add_field(s, msg, len, MCLASS_DIALED_NUMBER, (uint8_t *) "87654321", 8); | |
96 len = adsi_add_field(s, msg, len, MCLASS_CALLER_NAME, (uint8_t *) "Chan Dai Man", 15); | |
97 break; | |
98 case 1: | |
99 len = adsi_add_field(s, msg, -1, CLASS_SDMF_MSG_WAITING, NULL, 0); | |
100 /* Active */ | |
101 len = adsi_add_field(s, msg, len, 0, (uint8_t *) "\x42", 1); | |
102 len = adsi_add_field(s, msg, len, 0, (uint8_t *) "\x42", 1); | |
103 len = adsi_add_field(s, msg, len, 0, (uint8_t *) "\x42", 1); | |
104 break; | |
105 case 2: | |
106 len = adsi_add_field(s, msg, -1, CLASS_SDMF_MSG_WAITING, NULL, 0); | |
107 /* Inactive */ | |
108 len = adsi_add_field(s, msg, len, 0, (uint8_t *) "\x6F", 1); | |
109 len = adsi_add_field(s, msg, len, 0, (uint8_t *) "\x6F", 1); | |
110 len = adsi_add_field(s, msg, len, 0, (uint8_t *) "\x6F", 1); | |
111 break; | |
112 case 3: | |
113 len = adsi_add_field(s, msg, -1, CLASS_SDMF_CALLERID, NULL, 0); | |
114 /* Date and time as MMDDHHMM */ | |
115 len = adsi_add_field(s, msg, len, 0, (uint8_t *) "10011750", 8); | |
116 len = adsi_add_field(s, msg, len, 0, (uint8_t *) "6095551212", 10); | |
117 break; | |
118 } | |
119 break; | |
120 case ADSI_STANDARD_CLIP: | |
121 if (cycle > 4) | |
122 cycle = 0; | |
123 switch (cycle) | |
124 { | |
125 case 0: | |
126 len = adsi_add_field(s, msg, -1, CLIP_MDMF_CALLERID, NULL, 0); | |
127 len = adsi_add_field(s, msg, len, CLIP_CALLTYPE, (uint8_t *) "\x81", 1); | |
128 /* Date and time as MMDDHHMM */ | |
129 len = adsi_add_field(s, msg, len, CLIP_DATETIME, (uint8_t *) "10011750", 8); | |
130 len = adsi_add_field(s, msg, len, CLIP_DIALED_NUMBER, (uint8_t *) "12345678", 8); | |
131 len = adsi_add_field(s, msg, len, CLIP_CALLER_NUMBER, (uint8_t *) "87654321", 8); | |
132 len = adsi_add_field(s, msg, len, CLIP_CALLER_NAME, (uint8_t *) "Chan Dai Man", 15); | |
133 break; | |
134 case 1: | |
135 len = adsi_add_field(s, msg, -1, CLIP_MDMF_MSG_WAITING, NULL, 0); | |
136 /* Inactive */ | |
137 len = adsi_add_field(s, msg, len, CLIP_VISUAL_INDICATOR, (uint8_t *) "\x00", 1); | |
138 break; | |
139 case 2: | |
140 len = adsi_add_field(s, msg, -1, CLIP_MDMF_MSG_WAITING, NULL, 0); | |
141 /* Active */ | |
142 len = adsi_add_field(s, msg, len, CLIP_VISUAL_INDICATOR, (uint8_t *) "\xFF", 1); | |
143 len = adsi_add_field(s, msg, len, CLIP_NUM_MSG, (uint8_t *) "\x05", 1); | |
144 break; | |
145 case 3: | |
146 len = adsi_add_field(s, msg, -1, CLIP_MDMF_SMS, NULL, 0); | |
147 /* Active */ | |
148 len = adsi_add_field(s, msg, len, CLIP_DISPLAY_INFO, (uint8_t *) "\x00" "ABC", 4); | |
149 break; | |
150 case 4: | |
151 len = adsi_add_field(s, msg, -1, CLIP_MDMF_CALLERID, NULL, 0); | |
152 len = adsi_add_field(s, msg, len, CLIP_NUM_MSG, (uint8_t *) "\x03", 1); | |
153 break; | |
154 } | |
155 break; | |
156 case ADSI_STANDARD_ACLIP: | |
157 if (cycle > 0) | |
158 cycle = 0; | |
159 switch (cycle) | |
160 { | |
161 case 0: | |
162 len = adsi_add_field(s, msg, -1, ACLIP_MDMF_CALLERID, NULL, 0); | |
163 /* Date and time as MMDDHHMM */ | |
164 len = adsi_add_field(s, msg, len, ACLIP_DATETIME, (uint8_t *) "10011750", 8); | |
165 len = adsi_add_field(s, msg, len, ACLIP_DIALED_NUMBER, (uint8_t *) "12345678", 8); | |
166 len = adsi_add_field(s, msg, len, ACLIP_CALLER_NUMBER, (uint8_t *) "87654321", 8); | |
167 len = adsi_add_field(s, msg, len, ACLIP_CALLER_NAME, (uint8_t *) "Chan Dai Man", 15); | |
168 break; | |
169 } | |
170 break; | |
171 case ADSI_STANDARD_JCLIP: | |
172 len = adsi_add_field(s, msg, -1, JCLIP_MDMF_CALLERID, NULL, 0); | |
173 len = adsi_add_field(s, msg, len, JCLIP_CALLER_NUMBER, (uint8_t *) "12345678", 8); | |
174 len = adsi_add_field(s, msg, len, JCLIP_CALLER_NUM_DES, (uint8_t *) "215", 3); | |
175 len = adsi_add_field(s, msg, len, JCLIP_DIALED_NUMBER, (uint8_t *) "87654321", 8); | |
176 len = adsi_add_field(s, msg, len, JCLIP_DIALED_NUM_DES, (uint8_t *) "215", 3); | |
177 break; | |
178 case ADSI_STANDARD_CLIP_DTMF: | |
179 len = adsi_add_field(s, msg, 0, CLIP_DTMF_CALLER_NUMBER, (uint8_t *) "12345678", 8); | |
180 break; | |
181 case ADSI_STANDARD_TDD: | |
182 t = "The quick Brown Fox Jumps Over The Lazy dog 0123456789!@#$%^&*()"; | |
183 len = adsi_add_field(s, msg, -1, 0, (uint8_t *) t, strlen(t)); | |
184 break; | |
185 } | |
186 cycle++; | |
187 return len; | |
188 } | |
189 /*- End of function --------------------------------------------------------*/ | |
190 | |
191 static void put_adsi_msg(void *user_data, const uint8_t *msg, int len) | |
192 { | |
193 int i; | |
194 int l; | |
195 uint8_t field_type; | |
196 const uint8_t *field_body; | |
197 int field_len; | |
198 int message_type; | |
199 uint8_t body[256]; | |
200 | |
201 printf("Good message received (%d bytes)\n", len); | |
202 good_message_received = TRUE; | |
203 for (i = 0; i < len; i++) | |
204 { | |
205 printf("%02x ", msg[i]); | |
206 if ((i & 0xf) == 0xf) | |
207 printf("\n"); | |
208 } | |
209 printf("\n"); | |
210 l = -1; | |
211 message_type = -1; | |
212 printf("Message breakdown\n"); | |
213 do | |
214 { | |
215 l = adsi_next_field(&rx_adsi, msg, len, l, &field_type, &field_body, &field_len); | |
216 if (l > 0) | |
217 { | |
218 if (field_body) | |
219 { | |
220 memcpy(body, field_body, field_len); | |
221 body[field_len] = '\0'; | |
222 printf("Field type 0x%x, len %d, '%s' - ", field_type, field_len, body); | |
223 switch (current_standard) | |
224 { | |
225 case ADSI_STANDARD_CLASS: | |
226 switch (message_type) | |
227 { | |
228 case CLASS_SDMF_CALLERID: | |
229 break; | |
230 case CLASS_MDMF_CALLERID: | |
231 switch (field_type) | |
232 { | |
233 case MCLASS_DATETIME: | |
234 printf("Date and time (MMDDHHMM)"); | |
235 break; | |
236 case MCLASS_CALLER_NUMBER: | |
237 printf("Caller's number"); | |
238 break; | |
239 case MCLASS_DIALED_NUMBER: | |
240 printf("Dialed number"); | |
241 break; | |
242 case MCLASS_ABSENCE1: | |
243 printf("Caller's number absent: 'O' or 'P'"); | |
244 break; | |
245 case MCLASS_REDIRECT: | |
246 printf("Call forward: universal ('0'), on busy ('1'), or on unanswered ('2')"); | |
247 break; | |
248 case MCLASS_QUALIFIER: | |
249 printf("Long distance: 'L'"); | |
250 break; | |
251 case MCLASS_CALLER_NAME: | |
252 printf("Caller's name"); | |
253 break; | |
254 case MCLASS_ABSENCE2: | |
255 printf("Caller's name absent: 'O' or 'P'"); | |
256 break; | |
257 } | |
258 break; | |
259 case CLASS_SDMF_MSG_WAITING: | |
260 break; | |
261 case CLASS_MDMF_MSG_WAITING: | |
262 switch (field_type) | |
263 { | |
264 case MCLASS_VISUAL_INDICATOR: | |
265 printf("Message waiting/not waiting"); | |
266 break; | |
267 } | |
268 break; | |
269 } | |
270 break; | |
271 case ADSI_STANDARD_CLIP: | |
272 switch (message_type) | |
273 { | |
274 case CLIP_MDMF_CALLERID: | |
275 case CLIP_MDMF_MSG_WAITING: | |
276 case CLIP_MDMF_CHARGE_INFO: | |
277 case CLIP_MDMF_SMS: | |
278 switch (field_type) | |
279 { | |
280 case CLIP_DATETIME: | |
281 printf("Date and time (MMDDHHMM)"); | |
282 break; | |
283 case CLIP_CALLER_NUMBER: | |
284 printf("Caller's number"); | |
285 break; | |
286 case CLIP_DIALED_NUMBER: | |
287 printf("Dialed number"); | |
288 break; | |
289 case CLIP_ABSENCE1: | |
290 printf("Caller's number absent"); | |
291 break; | |
292 case CLIP_CALLER_NAME: | |
293 printf("Caller's name"); | |
294 break; | |
295 case CLIP_ABSENCE2: | |
296 printf("Caller's name absent"); | |
297 break; | |
298 case CLIP_VISUAL_INDICATOR: | |
299 printf("Visual indicator"); | |
300 break; | |
301 case CLIP_MESSAGE_ID: | |
302 printf("Message ID"); | |
303 break; | |
304 case CLIP_CALLTYPE: | |
305 printf("Voice call, ring-back-when-free call, or msg waiting call"); | |
306 break; | |
307 case CLIP_NUM_MSG: | |
308 printf("Number of messages"); | |
309 break; | |
310 #if 0 | |
311 case CLIP_REDIR_NUMBER: | |
312 printf("Redirecting number"); | |
313 break; | |
314 #endif | |
315 case CLIP_CHARGE: | |
316 printf("Charge"); | |
317 break; | |
318 case CLIP_DURATION: | |
319 printf("Duration of the call"); | |
320 break; | |
321 case CLIP_ADD_CHARGE: | |
322 printf("Additional charge"); | |
323 break; | |
324 case CLIP_DISPLAY_INFO: | |
325 printf("Display information"); | |
326 break; | |
327 case CLIP_SERVICE_INFO: | |
328 printf("Service information"); | |
329 break; | |
330 } | |
331 break; | |
332 } | |
333 break; | |
334 case ADSI_STANDARD_ACLIP: | |
335 switch (message_type) | |
336 { | |
337 case ACLIP_SDMF_CALLERID: | |
338 break; | |
339 case ACLIP_MDMF_CALLERID: | |
340 switch (field_type) | |
341 { | |
342 case ACLIP_DATETIME: | |
343 printf("Date and time (MMDDHHMM)"); | |
344 break; | |
345 case ACLIP_CALLER_NUMBER: | |
346 printf("Caller's number"); | |
347 break; | |
348 case ACLIP_DIALED_NUMBER: | |
349 printf("Dialed number"); | |
350 break; | |
351 case ACLIP_ABSENCE1: | |
352 printf("Caller's number absent: 'O' or 'P'"); | |
353 break; | |
354 case ACLIP_REDIRECT: | |
355 printf("Call forward: universal, on busy, or on unanswered"); | |
356 break; | |
357 case ACLIP_QUALIFIER: | |
358 printf("Long distance call: 'L'"); | |
359 break; | |
360 case ACLIP_CALLER_NAME: | |
361 printf("Caller's name"); | |
362 break; | |
363 case ACLIP_ABSENCE2: | |
364 printf("Caller's name absent: 'O' or 'P'"); | |
365 break; | |
366 } | |
367 break; | |
368 } | |
369 break; | |
370 case ADSI_STANDARD_JCLIP: | |
371 switch (message_type) | |
372 { | |
373 case JCLIP_MDMF_CALLERID: | |
374 switch (field_type) | |
375 { | |
376 case JCLIP_CALLER_NUMBER: | |
377 printf("Caller's number"); | |
378 break; | |
379 case JCLIP_CALLER_NUM_DES: | |
380 printf("Caller's number data extension signal"); | |
381 break; | |
382 case JCLIP_DIALED_NUMBER: | |
383 printf("Dialed number"); | |
384 break; | |
385 case JCLIP_DIALED_NUM_DES: | |
386 printf("Dialed number data extension signal"); | |
387 break; | |
388 case JCLIP_ABSENCE: | |
389 printf("Caller's number absent: 'C', 'O', 'P' or 'S'"); | |
390 break; | |
391 } | |
392 break; | |
393 } | |
394 break; | |
395 case ADSI_STANDARD_CLIP_DTMF: | |
396 switch (message_type) | |
397 { | |
398 case CLIP_DTMF_CALLER_NUMBER: | |
399 printf("Caller's number"); | |
400 break; | |
401 case CLIP_DTMF_ABSENCE1: | |
402 printf("Caller's number absent: private (1), overseas (2) or not available (3)"); | |
403 break; | |
404 } | |
405 break; | |
406 case ADSI_STANDARD_TDD: | |
407 break; | |
408 } | |
409 } | |
410 else | |
411 { | |
412 printf("Message type 0x%x - ", field_type); | |
413 message_type = field_type; | |
414 switch (current_standard) | |
415 { | |
416 case ADSI_STANDARD_CLASS: | |
417 switch (message_type) | |
418 { | |
419 case CLASS_SDMF_CALLERID: | |
420 printf("Single data message caller ID"); | |
421 break; | |
422 case CLASS_MDMF_CALLERID: | |
423 printf("Multiple data message caller ID"); | |
424 break; | |
425 case CLASS_SDMF_MSG_WAITING: | |
426 printf("Single data message message waiting"); | |
427 break; | |
428 case CLASS_MDMF_MSG_WAITING: | |
429 printf("Multiple data message message waiting"); | |
430 break; | |
431 default: | |
432 printf("Unknown"); | |
433 break; | |
434 } | |
435 break; | |
436 case ADSI_STANDARD_CLIP: | |
437 switch (message_type) | |
438 { | |
439 case CLIP_MDMF_CALLERID: | |
440 printf("Multiple data message caller ID"); | |
441 break; | |
442 case CLIP_MDMF_MSG_WAITING: | |
443 printf("Multiple data message message waiting"); | |
444 break; | |
445 case CLIP_MDMF_CHARGE_INFO: | |
446 printf("Multiple data message charge info"); | |
447 break; | |
448 case CLIP_MDMF_SMS: | |
449 printf("Multiple data message SMS"); | |
450 break; | |
451 default: | |
452 printf("Unknown"); | |
453 break; | |
454 } | |
455 break; | |
456 case ADSI_STANDARD_ACLIP: | |
457 switch (message_type) | |
458 { | |
459 case ACLIP_SDMF_CALLERID: | |
460 printf("Single data message caller ID frame"); | |
461 break; | |
462 case ACLIP_MDMF_CALLERID: | |
463 printf("Multiple data message caller ID frame"); | |
464 break; | |
465 default: | |
466 printf("Unknown"); | |
467 break; | |
468 } | |
469 break; | |
470 case ADSI_STANDARD_JCLIP: | |
471 switch (message_type) | |
472 { | |
473 case JCLIP_MDMF_CALLERID: | |
474 printf("Multiple data message caller ID frame"); | |
475 break; | |
476 default: | |
477 printf("Unknown"); | |
478 break; | |
479 } | |
480 break; | |
481 case ADSI_STANDARD_CLIP_DTMF: | |
482 switch (message_type) | |
483 { | |
484 case CLIP_DTMF_CALLER_NUMBER: | |
485 printf("Caller's number"); | |
486 break; | |
487 case CLIP_DTMF_ABSENCE1: | |
488 printf("Caller's number absent"); | |
489 break; | |
490 default: | |
491 printf("Unknown"); | |
492 break; | |
493 } | |
494 break; | |
495 case ADSI_STANDARD_TDD: | |
496 printf("Unknown"); | |
497 break; | |
498 } | |
499 } | |
500 printf("\n"); | |
501 } | |
502 } | |
503 while (l > 0); | |
504 if (l < -1) | |
505 { | |
506 /* This message appears corrupt */ | |
507 printf("Bad message contents\n"); | |
508 exit(2); | |
509 } | |
510 printf("\n"); | |
511 } | |
512 /*- End of function --------------------------------------------------------*/ | |
513 | |
514 int main(int argc, char *argv[]) | |
515 { | |
516 int16_t amp[BLOCK_LEN]; | |
517 uint8_t adsi_msg[256 + 42]; | |
518 int adsi_msg_len; | |
519 AFfilehandle inhandle; | |
520 AFfilehandle outhandle; | |
521 AFfilesetup filesetup; | |
522 int outframes; | |
523 int len; | |
524 int i; | |
525 int j; | |
526 int push; | |
527 int log_audio; | |
528 | |
529 log_audio = FALSE; | |
530 decode_test_file = NULL; | |
531 current_standard = ADSI_STANDARD_CLASS; | |
532 for (i = 1; i < argc; i++) | |
533 { | |
534 if (strcmp(argv[i], "-d") == 0) | |
535 { | |
536 i++; | |
537 decode_test_file = argv[i]; | |
538 continue; | |
539 } | |
540 if (strcmp(argv[i], "-s") == 0) | |
541 { | |
542 i++; | |
543 if (strcasecmp("CLASS", argv[i]) == 0) | |
544 current_standard = ADSI_STANDARD_CLASS; | |
545 else if (strcasecmp("CLIP", argv[i]) == 0) | |
546 current_standard = ADSI_STANDARD_CLIP; | |
547 else if (strcasecmp("A-CLIP", argv[i]) == 0) | |
548 current_standard = ADSI_STANDARD_ACLIP; | |
549 else if (strcasecmp("J-CLIP", argv[i]) == 0) | |
550 current_standard = ADSI_STANDARD_JCLIP; | |
551 else if (strcasecmp("CLIP-DTMF", argv[i]) == 0) | |
552 current_standard = ADSI_STANDARD_CLIP_DTMF; | |
553 else if (strcasecmp("TDD", argv[i]) == 0) | |
554 current_standard = ADSI_STANDARD_TDD; | |
555 else | |
556 current_standard = atoi(argv[i]); | |
557 continue; | |
558 } | |
559 if (strcmp(argv[i], "-l") == 0) | |
560 { | |
561 log_audio = TRUE; | |
562 continue; | |
563 } | |
564 } | |
565 filesetup = AF_NULL_FILESETUP; | |
566 outhandle = AF_NULL_FILEHANDLE; | |
567 | |
568 #if 0 | |
569 /* This part tests internal static routines in the ADSI module. It can | |
570 only be run with a modified version of the ADSI module, which makes | |
571 the routines visible. */ | |
572 /* Check the character encode/decode cycle */ | |
573 current_standard = ADSI_STANDARD_TDD; | |
574 adsi_tx_init(&tx_adsi, ADSI_STANDARD_TDD); | |
575 adsi_rx_init(&rx_adsi, ADSI_STANDARD_TDD, put_adsi_msg, NULL); | |
576 s = "The quick Brown Fox Jumps Over The Lazy dog 0123456789!@#$%^&*()"; | |
577 while ((ch = *s++)) | |
578 { | |
579 xx = adsi_encode_baudot(&tx_adsi, ch); | |
580 if ((xx & 0x3E0)) | |
581 { | |
582 yy = adsi_decode_baudot(&rx_adsi, (xx >> 5) & 0x1F); | |
583 if (yy) | |
584 printf("%c", yy); | |
585 } | |
586 yy = adsi_decode_baudot(&rx_adsi, xx & 0x1F); | |
587 if (yy) | |
588 printf("%c", yy); | |
589 } | |
590 printf("\n"); | |
591 #endif | |
592 | |
593 if (decode_test_file) | |
594 { | |
595 /* We will decode the audio from a wave file. */ | |
596 if ((inhandle = afOpenFile(decode_test_file, "r", NULL)) == AF_NULL_FILEHANDLE) | |
597 { | |
598 fprintf(stderr, " Cannot open wave file '%s'\n", decode_test_file); | |
599 exit(2); | |
600 } | |
601 | |
602 adsi_rx_init(&rx_adsi, current_standard, put_adsi_msg, NULL); | |
603 span_log_set_level(&rx_adsi.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW); | |
604 span_log_set_tag(&rx_adsi.logging, "ADSI"); | |
605 for (;;) | |
606 { | |
607 len = afReadFrames(inhandle, | |
608 AF_DEFAULT_TRACK, | |
609 amp, | |
610 BLOCK_LEN); | |
611 if (len == 0) | |
612 break; | |
613 adsi_rx(&rx_adsi, amp, len); | |
614 } | |
615 if (afCloseFile(inhandle) != 0) | |
616 { | |
617 fprintf(stderr, " Cannot close wave file '%s'\n", decode_test_file); | |
618 exit(2); | |
619 } | |
620 } | |
621 else | |
622 { | |
623 if (log_audio) | |
624 { | |
625 if ((filesetup = afNewFileSetup()) == AF_NULL_FILESETUP) | |
626 { | |
627 fprintf(stderr, " Failed to create file setup\n"); | |
628 exit(2); | |
629 } | |
630 afInitSampleFormat(filesetup, AF_DEFAULT_TRACK, AF_SAMPFMT_TWOSCOMP, 16); | |
631 afInitRate(filesetup, AF_DEFAULT_TRACK, (float) SAMPLE_RATE); | |
632 afInitFileFormat(filesetup, AF_FILE_WAVE); | |
633 afInitChannels(filesetup, AF_DEFAULT_TRACK, 1); | |
634 | |
635 if ((outhandle = afOpenFile(OUT_FILE_NAME, "w", filesetup)) == AF_NULL_FILEHANDLE) | |
636 { | |
637 fprintf(stderr, " Cannot create wave file '%s'\n", OUT_FILE_NAME); | |
638 exit(2); | |
639 } | |
640 } | |
641 /* Go through all the standards */ | |
642 /* This assumes standard 0 is NULL, and TDD is the last in the list */ | |
643 for (j = 1; j <= ADSI_STANDARD_TDD; j++) | |
644 { | |
645 printf("Testing %s\n", adsi_standard_to_str(j)); | |
646 current_standard = j; | |
647 adsi_tx_init(&tx_adsi, j); | |
648 adsi_rx_init(&rx_adsi, j, put_adsi_msg, NULL); | |
649 | |
650 /* Fake an OK condition for the first message test */ | |
651 good_message_received = TRUE; | |
652 push = 0; | |
653 for (i = 0; i < 100000; i++) | |
654 { | |
655 if (push == 0) | |
656 { | |
657 if ((len = adsi_tx(&tx_adsi, amp, BLOCK_LEN)) == 0) | |
658 push = 10; | |
659 } | |
660 else | |
661 { | |
662 len = 0; | |
663 /* Push a little silence through, to flush things out */ | |
664 if (--push == 0) | |
665 { | |
666 if (!good_message_received) | |
667 { | |
668 printf("No message received %s (%d)\n", adsi_standard_to_str(j), i); | |
669 exit(2); | |
670 } | |
671 good_message_received = FALSE; | |
672 adsi_msg_len = adsi_create_message(&tx_adsi, adsi_msg); | |
673 adsi_msg_len = adsi_put_message(&tx_adsi, adsi_msg, adsi_msg_len); | |
674 } | |
675 } | |
676 if (len < BLOCK_LEN) | |
677 { | |
678 memset(&[len], 0, sizeof(int16_t)*(BLOCK_LEN - len)); | |
679 len = BLOCK_LEN; | |
680 } | |
681 if (log_audio) | |
682 { | |
683 outframes = afWriteFrames(outhandle, | |
684 AF_DEFAULT_TRACK, | |
685 amp, | |
686 len); | |
687 if (outframes != len) | |
688 { | |
689 fprintf(stderr, " Error writing wave file\n"); | |
690 exit(2); | |
691 } | |
692 } | |
693 adsi_rx(&rx_adsi, amp, len); | |
694 } | |
695 } | |
696 if (log_audio) | |
697 { | |
698 if (afCloseFile(outhandle) != 0) | |
699 { | |
700 fprintf(stderr, " Cannot close wave file '%s'\n", OUT_FILE_NAME); | |
701 exit(2); | |
702 } | |
703 afFreeFileSetup(filesetup); | |
704 } | |
705 } | |
706 | |
707 printf("Tests passed.\n"); | |
708 return 0; | |
709 } | |
710 /*- End of function --------------------------------------------------------*/ | |
711 /*- End of file ------------------------------------------------------------*/ |