[Speex-dev] Audio Speed Variability

James Stanton jstanton at clairvista.com
Thu Oct 4 12:53:04 PDT 2007


I have a video conference like application that I've been working on for 
a while now, and a recent change is causing some odd problems, and I was 
wondering if anyone else had seen problems like this.  The issue I'm 
seeing is that when using the sound card for capture, the audio will 
eventually get about 1-2 seconds out of synch (delayed), from the 
video.  However, if I use USB devices for capture and playback, the 
delay disapears.  To make life more complex, using the sound card only 
causes the delay on some systems, but not all systems.  On my two main 
development boxes I see no problems with either USB or mini-jack on the 
soundboard, but on one of our other test machines only the USB works.  
It feels to me like it might be an audio clocking issue, but it could 
also be a speed of processing issue.  Has anyone seen this at all, and 
if so did anything help it?  Is there anything I can change in the speex 
codec to speed things up, in case it's a speed of processing issue?  I 
am seeing a fair number of problem records coming out of the speex 
jitter buffer, but they might just mean that data isn't being fed in 
fast enough into the buffer.  I'm checking:

speex_jitter_get(&speexJitter, (short *)newData, NULL);
if (speexJitter.valid_bits == 0) //bad record
{
fprintf(stderr, "Interpolating since nothing happened!!!!\n");
fflush(stderr);
}

Does this say I'm processing too slowly into the buffer, or that the 
data put in is somehow corrupt?
The application is Windows based, and I'm using DirectSound for capture 
and playback, specifically DirectSoundFullDuplexCreate8() with 
Notification Positions.  The RTP Library I'm using for transfer is 
JRTPLib 3.7.1, and I'm using the associated JThread 1.2.1 for .  I'm 
currently using Speex 1.1.12, in wideband mode with the speex jitter 
buffer, Quality is set to 8, and perceptual enhancement on.  The 
preprocessor state is being set as follows:

preprocessorState = speex_preprocess_state_init(320, 16000);  //640, 32000
    int denoise = 0;
    int agc = 0;
    int vad = 0;
    int dreverb = 0;
    float agcLevel = 8000;
    float dereverb_decay = .5f;
    float dereverb_level = .2f;
    speex_preprocess_ctl(preprocessorState, 
SPEEX_PREPROCESS_SET_DENOISE, &denoise);
    speex_preprocess_ctl(preprocessorState, SPEEX_PREPROCESS_SET_AGC, &agc);
    speex_preprocess_ctl(preprocessorState, SPEEX_PREPROCESS_SET_VAD, &vad);
    speex_preprocess_ctl(preprocessorState, 
SPEEX_PREPROCESS_SET_DEREVERB, &dreverb);
    speex_preprocess_ctl(preprocessorState, 
SPEEX_PREPROCESS_SET_DEREVERB_DECAY, &dereverb_decay);
    speex_preprocess_ctl(preprocessorState, 
SPEEX_PREPROCESS_SET_DEREVERB_LEVEL, &dereverb_level);
    speex_preprocess_ctl(preprocessorState, 
SPEEX_PREPROCESS_SET_AGC_LEVEL, &agcLevel);

Thank you for any input you might have!

Jamie Stanton





More information about the Speex-dev mailing list