alsa/alsa-lib-rate-plugin-fix.diff

67 lines
2.3 KiB
Diff

# HG changeset patch
# User tiwai
# Date 1194865276 -3600
# Node ID 95e6e03f2e9d147a6f557de4e4f33d4f865502b8
# Parent 93f4991e860b4eb310183c3a73331ca209e8f2c9
Remove ugly hack in rate plugin poll_descriptors callback
The rate plugin has ugly hacks in poll_descriptors callback to adjust
avail_min when partial read/write occurs. This causes often unexpected
problems like XRUNs, especially with two-period cases.
Let's remove that beast, it's rather harmful than useful.
Signed-off-by: Stas Sergeev <stsp@aknet.ru>
diff -r 93f4991e860b -r 95e6e03f2e9d src/pcm/pcm_rate.c
--- a/src/pcm/pcm_rate.c Mon Nov 12 08:50:08 2007 +0100
+++ b/src/pcm/pcm_rate.c Mon Nov 12 12:01:16 2007 +0100
@@ -715,38 +715,6 @@ static snd_pcm_sframes_t snd_pcm_rate_fo
return n;
}
-static int snd_pcm_rate_poll_descriptors(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int space)
-{
- snd_pcm_rate_t *rate = pcm->private_data;
- snd_pcm_uframes_t avail_min;
- int ret, err;
-
- ret = snd_pcm_generic_poll_descriptors(pcm, pfds, space);
- if (ret < 0)
- return ret;
-
- avail_min = rate->appl_ptr % pcm->period_size;
- if (avail_min > 0) {
- recalc(pcm, &avail_min);
- if (avail_min < rate->gen.slave->buffer_size &&
- avail_min != rate->gen.slave->period_size)
- avail_min++; /* 1st small little rounding correction */
- if (avail_min < rate->gen.slave->buffer_size &&
- avail_min != rate->gen.slave->period_size)
- avail_min++; /* 2nd small little rounding correction */
- avail_min += rate->orig_avail_min;
- } else {
- avail_min = rate->orig_avail_min;
- }
- if (rate->sw_params.avail_min == avail_min)
- return ret;
- rate->sw_params.avail_min = avail_min;
- err = snd_pcm_sw_params(rate->gen.slave, &rate->sw_params);
- if (err < 0)
- return err;
- return ret;
-}
-
static int snd_pcm_rate_commit_area(snd_pcm_t *pcm, snd_pcm_rate_t *rate,
snd_pcm_uframes_t appl_offset,
snd_pcm_uframes_t size,
@@ -1229,7 +1197,7 @@ static snd_pcm_fast_ops_t snd_pcm_rate_f
.avail_update = snd_pcm_rate_avail_update,
.mmap_commit = snd_pcm_rate_mmap_commit,
.poll_descriptors_count = snd_pcm_generic_poll_descriptors_count,
- .poll_descriptors = snd_pcm_rate_poll_descriptors,
+ .poll_descriptors = snd_pcm_generic_poll_descriptors,
.poll_revents = snd_pcm_rate_poll_revents,
};