65 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			65 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 *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; | ||
|  | } |