oops. decoder must delete decoder...
[speexdsp.git] / doc / sampledec.c
1 #include <speex/speex.h>
2 #include <stdio.h>
3
4 /*The frame size in hardcoded for this sample code but it doesn't have to be*/
5 #define FRAME_SIZE 160
6 int main(int argc, char **argv)
7 {
8    char *outFile;
9    FILE *fout;
10    /*Holds the audio that will be written to file (16 bits per sample)*/
11    short out[FRAME_SIZE];
12    /*Speex handle samples as float, so we need an array of floats*/
13    float output[FRAME_SIZE];
14    char cbits[200];
15    int nbBytes;
16    /*Holds the state of the decoder*/
17    void *state;
18    /*Holds bits so they can be read and written to by the Speex routines*/
19    SpeexBits bits;
20    int i, tmp;
21
22    /*Create a new decoder state in narrowband mode*/
23    state = speex_decoder_init(&speex_nb_mode);
24
25    /*Set the perceptual enhancement on*/
26    tmp=1;
27    speex_decoder_ctl(state, SPEEX_SET_ENH, &tmp);
28
29    outFile = argv[1];
30    fout = fopen(outFile, "w");
31
32    /*Initialization of the structure that holds the bits*/
33    speex_bits_init(&bits);
34    while (1)
35    {
36       /*Read the size encoded by sampleenc, this part will likely be 
37         different in your application*/
38       fread(&nbBytes, sizeof(int), 1, stdin);
39       fprintf (stderr, "nbBytes: %d\n", nbBytes);
40       if (feof(stdin))
41          break;
42       
43       /*Read the "packet" encoded by sampleenc*/
44       fread(cbits, 1, nbBytes, stdin);
45       /*Copy the data into the bit-stream struct*/
46       speex_bits_read_from(&bits, cbits, nbBytes);
47
48       /*Decode the data*/
49       speex_decode(state, &bits, output);
50
51       /*Copy from float to short (16 bits) for output*/
52       for (i=0;i<FRAME_SIZE;i++)
53          out[i]=output[i];
54
55       /*Write the decoded audio to file*/
56       fwrite(out, sizeof(short), FRAME_SIZE, fout);
57    }
58    
59    /*Destroy the decoder state*/
60    speex_decoder_destroy(state);
61    /*Destroy the bit-stream truct*/
62    speex_bits_destroy(&bits);
63    fclose(fout);
64    return 0;
65 }