| #include <speex/speex.h> | |
| #include <stdio.h> | |
| /*The frame size in hardcoded for this sample code but it doesn't have to be*/ | |
| #define FRAME_SIZE 160 | |
| int main(int argc, char **argv) | |
| { | |
| char *outFile; | |
| FILE *fout; | |
| /*Holds the audio that will be written to file (16 bits per sample)*/ | |
| short out[FRAME_SIZE]; | |
| /*Speex handle samples as float, so we need an array of floats*/ | |
| float output[FRAME_SIZE]; | |
| char cbits[200]; | |
| int nbBytes; | |
| /*Holds the state of the decoder*/ | |
| void *state; | |
| /*Holds bits so they can be read and written to by the Speex routines*/ | |
| SpeexBits bits; | |
| int i, tmp; | |
| /*Create a new decoder state in narrowband mode*/ | |
| state = speex_decoder_init(&speex_nb_mode); | |
| /*Set the perceptual enhancement on*/ | |
| tmp=1; | |
| speex_decoder_ctl(state, SPEEX_SET_ENH, &tmp); | |
| outFile = argv[1]; | |
| fout = fopen(outFile, "w"); | |
| /*Initialization of the structure that holds the bits*/ | |
| speex_bits_init(&bits); | |
| while (1) | |
| { | |
| /*Read the size encoded by sampleenc, this part will likely be | |
| different in your application*/ | |
| fread(&nbBytes, sizeof(int), 1, stdin); | |
| fprintf (stderr, "nbBytes: %d\n", nbBytes); | |
| if (feof(stdin)) | |
| break; | |
| /*Read the "packet" encoded by sampleenc*/ | |
| fread(cbits, 1, nbBytes, stdin); | |
| /*Copy the data into the bit-stream struct*/ | |
| speex_bits_read_from(&bits, cbits, nbBytes); | |
| /*Decode the data*/ | |
| speex_decode(state, &bits, output); | |
| /*Copy from float to short (16 bits) for output*/ | |
| for (i=0;i<FRAME_SIZE;i++) | |
| out[i]=output[i]; | |
| /*Write the decoded audio to file*/ | |
| fwrite(out, sizeof(short), FRAME_SIZE, fout); | |
| } | |
| /*Destroy the decoder state*/ | |
| speex_decoder_destroy(state); | |
| /*Destroy the bit-stream truct*/ | |
| speex_bits_destroy(&bits); | |
| fclose(fout); | |
| return 0; | |
| } |