[Speex-dev] encoding speex, (insanity looming)
David Stubbs
stubbsd at gmail.com
Wed Feb 9 04:43:30 PST 2005
Hi All,
I'm very new to speex and in fact handling audio at all, it seems I have run
in to a problem I seem unable to fix. I'm trying to take audio from a microphone
using alsa, then encode it as speex and save to disk. I have been
wondering if it has something to do with endian type, but speexenc and
speexdec works fine.
Currently I have the following setup:
Platform: PowerPC (powerbook) running Linux (2.6)
Input stream: Signed 16bit Little endian, mono, PCM @ 16000Hz
if saved out 'as is' can be played with "aplay"
using the following command:
"aplay -c1 -r16000 -f S16_LE -t raw <fileame>"
Bellow is part of some test code that I have been trying to get to work,
I have removed some of the code to make it easyer to see. Any help would
be wonderful, think of it as an heroic act by saving me from a mental
break down. :)
Thanks,
David.
==== sample code ====
...
// encoder
void *enc_state;
SpeexBits enc_bits;
// decoder
void *dec_state;
SpeexBits dec_bits
// quaility and rate
int quality = 8, rate = 16000;
// setup encoder
speex_bits_init(&enc_bits);
enc_state = speex_encoder_init(&speex_wb_mode);
speex_encoder_ctl(enc_state, SPEEX_SET_QUALITY, &quality);
speex_encoder_ctl(enc_state, SPEEX_SET_SAMPLING_RATE, &rate);
// setup decoder
speex_bits_init(&dec_bits);
dec_state = speex_decoder_init(&speex_wb_mode);
speex_encoder_ctl(dec_state, SPEEX_SET_QUALITY, &quality);
speex_encoder_ctl(dec_state, SPEEX_SET_SAMPLING_RATE, &rate);
int file; // for the file to write.
// setup file for writing the encoded => decoded audio out to
if ((file= open64("test.spx.debug", O_WRONLY | O_CREAT, 0644)) == -1) {
perror("test.spx.debug");
exit(1);
}
...
// Note: This area is repeated in a for loop with "packet"
filled with 320
// pcm samples (320 shorts)
//
// short packet[320]; // packet size for wideband.
int nbytes, err;
char encoded_audio[320]; // buffer to store encoded audio from speex
short pcm_out[640]; // buffer of short to write decoded audio to disk.
// Note: Please see the note bellow about this as
// there seems something wrong, thought
// I could have set this to 320 not 640
// reset the encoder bits.
speex_bits_reset(&enc_bits);
// encode a frame
// Note: packet is a buffer of shorts containing 320 samples
// of pcm data (320 shorts).
speex_encode(enc_state, packet, enc_bits);
// write the chars from encoding to encoded_audio, read to write to disk
// althought we will not do so here,
nbytes = speex_bits_write(&enc_bits, encoded_audio, 320) ;
// read in the chars from the encoding process ready to decode
speex_bits_read_from(&dec_bits, encoded_audio, nbytes);
// decode the bits in to the array for short "pcm_out" ready for writing
// to disk.
// Note: I have noticed that if the array "pcm_out" is not 640 long then
// the app segfaults, this isn't what I would have expected as
// I thought that, using wideband you put in 320
samples (shorts)
// and that at the other end (this end) you got 320
back so I don't
// understand why it would segfault?
speex_decode(dec_state, &dec_bits, pcm_out);
// save the encoded data to a file
write(file, pcm_out, sizeof(short) * frame_size);
...
// clean up encoder
speex_bits_destroy(&enc_bits);
speex_encoder_destroy(&enc_state);
// clean up decoder
speex_bits_destroy(&dec_bits);
speex_encoder_destroy(&dec_state);
// close file
fsync(file);
close(file);
More information about the Speex-dev
mailing list