Alsa-Devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox