* [PATCH RFC] clumsy attempt at fixing rate plugin draining function
@ 2020-04-12 21:05 sylvain.bertrand
0 siblings, 0 replies; only message in thread
From: sylvain.bertrand @ 2020-04-12 21:05 UTC (permalink / raw)
To: alsa-devel
Hi,
This is related to github issue #41.
I don't know how to update last_commit_ptr properly.
Neither if it is consistent with the rate state (boundary, app_ptr, etc).
--
Sylvain
--- a/src/pcm/pcm_rate.c
+++ b/src/pcm/pcm_rate.c
@@ -1051,6 +1051,7 @@ static int snd_pcm_rate_drain(snd_pcm_t *pcm)
/* commit the remaining fraction (if any) */
snd_pcm_uframes_t size, ofs, saved_avail_min;
snd_pcm_sw_params_t sw_params;
+ int commit_err;
__snd_pcm_lock(pcm);
/* temporarily set avail_min to one */
@@ -1064,7 +1065,7 @@ static int snd_pcm_rate_drain(snd_pcm_t *pcm)
while (size > 0) {
snd_pcm_uframes_t psize, spsize;
int err;
-
+
err = __snd_pcm_wait_in_lock(rate->gen.slave, -1);
if (err < 0)
break;
@@ -1077,14 +1078,29 @@ static int snd_pcm_rate_drain(snd_pcm_t *pcm)
if (! spsize)
break;
}
- snd_pcm_rate_commit_area(pcm, rate, ofs,
+ commit_err = snd_pcm_rate_commit_area(pcm, rate, ofs,
psize, spsize);
+ if (commit_err == 1) {
+ rate->last_commit_ptr += psize;
+ if (rate->last_commit_ptr >= pcm->boundary)
+ rate->last_commit_ptr = 0;
+ } else if (commit_err == 0) {
+ if (pcm->mode & SND_PCM_NONBLOCK != 0) {
+ commit_err = -EAGAIN;
+ break;
+ }
+ continue;
+ } else
+ break;
+
ofs = (ofs + psize) % pcm->buffer_size;
size -= psize;
}
sw_params.avail_min = saved_avail_min;
snd_pcm_sw_params(rate->gen.slave, &sw_params);
__snd_pcm_unlock(pcm);
+ if (commit_err < 0)
+ return commit_err;
}
return snd_pcm_drain(rate->gen.slave);
}
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2020-04-12 21:06 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-04-12 21:05 [PATCH RFC] clumsy attempt at fixing rate plugin draining function sylvain.bertrand
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.