66 lines
1.8 KiB
C
66 lines
1.8 KiB
C
|
#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;
|
||
|
}
|