[ALSA] [ML403-AC97CR] Fix capture/periodic overrun bug

We have to do fairly accurate counting of the minimal periods, instead
of being lazy and just setting the number to zero as soon as one period
elapses.

Signed-off-by: Joachim Foerster <JOFT@gmx.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Joachim Foerster
2007-11-05 15:48:36 +01:00
committato da Jaroslav Kysela
parent a9f00d8df2
commit dddefd0d70
2 ha cambiato i file con 4 aggiunte e 22 eliminazioni

Vedi File

@@ -403,7 +403,7 @@ snd_pcm_indirect2_playback_interrupt(struct snd_pcm_substream *substream,
rec->min_multiple);
rec->mul_elapsed++;
#endif
rec->min_periods = 0;
rec->min_periods = (rec->min_periods % rec->min_multiple);
snd_pcm_period_elapsed(substream);
}
}
@@ -568,24 +568,8 @@ snd_pcm_indirect2_capture_interrupt(struct snd_pcm_substream *substream,
rec->mul_elapsed_real += (rec->min_periods /
rec->min_multiple);
rec->mul_elapsed++;
if (!(rec->mul_elapsed % 4)) {
struct snd_pcm_runtime *runtime = substream->runtime;
unsigned int appl_ptr =
frames_to_bytes(runtime,
(unsigned int)runtime->control->
appl_ptr) % rec->sw_buffer_size;
int diff = rec->sw_data - appl_ptr;
if (diff < 0)
diff += rec->sw_buffer_size;
snd_printk(KERN_DEBUG
"STAT: mul_elapsed: %d, sw_data: %u, "
"appl_ptr (bytes): %u, diff: %d\n",
rec->mul_elapsed, rec->sw_data, appl_ptr,
diff);
}
#endif
rec->min_periods = 0;
rec->min_periods = (rec->min_periods % rec->min_multiple);
snd_pcm_period_elapsed(substream);
}
}