Initial import to Tizen
[profile/ivi/sphinxbase.git] / test / unit / test_ad / test_ad_copy.c
1 /* -*- c-basic-offset: 4 -*- */
2
3 #include "config.h"
4 #include "ad.h"
5 #include "cont_ad.h"
6 #include "ckd_alloc.h"
7 #include "byteorder.h"
8 #include "test_macros.h"
9
10 #include <stdio.h>
11
12 #ifndef WORDS_BIGENDIAN
13 #define WORDS_BIGENDIAN 0
14 #endif
15
16 int
17 main(int argc, char *argv[])
18 {
19     cont_ad_t *cont;
20     FILE *infp;
21     int16 buf[512];
22     int listening;
23     int k, n_calib_samp;
24     int16 *calib, *cptr;
25
26     TEST_ASSERT(infp = fopen(TESTDATADIR "/chan3.raw", "rb"));
27     TEST_ASSERT(cont = cont_ad_init(NULL, NULL));
28
29     n_calib_samp = cont_ad_calib_size(cont);
30     calib = ckd_malloc(n_calib_samp * 2);
31     printf("Reading %d calibration samples\n", n_calib_samp);
32     TEST_ASSERT(fread(calib, 2, n_calib_samp, infp) == n_calib_samp);
33     printf("Calibrating...\n");
34     TEST_EQUAL(0, cont_ad_calib_loop(cont, calib, n_calib_samp));
35     printf("Calibrated!\n");
36
37     listening = FALSE;
38     cptr = calib;
39     while (1) {
40         /* Use up the calibration samples first. */
41         if (n_calib_samp) {
42             k = n_calib_samp;
43             if (k > 512)
44                 k = 512;
45             memcpy(buf, cptr, 512 * 2);
46             cptr += k;
47             n_calib_samp -= k;
48             if (k < 512)
49                 k = fread(buf + k, 2, 512-k, infp);
50         }
51         else {
52             k = fread(buf, 2, 512, infp);
53         }
54
55         /* End of file. */
56         if (k < 256) { /* FIXME: It should do something useful with fewer samples. */
57             if (listening) {
58                 printf("End of file at %.3f seconds\n",
59                        (double)(cont->read_ts - k) / 16000);
60             }
61             break;
62         }
63
64         k = cont_ad_read(cont, buf, k);
65
66         if (cont->state == CONT_AD_STATE_SIL) {
67             /* Has there been enough silence to cut the utterance? */
68             if (listening && cont->seglen > 8000) {
69                 printf("End of utterance at %.3f seconds\n",
70                        (double)(cont->read_ts - k - cont->seglen) / 16000);
71                 listening = FALSE;
72             }
73         }
74         else {
75             if (!listening) {
76                 printf("Start of utterance at %.3f seconds\n",
77                        (double)(cont->read_ts - k) / 16000);
78                 listening = TRUE;
79             }
80         }
81     }
82
83     ckd_free(calib);
84     cont_ad_close(cont);
85     fclose(infp);
86     return 0;
87 }