well, jaroslav's patch (to change the ESO value) was most of the solution. in the diff below, i have also cleaned up the spurious interrupt detection. with these two changes, i can run my trident with a configuration that previously caused endless xruns in full duplex mode (44.1kHz, 64 frame period) with no xruns at all.
jaroslav - if there are any parts of this patch you don't agree with, send me back a modified one and i'll test it again. i really hope that not all ALSA-supported h/w has issues like this. the ability to function correctly in full duplex mode is critical for all DAW software and much else besides. --p Index: trident.c =================================================================== RCS file: /cvsroot/alsa/alsa-driver/lowlevel/pci/trident.c,v retrieving revision 1.147 diff -c -u -p -r1.147 trident.c --- trident.c 2001/05/11 14:21:02 1.147 +++ trident.c 2001/12/05 03:24:31 @@ -982,7 +982,14 @@ static int snd_trident_capture_prepare(s // Set voice parameters voice->CSO = 0; - voice->ESO = (runtime->period_size * 2) - 1; /* in samples */ + + /* the +2 is a correction for a h/w problem. if not + used, the ESO interrupt is received before the capture pointer + has actually reached the ESO point. this causes errors in + the mid-level code. + */ + + voice->ESO = (runtime->period_size * 2) + 2 - 1; /* in samples */ voice->CTRL = snd_trident_control_mode(substream); voice->FMC = 3; voice->RVol = 0x7f; @@ -3337,19 +3344,20 @@ static void snd_trident_interrupt(int ir if ((chn_int & mask) == 0) continue; voice = &trident->synth.voices[channel]; - delta = (int)stimer - (int)voice->stimer; - if (delta > -32 && delta < 32) { - trident->spurious_irq_count++; + + if (voice->pcm && voice->substream) { + delta = (int)(stimer - voice->stimer); + voice->stimer = stimer; + if (delta < 0) delta = -delta; - if (trident->spurious_irq_max_delta < delta) - trident->spurious_irq_max_delta = delta; - if (delta < -20 || delta > 20) - snd_printk("spurious interrupt detected: stimer = 0x%x, voice->stimer = 0x%x, delta = %i\n", stimer, voice->stimer, delta); - continue; - } - voice->stimer = stimer; - if (voice->pcm && voice->substream) { + + if (delta < voice->substream->runtime->period_size - +32) { + trident->spurious_irq_count++; + if (delta > trident->spurious_irq_max_delta) + trident->spurious_irq_max_delta = +delta; + continue; + } spin_unlock(&trident->reg_lock); snd_pcm_period_elapsed(voice->substream); spin_lock(&trident->reg_lock); _______________________________________________ Alsa-devel mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-devel