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);
In short try calling speex_encode_int and speex_decode_int. The calls to speex_encode and speex_decode expects the data to be a floating point values. The data is passed by pointer and the compiler does not do the conversion. This is why you are getting the segfault on decode as the short is 16-bits and a standard float is 32-bits. Tom -----Original Message----- From: speex-dev-bounces@xiph.org [mailto:speex-dev-bounces@xiph.org]On Behalf Of David Stubbs Sent: Wednesday, February 09, 2005 7:44 AM To: speex-dev@xiph.org Subject: [Speex-dev] encoding speex, (insanity looming) 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); _______________________________________________ Speex-dev mailing list Speex-dev@xiph.org http://lists.xiph.org/mailman/listinfo/speex-dev
Hi Tom, Thanks for your reply, I'm having a few difficulty's following you advise. You mention that I should be calling 'speex_encoder_int' & 'speex_decoder_int', I'm having problems finding these functions in the speex header. I am currenlty calling speex_encoder_init & speex_decoder_init in my test code, I have repeated the relevent bits of the example bellow. My version of speex is 1.1.6. Thanks once again for your help, David. 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); On Wed, 9 Feb 2005 09:08:47 -0500, Tom Newbern <tnewbern@comcast.net> wrote:> In short try calling speex_encode_int and speex_decode_int. > > The calls to speex_encode and speex_decode expects the data to be a floating > point values. The data is passed by pointer and the compiler does not do > the conversion. This is why you are getting the segfault on decode as the > short is 16-bits and a standard float is 32-bits. > > Tom > > > -----Original Message----- > From: speex-dev-bounces@xiph.org [mailto:speex-dev-bounces@xiph.org]On > Behalf Of David Stubbs > Sent: Wednesday, February 09, 2005 7:44 AM > To: speex-dev@xiph.org > Subject: [Speex-dev] encoding speex, (insanity looming) > > 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); > _______________________________________________ > Speex-dev mailing list > Speex-dev@xiph.org > http://lists.xiph.org/mailman/listinfo/speex-dev > >