| #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 *inFile; |
| FILE *fin; |
| short in[FRAME_SIZE]; |
| float input[FRAME_SIZE]; |
| char cbits[200]; |
| int nbBytes; |
| /*Holds the state of the encoder*/ |
| void *state; |
| /*Holds bits so they can be read and written to by the Speex routines*/ |
| SpeexBits bits; |
| int i, tmp; |
| |
| /*Create a new encoder state in narrowband mode*/ |
| state = speex_encoder_init(&speex_nb_mode); |
| |
| /*Set the quality to 8 (15 kbps)*/ |
| tmp=8; |
| speex_encoder_ctl(state, SPEEX_SET_QUALITY, &tmp); |
| |
| inFile = argv[1]; |
| fin = fopen(inFile, "r"); |
| |
| /*Initialization of the structure that holds the bits*/ |
| speex_bits_init(&bits); |
| while (1) |
| { |
| /*Read a 16 bits/sample audio frame*/ |
| fread(in, sizeof(short), FRAME_SIZE, fin); |
| if (feof(fin)) |
| break; |
| /*Copy the 16 bits values to float so Speex can work on them*/ |
| for (i=0;i<FRAME_SIZE;i++) |
| input[i]=in[i]; |
| |
| /*Flush all the bits in the struct so we can encode a new frame*/ |
| speex_bits_reset(&bits); |
| |
| /*Encode the frame*/ |
| speex_encode(state, input, &bits); |
| /*Copy the bits to an array of char that can be written*/ |
| nbBytes = speex_bits_write(&bits, cbits, 200); |
| |
| /*Write the size of the frame first. This is what sampledec expects but |
| it's likely to be different in your own application*/ |
| fwrite(&nbBytes, sizeof(int), 1, stdout); |
| /*Write the compressed data*/ |
| fwrite(cbits, 1, nbBytes, stdout); |
| |
| } |
| |
| /*Destroy the encoder state*/ |
| speex_encoder_destroy(state); |
| /*Destroy the bit-packing struct*/ |
| speex_bits_destroy(&bits); |
| fclose(fin); |
| return 0; |
| } |