[Speex-dev] tgAudioCodec.zip

Jean-Marc Valin Jean-Marc.Valin at USherbrooke.ca
Tue Apr 26 18:38:49 PDT 2005


Hi Tom,

In order to trace the problem, I'd need the original file, the exact
encoding options and the whether Speex was build for float or
fixed-point.

Thanks,

	Jean-Marc

Le mardi 26 avril 2005 à 08:51 -0400, Tom Grandgent a écrit :
> I have (finally) posted my Speex wrapper classes.  They are at:
> http://www.grandgent.com/spx/tgAudioCodec.zip
> 
> I followed your recommendations and they worked fine with 1.1.0.  
> However, I'm still having the same problem with 1.1.7 that I had the 
> last time I tried to upgrade.  I'm using the same code with both versions, 
> except for calling speex_encode_int instead of speex_encode, and passing 
> ints to speex_preprocess instead of floats.
> 
> What happens is that the encoder gets into a bad state and everything 
> sounds garbled after that point.  I can restart the decoder, disable 
> the preprocessor, and the problem still exists, so I think the problem 
> is related to the encoder.  This problem might happen 2 minutes into a 
> stream or an hour, it seems random, but it's happened 3 times in about 
> 2-3 hours of testing, on both a 900MHz Athlon and a 2.8GHz P4.
> 
> This time, I've saved the decoder's output.  I'm hoping that if you 
> listen to it, you might have some idea of the problem.  It sounds like 
> the low half of the frequency spectrum is somewhat ok, but the high half 
> is totally messed up, getting 'frozen' on these weird sounds.  (I'm using 
> wideband 16kHz only.  VBR quality 6, not using Speex's VAD or DTX.)
> 
> You can hear the audio go from good to bad at 9 seconds into this clip.  
> At 32 seconds, I turn off the preprocessor and you can hear the weird 
> sounds still occurring.  Note that the loud noise is the background noise 
> always present on that PC.  The Speex denoiser does an amazing job. :)
> 
> I've made the audio clip available as WAV (1.4MB), OGG (211KB), 
> and SPX (75KB).  They all sound pretty much the same:
> 
> http://www.grandgent.com/spx/badenc.wav
> http://www.grandgent.com/spx/badenc.ogg
> http://www.grandgent.com/spx/badenc.spx
> 
> Any ideas would be greatly appreciated...
> 
> Tom
> 
> Jean-Marc Valin <Jean-Marc.Valin at USherbrooke.ca> wrote:
> > 
> > > Glad to hear there is a way now.  The problem I ran into predated that 
> > > feature though.  At some point, speex_preprocess got changed from 
> > > taking floats to ints.  Not a big deal for me, and I know it's part of 
> > > the unstable series, but it was a breaking change that I never knew 
> > > about until someone got compile errors with my class.
> > 
> > Yeah, I prefered to change it now, so that if the preprocessor is ever
> > converted to fixed-point I won't have to change it again or have two
> > versions of the functions like for encoding and decoding (float and
> > _int() version).
> > 
> > > I had tried to upgrade to a newer version of Speex myself, but I kept 
> > > getting weird problems where the decoder would flip out after awhile 
> > > (seemingly at random, and almost never on my PC), producing very loud 
> > > noise, and I'd have to restart the stream.  After some unsuccessful 
> > > debugging attempts I went back to the older version that has been very 
> > > solid for me.  I'm pretty sure the problem is on my end but I haven't 
> > > figured it out yet...
> > 
> > Would be nice if you did, just in case it's a problem with Speex.
> > Perhaps just tracking down when it happened could help.
> > 
> > > I thought it might be related to packing multiple frames together.  Can 
> > > you tell me if it's still ok to do speex_bits_init, call speex_encode 
> > > several times, then speex_bits_insert_terminator, then speex_bits_write + 
> > > speex_bits_destroy.  And then on the decoding side do speex_bits_init, 
> > > speex_bits_read_from, and loop on speex_decode until either it returns -1 
> > > or speex_bits_remaining returns <= 0?
> > 
> > Should be OK. Now, even just speex_bits_write() should even insert the
> > terminator for you. BTW, no need to init() and destroy(), you can just
> > just use reset(). As for speex_bits_remaining, it's not necessary
> > either, just the return value of speex_decode should be fine. If not, it
> > may be a bug (though I'd be surprised).
> > 
> > > Hmm, you and Ralph have convinced me to put it back online.  But I'll 
> > > have to review the code and strip out the application-specific stuff 
> > > I've added since then.  I suppose if I put a little more thought into 
> > > the instructions I include with it, things would probably be ok.  I 
> > > think I overreacted before anyway...
> > 
> > Good to hear :-)
> > 
> > 	Jean-Marc
> > 
> > -- 
> > Jean-Marc Valin <Jean-Marc.Valin at USherbrooke.ca>
> > Université de Sherbrooke 
> _______________________________________________
> Speex-dev mailing list
> Speex-dev at xiph.org
> http://lists.xiph.org/mailman/listinfo/speex-dev
> 
-- 
Jean-Marc Valin <Jean-Marc.Valin at USherbrooke.ca>
Université de Sherbrooke



More information about the Speex-dev mailing list