[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:

committato da
Jaroslav Kysela

parent
a9f00d8df2
commit
dddefd0d70
@@ -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);
|
||||
}
|
||||
}
|
||||
|
Fai riferimento in un nuovo problema
Block a user