Blame SOURCES/alsa-git.patch

4c4e16
From ad8c8e5503980295dd8e5e54a6285d2d7e32eb1e Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Thu, 22 Oct 2020 20:57:32 +0200
4c4e16
Subject: [PATCH 01/49] dlmisc: the snd_plugin_dir_set / snd_plugin_dir must be
4c4e16
 declared even for \!DL_ORIGIN_AVAILABLE
4c4e16
4c4e16
Fixes: 8580c081c2 ("dlsym: add support for ALSA_PLUGIN_DIR environment variable")
4c4e16
BugLink: https://github.com/alsa-project/alsa-lib/issues/91
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/dlmisc.c | 2 --
4c4e16
 1 file changed, 2 deletions(-)
4c4e16
4c4e16
diff --git a/src/dlmisc.c b/src/dlmisc.c
4c4e16
index c9517c55..f20eb593 100644
4c4e16
--- a/src/dlmisc.c
4c4e16
+++ b/src/dlmisc.c
4c4e16
@@ -42,11 +42,9 @@
4c4e16
 #ifndef PIC
4c4e16
 struct snd_dlsym_link *snd_dlsym_start = NULL;
4c4e16
 #endif
4c4e16
-#ifdef DL_ORIGIN_AVAILABLE
4c4e16
 static int snd_plugin_dir_set = 0;
4c4e16
 static char *snd_plugin_dir = NULL;
4c4e16
 #endif
4c4e16
-#endif
4c4e16
 
4c4e16
 #if defined(DL_ORIGIN_AVAILABLE) && defined(HAVE_LIBPTHREAD)
4c4e16
 static pthread_mutex_t snd_dlpath_mutex = PTHREAD_MUTEX_INITIALIZER;
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 1d993b37ab4e0b9b6e6b795d7be84ce97b29e20b Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Thu, 29 Oct 2020 20:31:19 +0100
4c4e16
Subject: [PATCH 02/49] dlmisc: fix snd_plugin_dir locking for not
4c4e16
 DL_ORIGIN_AVAILABLE
4c4e16
4c4e16
Fixes: 8580c081c2 ("dlsym: add support for ALSA_PLUGIN_DIR environment variable")
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/dlmisc.c | 4 +---
4c4e16
 1 file changed, 1 insertion(+), 3 deletions(-)
4c4e16
4c4e16
diff --git a/src/dlmisc.c b/src/dlmisc.c
4c4e16
index f20eb593..1dd91356 100644
4c4e16
--- a/src/dlmisc.c
4c4e16
+++ b/src/dlmisc.c
4c4e16
@@ -46,7 +46,7 @@ static int snd_plugin_dir_set = 0;
4c4e16
 static char *snd_plugin_dir = NULL;
4c4e16
 #endif
4c4e16
 
4c4e16
-#if defined(DL_ORIGIN_AVAILABLE) && defined(HAVE_LIBPTHREAD)
4c4e16
+#ifdef HAVE_LIBPTHREAD
4c4e16
 static pthread_mutex_t snd_dlpath_mutex = PTHREAD_MUTEX_INITIALIZER;
4c4e16
 
4c4e16
 static inline void snd_dlpath_lock(void)
4c4e16
@@ -440,12 +440,10 @@ void snd_dlobj_cache_cleanup(void)
4c4e16
 		free(c);
4c4e16
 	}
4c4e16
 	snd_dlobj_unlock();
4c4e16
-#ifdef DL_ORIGIN_AVAILABLE
4c4e16
 	snd_dlpath_lock();
4c4e16
 	snd_plugin_dir_set = 0;
4c4e16
 	free(snd_plugin_dir);
4c4e16
 	snd_plugin_dir = NULL;
4c4e16
 	snd_dlpath_unlock();
4c4e16
-#endif
4c4e16
 }
4c4e16
 #endif
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 2757191e3b85d491705b31c6ecca2dbd96d26ade Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Thu, 29 Oct 2020 20:34:17 +0100
4c4e16
Subject: [PATCH 03/49] pcm: snd_pcm_mmap_readi - fix typo in comment
4c4e16
4c4e16
\param size frames to be *read*
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_mmap.c | 2 +-
4c4e16
 1 file changed, 1 insertion(+), 1 deletion(-)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_mmap.c b/src/pcm/pcm_mmap.c
4c4e16
index 9600c383..9cbaae05 100644
4c4e16
--- a/src/pcm/pcm_mmap.c
4c4e16
+++ b/src/pcm/pcm_mmap.c
4c4e16
@@ -183,7 +183,7 @@ snd_pcm_sframes_t snd_pcm_mmap_writen(snd_pcm_t *pcm, void **bufs, snd_pcm_ufram
4c4e16
  * \brief Read interleaved frames from a PCM using direct buffer (mmap)
4c4e16
  * \param pcm PCM handle
4c4e16
  * \param buffer frames containing buffer
4c4e16
- * \param size frames to be written
4c4e16
+ * \param size frames to be read
4c4e16
  * \return a positive number of frames actually read otherwise a
4c4e16
  * negative error code
4c4e16
  * \retval -EBADFD PCM is not in the right state (#SND_PCM_STATE_PREPARED or #SND_PCM_STATE_RUNNING)
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 39bd0e1a5be3620f9123f7fe72ffa6cb7d463b21 Mon Sep 17 00:00:00 2001
4c4e16
From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
4c4e16
Date: Thu, 12 Nov 2020 10:29:38 -0600
4c4e16
Subject: [PATCH 04/49] topology: use inclusive language for bclk
4c4e16
4c4e16
use bclk_provider for structure fields, 'codec_provider' and
4c4e16
'codec_consumer' for options and modify #defines to use CP and CC
4c4e16
suffixes.
4c4e16
4c4e16
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
4c4e16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4c4e16
---
4c4e16
 include/sound/uapi/asoc.h | 11 +++++++----
4c4e16
 include/topology.h        |  2 +-
4c4e16
 src/topology/pcm.c        | 36 ++++++++++++++++++++++++++----------
4c4e16
 3 files changed, 34 insertions(+), 15 deletions(-)
4c4e16
4c4e16
diff --git a/include/sound/uapi/asoc.h b/include/sound/uapi/asoc.h
4c4e16
index 4efb4ec4..ceafb1a9 100644
4c4e16
--- a/include/sound/uapi/asoc.h
4c4e16
+++ b/include/sound/uapi/asoc.h
4c4e16
@@ -169,10 +169,13 @@
4c4e16
 #define SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP            (1 << 3)
4c4e16
 
4c4e16
 /* DAI topology BCLK parameter
4c4e16
- * For the backwards capability, by default codec is bclk master
4c4e16
+ * For the backwards capability, by default codec is bclk provider
4c4e16
  */
4c4e16
-#define SND_SOC_TPLG_BCLK_CM         0 /* codec is bclk master */
4c4e16
-#define SND_SOC_TPLG_BCLK_CS         1 /* codec is bclk slave */
4c4e16
+#define SND_SOC_TPLG_BCLK_CP         0 /* codec is bclk provider */
4c4e16
+#define SND_SOC_TPLG_BCLK_CC         1 /* codec is bclk consumer */
4c4e16
+/* keep previous definitions for compatibility */
4c4e16
+#define SND_SOC_TPLG_BCLK_CM         SND_SOC_TPLG_BCLK_CP
4c4e16
+#define SND_SOC_TPLG_BCLK_CS         SND_SOC_TPLG_BCLK_CC
4c4e16
 
4c4e16
 /* DAI topology FSYNC parameter
4c4e16
  * For the backwards capability, by default codec is fsync master
4c4e16
@@ -335,7 +338,7 @@ struct snd_soc_tplg_hw_config {
4c4e16
 	__u8 clock_gated;	/* SND_SOC_TPLG_DAI_CLK_GATE_ value */
4c4e16
 	__u8 invert_bclk;	/* 1 for inverted BCLK, 0 for normal */
4c4e16
 	__u8 invert_fsync;	/* 1 for inverted frame clock, 0 for normal */
4c4e16
-	__u8 bclk_master;	/* SND_SOC_TPLG_BCLK_ value */
4c4e16
+	__u8 bclk_provider;	/* SND_SOC_TPLG_BCLK_ value */
4c4e16
 	__u8 fsync_master;	/* SND_SOC_TPLG_FSYNC_ value */
4c4e16
 	__u8 mclk_direction;    /* SND_SOC_TPLG_MCLK_ value */
4c4e16
 	__le16 reserved;	/* for 32bit alignment */
4c4e16
diff --git a/include/topology.h b/include/topology.h
4c4e16
index 1f52e66e..6c970649 100644
4c4e16
--- a/include/topology.h
4c4e16
+++ b/include/topology.h
4c4e16
@@ -1028,7 +1028,7 @@ struct snd_tplg_hw_config_template {
4c4e16
 	unsigned char clock_gated;      /* SND_SOC_TPLG_DAI_CLK_GATE_ value */
4c4e16
 	unsigned char  invert_bclk;     /* 1 for inverted BCLK, 0 for normal */
4c4e16
 	unsigned char  invert_fsync;    /* 1 for inverted frame clock, 0 for normal */
4c4e16
-	unsigned char  bclk_master;     /* SND_SOC_TPLG_BCLK_ value */
4c4e16
+	unsigned char  bclk_provider;   /* SND_SOC_TPLG_BCLK_ value */
4c4e16
 	unsigned char  fsync_master;    /* SND_SOC_TPLG_FSYNC_ value */
4c4e16
 	unsigned char  mclk_direction;  /* SND_SOC_TPLG_MCLK_ value */
4c4e16
 	unsigned short reserved;        /* for 32bit alignment */
4c4e16
diff --git a/src/topology/pcm.c b/src/topology/pcm.c
4c4e16
index 191b7a0a..f05df348 100644
4c4e16
--- a/src/topology/pcm.c
4c4e16
+++ b/src/topology/pcm.c
4c4e16
@@ -1411,6 +1411,7 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
4c4e16
 	snd_config_t *n;
4c4e16
 	const char *id, *val = NULL;
4c4e16
 	int ret, ival;
4c4e16
+	bool provider_legacy;
4c4e16
 
4c4e16
 	elem = tplg_elem_new_common(tplg, cfg, NULL, SND_TPLG_TYPE_HW_CONFIG);
4c4e16
 	if (!elem)
4c4e16
@@ -1451,8 +1452,15 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
4c4e16
 			continue;
4c4e16
 		}
4c4e16
 
4c4e16
-		if (strcmp(id, "bclk") == 0 ||
4c4e16
-		    strcmp(id, "bclk_master") == 0) {
4c4e16
+		provider_legacy = false;
4c4e16
+		if (strcmp(id, "bclk_master") == 0) {
4c4e16
+			SNDERR("deprecated option %s, please use 'bclk'\n", id);
4c4e16
+			provider_legacy = true;
4c4e16
+		}
4c4e16
+
4c4e16
+		if (provider_legacy ||
4c4e16
+		    strcmp(id, "bclk") == 0) {
4c4e16
+
4c4e16
 			if (snd_config_get_string(n, &val) < 0)
4c4e16
 				return -EINVAL;
4c4e16
 
4c4e16
@@ -1462,11 +1470,19 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
4c4e16
 				 */
4c4e16
 				SNDERR("deprecated bclk value '%s'", val);
4c4e16
 
4c4e16
-				hw_cfg->bclk_master = SND_SOC_TPLG_BCLK_CS;
4c4e16
+				hw_cfg->bclk_provider = SND_SOC_TPLG_BCLK_CC;
4c4e16
 			} else if (!strcmp(val, "codec_slave")) {
4c4e16
-				hw_cfg->bclk_master = SND_SOC_TPLG_BCLK_CS;
4c4e16
+				SNDERR("deprecated bclk value '%s', use 'codec_consumer'", val);
4c4e16
+
4c4e16
+				hw_cfg->bclk_provider = SND_SOC_TPLG_BCLK_CC;
4c4e16
+			} else if (!strcmp(val, "codec_consumer")) {
4c4e16
+				hw_cfg->bclk_provider = SND_SOC_TPLG_BCLK_CC;
4c4e16
 			} else if (!strcmp(val, "codec_master")) {
4c4e16
-				hw_cfg->bclk_master = SND_SOC_TPLG_BCLK_CM;
4c4e16
+				SNDERR("deprecated bclk value '%s', use 'codec_provider", val);
4c4e16
+
4c4e16
+				hw_cfg->bclk_provider = SND_SOC_TPLG_BCLK_CP;
4c4e16
+			} else if (!strcmp(val, "codec_provider")) {
4c4e16
+				hw_cfg->bclk_provider = SND_SOC_TPLG_BCLK_CP;
4c4e16
 			}
4c4e16
 			continue;
4c4e16
 		}
4c4e16
@@ -1623,10 +1639,10 @@ int tplg_save_hw_config(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
4c4e16
 	if (err >= 0 && hc->fmt)
4c4e16
 		err = tplg_save_printf(dst, pfx, "\tformat '%s'\n",
4c4e16
 				       get_audio_hw_format_name(hc->fmt));
4c4e16
-	if (err >= 0 && hc->bclk_master)
4c4e16
+	if (err >= 0 && hc->bclk_provider)
4c4e16
 		err = tplg_save_printf(dst, pfx, "\tbclk '%s'\n",
4c4e16
-				       hc->bclk_master == SND_SOC_TPLG_BCLK_CS ?
4c4e16
-						"codec_slave" : "codec_master");
4c4e16
+				       hc->bclk_provider == SND_SOC_TPLG_BCLK_CC ?
4c4e16
+						"codec_consumer" : "codec_provider");
4c4e16
 	if (err >= 0 && hc->bclk_rate)
4c4e16
 		err = tplg_save_printf(dst, pfx, "\tbclk_freq %u\n",
4c4e16
 				       hc->bclk_rate);
4c4e16
@@ -1791,7 +1807,7 @@ static int set_link_hw_config(struct snd_soc_tplg_hw_config *cfg,
4c4e16
 	cfg->clock_gated = tpl->clock_gated;
4c4e16
 	cfg->invert_bclk = tpl->invert_bclk;
4c4e16
 	cfg->invert_fsync = tpl->invert_fsync;
4c4e16
-	cfg->bclk_master = tpl->bclk_master;
4c4e16
+	cfg->bclk_provider = tpl->bclk_provider;
4c4e16
 	cfg->fsync_master = tpl->fsync_master;
4c4e16
 	cfg->mclk_direction = tpl->mclk_direction;
4c4e16
 	cfg->reserved = tpl->reserved;
4c4e16
@@ -2174,7 +2190,7 @@ next:
4c4e16
 		hw->clock_gated = link->hw_config[i].clock_gated;
4c4e16
 		hw->invert_bclk = link->hw_config[i].invert_bclk;
4c4e16
 		hw->invert_fsync = link->hw_config[i].invert_fsync;
4c4e16
-		hw->bclk_master = link->hw_config[i].bclk_master;
4c4e16
+		hw->bclk_provider = link->hw_config[i].bclk_provider;
4c4e16
 		hw->fsync_master = link->hw_config[i].fsync_master;
4c4e16
 		hw->mclk_direction = link->hw_config[i].mclk_direction;
4c4e16
 		hw->mclk_rate = link->hw_config[i].mclk_rate;
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 706192341d1d0bbb906d690b227b9dee5c1fc4b5 Mon Sep 17 00:00:00 2001
4c4e16
From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
4c4e16
Date: Thu, 12 Nov 2020 10:29:39 -0600
4c4e16
Subject: [PATCH 05/49] topology: use inclusive language for fsync
4c4e16
4c4e16
use fsync_provider for structure fields, 'codec_provider' and
4c4e16
'codec_consumer' for options and modify #defines to use CP and CC
4c4e16
suffixes.
4c4e16
4c4e16
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
4c4e16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4c4e16
---
4c4e16
 include/sound/uapi/asoc.h | 11 +++++++----
4c4e16
 include/topology.h        |  2 +-
4c4e16
 src/topology/pcm.c        | 37 ++++++++++++++++++++++++++-----------
4c4e16
 3 files changed, 34 insertions(+), 16 deletions(-)
4c4e16
4c4e16
diff --git a/include/sound/uapi/asoc.h b/include/sound/uapi/asoc.h
4c4e16
index ceafb1a9..f32c5697 100644
4c4e16
--- a/include/sound/uapi/asoc.h
4c4e16
+++ b/include/sound/uapi/asoc.h
4c4e16
@@ -178,10 +178,13 @@
4c4e16
 #define SND_SOC_TPLG_BCLK_CS         SND_SOC_TPLG_BCLK_CC
4c4e16
 
4c4e16
 /* DAI topology FSYNC parameter
4c4e16
- * For the backwards capability, by default codec is fsync master
4c4e16
+ * For the backwards capability, by default codec is fsync provider
4c4e16
  */
4c4e16
-#define SND_SOC_TPLG_FSYNC_CM         0 /* codec is fsync master */
4c4e16
-#define SND_SOC_TPLG_FSYNC_CS         1 /* codec is fsync slave */
4c4e16
+#define SND_SOC_TPLG_FSYNC_CP         0 /* codec is fsync provider */
4c4e16
+#define SND_SOC_TPLG_FSYNC_CC         1 /* codec is fsync consumer */
4c4e16
+/* keep previous definitions for compatibility */
4c4e16
+#define SND_SOC_TPLG_FSYNC_CM         SND_SOC_TPLG_FSYNC_CP
4c4e16
+#define SND_SOC_TPLG_FSYNC_CS         SND_SOC_TPLG_FSYNC_CC
4c4e16
 
4c4e16
 /*
4c4e16
  * Block Header.
4c4e16
@@ -339,7 +342,7 @@ struct snd_soc_tplg_hw_config {
4c4e16
 	__u8 invert_bclk;	/* 1 for inverted BCLK, 0 for normal */
4c4e16
 	__u8 invert_fsync;	/* 1 for inverted frame clock, 0 for normal */
4c4e16
 	__u8 bclk_provider;	/* SND_SOC_TPLG_BCLK_ value */
4c4e16
-	__u8 fsync_master;	/* SND_SOC_TPLG_FSYNC_ value */
4c4e16
+	__u8 fsync_provider;	/* SND_SOC_TPLG_FSYNC_ value */
4c4e16
 	__u8 mclk_direction;    /* SND_SOC_TPLG_MCLK_ value */
4c4e16
 	__le16 reserved;	/* for 32bit alignment */
4c4e16
 	__le32 mclk_rate;	/* MCLK or SYSCLK freqency in Hz */
4c4e16
diff --git a/include/topology.h b/include/topology.h
4c4e16
index 6c970649..4ade20df 100644
4c4e16
--- a/include/topology.h
4c4e16
+++ b/include/topology.h
4c4e16
@@ -1029,7 +1029,7 @@ struct snd_tplg_hw_config_template {
4c4e16
 	unsigned char  invert_bclk;     /* 1 for inverted BCLK, 0 for normal */
4c4e16
 	unsigned char  invert_fsync;    /* 1 for inverted frame clock, 0 for normal */
4c4e16
 	unsigned char  bclk_provider;   /* SND_SOC_TPLG_BCLK_ value */
4c4e16
-	unsigned char  fsync_master;    /* SND_SOC_TPLG_FSYNC_ value */
4c4e16
+	unsigned char  fsync_provider;  /* SND_SOC_TPLG_FSYNC_ value */
4c4e16
 	unsigned char  mclk_direction;  /* SND_SOC_TPLG_MCLK_ value */
4c4e16
 	unsigned short reserved;        /* for 32bit alignment */
4c4e16
 	unsigned int mclk_rate;	        /* MCLK or SYSCLK freqency in Hz */
4c4e16
diff --git a/src/topology/pcm.c b/src/topology/pcm.c
4c4e16
index f05df348..c8f41862 100644
4c4e16
--- a/src/topology/pcm.c
4c4e16
+++ b/src/topology/pcm.c
4c4e16
@@ -1504,8 +1504,15 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
4c4e16
 			continue;
4c4e16
 		}
4c4e16
 
4c4e16
-		if (strcmp(id, "fsync") == 0 ||
4c4e16
-		    strcmp(id, "fsync_master") == 0) {
4c4e16
+		provider_legacy = false;
4c4e16
+		if (strcmp(id, "fsync_master") == 0) {
4c4e16
+			SNDERR("deprecated option %s, please use 'fsync'\n", id);
4c4e16
+			provider_legacy = true;
4c4e16
+		}
4c4e16
+
4c4e16
+		if (provider_legacy ||
4c4e16
+		    strcmp(id, "fsync") == 0) {
4c4e16
+
4c4e16
 			if (snd_config_get_string(n, &val) < 0)
4c4e16
 				return -EINVAL;
4c4e16
 
4c4e16
@@ -1515,11 +1522,19 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
4c4e16
 				 */
4c4e16
 				SNDERR("deprecated fsync value '%s'", val);
4c4e16
 
4c4e16
-				hw_cfg->fsync_master = SND_SOC_TPLG_FSYNC_CS;
4c4e16
+				hw_cfg->fsync_provider = SND_SOC_TPLG_FSYNC_CC;
4c4e16
 			} else if (!strcmp(val, "codec_slave")) {
4c4e16
-				hw_cfg->fsync_master = SND_SOC_TPLG_FSYNC_CS;
4c4e16
+				SNDERR("deprecated fsync value '%s', use 'codec_consumer'", val);
4c4e16
+
4c4e16
+				hw_cfg->fsync_provider = SND_SOC_TPLG_FSYNC_CC;
4c4e16
+			} else if (!strcmp(val, "codec_consumer")) {
4c4e16
+				hw_cfg->fsync_provider = SND_SOC_TPLG_FSYNC_CC;
4c4e16
 			} else if (!strcmp(val, "codec_master")) {
4c4e16
-				hw_cfg->fsync_master = SND_SOC_TPLG_FSYNC_CM;
4c4e16
+				SNDERR("deprecated fsync value '%s', use 'codec_provider'", val);
4c4e16
+
4c4e16
+				hw_cfg->fsync_provider = SND_SOC_TPLG_FSYNC_CP;
4c4e16
+			} else if (!strcmp(val, "codec_provider")) {
4c4e16
+				hw_cfg->fsync_provider = SND_SOC_TPLG_FSYNC_CP;
4c4e16
 			}
4c4e16
 			continue;
4c4e16
 		}
4c4e16
@@ -1648,10 +1663,10 @@ int tplg_save_hw_config(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
4c4e16
 				       hc->bclk_rate);
4c4e16
 	if (err >= 0 && hc->invert_bclk)
4c4e16
 		err = tplg_save_printf(dst, pfx, "\tbclk_invert 1\n");
4c4e16
-	if (err >= 0 && hc->fsync_master)
4c4e16
-		err = tplg_save_printf(dst, pfx, "\tfsync_master '%s'\n",
4c4e16
-				       hc->fsync_master == SND_SOC_TPLG_FSYNC_CS ?
4c4e16
-						"codec_slave" : "codec_master");
4c4e16
+	if (err >= 0 && hc->fsync_provider)
4c4e16
+		err = tplg_save_printf(dst, pfx, "\tfsync_provider '%s'\n",
4c4e16
+				       hc->fsync_provider == SND_SOC_TPLG_FSYNC_CC ?
4c4e16
+						"codec_consumer" : "codec_provider");
4c4e16
 	if (err >= 0 && hc->fsync_rate)
4c4e16
 		err = tplg_save_printf(dst, pfx, "\tfsync_freq %u\n",
4c4e16
 				       hc->fsync_rate);
4c4e16
@@ -1808,7 +1823,7 @@ static int set_link_hw_config(struct snd_soc_tplg_hw_config *cfg,
4c4e16
 	cfg->invert_bclk = tpl->invert_bclk;
4c4e16
 	cfg->invert_fsync = tpl->invert_fsync;
4c4e16
 	cfg->bclk_provider = tpl->bclk_provider;
4c4e16
-	cfg->fsync_master = tpl->fsync_master;
4c4e16
+	cfg->fsync_provider = tpl->fsync_provider;
4c4e16
 	cfg->mclk_direction = tpl->mclk_direction;
4c4e16
 	cfg->reserved = tpl->reserved;
4c4e16
 	cfg->mclk_rate = tpl->mclk_rate;
4c4e16
@@ -2191,7 +2206,7 @@ next:
4c4e16
 		hw->invert_bclk = link->hw_config[i].invert_bclk;
4c4e16
 		hw->invert_fsync = link->hw_config[i].invert_fsync;
4c4e16
 		hw->bclk_provider = link->hw_config[i].bclk_provider;
4c4e16
-		hw->fsync_master = link->hw_config[i].fsync_master;
4c4e16
+		hw->fsync_provider = link->hw_config[i].fsync_provider;
4c4e16
 		hw->mclk_direction = link->hw_config[i].mclk_direction;
4c4e16
 		hw->mclk_rate = link->hw_config[i].mclk_rate;
4c4e16
 		hw->bclk_rate = link->hw_config[i].bclk_rate;
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From e5c350d7bc6f3d45702059c0ae8d32b3603273c1 Mon Sep 17 00:00:00 2001
4c4e16
From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
4c4e16
Date: Thu, 12 Nov 2020 10:29:40 -0600
4c4e16
Subject: [PATCH 06/49] topology: use inclusive language in documentation
4c4e16
4c4e16
Use codec_provider and codec_consumer for bclk and fsync
4c4e16
4c4e16
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
4c4e16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4c4e16
---
4c4e16
 include/topology.h | 4 ++--
4c4e16
 1 file changed, 2 insertions(+), 2 deletions(-)
4c4e16
4c4e16
diff --git a/include/topology.h b/include/topology.h
4c4e16
index 4ade20df..d1feee4d 100644
4c4e16
--- a/include/topology.h
4c4e16
+++ b/include/topology.h
4c4e16
@@ -658,8 +658,8 @@ extern "C" {
4c4e16
  *
4c4e16
  *	id "1"				# used for binding to the config
4c4e16
  *	format "I2S"			# physical audio format.
4c4e16
- *	bclk   "master"			# Platform is master of bit clock
4c4e16
- *	fsync  "slave"			# Platform is slave of fsync
4c4e16
+ *	bclk   "codec_provider"		# Codec provides the bit clock
4c4e16
+ *	fsync  "codec_consumer"		# Codec follows the fsync
4c4e16
  * }
4c4e16
  * 
4c4e16
  *
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 7d36895225d09ae26868997382445cc7ad2e9513 Mon Sep 17 00:00:00 2001
4c4e16
From: Jonas Holmberg <jonashg@axis.com>
4c4e16
Date: Wed, 4 Nov 2020 14:49:56 +0100
4c4e16
Subject: [PATCH 07/49] pcm: set the snd_pcm_ioplug_status() tstamp field
4c4e16
4c4e16
Set the status tstamp field so that it can be accessed with
4c4e16
snd_pcm_status_get_htstamp().
4c4e16
4c4e16
Signed-off-by: Jonas Holmberg <jonashg@axis.com>
4c4e16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4c4e16
---
4c4e16
 src/pcm/pcm_ioplug.c | 1 +
4c4e16
 1 file changed, 1 insertion(+)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c
4c4e16
index a437ca32..9b1b8ac3 100644
4c4e16
--- a/src/pcm/pcm_ioplug.c
4c4e16
+++ b/src/pcm/pcm_ioplug.c
4c4e16
@@ -115,6 +115,7 @@ static int snd_pcm_ioplug_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
4c4e16
 	snd_pcm_ioplug_hw_ptr_update(pcm);
4c4e16
 	status->state = io->data->state;
4c4e16
 	status->trigger_tstamp = io->trigger_tstamp;
4c4e16
+	gettimestamp(&status->tstamp, pcm->tstamp_type);
4c4e16
 	status->avail = snd_pcm_mmap_avail(pcm);
4c4e16
 	status->avail_max = io->avail_max;
4c4e16
 	return 0;
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 6d3311fefb1b41c7484fd728e4ad4a6fb5b55ad4 Mon Sep 17 00:00:00 2001
4c4e16
From: Takashi Iwai <tiwai@suse.de>
4c4e16
Date: Thu, 10 Dec 2020 10:36:41 +0100
4c4e16
Subject: [PATCH 08/49] Makefile: Add README.md to EXTRA_DIST
4c4e16
4c4e16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4c4e16
---
4c4e16
 Makefile.am | 2 +-
4c4e16
 1 file changed, 1 insertion(+), 1 deletion(-)
4c4e16
4c4e16
diff --git a/Makefile.am b/Makefile.am
4c4e16
index c484d4da..ff4c963a 100644
4c4e16
--- a/Makefile.am
4c4e16
+++ b/Makefile.am
4c4e16
@@ -16,7 +16,7 @@ SUBDIRS += alsalisp
4c4e16
 endif
4c4e16
 endif
4c4e16
 SUBDIRS += test utils
4c4e16
-EXTRA_DIST=ChangeLog INSTALL TODO NOTES configure gitcompile libtool \
4c4e16
+EXTRA_DIST=README.md ChangeLog INSTALL TODO NOTES configure gitcompile libtool \
4c4e16
 	   depcomp version MEMORY-LEAK m4/attributes.m4
4c4e16
 AUTOMAKE_OPTIONS=foreign
4c4e16
 
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From ea02dbd20a535085638c63c6b8bec94e628486c4 Mon Sep 17 00:00:00 2001
4c4e16
From: David Henningsson <diwic@ubuntu.com>
4c4e16
Date: Wed, 16 Dec 2020 19:55:22 +0100
4c4e16
Subject: [PATCH 09/49] pcm: Add snd_pcm_audio_tstamp_type_t constants
4c4e16
4c4e16
These are mostly a copy-paste from the kernel headers. But since functions
4c4e16
snd_pcm_audio_tstamp_config make use of these they should be added to the
4c4e16
public API as well.
4c4e16
4c4e16
Reported-by: Alex Moon <alex.r.moon@gmail.com>
4c4e16
Signed-off-by: David Henningsson <diwic@ubuntu.com>
4c4e16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4c4e16
---
4c4e16
 include/pcm.h | 14 ++++++++++++++
4c4e16
 1 file changed, 14 insertions(+)
4c4e16
4c4e16
diff --git a/include/pcm.h b/include/pcm.h
4c4e16
index 5b078231..cf1eea8b 100644
4c4e16
--- a/include/pcm.h
4c4e16
+++ b/include/pcm.h
4c4e16
@@ -350,6 +350,20 @@ typedef enum _snd_pcm_tstamp_type {
4c4e16
 	SND_PCM_TSTAMP_TYPE_LAST = SND_PCM_TSTAMP_TYPE_MONOTONIC_RAW,
4c4e16
 } snd_pcm_tstamp_type_t;
4c4e16
 
4c4e16
+typedef enum _snd_pcm_audio_tstamp_type {
4c4e16
+	/**
4c4e16
+	 * first definition for backwards compatibility only,
4c4e16
+	 * maps to wallclock/link time for HDAudio playback and DEFAULT/DMA time for everything else
4c4e16
+	 */
4c4e16
+	SND_PCM_AUDIO_TSTAMP_TYPE_COMPAT = 0,
4c4e16
+	SND_PCM_AUDIO_TSTAMP_TYPE_DEFAULT = 1,           /**< DMA time, reported as per hw_ptr */
4c4e16
+	SND_PCM_AUDIO_TSTAMP_TYPE_LINK = 2,	           /**< link time reported by sample or wallclock counter, reset on startup */
4c4e16
+	SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ABSOLUTE = 3,	   /**< link time reported by sample or wallclock counter, not reset on startup */
4c4e16
+	SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ESTIMATED = 4,    /**< link time estimated indirectly */
4c4e16
+	SND_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED = 5, /**< link time synchronized with system time */
4c4e16
+	SND_PCM_AUDIO_TSTAMP_TYPE_LAST = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED
4c4e16
+} snd_pcm_audio_tstamp_type_t;
4c4e16
+
4c4e16
 typedef struct _snd_pcm_audio_tstamp_config {
4c4e16
 	/* 5 of max 16 bits used */
4c4e16
 	unsigned int type_requested:4;
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From dcda999d0000cbdabe61d3d175943b5f23c30057 Mon Sep 17 00:00:00 2001
4c4e16
From: David Henningsson <diwic@ubuntu.com>
4c4e16
Date: Wed, 16 Dec 2020 20:02:52 +0100
4c4e16
Subject: [PATCH 10/49] test/audio_time: Make use of SND_PCM_AUDIO_TSTAMP_TYPE
4c4e16
 constants
4c4e16
4c4e16
Also fixup the usage row which seemed wrong to me.
4c4e16
4c4e16
Signed-off-by: David Henningsson <diwic@ubuntu.com>
4c4e16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4c4e16
---
4c4e16
 test/audio_time.c | 26 +++++++++++++-------------
4c4e16
 1 file changed, 13 insertions(+), 13 deletions(-)
4c4e16
4c4e16
diff --git a/test/audio_time.c b/test/audio_time.c
4c4e16
index 530922d9..e4d4a944 100644
4c4e16
--- a/test/audio_time.c
4c4e16
+++ b/test/audio_time.c
4c4e16
@@ -32,7 +32,7 @@ static void usage(char *command)
4c4e16
 		"-d, --delay             add delay \n"
4c4e16
 		"-D, --device=NAME       select PCM by name \n"
4c4e16
 		"-p, --playback          playback tstamps \n"
4c4e16
-		"-t, --ts_type=TYPE      Default(0),link(1),link_estimated(2),synchronized(3) \n"
4c4e16
+		"-t, --ts_type=TYPE      Compat(0),default(1),link(2),link_absolute(3),link_estimated(4),link_synchronized(5) \n"
4c4e16
 		"-r, --report            show audio timestamp and accuracy validity\n"
4c4e16
 		, command);
4c4e16
 }
4c4e16
@@ -201,17 +201,17 @@ int main(int argc, char *argv[])
4c4e16
 			goto _exit;
4c4e16
 		}
4c4e16
 
4c4e16
-		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, 0))
4c4e16
+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, SND_PCM_AUDIO_TSTAMP_TYPE_COMPAT))
4c4e16
 			printf("Playback supports audio compat timestamps\n");
4c4e16
-		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, 1))
4c4e16
+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, SND_PCM_AUDIO_TSTAMP_TYPE_DEFAULT))
4c4e16
 			printf("Playback supports audio default timestamps\n");
4c4e16
-		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, 2))
4c4e16
+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, SND_PCM_AUDIO_TSTAMP_TYPE_LINK))
4c4e16
 			printf("Playback supports audio link timestamps\n");
4c4e16
-		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, 3))
4c4e16
+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ABSOLUTE))
4c4e16
 			printf("Playback supports audio link absolute timestamps\n");
4c4e16
-		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, 4))
4c4e16
+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ESTIMATED))
4c4e16
 			printf("Playback supports audio link estimated timestamps\n");
4c4e16
-		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, 5))
4c4e16
+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, SND_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED))
4c4e16
 			printf("Playback supports audio link synchronized timestamps\n");
4c4e16
 
4c4e16
 		snd_pcm_sw_params_alloca(&swparams_p);
4c4e16
@@ -269,17 +269,17 @@ int main(int argc, char *argv[])
4c4e16
 			goto _exit;
4c4e16
 		}
4c4e16
 
4c4e16
-		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, 0))
4c4e16
+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, SND_PCM_AUDIO_TSTAMP_TYPE_COMPAT))
4c4e16
 			printf("Capture supports audio compat timestamps\n");
4c4e16
-		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, 1))
4c4e16
+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, SND_PCM_AUDIO_TSTAMP_TYPE_DEFAULT))
4c4e16
 			printf("Capture supports audio default timestamps\n");
4c4e16
-		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, 2))
4c4e16
+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, SND_PCM_AUDIO_TSTAMP_TYPE_LINK))
4c4e16
 			printf("Capture supports audio link timestamps\n");
4c4e16
-		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, 3))
4c4e16
+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ABSOLUTE))
4c4e16
 			printf("Capture supports audio link absolute timestamps\n");
4c4e16
-		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, 4))
4c4e16
+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ESTIMATED))
4c4e16
 			printf("Capture supports audio link estimated timestamps\n");
4c4e16
-		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, 5))
4c4e16
+		if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, SND_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED))
4c4e16
 			printf("Capture supports audio link synchronized timestamps\n");
4c4e16
 
4c4e16
 		snd_pcm_sw_params_alloca(&swparams_c);
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From a9cbfecd87777d76a83e5a912ca9bdcf48e31fa9 Mon Sep 17 00:00:00 2001
4c4e16
From: Takashi Iwai <tiwai@suse.de>
4c4e16
Date: Tue, 22 Dec 2020 16:10:16 +0100
4c4e16
Subject: [PATCH 11/49] pcm: Fix a typo in SND_PCM_AUDIO_TSTAMP_TYPE_LAST
4c4e16
 definition
4c4e16
4c4e16
It was wrongly defined with SNDRV_ prefix.  Fix it.
4c4e16
4c4e16
Fixes: ea02dbd20a53 ("pcm: Add snd_pcm_audio_tstamp_type_t constants")
4c4e16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4c4e16
---
4c4e16
 include/pcm.h | 2 +-
4c4e16
 1 file changed, 1 insertion(+), 1 deletion(-)
4c4e16
4c4e16
diff --git a/include/pcm.h b/include/pcm.h
4c4e16
index cf1eea8b..e300b951 100644
4c4e16
--- a/include/pcm.h
4c4e16
+++ b/include/pcm.h
4c4e16
@@ -361,7 +361,7 @@ typedef enum _snd_pcm_audio_tstamp_type {
4c4e16
 	SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ABSOLUTE = 3,	   /**< link time reported by sample or wallclock counter, not reset on startup */
4c4e16
 	SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ESTIMATED = 4,    /**< link time estimated indirectly */
4c4e16
 	SND_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED = 5, /**< link time synchronized with system time */
4c4e16
-	SND_PCM_AUDIO_TSTAMP_TYPE_LAST = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED
4c4e16
+	SND_PCM_AUDIO_TSTAMP_TYPE_LAST = SND_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED
4c4e16
 } snd_pcm_audio_tstamp_type_t;
4c4e16
 
4c4e16
 typedef struct _snd_pcm_audio_tstamp_config {
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 5275d170e05639473e68e5feb349aec65bf26428 Mon Sep 17 00:00:00 2001
4c4e16
From: Alex Henrie <alexhenrie24@gmail.com>
4c4e16
Date: Sat, 26 Dec 2020 14:35:39 -0700
4c4e16
Subject: [PATCH 12/49] conf: fix use after free in
4c4e16
 _snd_config_load_with_include
4c4e16
4c4e16
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
4c4e16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4c4e16
---
4c4e16
 src/conf.c | 4 +++-
4c4e16
 1 file changed, 3 insertions(+), 1 deletion(-)
4c4e16
4c4e16
diff --git a/src/conf.c b/src/conf.c
4c4e16
index 7df2b4e7..44d1bfde 100644
4c4e16
--- a/src/conf.c
4c4e16
+++ b/src/conf.c
4c4e16
@@ -1970,7 +1970,9 @@ int _snd_config_load_with_include(snd_config_t *config, snd_input_t *in,
4c4e16
 		SNDERR("%s:%d:%d:%s", fd->name ? fd->name : "_toplevel_", fd->line, fd->column, str);
4c4e16
 		goto _end;
4c4e16
 	}
4c4e16
-	if (get_char(&input) != LOCAL_UNEXPECTED_EOF) {
4c4e16
+	err = get_char(&input);
4c4e16
+	fd = input.current;
4c4e16
+	if (err != LOCAL_UNEXPECTED_EOF) {
4c4e16
 		SNDERR("%s:%d:%d:Unexpected }", fd->name ? fd->name : "", fd->line, fd->column);
4c4e16
 		err = -EINVAL;
4c4e16
 		goto _end;
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 0f4821ec1729cd72a3dde3ea63f7857e92a10919 Mon Sep 17 00:00:00 2001
4c4e16
From: Alex Henrie <alexhenrie24@gmail.com>
4c4e16
Date: Sat, 26 Dec 2020 14:35:40 -0700
4c4e16
Subject: [PATCH 13/49] ucm: fix bad frees in get_list0 and get_list20
4c4e16
4c4e16
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
4c4e16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4c4e16
---
4c4e16
 src/ucm/main.c | 4 ++--
4c4e16
 1 file changed, 2 insertions(+), 2 deletions(-)
4c4e16
4c4e16
diff --git a/src/ucm/main.c b/src/ucm/main.c
4c4e16
index 3871d5aa..754b967e 100644
4c4e16
--- a/src/ucm/main.c
4c4e16
+++ b/src/ucm/main.c
4c4e16
@@ -666,7 +666,7 @@ static int get_list0(struct list_head *list,
4c4e16
 	}
4c4e16
 	return cnt;
4c4e16
       __fail:
4c4e16
-        snd_use_case_free_list((const char **)res, cnt);
4c4e16
+        snd_use_case_free_list(*result, cnt);
4c4e16
         return -ENOMEM;
4c4e16
 }
4c4e16
 
4c4e16
@@ -724,7 +724,7 @@ static int get_list20(struct list_head *list,
4c4e16
 	}
4c4e16
 	return cnt;
4c4e16
       __fail:
4c4e16
-        snd_use_case_free_list((const char **)res, cnt);
4c4e16
+        snd_use_case_free_list(*result, cnt);
4c4e16
         return -ENOMEM;
4c4e16
 }
4c4e16
 
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From c56278cfda55b9f5d106890c7354176dba8c8f4d Mon Sep 17 00:00:00 2001
4c4e16
From: Alex Henrie <alexhenrie24@gmail.com>
4c4e16
Date: Sat, 26 Dec 2020 14:35:41 -0700
4c4e16
Subject: [PATCH 14/49] rawmidi: fix memory leak in snd_rawmidi_virtual_open
4c4e16
4c4e16
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
4c4e16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4c4e16
---
4c4e16
 src/rawmidi/rawmidi_virt.c | 3 ++-
4c4e16
 1 file changed, 2 insertions(+), 1 deletion(-)
4c4e16
4c4e16
diff --git a/src/rawmidi/rawmidi_virt.c b/src/rawmidi/rawmidi_virt.c
4c4e16
index 2c4c27f5..884b8ff8 100644
4c4e16
--- a/src/rawmidi/rawmidi_virt.c
4c4e16
+++ b/src/rawmidi/rawmidi_virt.c
4c4e16
@@ -315,7 +315,7 @@ int snd_rawmidi_virtual_open(snd_rawmidi_t **inputp, snd_rawmidi_t **outputp,
4c4e16
 			     int merge, int mode)
4c4e16
 {
4c4e16
 	int err;
4c4e16
-	snd_rawmidi_t *rmidi;
4c4e16
+	snd_rawmidi_t *rmidi = NULL;
4c4e16
 	snd_rawmidi_virtual_t *virt = NULL;
4c4e16
 	struct pollfd pfd;
4c4e16
 
4c4e16
@@ -392,6 +392,7 @@ int snd_rawmidi_virtual_open(snd_rawmidi_t **inputp, snd_rawmidi_t **outputp,
4c4e16
 		free(*inputp);
4c4e16
 	if (outputp)
4c4e16
 		free(*outputp);
4c4e16
+	free(rmidi);
4c4e16
 	return err;
4c4e16
 }
4c4e16
 
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From aa28847248f2f416d9ecc6cbfa75192455400f6f Mon Sep 17 00:00:00 2001
4c4e16
From: Alex Henrie <alexhenrie24@gmail.com>
4c4e16
Date: Sat, 26 Dec 2020 14:35:43 -0700
4c4e16
Subject: [PATCH 15/49] timer: fix sizeof operator mismatch in
4c4e16
 snd_timer_query_hw_open
4c4e16
4c4e16
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
4c4e16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4c4e16
---
4c4e16
 src/timer/timer_query_hw.c | 2 +-
4c4e16
 1 file changed, 1 insertion(+), 1 deletion(-)
4c4e16
4c4e16
diff --git a/src/timer/timer_query_hw.c b/src/timer/timer_query_hw.c
4c4e16
index dad228c8..d8bac6e7 100644
4c4e16
--- a/src/timer/timer_query_hw.c
4c4e16
+++ b/src/timer/timer_query_hw.c
4c4e16
@@ -104,7 +104,7 @@ int snd_timer_query_hw_open(snd_timer_query_t **handle, const char *name, int mo
4c4e16
 		close(fd);
4c4e16
 		return -SND_ERROR_INCOMPATIBLE_VERSION;
4c4e16
 	}
4c4e16
-	tmr = (snd_timer_query_t *) calloc(1, sizeof(snd_timer_t));
4c4e16
+	tmr = (snd_timer_query_t *) calloc(1, sizeof(snd_timer_query_t));
4c4e16
 	if (tmr == NULL) {
4c4e16
 		close(fd);
4c4e16
 		return -ENOMEM;
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 2e470d59d84a563a9efa81572ddc48d9858ceb92 Mon Sep 17 00:00:00 2001
4c4e16
From: Alex Henrie <alexhenrie24@gmail.com>
4c4e16
Date: Sat, 26 Dec 2020 14:35:44 -0700
4c4e16
Subject: [PATCH 16/49] pcm: remove dead assignments from
4c4e16
 snd_pcm_rate_(commit_area|grab_next_period)
4c4e16
4c4e16
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
4c4e16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4c4e16
---
4c4e16
 src/pcm/pcm_rate.c | 2 --
4c4e16
 1 file changed, 2 deletions(-)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c
4c4e16
index 5bf7dbb9..dc38e95e 100644
4c4e16
--- a/src/pcm/pcm_rate.c
4c4e16
+++ b/src/pcm/pcm_rate.c
4c4e16
@@ -746,7 +746,6 @@ static int snd_pcm_rate_commit_area(snd_pcm_t *pcm, snd_pcm_rate_t *rate,
4c4e16
 		if (result < 0)
4c4e16
 			return result;
4c4e16
 	      __partial:
4c4e16
-		xfer = 0;
4c4e16
 		cont = slave_frames;
4c4e16
 		if (cont > slave_size)
4c4e16
 			cont = slave_size;
4c4e16
@@ -846,7 +845,6 @@ static int snd_pcm_rate_grab_next_period(snd_pcm_t *pcm, snd_pcm_uframes_t hw_of
4c4e16
 		if (result < 0)
4c4e16
 			return result;
4c4e16
 	      __partial:
4c4e16
-		xfer = 0;
4c4e16
 		cont = slave_frames;
4c4e16
 		if (cont > rate->gen.slave->period_size)
4c4e16
 			cont = rate->gen.slave->period_size;
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From fc719bfe4e97bbfce899cc7e67df08ecd573c5d3 Mon Sep 17 00:00:00 2001
4c4e16
From: Alex Henrie <alexhenrie24@gmail.com>
4c4e16
Date: Sat, 26 Dec 2020 14:35:45 -0700
4c4e16
Subject: [PATCH 17/49] pcm_multi: remove dead assignment from
4c4e16
 _snd_pcm_multi_open
4c4e16
4c4e16
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
4c4e16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4c4e16
---
4c4e16
 src/pcm/pcm_multi.c | 1 -
4c4e16
 1 file changed, 1 deletion(-)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_multi.c b/src/pcm/pcm_multi.c
4c4e16
index 53c414d5..5fa09b9b 100644
4c4e16
--- a/src/pcm/pcm_multi.c
4c4e16
+++ b/src/pcm/pcm_multi.c
4c4e16
@@ -1323,7 +1323,6 @@ int _snd_pcm_multi_open(snd_pcm_t **pcmp, const char *name,
4c4e16
 		err = -ENOMEM;
4c4e16
 		goto _free;
4c4e16
 	}
4c4e16
-	idx = 0;
4c4e16
 	for (idx = 0; idx < channels_count; ++idx)
4c4e16
 		channels_sidx[idx] = -1;
4c4e16
 	idx = 0;
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 9ebd29d2d31df0f8967f3e60cf24bb63c95d4984 Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Sun, 27 Dec 2020 13:17:26 +0100
4c4e16
Subject: [PATCH 18/49] conf: fix get_hexachar() return value
4c4e16
4c4e16
Reported-by: Alex Henrie <alexhenrie24@gmail.com>
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/conf.c | 2 +-
4c4e16
 1 file changed, 1 insertion(+), 1 deletion(-)
4c4e16
4c4e16
diff --git a/src/conf.c b/src/conf.c
4c4e16
index 44d1bfde..6cfe65bf 100644
4c4e16
--- a/src/conf.c
4c4e16
+++ b/src/conf.c
4c4e16
@@ -887,7 +887,7 @@ static inline int get_hexachar(input_t *input)
4c4e16
 	if (c >= '0' && c <= '9') num |= (c - '0') << 0;
4c4e16
 	else if (c >= 'a' && c <= 'f') num |= (c - 'a') << 0;
4c4e16
 	else if (c >= 'A' && c <= 'F') num |= (c - 'A') << 0;
4c4e16
-	return c;
4c4e16
+	return num;
4c4e16
 }
4c4e16
 
4c4e16
 static int get_quotedchar(input_t *input)
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 36aff79747b23b9535e81befe8b7b2972837bce3 Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Sun, 27 Dec 2020 13:29:33 +0100
4c4e16
Subject: [PATCH 19/49] pcm: fix __snd_pcm_state() return value
4c4e16
4c4e16
The __snd_pcm_state() must return a valid state, not an error value
4c4e16
when the plugin callback is not defined. Use the first state
4c4e16
SND_PCM_STATE_OPEN - the other functions will return the error
4c4e16
code depending on this state.
4c4e16
4c4e16
Link: https://lore.kernel.org/alsa-devel/20201226213547.175071-10-alexhenrie24@gmail.com/
4c4e16
Reported-by: Alex Henrie <alexhenrie24@gmail.com>
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_local.h | 2 +-
4c4e16
 1 file changed, 1 insertion(+), 1 deletion(-)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_local.h b/src/pcm/pcm_local.h
4c4e16
index fe77e50d..bec5a408 100644
4c4e16
--- a/src/pcm/pcm_local.h
4c4e16
+++ b/src/pcm/pcm_local.h
4c4e16
@@ -444,7 +444,7 @@ static inline int __snd_pcm_start(snd_pcm_t *pcm)
4c4e16
 static inline snd_pcm_state_t __snd_pcm_state(snd_pcm_t *pcm)
4c4e16
 {
4c4e16
 	if (!pcm->fast_ops->state)
4c4e16
-		return -ENOSYS;
4c4e16
+		return SND_PCM_STATE_OPEN;
4c4e16
 	return pcm->fast_ops->state(pcm->fast_op_arg);
4c4e16
 }
4c4e16
 
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From a92ad2fea4b36d7282f4a571275fb492dd1bba75 Mon Sep 17 00:00:00 2001
4c4e16
From: Alex Henrie <alexhenrie24@gmail.com>
4c4e16
Date: Sun, 27 Dec 2020 18:43:15 -0700
4c4e16
Subject: [PATCH 20/49] confmisc: fix memory leak in snd_func_concat
4c4e16
4c4e16
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
4c4e16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4c4e16
---
4c4e16
 src/confmisc.c | 3 +--
4c4e16
 1 file changed, 1 insertion(+), 2 deletions(-)
4c4e16
4c4e16
diff --git a/src/confmisc.c b/src/confmisc.c
4c4e16
index eb8218c1..3ce95c7a 100644
4c4e16
--- a/src/confmisc.c
4c4e16
+++ b/src/confmisc.c
4c4e16
@@ -419,7 +419,6 @@ int snd_func_concat(snd_config_t **dst, snd_config_t *root, snd_config_t *src,
4c4e16
 				tmp = realloc(res, len + len1 + 1);
4c4e16
 				if (tmp == NULL) {
4c4e16
 					free(ptr);
4c4e16
-					free(res);
4c4e16
 					err = -ENOMEM;
4c4e16
 					goto __error;
4c4e16
 				}
4c4e16
@@ -440,8 +439,8 @@ int snd_func_concat(snd_config_t **dst, snd_config_t *root, snd_config_t *src,
4c4e16
 	err = snd_config_get_id(src, &id;;
4c4e16
 	if (err >= 0)
4c4e16
 		err = snd_config_imake_string(dst, id, res);
4c4e16
-	free(res);
4c4e16
       __error:
4c4e16
+	free(res);
4c4e16
 	return err;
4c4e16
 }
4c4e16
 #ifndef DOC_HIDDEN
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 6c24cd2e60cc9c1fca809ffeeb7ffe8af94b201e Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Tue, 29 Dec 2020 11:15:46 +0100
4c4e16
Subject: [PATCH 21/49] conf: fix return code in _snd_config_load_with_include
4c4e16
4c4e16
Fixes: 5275d170e0 ("conf: fix use after free in _snd_config_load_with_include")
4c4e16
BugLink: https://github.com/alsa-project/alsa-lib/issues/108
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/conf.c | 1 +
4c4e16
 1 file changed, 1 insertion(+)
4c4e16
4c4e16
diff --git a/src/conf.c b/src/conf.c
4c4e16
index 6cfe65bf..3c943db2 100644
4c4e16
--- a/src/conf.c
4c4e16
+++ b/src/conf.c
4c4e16
@@ -1977,6 +1977,7 @@ int _snd_config_load_with_include(snd_config_t *config, snd_input_t *in,
4c4e16
 		err = -EINVAL;
4c4e16
 		goto _end;
4c4e16
 	}
4c4e16
+	err = 0;
4c4e16
  _end:
4c4e16
 	while (fd->next) {
4c4e16
 		fd_next = fd->next;
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From afe6ff3b33ee6e5ea3511fe458bfd4e516b10bcf Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Wed, 30 Dec 2020 09:31:10 +0100
4c4e16
Subject: [PATCH 22/49] pcm: plugin status - fix the return value (regression)
4c4e16
4c4e16
The snd_pcm_plugin_avail_update() error code in snd_pcm_plugin_status()
4c4e16
should not be reported to the caller. The state errors can be determined
4c4e16
using the state member in the status structure.
4c4e16
4c4e16
Fixes: 4f90392f07e ("pcm: fix the snd_pcm_plugin_status() avail and delay fields")
4c4e16
BugLink: https://github.com/alsa-project/alsa-lib/issues/107
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_plugin.c | 8 +++-----
4c4e16
 1 file changed, 3 insertions(+), 5 deletions(-)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
4c4e16
index 5739cfc2..76a524fa 100644
4c4e16
--- a/src/pcm/pcm_plugin.c
4c4e16
+++ b/src/pcm/pcm_plugin.c
4c4e16
@@ -541,19 +541,17 @@ static snd_pcm_sframes_t snd_pcm_plugin_avail_update(snd_pcm_t *pcm)
4c4e16
 static int snd_pcm_plugin_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
4c4e16
 {
4c4e16
 	snd_pcm_plugin_t *plugin = pcm->private_data;
4c4e16
-	snd_pcm_sframes_t err, avail;
4c4e16
+	snd_pcm_sframes_t err;
4c4e16
 
4c4e16
 	/* sync with the latest hw and appl ptrs */
4c4e16
-	avail = snd_pcm_plugin_avail_update(pcm);
4c4e16
-	if (avail < 0)
4c4e16
-		return avail;
4c4e16
+	snd_pcm_plugin_avail_update(pcm);
4c4e16
 
4c4e16
 	err = snd_pcm_status(plugin->gen.slave, status);
4c4e16
 	if (err < 0)
4c4e16
 		return err;
4c4e16
 	status->appl_ptr = *pcm->appl.ptr;
4c4e16
 	status->hw_ptr = *pcm->hw.ptr;
4c4e16
-	status->avail = avail;
4c4e16
+	status->avail = snd_pcm_mmap_avail(pcm);
4c4e16
 	status->delay = snd_pcm_mmap_delay(pcm);
4c4e16
 	return 0;
4c4e16
 }
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 49eea5d7bc7d39f9a4cc1f3b3a813e90b90519eb Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Sun, 3 Jan 2021 16:16:10 +0100
4c4e16
Subject: [PATCH 23/49] pcm: plugin status - revert the recent changes
4c4e16
4c4e16
It's no reason to sync the avail/delay fields using the mirrored
4c4e16
buffer pointers. The slave information must be valid.
4c4e16
4c4e16
The original report probably tries to fix something for
4c4e16
the specific plugin. Revert all changes.
4c4e16
4c4e16
Fixes: afe6ff3b33e ("pcm: plugin status - fix the return value (regression)")
4c4e16
Fixes: 4f90392f07e ("pcm: fix the snd_pcm_plugin_status() avail and delay fields")
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_plugin.c | 2 --
4c4e16
 1 file changed, 2 deletions(-)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
4c4e16
index 76a524fa..ea60eb98 100644
4c4e16
--- a/src/pcm/pcm_plugin.c
4c4e16
+++ b/src/pcm/pcm_plugin.c
4c4e16
@@ -551,8 +551,6 @@ static int snd_pcm_plugin_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
4c4e16
 		return err;
4c4e16
 	status->appl_ptr = *pcm->appl.ptr;
4c4e16
 	status->hw_ptr = *pcm->hw.ptr;
4c4e16
-	status->avail = snd_pcm_mmap_avail(pcm);
4c4e16
-	status->delay = snd_pcm_mmap_delay(pcm);
4c4e16
 	return 0;
4c4e16
 }
4c4e16
 
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From fa1895aa2b4f3f154e537bee92860fe793045643 Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Sun, 3 Jan 2021 16:34:04 +0100
4c4e16
Subject: [PATCH 24/49] pcm: plugin - tidy snd_pcm_plugin_avail_update()
4c4e16
4c4e16
No functional changes - move the code to snd_pcm_plugin_sync_hw_ptr()
4c4e16
and put the mmap capture updates to separate function for readability.
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_plugin.c | 142 +++++++++++++++++++++++--------------------
4c4e16
 1 file changed, 76 insertions(+), 66 deletions(-)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
4c4e16
index ea60eb98..83793397 100644
4c4e16
--- a/src/pcm/pcm_plugin.c
4c4e16
+++ b/src/pcm/pcm_plugin.c
4c4e16
@@ -460,82 +460,92 @@ snd_pcm_plugin_mmap_commit(snd_pcm_t *pcm,
4c4e16
 	return xfer > 0 ? xfer : err;
4c4e16
 }
4c4e16
 
4c4e16
-static snd_pcm_sframes_t snd_pcm_plugin_avail_update(snd_pcm_t *pcm)
4c4e16
+static snd_pcm_sframes_t
4c4e16
+snd_pcm_plugin_sync_hw_ptr_capture(snd_pcm_t *pcm,
4c4e16
+				   snd_pcm_sframes_t slave_size)
4c4e16
 {
4c4e16
 	snd_pcm_plugin_t *plugin = pcm->private_data;
4c4e16
 	snd_pcm_t *slave = plugin->gen.slave;
4c4e16
-	snd_pcm_sframes_t slave_size;
4c4e16
+	const snd_pcm_channel_area_t *areas;
4c4e16
+	snd_pcm_uframes_t xfer, hw_offset, size;
4c4e16
 	int err;
4c4e16
 
4c4e16
-	slave_size = snd_pcm_avail_update(slave);
4c4e16
+	xfer = snd_pcm_mmap_capture_avail(pcm);
4c4e16
+	size = pcm->buffer_size - xfer;
4c4e16
+	areas = snd_pcm_mmap_areas(pcm);
4c4e16
+	hw_offset = snd_pcm_mmap_hw_offset(pcm);
4c4e16
+	while (size > 0 && slave_size > 0) {
4c4e16
+		snd_pcm_uframes_t frames = size;
4c4e16
+		snd_pcm_uframes_t cont = pcm->buffer_size - hw_offset;
4c4e16
+		const snd_pcm_channel_area_t *slave_areas;
4c4e16
+		snd_pcm_uframes_t slave_offset;
4c4e16
+		snd_pcm_uframes_t slave_frames = ULONG_MAX;
4c4e16
+		snd_pcm_sframes_t result;
4c4e16
+		/* As mentioned in the ALSA API (see pcm/pcm.c:942):
4c4e16
+		 * The function #snd_pcm_avail_update()
4c4e16
+		 * have to be called before any mmap begin+commit operation.
4c4e16
+		 * Otherwise the snd_pcm_areas_copy will not called a second time.
4c4e16
+		 * But this is needed, if the ring buffer wrap is reached and
4c4e16
+		 * there is more data available.
4c4e16
+		 */
4c4e16
+		slave_size = snd_pcm_avail_update(slave);
4c4e16
+		result = snd_pcm_mmap_begin(slave, &slave_areas, &slave_offset, &slave_frames);
4c4e16
+		if (result < 0) {
4c4e16
+			err = result;
4c4e16
+			goto error;
4c4e16
+		}
4c4e16
+		if (frames > cont)
4c4e16
+			frames = cont;
4c4e16
+		frames = (plugin->read)(pcm, areas, hw_offset, frames,
4c4e16
+					slave_areas, slave_offset, &slave_frames);
4c4e16
+		result = snd_pcm_mmap_commit(slave, slave_offset, slave_frames);
4c4e16
+		if (result > 0 && (snd_pcm_uframes_t)result != slave_frames) {
4c4e16
+			snd_pcm_sframes_t res;
4c4e16
+			res = plugin->undo_read(slave, areas, hw_offset, frames, slave_frames - result);
4c4e16
+			if (res < 0) {
4c4e16
+				err = res;
4c4e16
+				goto error;
4c4e16
+			}
4c4e16
+			frames -= res;
4c4e16
+		}
4c4e16
+		if (result <= 0) {
4c4e16
+			err = result;
4c4e16
+			goto error;
4c4e16
+		}
4c4e16
+		snd_pcm_mmap_hw_forward(pcm, frames);
4c4e16
+		if (frames == cont)
4c4e16
+			hw_offset = 0;
4c4e16
+		else
4c4e16
+			hw_offset += frames;
4c4e16
+		size -= frames;
4c4e16
+		slave_size -= slave_frames;
4c4e16
+		xfer += frames;
4c4e16
+	}
4c4e16
+	return (snd_pcm_sframes_t)xfer;
4c4e16
+error:
4c4e16
+	return xfer > 0 ? (snd_pcm_sframes_t)xfer : err;
4c4e16
+}
4c4e16
+
4c4e16
+static snd_pcm_sframes_t snd_pcm_plugin_sync_hw_ptr(snd_pcm_t *pcm,
4c4e16
+						    snd_pcm_uframes_t slave_hw_ptr,
4c4e16
+						    snd_pcm_sframes_t slave_size)
4c4e16
+{
4c4e16
 	if (pcm->stream == SND_PCM_STREAM_CAPTURE &&
4c4e16
 	    pcm->access != SND_PCM_ACCESS_RW_INTERLEAVED &&
4c4e16
 	    pcm->access != SND_PCM_ACCESS_RW_NONINTERLEAVED)
4c4e16
-		goto _capture;
4c4e16
-        *pcm->hw.ptr = *slave->hw.ptr;
4c4e16
+		return snd_pcm_plugin_sync_hw_ptr_capture(pcm, slave_size);
4c4e16
+        *pcm->hw.ptr = slave_hw_ptr;
4c4e16
         return slave_size;
4c4e16
- _capture:
4c4e16
- 	{
4c4e16
-		const snd_pcm_channel_area_t *areas;
4c4e16
-		snd_pcm_uframes_t xfer, hw_offset, size;
4c4e16
-		
4c4e16
-		xfer = snd_pcm_mmap_capture_avail(pcm);
4c4e16
-		size = pcm->buffer_size - xfer;
4c4e16
-		areas = snd_pcm_mmap_areas(pcm);
4c4e16
-		hw_offset = snd_pcm_mmap_hw_offset(pcm);
4c4e16
-		while (size > 0 && slave_size > 0) {
4c4e16
-			snd_pcm_uframes_t frames = size;
4c4e16
-			snd_pcm_uframes_t cont = pcm->buffer_size - hw_offset;
4c4e16
-			const snd_pcm_channel_area_t *slave_areas;
4c4e16
-			snd_pcm_uframes_t slave_offset;
4c4e16
-			snd_pcm_uframes_t slave_frames = ULONG_MAX;
4c4e16
-			snd_pcm_sframes_t result;
4c4e16
-			/* As mentioned in the ALSA API (see pcm/pcm.c:942):
4c4e16
-			 * The function #snd_pcm_avail_update()
4c4e16
-			 * have to be called before any mmap begin+commit operation.
4c4e16
-			 * Otherwise the snd_pcm_areas_copy will not called a second time.
4c4e16
-			 * But this is needed, if the ring buffer wrap is reached and
4c4e16
-			 * there is more data available.
4c4e16
-			 */
4c4e16
-			slave_size = snd_pcm_avail_update(slave);
4c4e16
-			result = snd_pcm_mmap_begin(slave, &slave_areas, &slave_offset, &slave_frames);
4c4e16
-			if (result < 0) {
4c4e16
-				err = result;
4c4e16
-				goto error;
4c4e16
-			}
4c4e16
-			if (frames > cont)
4c4e16
-				frames = cont;
4c4e16
-			frames = (plugin->read)(pcm, areas, hw_offset, frames,
4c4e16
-					      slave_areas, slave_offset, &slave_frames);
4c4e16
-			result = snd_pcm_mmap_commit(slave, slave_offset, slave_frames);
4c4e16
-			if (result > 0 && (snd_pcm_uframes_t)result != slave_frames) {
4c4e16
-				snd_pcm_sframes_t res;
4c4e16
-				
4c4e16
-				res = plugin->undo_read(slave, areas, hw_offset, frames, slave_frames - result);
4c4e16
-				if (res < 0) {
4c4e16
-					err = res;
4c4e16
-					goto error;
4c4e16
-				}
4c4e16
-				frames -= res;
4c4e16
-			}
4c4e16
-			if (result <= 0) {
4c4e16
-				err = result;
4c4e16
-				goto error;
4c4e16
-			}
4c4e16
-			snd_pcm_mmap_hw_forward(pcm, frames);
4c4e16
-			if (frames == cont)
4c4e16
-				hw_offset = 0;
4c4e16
-			else
4c4e16
-				hw_offset += frames;
4c4e16
-			size -= frames;
4c4e16
-			slave_size -= slave_frames;
4c4e16
-			xfer += frames;
4c4e16
-		}
4c4e16
-		return (snd_pcm_sframes_t)xfer;
4c4e16
+}
4c4e16
 
4c4e16
-	error:
4c4e16
-		return xfer > 0 ? (snd_pcm_sframes_t)xfer : err;
4c4e16
-	}
4c4e16
+static snd_pcm_sframes_t snd_pcm_plugin_avail_update(snd_pcm_t *pcm)
4c4e16
+{
4c4e16
+	snd_pcm_plugin_t *plugin = pcm->private_data;
4c4e16
+	snd_pcm_t *slave = plugin->gen.slave;
4c4e16
+	snd_pcm_sframes_t slave_size;
4c4e16
+
4c4e16
+	slave_size = snd_pcm_avail_update(slave);
4c4e16
+	return snd_pcm_plugin_sync_hw_ptr(pcm, *slave->hw.ptr, slave_size);
4c4e16
 }
4c4e16
 
4c4e16
 static int snd_pcm_plugin_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 28cc099d9ea3962b033cb1cb9c3e07db828d9ff7 Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Sun, 3 Jan 2021 16:41:29 +0100
4c4e16
Subject: [PATCH 25/49] pcm: plugin - optimize sync in snd_pcm_plugin_status()
4c4e16
4c4e16
Do hw_ptr sync only once after the status call. This avoids
4c4e16
double update.
4c4e16
4c4e16
Also, the application pointer must not change when
4c4e16
the status is called. Add assert() call for this condition.
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_plugin.c | 7 ++-----
4c4e16
 1 file changed, 2 insertions(+), 5 deletions(-)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
4c4e16
index 83793397..6a815145 100644
4c4e16
--- a/src/pcm/pcm_plugin.c
4c4e16
+++ b/src/pcm/pcm_plugin.c
4c4e16
@@ -553,14 +553,11 @@ static int snd_pcm_plugin_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
4c4e16
 	snd_pcm_plugin_t *plugin = pcm->private_data;
4c4e16
 	snd_pcm_sframes_t err;
4c4e16
 
4c4e16
-	/* sync with the latest hw and appl ptrs */
4c4e16
-	snd_pcm_plugin_avail_update(pcm);
4c4e16
-
4c4e16
 	err = snd_pcm_status(plugin->gen.slave, status);
4c4e16
 	if (err < 0)
4c4e16
 		return err;
4c4e16
-	status->appl_ptr = *pcm->appl.ptr;
4c4e16
-	status->hw_ptr = *pcm->hw.ptr;
4c4e16
+	assert(status->appl_ptr == *pcm->appl.ptr);
4c4e16
+	snd_pcm_plugin_sync_hw_ptr(pcm, status->hw_ptr, status->avail);
4c4e16
 	return 0;
4c4e16
 }
4c4e16
 
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 21549e6583f1dfe5b2fe1aaa88345e4645dd96d0 Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Wed, 30 Dec 2020 17:49:33 +0100
4c4e16
Subject: [PATCH 26/49] Revert "pcm_plugin: fix delay"
4c4e16
4c4e16
This reverts commit aba87e509898ec9ddb3e319267d7c267409ff100.
4c4e16
4c4e16
The commit does not look good. The plugins must handle
4c4e16
the delay value correctly.
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_plugin.c | 6 ------
4c4e16
 1 file changed, 6 deletions(-)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
4c4e16
index 6a815145..5787a43d 100644
4c4e16
--- a/src/pcm/pcm_plugin.c
4c4e16
+++ b/src/pcm/pcm_plugin.c
4c4e16
@@ -142,12 +142,6 @@ static int snd_pcm_plugin_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
4c4e16
 	int err = snd_pcm_delay(plugin->gen.slave, &sd);
4c4e16
 	if (err < 0)
4c4e16
 		return err;
4c4e16
-        if (pcm->stream == SND_PCM_STREAM_CAPTURE &&
4c4e16
-	    pcm->access != SND_PCM_ACCESS_RW_INTERLEAVED &&
4c4e16
-	    pcm->access != SND_PCM_ACCESS_RW_NONINTERLEAVED) {
4c4e16
-                sd += snd_pcm_mmap_capture_avail(pcm);
4c4e16
-        }        
4c4e16
-
4c4e16
 	*delayp = sd;
4c4e16
 	return 0;
4c4e16
 }
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 6ca01c07ee13435d6c2db4e9121d9a86cc4b1457 Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Wed, 30 Dec 2020 19:14:25 +0100
4c4e16
Subject: [PATCH 27/49] pcm: ioplug - fix the delay calculation in the status
4c4e16
 callback
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_ioplug.c | 32 ++++++++++++++++++--------------
4c4e16
 1 file changed, 18 insertions(+), 14 deletions(-)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c
4c4e16
index 9b1b8ac3..f2315a10 100644
4c4e16
--- a/src/pcm/pcm_ioplug.c
4c4e16
+++ b/src/pcm/pcm_ioplug.c
4c4e16
@@ -107,9 +107,24 @@ static int snd_pcm_ioplug_channel_info(snd_pcm_t *pcm, snd_pcm_channel_info_t *i
4c4e16
 	return snd_pcm_channel_info_shm(pcm, info, -1);
4c4e16
 }
4c4e16
 
4c4e16
+static int snd_pcm_ioplug_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
4c4e16
+{
4c4e16
+	ioplug_priv_t *io = pcm->private_data;
4c4e16
+
4c4e16
+	if (io->data->version >= 0x010001 &&
4c4e16
+	    io->data->callback->delay)
4c4e16
+		return io->data->callback->delay(io->data, delayp);
4c4e16
+	else {
4c4e16
+		snd_pcm_ioplug_hw_ptr_update(pcm);
4c4e16
+		*delayp = snd_pcm_mmap_hw_avail(pcm);
4c4e16
+	}
4c4e16
+	return 0;
4c4e16
+}
4c4e16
+
4c4e16
 static int snd_pcm_ioplug_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
4c4e16
 {
4c4e16
 	ioplug_priv_t *io = pcm->private_data;
4c4e16
+	snd_pcm_sframes_t sd;
4c4e16
 
4c4e16
 	memset(status, 0, sizeof(*status));
4c4e16
 	snd_pcm_ioplug_hw_ptr_update(pcm);
4c4e16
@@ -118,6 +133,9 @@ static int snd_pcm_ioplug_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
4c4e16
 	gettimestamp(&status->tstamp, pcm->tstamp_type);
4c4e16
 	status->avail = snd_pcm_mmap_avail(pcm);
4c4e16
 	status->avail_max = io->avail_max;
4c4e16
+	if (snd_pcm_ioplug_delay(pcm, &sd) < 0)
4c4e16
+		sd = snd_pcm_mmap_delay(pcm);
4c4e16
+	status->delay = sd;
4c4e16
 	return 0;
4c4e16
 }
4c4e16
 
4c4e16
@@ -133,20 +151,6 @@ static int snd_pcm_ioplug_hwsync(snd_pcm_t *pcm)
4c4e16
 	return 0;
4c4e16
 }
4c4e16
 
4c4e16
-static int snd_pcm_ioplug_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
4c4e16
-{
4c4e16
-	ioplug_priv_t *io = pcm->private_data;
4c4e16
-
4c4e16
-	if (io->data->version >= 0x010001 &&
4c4e16
-	    io->data->callback->delay)
4c4e16
-		return io->data->callback->delay(io->data, delayp);
4c4e16
-	else {
4c4e16
-		snd_pcm_ioplug_hw_ptr_update(pcm);
4c4e16
-		*delayp = snd_pcm_mmap_hw_avail(pcm);
4c4e16
-	}
4c4e16
-	return 0;
4c4e16
-}
4c4e16
-
4c4e16
 static int snd_pcm_ioplug_reset(snd_pcm_t *pcm)
4c4e16
 {
4c4e16
 	ioplug_priv_t *io = pcm->private_data;
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 5988bb3ff42827ab4c13f248291ad1767c8d973d Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Sun, 3 Jan 2021 16:56:38 +0100
4c4e16
Subject: [PATCH 28/49] pcm: rate - tidy up snd_pcm_rate_avail_update()
4c4e16
4c4e16
No functional change - just move the capture code to
4c4e16
a separate function for the better readability.
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_rate.c | 37 +++++++++++++++++++++----------------
4c4e16
 1 file changed, 21 insertions(+), 16 deletions(-)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c
4c4e16
index dc38e95e..7073f8ab 100644
4c4e16
--- a/src/pcm/pcm_rate.c
4c4e16
+++ b/src/pcm/pcm_rate.c
4c4e16
@@ -964,29 +964,18 @@ static snd_pcm_sframes_t snd_pcm_rate_mmap_commit(snd_pcm_t *pcm,
4c4e16
 	return size;
4c4e16
 }
4c4e16
 
4c4e16
-static snd_pcm_sframes_t snd_pcm_rate_avail_update(snd_pcm_t *pcm)
4c4e16
+static snd_pcm_sframes_t snd_pcm_rate_avail_update_capture(snd_pcm_t *pcm,
4c4e16
+							   snd_pcm_sframes_t slave_size)
4c4e16
 {
4c4e16
 	snd_pcm_rate_t *rate = pcm->private_data;
4c4e16
 	snd_pcm_t *slave = rate->gen.slave;
4c4e16
-	snd_pcm_sframes_t slave_size;
4c4e16
-
4c4e16
-	slave_size = snd_pcm_avail_update(slave);
4c4e16
-	if (slave_size < 0)
4c4e16
-		return slave_size;
4c4e16
-
4c4e16
-	if (pcm->stream == SND_PCM_STREAM_CAPTURE)
4c4e16
-		goto _capture;
4c4e16
-	snd_pcm_rate_sync_hwptr(pcm);
4c4e16
-	snd_pcm_rate_sync_playback_area(pcm, rate->appl_ptr);
4c4e16
-	return snd_pcm_mmap_avail(pcm);
4c4e16
- _capture: {
4c4e16
 	snd_pcm_uframes_t xfer, hw_offset, size;
4c4e16
 	
4c4e16
 	xfer = snd_pcm_mmap_capture_avail(pcm);
4c4e16
 	size = pcm->buffer_size - xfer;
4c4e16
 	hw_offset = snd_pcm_mmap_hw_offset(pcm);
4c4e16
 	while (size >= pcm->period_size &&
4c4e16
-	       (snd_pcm_uframes_t)slave_size >= rate->gen.slave->period_size) {
4c4e16
+	       (snd_pcm_uframes_t)slave_size >= slave->period_size) {
4c4e16
 		int err = snd_pcm_rate_grab_next_period(pcm, hw_offset);
4c4e16
 		if (err < 0)
4c4e16
 			return err;
4c4e16
@@ -994,13 +983,29 @@ static snd_pcm_sframes_t snd_pcm_rate_avail_update(snd_pcm_t *pcm)
4c4e16
 			return (snd_pcm_sframes_t)xfer;
4c4e16
 		xfer += pcm->period_size;
4c4e16
 		size -= pcm->period_size;
4c4e16
-		slave_size -= rate->gen.slave->period_size;
4c4e16
+		slave_size -= slave->period_size;
4c4e16
 		hw_offset += pcm->period_size;
4c4e16
 		hw_offset %= pcm->buffer_size;
4c4e16
 		snd_pcm_mmap_hw_forward(pcm, pcm->period_size);
4c4e16
 	}
4c4e16
 	return (snd_pcm_sframes_t)xfer;
4c4e16
- }
4c4e16
+}
4c4e16
+
4c4e16
+static snd_pcm_sframes_t snd_pcm_rate_avail_update(snd_pcm_t *pcm)
4c4e16
+{
4c4e16
+	snd_pcm_rate_t *rate = pcm->private_data;
4c4e16
+	snd_pcm_sframes_t slave_size;
4c4e16
+
4c4e16
+	slave_size = snd_pcm_avail_update(rate->gen.slave);
4c4e16
+	if (slave_size < 0)
4c4e16
+		return slave_size;
4c4e16
+
4c4e16
+	if (pcm->stream == SND_PCM_STREAM_CAPTURE)
4c4e16
+		return snd_pcm_rate_avail_update_capture(pcm, slave_size);
4c4e16
+
4c4e16
+	snd_pcm_rate_sync_hwptr(pcm);
4c4e16
+	snd_pcm_rate_sync_playback_area(pcm, rate->appl_ptr);
4c4e16
+	return snd_pcm_mmap_avail(pcm);
4c4e16
 }
4c4e16
 
4c4e16
 static int snd_pcm_rate_htimestamp(snd_pcm_t *pcm,
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 6cee452eabc5cfdf0a6955033b8ac8f6e12ea883 Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Sun, 3 Jan 2021 17:13:50 +0100
4c4e16
Subject: [PATCH 29/49] pcm: ioplug - fix the delay calculation for old plugins
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_ioplug.c | 2 +-
4c4e16
 1 file changed, 1 insertion(+), 1 deletion(-)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c
4c4e16
index f2315a10..e141b1f9 100644
4c4e16
--- a/src/pcm/pcm_ioplug.c
4c4e16
+++ b/src/pcm/pcm_ioplug.c
4c4e16
@@ -116,7 +116,7 @@ static int snd_pcm_ioplug_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
4c4e16
 		return io->data->callback->delay(io->data, delayp);
4c4e16
 	else {
4c4e16
 		snd_pcm_ioplug_hw_ptr_update(pcm);
4c4e16
-		*delayp = snd_pcm_mmap_hw_avail(pcm);
4c4e16
+		*delayp = snd_pcm_mmap_delay(pcm);
4c4e16
 	}
4c4e16
 	return 0;
4c4e16
 }
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From fc0f7af9ee7bd4c31c2bab229e8e79eb96e908fa Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Mon, 4 Jan 2021 12:29:00 +0100
4c4e16
Subject: [PATCH 30/49] pcm: rate - use pcm_frame_diff() in
4c4e16
 snd_pcm_rate_playback_internal_delay()
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_rate.c | 6 +-----
4c4e16
 1 file changed, 1 insertion(+), 5 deletions(-)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c
4c4e16
index 7073f8ab..abb2753f 100644
4c4e16
--- a/src/pcm/pcm_rate.c
4c4e16
+++ b/src/pcm/pcm_rate.c
4c4e16
@@ -612,11 +612,7 @@ static snd_pcm_uframes_t snd_pcm_rate_playback_internal_delay(snd_pcm_t *pcm)
4c4e16
 {
4c4e16
 	snd_pcm_rate_t *rate = pcm->private_data;
4c4e16
 
4c4e16
-	if (rate->appl_ptr < rate->last_commit_ptr) {
4c4e16
-		return rate->appl_ptr - rate->last_commit_ptr + pcm->boundary;
4c4e16
-	} else {
4c4e16
-		return rate->appl_ptr - rate->last_commit_ptr;
4c4e16
-	}
4c4e16
+	return pcm_frame_diff(rate->appl_ptr, rate->last_commit_ptr, pcm->boundary);
4c4e16
 }
4c4e16
 
4c4e16
 static int snd_pcm_rate_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From da5b70d3fae091a8568b80a476c1cf340965805a Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Mon, 4 Jan 2021 12:32:25 +0100
4c4e16
Subject: [PATCH 31/49] pcm: plugin - fix status code for capture
4c4e16
4c4e16
The recent updates do not take in account the possible
4c4e16
calls for the capture stream. Fix the avail and delay
4c4e16
inconsistencies (and assert).
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_plugin.c | 21 +++++++++++++++++++--
4c4e16
 1 file changed, 19 insertions(+), 2 deletions(-)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
4c4e16
index 5787a43d..7ed6f25a 100644
4c4e16
--- a/src/pcm/pcm_plugin.c
4c4e16
+++ b/src/pcm/pcm_plugin.c
4c4e16
@@ -545,13 +545,30 @@ static snd_pcm_sframes_t snd_pcm_plugin_avail_update(snd_pcm_t *pcm)
4c4e16
 static int snd_pcm_plugin_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
4c4e16
 {
4c4e16
 	snd_pcm_plugin_t *plugin = pcm->private_data;
4c4e16
-	snd_pcm_sframes_t err;
4c4e16
+	snd_pcm_sframes_t err, diff;
4c4e16
 
4c4e16
 	err = snd_pcm_status(plugin->gen.slave, status);
4c4e16
 	if (err < 0)
4c4e16
 		return err;
4c4e16
-	assert(status->appl_ptr == *pcm->appl.ptr);
4c4e16
 	snd_pcm_plugin_sync_hw_ptr(pcm, status->hw_ptr, status->avail);
4c4e16
+	/*
4c4e16
+	 * For capture stream, the situation is more complicated, because
4c4e16
+	 * snd_pcm_plugin_avail_update() commits the data to the slave pcm.
4c4e16
+	 * It means that the slave appl_ptr is updated. Calculate diff and
4c4e16
+	 * update the delay and avail.
4c4e16
+	 *
4c4e16
+	 * This resolves the data inconsistency for immediate calls:
4c4e16
+	 *    snd_pcm_avail_update()
4c4e16
+	 *    snd_pcm_status()
4c4e16
+	 */
4c4e16
+	if (pcm->stream == SND_PCM_STREAM_CAPTURE) {
4c4e16
+		status->appl_ptr = *pcm->appl.ptr;
4c4e16
+		diff = pcm_frame_diff(status->appl_ptr, *pcm->appl.ptr, pcm->boundary);
4c4e16
+		status->avail += diff;
4c4e16
+		status->delay += diff;
4c4e16
+	} else {
4c4e16
+		assert(status->appl_ptr == *pcm->appl.ptr);
4c4e16
+	}
4c4e16
 	return 0;
4c4e16
 }
4c4e16
 
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From ac520b2ed11f31e789a4da1d55e360e3eaeac50d Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Mon, 4 Jan 2021 17:14:42 +0100
4c4e16
Subject: [PATCH 32/49] pcm: rate - use pcm_frame_diff() on related places
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_rate.c | 20 +++++++-------------
4c4e16
 1 file changed, 7 insertions(+), 13 deletions(-)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c
4c4e16
index abb2753f..3d301d0e 100644
4c4e16
--- a/src/pcm/pcm_rate.c
4c4e16
+++ b/src/pcm/pcm_rate.c
4c4e16
@@ -561,17 +561,16 @@ snd_pcm_rate_read_areas1(snd_pcm_t *pcm,
4c4e16
 
4c4e16
 static inline void snd_pcm_rate_sync_hwptr0(snd_pcm_t *pcm, snd_pcm_uframes_t slave_hw_ptr)
4c4e16
 {
4c4e16
-	snd_pcm_rate_t *rate = pcm->private_data;
4c4e16
-
4c4e16
-	snd_pcm_sframes_t slave_hw_ptr_diff = slave_hw_ptr - rate->last_slave_hw_ptr;
4c4e16
+	snd_pcm_rate_t *rate;
4c4e16
+	snd_pcm_sframes_t slave_hw_ptr_diff;
4c4e16
 	snd_pcm_sframes_t last_slave_hw_ptr_frac;
4c4e16
 
4c4e16
 	if (pcm->stream != SND_PCM_STREAM_PLAYBACK)
4c4e16
 		return;
4c4e16
 
4c4e16
-	if (slave_hw_ptr_diff < 0)
4c4e16
-		slave_hw_ptr_diff += rate->gen.slave->boundary; /* slave boundary wraparound */
4c4e16
-	else if (slave_hw_ptr_diff == 0)
4c4e16
+	rate = pcm->private_data;
4c4e16
+	slave_hw_ptr_diff = pcm_frame_diff(slave_hw_ptr, rate->last_slave_hw_ptr, rate->gen.slave->boundary);
4c4e16
+	if (slave_hw_ptr_diff == 0)
4c4e16
 		return;
4c4e16
 	last_slave_hw_ptr_frac = rate->last_slave_hw_ptr % rate->gen.slave->period_size;
4c4e16
 	/* While handling fraction part fo slave period, rounded value will be
4c4e16
@@ -922,10 +921,7 @@ static int snd_pcm_rate_sync_playback_area(snd_pcm_t *pcm, snd_pcm_uframes_t app
4c4e16
 	if (slave_size < 0)
4c4e16
 		return slave_size;
4c4e16
 
4c4e16
-	if (appl_ptr < rate->last_commit_ptr)
4c4e16
-		xfer = appl_ptr - rate->last_commit_ptr + pcm->boundary;
4c4e16
-	else
4c4e16
-		xfer = appl_ptr - rate->last_commit_ptr;
4c4e16
+	xfer = pcm_frame_diff(appl_ptr, rate->last_commit_ptr, pcm->boundary);
4c4e16
 	while (xfer >= pcm->period_size &&
4c4e16
 	       (snd_pcm_uframes_t)slave_size >= rate->gen.slave->period_size) {
4c4e16
 		err = snd_pcm_rate_commit_next_period(pcm, rate->last_commit_ptr % pcm->buffer_size);
4c4e16
@@ -1059,9 +1055,7 @@ static int snd_pcm_rate_drain(snd_pcm_t *pcm)
4c4e16
 		sw_params.avail_min = 1;
4c4e16
 		snd_pcm_sw_params(rate->gen.slave, &sw_params);
4c4e16
 
4c4e16
-		size = rate->appl_ptr - rate->last_commit_ptr;
4c4e16
-		if (size > pcm->boundary)
4c4e16
-			size -= pcm->boundary;
4c4e16
+		size = pcm_frame_diff(rate->appl_ptr, rate->last_commit_ptr, pcm->boundary);
4c4e16
 		ofs = rate->last_commit_ptr % pcm->buffer_size;
4c4e16
 		while (size > 0) {
4c4e16
 			snd_pcm_uframes_t psize, spsize;
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From b62f66442bfbcea7c11afe4917e196fa95a65083 Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Mon, 4 Jan 2021 17:27:32 +0100
4c4e16
Subject: [PATCH 33/49] pcm: rate - fix the capture delay values
4c4e16
4c4e16
Use the correct snd_pcm_mmap_capture_delay() function instead
4c4e16
snd_pcm_mmap_capture_hw_avail().
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_rate.c | 8 ++------
4c4e16
 1 file changed, 2 insertions(+), 6 deletions(-)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c
4c4e16
index 3d301d0e..770aafea 100644
4c4e16
--- a/src/pcm/pcm_rate.c
4c4e16
+++ b/src/pcm/pcm_rate.c
4c4e16
@@ -632,7 +632,7 @@ static int snd_pcm_rate_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
4c4e16
 				+ snd_pcm_rate_playback_internal_delay(pcm);
4c4e16
 	} else {
4c4e16
 		*delayp = rate->ops.output_frames(rate->obj, slave_delay)
4c4e16
-				+ snd_pcm_mmap_capture_hw_avail(pcm);
4c4e16
+				+ snd_pcm_mmap_capture_delay(pcm);
4c4e16
 	}
4c4e16
 	return 0;
4c4e16
 }
4c4e16
@@ -1157,12 +1157,8 @@ static int snd_pcm_rate_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
4c4e16
 		status->avail = snd_pcm_mmap_playback_avail(pcm);
4c4e16
 		status->avail_max = rate->ops.input_frames(rate->obj, status->avail_max);
4c4e16
 	} else {
4c4e16
-		/* FIXME: Maybe possible to somthing similar to
4c4e16
-		 * snd_pcm_rate_playback_internal_delay()
4c4e16
-		 * for the capture case.
4c4e16
-		 */
4c4e16
 		status->delay = rate->ops.output_frames(rate->obj, status->delay)
4c4e16
-					+ snd_pcm_mmap_capture_hw_avail(pcm);
4c4e16
+					+ snd_pcm_mmap_capture_delay(pcm);
4c4e16
 		status->avail = snd_pcm_mmap_capture_avail(pcm);
4c4e16
 		status->avail_max = rate->ops.output_frames(rate->obj, status->avail_max);
4c4e16
 	}
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 437b5b3aae8b1d9f65289f563deb0fa6356a0fa6 Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Thu, 7 Jan 2021 17:32:11 +0100
4c4e16
Subject: [PATCH 34/49] ucm: fix possible memory leak in parse_verb_file()
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/ucm/parser.c | 2 +-
4c4e16
 1 file changed, 1 insertion(+), 1 deletion(-)
4c4e16
4c4e16
diff --git a/src/ucm/parser.c b/src/ucm/parser.c
4c4e16
index 75b78826..c8bee1f2 100644
4c4e16
--- a/src/ucm/parser.c
4c4e16
+++ b/src/ucm/parser.c
4c4e16
@@ -1575,7 +1575,7 @@ static int parse_verb_file(snd_use_case_mgr_t *uc_mgr,
4c4e16
 	/* in-place evaluation */
4c4e16
 	err = uc_mgr_evaluate_inplace(uc_mgr, cfg);
4c4e16
 	if (err < 0)
4c4e16
-		return err;
4c4e16
+		goto _err;
4c4e16
 
4c4e16
 	/* parse master config sections */
4c4e16
 	snd_config_for_each(i, next, cfg) {
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From d0bb8f84c92357bfd0e024efe5f6d53a963c4d7a Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Thu, 7 Jan 2021 17:34:00 +0100
4c4e16
Subject: [PATCH 35/49] topology: tplg_pprint_integer() fix coverity
4c4e16
 uninitalized variable error
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/topology/save.c | 2 ++
4c4e16
 1 file changed, 2 insertions(+)
4c4e16
4c4e16
diff --git a/src/topology/save.c b/src/topology/save.c
4c4e16
index c7a5a801..f7af7af3 100644
4c4e16
--- a/src/topology/save.c
4c4e16
+++ b/src/topology/save.c
4c4e16
@@ -133,6 +133,8 @@ static int tplg_pprint_integer(snd_config_t *n, char **ret)
4c4e16
 		if (llval < INT_MIN || llval > UINT_MAX)
4c4e16
 			return snd_config_get_ascii(n, ret);
4c4e16
 		lval = llval;
4c4e16
+	} else {
4c4e16
+		lval = 0;
4c4e16
 	}
4c4e16
 	err = tplg_nice_value_format(buf, sizeof(buf), (unsigned int)lval);
4c4e16
 	if (err < 0)
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From b8764a061b83284be60adc01c1f7b035c4484ace Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Thu, 7 Jan 2021 17:36:04 +0100
4c4e16
Subject: [PATCH 36/49] topology: tplg_add_widget_object() - do not use invalid
4c4e16
 elem_ctl
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/topology/dapm.c | 1 +
4c4e16
 1 file changed, 1 insertion(+)
4c4e16
4c4e16
diff --git a/src/topology/dapm.c b/src/topology/dapm.c
4c4e16
index 92dc01aa..f6a84a60 100644
4c4e16
--- a/src/topology/dapm.c
4c4e16
+++ b/src/topology/dapm.c
4c4e16
@@ -836,6 +836,7 @@ int tplg_add_widget_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
4c4e16
 		default:
4c4e16
 			SNDERR("widget %s: invalid type %d for ctl %d",
4c4e16
 				wt->name, ct->type, i);
4c4e16
+			ret = -EINVAL;
4c4e16
 			break;
4c4e16
 		}
4c4e16
 
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 0dbaba95f4bc59602bf2d3fb12a60db7444e5892 Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Thu, 7 Jan 2021 17:38:50 +0100
4c4e16
Subject: [PATCH 37/49] topology: tplg_decode_pcm() - add missing log argument
4c4e16
 (compress)
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/topology/pcm.c | 2 +-
4c4e16
 1 file changed, 1 insertion(+), 1 deletion(-)
4c4e16
4c4e16
diff --git a/src/topology/pcm.c b/src/topology/pcm.c
4c4e16
index c8f41862..a473b59b 100644
4c4e16
--- a/src/topology/pcm.c
4c4e16
+++ b/src/topology/pcm.c
4c4e16
@@ -2020,7 +2020,7 @@ next:
4c4e16
 	pt->playback = pcm->playback;
4c4e16
 	pt->capture = pcm->capture;
4c4e16
 	pt->compress = pcm->compress;
4c4e16
-	tplg_log(tplg, 'D', pos, "pcm: playback %d capture %d compress",
4c4e16
+	tplg_log(tplg, 'D', pos, "pcm: playback %d capture %d compress %d",
4c4e16
 		 pt->playback, pt->capture, pt->compress);
4c4e16
 	pt->num_streams = pcm->num_streams;
4c4e16
 	pt->flag_mask = pcm->flag_mask;
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 51e1d486ce4535923692bd1d7e59d5aa3a29cd50 Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Thu, 7 Jan 2021 17:40:42 +0100
4c4e16
Subject: [PATCH 38/49] topology: parse_tuple_set() - remove dead condition
4c4e16
 code
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/topology/data.c | 2 +-
4c4e16
 1 file changed, 1 insertion(+), 1 deletion(-)
4c4e16
4c4e16
diff --git a/src/topology/data.c b/src/topology/data.c
4c4e16
index c2931bd2..5633cdc3 100644
4c4e16
--- a/src/topology/data.c
4c4e16
+++ b/src/topology/data.c
4c4e16
@@ -860,7 +860,7 @@ static int parse_tuple_set(snd_config_t *cfg,
4c4e16
 			}
4c4e16
 
4c4e16
 			if ((type == SND_SOC_TPLG_TUPLE_TYPE_WORD
4c4e16
-					&& tuple_val > UINT_MAX)
4c4e16
+					/* && tuple_val > UINT_MAX */)
4c4e16
 				|| (type == SND_SOC_TPLG_TUPLE_TYPE_SHORT
4c4e16
 					&& tuple_val > USHRT_MAX)
4c4e16
 				|| (type == SND_SOC_TPLG_TUPLE_TYPE_BYTE
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 3f63dc26445ae7c215e48a57af83b6da325f166d Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Thu, 7 Jan 2021 17:41:38 +0100
4c4e16
Subject: [PATCH 39/49] ucm: uc_mgr_substitute_tree() fix use after free
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/ucm/ucm_subs.c | 3 ++-
4c4e16
 1 file changed, 2 insertions(+), 1 deletion(-)
4c4e16
4c4e16
diff --git a/src/ucm/ucm_subs.c b/src/ucm/ucm_subs.c
4c4e16
index f608bb09..df6d736f 100644
4c4e16
--- a/src/ucm/ucm_subs.c
4c4e16
+++ b/src/ucm/ucm_subs.c
4c4e16
@@ -417,11 +417,12 @@ int uc_mgr_substitute_tree(snd_use_case_mgr_t *uc_mgr, snd_config_t *node)
4c4e16
 		if (err < 0)
4c4e16
 			return err;
4c4e16
 		err = snd_config_set_id(node, s);
4c4e16
-		free(s);
4c4e16
 		if (err < 0) {
4c4e16
 			uc_error("unable to set substituted id '%s' (old id '%s')", s, id);
4c4e16
+			free(s);
4c4e16
 			return err;
4c4e16
 		}
4c4e16
+		free(s);
4c4e16
 	}
4c4e16
 	if (snd_config_get_type(node) != SND_CONFIG_TYPE_COMPOUND) {
4c4e16
 		if (snd_config_get_type(node) == SND_CONFIG_TYPE_STRING) {
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 45f503632acf24877c466a7c1c74d8a26414bf3e Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Thu, 7 Jan 2021 17:45:27 +0100
4c4e16
Subject: [PATCH 40/49] topology: sort_config() cleanups - use goto for the
4c4e16
 error path
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/topology/save.c | 15 +++++++--------
4c4e16
 1 file changed, 7 insertions(+), 8 deletions(-)
4c4e16
4c4e16
diff --git a/src/topology/save.c b/src/topology/save.c
4c4e16
index f7af7af3..fecbc6a5 100644
4c4e16
--- a/src/topology/save.c
4c4e16
+++ b/src/topology/save.c
4c4e16
@@ -180,29 +180,28 @@ static snd_config_t *sort_config(const char *id, snd_config_t *src)
4c4e16
 	}
4c4e16
 	if (array <= 0)
4c4e16
 		qsort(a, count, sizeof(a[0]), _compar);
4c4e16
-	if (snd_config_make_compound(&dst, id, count == 1)) {
4c4e16
-		free(a);
4c4e16
-		return NULL;
4c4e16
-	}
4c4e16
+	if (snd_config_make_compound(&dst, id, count == 1))
4c4e16
+		goto lerr;
4c4e16
 	for (index = 0; index < count; index++) {
4c4e16
 		snd_config_t *s = a[index];
4c4e16
 		const char *id2;
4c4e16
 		if (snd_config_get_id(s, &id2)) {
4c4e16
 			snd_config_delete(dst);
4c4e16
-			free(a);
4c4e16
-			return NULL;
4c4e16
+			goto lerr;
4c4e16
 		}
4c4e16
 		s = sort_config(id2, s);
4c4e16
 		if (s == NULL || snd_config_add(dst, s)) {
4c4e16
 			if (s)
4c4e16
 				snd_config_delete(s);
4c4e16
 			snd_config_delete(dst);
4c4e16
-			free(a);
4c4e16
-			return NULL;
4c4e16
+			goto lerr;
4c4e16
 		}
4c4e16
 	}
4c4e16
 	free(a);
4c4e16
 	return dst;
4c4e16
+lerr:
4c4e16
+	free(a);
4c4e16
+	return NULL;
4c4e16
 }
4c4e16
 
4c4e16
 static int tplg_check_quoted(const unsigned char *p)
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 93752fb4de397554e92a4eb9079f77dabaec7d7f Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Thu, 7 Jan 2021 17:49:25 +0100
4c4e16
Subject: [PATCH 41/49] conf: USB - add "Xonar U7 MKII" to
4c4e16
 USB-Audio.pcm.iec958_device
4c4e16
4c4e16
BugLink: https://github.com/alsa-project/alsa-lib/issues/100
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/conf/cards/USB-Audio.conf | 1 +
4c4e16
 1 file changed, 1 insertion(+)
4c4e16
4c4e16
diff --git a/src/conf/cards/USB-Audio.conf b/src/conf/cards/USB-Audio.conf
4c4e16
index 9b64af3c..b1b74b02 100644
4c4e16
--- a/src/conf/cards/USB-Audio.conf
4c4e16
+++ b/src/conf/cards/USB-Audio.conf
4c4e16
@@ -39,6 +39,7 @@ USB-Audio.pcm.iec958_device {
4c4e16
 	# "NoiseBlaster 3000" 42
4c4e16
 	"USB Sound Blaster HD" 1
4c4e16
 	"Xonar U7" 1
4c4e16
+	"Xonar U7 MKII" 1
4c4e16
 	"ASUS XONAR U5" 1
4c4e16
 	"XONAR U5" 1
4c4e16
 	"XONAR SOUND CARD" 1
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 644514e85da169670e4a490b7b15b5ecfcec92c0 Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Mon, 18 Jan 2021 21:09:43 +0100
4c4e16
Subject: [PATCH 42/49] pcm_plugin: set the initial hw_ptr/appl_ptr from the
4c4e16
 child pcm
4c4e16
4c4e16
The direct plugins (dmix & etc.) sets own initial
4c4e16
hw_ptr and appl_ptr. Use this initial settings
4c4e16
to export correct values in snd_pcm_status().
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_plugin.c | 32 +++++++++++++++++---------------
4c4e16
 1 file changed, 17 insertions(+), 15 deletions(-)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
4c4e16
index 7ed6f25a..ff254eba 100644
4c4e16
--- a/src/pcm/pcm_plugin.c
4c4e16
+++ b/src/pcm/pcm_plugin.c
4c4e16
@@ -146,15 +146,14 @@ static int snd_pcm_plugin_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
4c4e16
 	return 0;
4c4e16
 }
4c4e16
 
4c4e16
-static int snd_pcm_plugin_prepare(snd_pcm_t *pcm)
4c4e16
+static int snd_pcm_plugin_call_init_cb(snd_pcm_t *pcm, snd_pcm_plugin_t *plugin)
4c4e16
 {
4c4e16
-	snd_pcm_plugin_t *plugin = pcm->private_data;
4c4e16
+	snd_pcm_t *slave = plugin->gen.slave;
4c4e16
 	int err;
4c4e16
-	err = snd_pcm_prepare(plugin->gen.slave);
4c4e16
-	if (err < 0)
4c4e16
-		return err;
4c4e16
-	*pcm->hw.ptr = 0;
4c4e16
-	*pcm->appl.ptr = 0;
4c4e16
+
4c4e16
+	assert(pcm->boundary == slave->boundary);
4c4e16
+	*pcm->hw.ptr = *slave->hw.ptr;
4c4e16
+	*pcm->appl.ptr = *slave->appl.ptr;
4c4e16
 	if (plugin->init) {
4c4e16
 		err = plugin->init(pcm);
4c4e16
 		if (err < 0)
4c4e16
@@ -163,6 +162,16 @@ static int snd_pcm_plugin_prepare(snd_pcm_t *pcm)
4c4e16
 	return 0;
4c4e16
 }
4c4e16
 
4c4e16
+static int snd_pcm_plugin_prepare(snd_pcm_t *pcm)
4c4e16
+{
4c4e16
+	snd_pcm_plugin_t *plugin = pcm->private_data;
4c4e16
+	int err;
4c4e16
+	err = snd_pcm_prepare(plugin->gen.slave);
4c4e16
+	if (err < 0)
4c4e16
+		return err;
4c4e16
+	return snd_pcm_plugin_call_init_cb(pcm, plugin);
4c4e16
+}
4c4e16
+
4c4e16
 static int snd_pcm_plugin_reset(snd_pcm_t *pcm)
4c4e16
 {
4c4e16
 	snd_pcm_plugin_t *plugin = pcm->private_data;
4c4e16
@@ -170,14 +179,7 @@ static int snd_pcm_plugin_reset(snd_pcm_t *pcm)
4c4e16
 	err = snd_pcm_reset(plugin->gen.slave);
4c4e16
 	if (err < 0)
4c4e16
 		return err;
4c4e16
-	*pcm->hw.ptr = 0;
4c4e16
-	*pcm->appl.ptr = 0;
4c4e16
-	if (plugin->init) {
4c4e16
-		err = plugin->init(pcm);
4c4e16
-		if (err < 0)
4c4e16
-			return err;
4c4e16
-	}
4c4e16
-	return 0;
4c4e16
+	return snd_pcm_plugin_call_init_cb(pcm, plugin);
4c4e16
 }
4c4e16
 
4c4e16
 static snd_pcm_sframes_t snd_pcm_plugin_rewindable(snd_pcm_t *pcm)
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 0de72e63d7bd180566c71f6fb01d7719525ee326 Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Tue, 19 Jan 2021 11:17:00 +0100
4c4e16
Subject: [PATCH 43/49] pcm: dmix/dshare - delay calculation fixes and cleanups
4c4e16
4c4e16
Unfortunately, we cannot use status->avail from slave, because this value
4c4e16
does not wrap to the buffer size and it may even overflow slave boundary
4c4e16
(endless run). We can use only hw_ptr from slave.
4c4e16
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_dmix.c   | 5 ++---
4c4e16
 src/pcm/pcm_dshare.c | 5 ++---
4c4e16
 2 files changed, 4 insertions(+), 6 deletions(-)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c
4c4e16
index 5b7472d9..be2675af 100644
4c4e16
--- a/src/pcm/pcm_dmix.c
4c4e16
+++ b/src/pcm/pcm_dmix.c
4c4e16
@@ -488,8 +488,7 @@ static int snd_pcm_dmix_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
4c4e16
 	case SNDRV_PCM_STATE_DRAINING:
4c4e16
 	case SNDRV_PCM_STATE_RUNNING:
4c4e16
 		snd_pcm_dmix_sync_ptr0(pcm, status->hw_ptr);
4c4e16
-		status->delay += snd_pcm_mmap_playback_delay(pcm)
4c4e16
-				+ status->avail - dmix->spcm->buffer_size;
4c4e16
+		status->delay = snd_pcm_mmap_playback_delay(pcm);
4c4e16
 		break;
4c4e16
 	default:
4c4e16
 		break;
4c4e16
@@ -518,7 +517,7 @@ static int snd_pcm_dmix_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
4c4e16
 	case SNDRV_PCM_STATE_PREPARED:
4c4e16
 	case SNDRV_PCM_STATE_SUSPENDED:
4c4e16
 	case STATE_RUN_PENDING:
4c4e16
-		*delayp = snd_pcm_mmap_playback_hw_avail(pcm);
4c4e16
+		*delayp = snd_pcm_mmap_playback_delay(pcm);
4c4e16
 		return 0;
4c4e16
 	case SNDRV_PCM_STATE_XRUN:
4c4e16
 		return -EPIPE;
4c4e16
diff --git a/src/pcm/pcm_dshare.c b/src/pcm/pcm_dshare.c
4c4e16
index 8a672572..10243013 100644
4c4e16
--- a/src/pcm/pcm_dshare.c
4c4e16
+++ b/src/pcm/pcm_dshare.c
4c4e16
@@ -237,8 +237,7 @@ static int snd_pcm_dshare_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
4c4e16
 	case SNDRV_PCM_STATE_DRAINING:
4c4e16
 	case SNDRV_PCM_STATE_RUNNING:
4c4e16
 		snd_pcm_dshare_sync_ptr0(pcm, status->hw_ptr);
4c4e16
-		status->delay += snd_pcm_mmap_playback_delay(pcm)
4c4e16
-				+ status->avail - dshare->spcm->buffer_size;
4c4e16
+		status->delay += snd_pcm_mmap_playback_delay(pcm);
4c4e16
 		break;
4c4e16
 	default:
4c4e16
 		break;
4c4e16
@@ -290,7 +289,7 @@ static int snd_pcm_dshare_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
4c4e16
 	case SNDRV_PCM_STATE_PREPARED:
4c4e16
 	case SNDRV_PCM_STATE_SUSPENDED:
4c4e16
 	case STATE_RUN_PENDING:
4c4e16
-		*delayp = snd_pcm_mmap_playback_hw_avail(pcm);
4c4e16
+		*delayp = snd_pcm_mmap_playback_delay(pcm);
4c4e16
 		return 0;
4c4e16
 	case SNDRV_PCM_STATE_XRUN:
4c4e16
 		return -EPIPE;
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From ae7362c996e0b991c399cc26c6d0b3c8e295e83c Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Wed, 20 Jan 2021 16:58:33 +0100
4c4e16
Subject: [PATCH 44/49] topology: fix 'parse_tuple_set() - remove dead
4c4e16
 condition code'
4c4e16
4c4e16
The whole SND_SOC_TPLG_TUPLE_TYPE_WORD condition part must be
4c4e16
commented out, otherwise the condition is always true.
4c4e16
4c4e16
Fixes: 51e1d486ce ("topology: parse_tuple_set() - remove dead condition code")
4c4e16
BugLink: https://github.com/alsa-project/alsa-lib/issues/114
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/topology/data.c | 10 +++++-----
4c4e16
 1 file changed, 5 insertions(+), 5 deletions(-)
4c4e16
4c4e16
diff --git a/src/topology/data.c b/src/topology/data.c
4c4e16
index 5633cdc3..0546d63e 100644
4c4e16
--- a/src/topology/data.c
4c4e16
+++ b/src/topology/data.c
4c4e16
@@ -859,11 +859,11 @@ static int parse_tuple_set(snd_config_t *cfg,
4c4e16
 				goto err;
4c4e16
 			}
4c4e16
 
4c4e16
-			if ((type == SND_SOC_TPLG_TUPLE_TYPE_WORD
4c4e16
-					/* && tuple_val > UINT_MAX */)
4c4e16
-				|| (type == SND_SOC_TPLG_TUPLE_TYPE_SHORT
4c4e16
-					&& tuple_val > USHRT_MAX)
4c4e16
-				|| (type == SND_SOC_TPLG_TUPLE_TYPE_BYTE
4c4e16
+			if (/* (type == SND_SOC_TPLG_TUPLE_TYPE_WORD
4c4e16
+					&& tuple_val > UINT_MAX) || */
4c4e16
+				(type == SND_SOC_TPLG_TUPLE_TYPE_SHORT
4c4e16
+					&& tuple_val > USHRT_MAX) ||
4c4e16
+				(type == SND_SOC_TPLG_TUPLE_TYPE_BYTE
4c4e16
 					&& tuple_val > UCHAR_MAX)) {
4c4e16
 				SNDERR("tuple %s: invalid value", id);
4c4e16
 				goto err;
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From f2c1a9f3279a30cbd8dcba1eaf0d52f50b56b886 Mon Sep 17 00:00:00 2001
4c4e16
From: Takashi Iwai <tiwai@suse.de>
4c4e16
Date: Fri, 22 Jan 2021 15:48:39 +0100
4c4e16
Subject: [PATCH 45/49] pcm: direct: Fix the missing appl_ptr update
4c4e16
4c4e16
A snd_pcm_status() call for the direct plugins receives the status
4c4e16
from the slave PCM, but this doesn't contain a valid appl_ptr, since
4c4e16
the slave PCM for the direct plugins is in a free-wheel mode, hence
4c4e16
the appl_ptr is always zero.  This result in the inconsistent
4c4e16
status->appl_ptr and pcm->appl.ptr, hitting the recently introduced
4c4e16
assert() call.
4c4e16
4c4e16
Fix it by transferring the plugin's appl_ptr to the upper caller.
4c4e16
4c4e16
BugLink: https://bugzilla.opensuse.org/show_bug.cgi?id=1181194
4c4e16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_dmix.c   | 1 +
4c4e16
 src/pcm/pcm_dshare.c | 1 +
4c4e16
 src/pcm/pcm_dsnoop.c | 1 +
4c4e16
 3 files changed, 3 insertions(+)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c
4c4e16
index be2675af..d8495065 100644
4c4e16
--- a/src/pcm/pcm_dmix.c
4c4e16
+++ b/src/pcm/pcm_dmix.c
4c4e16
@@ -495,6 +495,7 @@ static int snd_pcm_dmix_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
4c4e16
 	}
4c4e16
 
4c4e16
 	status->state = snd_pcm_dmix_state(pcm);
4c4e16
+	status->appl_ptr = *pcm->appl.ptr; /* slave PCM doesn't set appl_ptr */
4c4e16
 	status->trigger_tstamp = dmix->trigger_tstamp;
4c4e16
 	status->avail = snd_pcm_mmap_playback_avail(pcm);
4c4e16
 	status->avail_max = status->avail > dmix->avail_max ? status->avail : dmix->avail_max;
4c4e16
diff --git a/src/pcm/pcm_dshare.c b/src/pcm/pcm_dshare.c
4c4e16
index 10243013..dccb137b 100644
4c4e16
--- a/src/pcm/pcm_dshare.c
4c4e16
+++ b/src/pcm/pcm_dshare.c
4c4e16
@@ -243,6 +243,7 @@ static int snd_pcm_dshare_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
4c4e16
 		break;
4c4e16
 	}
4c4e16
 	status->state = snd_pcm_dshare_state(pcm);
4c4e16
+	status->appl_ptr = *pcm->appl.ptr; /* slave PCM doesn't set appl_ptr */
4c4e16
 	status->trigger_tstamp = dshare->trigger_tstamp;
4c4e16
 	status->avail = snd_pcm_mmap_playback_avail(pcm);
4c4e16
 	status->avail_max = status->avail > dshare->avail_max ? status->avail : dshare->avail_max;
4c4e16
diff --git a/src/pcm/pcm_dsnoop.c b/src/pcm/pcm_dsnoop.c
4c4e16
index c6e8cd27..695bf4aa 100644
4c4e16
--- a/src/pcm/pcm_dsnoop.c
4c4e16
+++ b/src/pcm/pcm_dsnoop.c
4c4e16
@@ -193,6 +193,7 @@ static int snd_pcm_dsnoop_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
4c4e16
 	snd_pcm_status(dsnoop->spcm, status);
4c4e16
 	state = snd_pcm_state(dsnoop->spcm);
4c4e16
 	status->state = state == SND_PCM_STATE_RUNNING ? dsnoop->state : state;
4c4e16
+	status->appl_ptr = *pcm->appl.ptr; /* slave PCM doesn't set appl_ptr */
4c4e16
 	status->trigger_tstamp = dsnoop->trigger_tstamp;
4c4e16
 	status->avail = snd_pcm_mmap_capture_avail(pcm);
4c4e16
 	status->avail_max = status->avail > dsnoop->avail_max ? status->avail : dsnoop->avail_max;
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 26fdcb98e6be186016d53f87d06ae47aabe5b7fc Mon Sep 17 00:00:00 2001
4c4e16
From: Takashi Iwai <tiwai@suse.de>
4c4e16
Date: Fri, 22 Jan 2021 15:48:40 +0100
4c4e16
Subject: [PATCH 46/49] pcm: ioplug: Pass appl_ptr and hw_ptr in
4c4e16
 snd_pcm_status()
4c4e16
4c4e16
The snd_pcm_status() of the ioplug doesn't return the current
4c4e16
positions of hw_ptr and appl_ptr as advertised.  Fix it by copying the
4c4e16
current values stored in the plugin data.
4c4e16
4c4e16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_ioplug.c | 2 ++
4c4e16
 1 file changed, 2 insertions(+)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c
4c4e16
index e141b1f9..a1463bf6 100644
4c4e16
--- a/src/pcm/pcm_ioplug.c
4c4e16
+++ b/src/pcm/pcm_ioplug.c
4c4e16
@@ -133,6 +133,8 @@ static int snd_pcm_ioplug_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
4c4e16
 	gettimestamp(&status->tstamp, pcm->tstamp_type);
4c4e16
 	status->avail = snd_pcm_mmap_avail(pcm);
4c4e16
 	status->avail_max = io->avail_max;
4c4e16
+	status->appl_ptr = *pcm->appl.ptr;
4c4e16
+	status->hw_ptr = *pcm->hw.ptr;
4c4e16
 	if (snd_pcm_ioplug_delay(pcm, &sd) < 0)
4c4e16
 		sd = snd_pcm_mmap_delay(pcm);
4c4e16
 	status->delay = sd;
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From bcc762f99ad642cc0dd9eaceb51f228eba9fe68c Mon Sep 17 00:00:00 2001
4c4e16
From: Takashi Iwai <tiwai@suse.de>
4c4e16
Date: Fri, 22 Jan 2021 15:48:41 +0100
4c4e16
Subject: [PATCH 47/49] pcm: null: Pass appl_ptr and hw_ptr in snd_pcm_status()
4c4e16
4c4e16
Just like the previous fix for ioplug, the null plugin also misses the
4c4e16
appl_ptr and hw_ptr updates for snd_pcm_status().  Fix it as well.
4c4e16
4c4e16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_null.c | 2 ++
4c4e16
 1 file changed, 2 insertions(+)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_null.c b/src/pcm/pcm_null.c
4c4e16
index 1d815485..c8ea9b38 100644
4c4e16
--- a/src/pcm/pcm_null.c
4c4e16
+++ b/src/pcm/pcm_null.c
4c4e16
@@ -96,6 +96,8 @@ static int snd_pcm_null_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
4c4e16
 	memset(status, 0, sizeof(*status));
4c4e16
 	status->state = null->state;
4c4e16
 	status->trigger_tstamp = null->trigger_tstamp;
4c4e16
+	status->appl_ptr = *pcm->appl.ptr;
4c4e16
+	status->hw_ptr = *pcm->hw.ptr;
4c4e16
 	gettimestamp(&status->tstamp, pcm->tstamp_type);
4c4e16
 	status->avail = snd_pcm_null_avail_update(pcm);
4c4e16
 	status->avail_max = pcm->buffer_size;
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 55d59821ffb8f44395cf2b7a424d6523da58e66a Mon Sep 17 00:00:00 2001
4c4e16
From: Takashi Iwai <tiwai@suse.de>
4c4e16
Date: Fri, 22 Jan 2021 15:48:42 +0100
4c4e16
Subject: [PATCH 48/49] pcm: share: Pass appl_ptr and hw_ptr in
4c4e16
 snd_pcm_status()
4c4e16
4c4e16
This one also has the same problem as others; the appl_ptr and hw_ptr
4c4e16
of share plugin aren't updated in snd_pcm_status() call.  Fix it.
4c4e16
4c4e16
Signed-off-by: Takashi Iwai <tiwai@suse.de>
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm_share.c | 2 ++
4c4e16
 1 file changed, 2 insertions(+)
4c4e16
4c4e16
diff --git a/src/pcm/pcm_share.c b/src/pcm/pcm_share.c
4c4e16
index bff9507d..72509491 100644
4c4e16
--- a/src/pcm/pcm_share.c
4c4e16
+++ b/src/pcm/pcm_share.c
4c4e16
@@ -711,6 +711,8 @@ static int snd_pcm_share_status(snd_pcm_t *pcm, snd_pcm_status_t *status)
4c4e16
  _notrunning:
4c4e16
 	status->delay = sd + d;
4c4e16
 	status->state = share->state;
4c4e16
+	status->appl_ptr = *pcm->appl.ptr;
4c4e16
+	status->hw_ptr = *pcm->hw.ptr;
4c4e16
 	status->trigger_tstamp = share->trigger_tstamp;
4c4e16
  _end:
4c4e16
 	Pthread_mutex_unlock(&slave->mutex);
4c4e16
-- 
4c4e16
2.29.2
4c4e16
4c4e16
4c4e16
From 00eafe98eebff8ecd1ecdc58470068bfd610cc8d Mon Sep 17 00:00:00 2001
4c4e16
From: Jaroslav Kysela <perex@perex.cz>
4c4e16
Date: Thu, 21 Jan 2021 15:45:49 +0100
4c4e16
Subject: [PATCH 49/49] pcm: pcm_ioplug - fix the avail_update mmap capture
4c4e16
 copy issue
4c4e16
4c4e16
It seems that the commit "pcm: ioplug: Transfer all available data"
4c4e16
introduced new regressions (wrong memory access). The second issue
4c4e16
is that the avail_update in ioplug does not move appl_ptr nor hw_ptr,
4c4e16
so it's possible that the transfers may be repetitive.
4c4e16
4c4e16
This patch moves the transfer calls to mmap_begin callback where it
4c4e16
should be. The pointer wraps are handled by design now.
4c4e16
4c4e16
Fixes: 1714332719 ("pcm: ioplug: Transfer all available data")
4c4e16
BugLink: https://github.com/alsa-project/alsa-lib/pull/103
4c4e16
Tested-by: Andreas Pape <apape@de.adit-jv.com>
4c4e16
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
4c4e16
---
4c4e16
 src/pcm/pcm.c        | 20 ++++++++++-----
4c4e16
 src/pcm/pcm_ioplug.c | 60 +++++++++++++++++++++++++-------------------
4c4e16
 src/pcm/pcm_local.h  |  2 ++
4c4e16
 3 files changed, 50 insertions(+), 32 deletions(-)
4c4e16
4c4e16
diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c
4c4e16
index 24030b31..a57ce5d9 100644
4c4e16
--- a/src/pcm/pcm.c
4c4e16
+++ b/src/pcm/pcm.c
4c4e16
@@ -7218,9 +7218,8 @@ int snd_pcm_mmap_begin(snd_pcm_t *pcm,
4c4e16
 }
4c4e16
 
4c4e16
 #ifndef DOC_HIDDEN
4c4e16
-/* locked version */
4c4e16
-int __snd_pcm_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
4c4e16
-		       snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames)
4c4e16
+int __snd_pcm_mmap_begin_generic(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
4c4e16
+				 snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames)
4c4e16
 {
4c4e16
 	snd_pcm_uframes_t cont;
4c4e16
 	snd_pcm_uframes_t f;
4c4e16
@@ -7229,9 +7228,6 @@ int __snd_pcm_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
4c4e16
 
4c4e16
 	assert(pcm && areas && offset && frames);
4c4e16
 
4c4e16
-	if (pcm->fast_ops->mmap_begin)
4c4e16
-		return pcm->fast_ops->mmap_begin(pcm->fast_op_arg, areas, offset, frames);
4c4e16
-
4c4e16
 	/* fallback for plugins that do not specify new callback */
4c4e16
 	xareas = snd_pcm_mmap_areas(pcm);
4c4e16
 	if (xareas == NULL)
4c4e16
@@ -7250,6 +7246,18 @@ int __snd_pcm_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
4c4e16
 	*frames = f;
4c4e16
 	return 0;
4c4e16
 }
4c4e16
+
4c4e16
+/* locked version */
4c4e16
+int __snd_pcm_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
4c4e16
+			 snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames)
4c4e16
+{
4c4e16
+	assert(pcm && areas && offset && frames);
4c4e16
+
4c4e16
+	if (pcm->fast_ops->mmap_begin)
4c4e16
+		return pcm->fast_ops->mmap_begin(pcm->fast_op_arg, areas, offset, frames);
4c4e16
+
4c4e16
+	return __snd_pcm_mmap_begin_generic(pcm, areas, offset, frames);
4c4e16
+}
4c4e16
 #endif
4c4e16
 
4c4e16
 /**
4c4e16
diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c
4c4e16
index a1463bf6..98184398 100644
4c4e16
--- a/src/pcm/pcm_ioplug.c
4c4e16
+++ b/src/pcm/pcm_ioplug.c
4c4e16
@@ -697,6 +697,38 @@ static snd_pcm_sframes_t snd_pcm_ioplug_readn(snd_pcm_t *pcm, void **bufs, snd_p
4c4e16
 	}
4c4e16
 }
4c4e16
 
4c4e16
+static int snd_pcm_ioplug_mmap_begin_capture(snd_pcm_t *pcm,
4c4e16
+					     const snd_pcm_channel_area_t **areas,
4c4e16
+					     snd_pcm_uframes_t *offset,
4c4e16
+					     snd_pcm_uframes_t *frames)
4c4e16
+{
4c4e16
+	ioplug_priv_t *io = pcm->private_data;
4c4e16
+	int err;
4c4e16
+
4c4e16
+	err = __snd_pcm_mmap_begin_generic(pcm, areas, offset, frames);
4c4e16
+	if (err < 0)
4c4e16
+		return err;
4c4e16
+
4c4e16
+	if (io->data->callback->transfer &&
4c4e16
+	    pcm->access != SND_PCM_ACCESS_RW_INTERLEAVED &&
4c4e16
+	    pcm->access != SND_PCM_ACCESS_RW_NONINTERLEAVED) {
4c4e16
+		snd_pcm_sframes_t result;
4c4e16
+		result = io->data->callback->transfer(io->data, *areas, *offset, *frames);
4c4e16
+		if (result < 0)
4c4e16
+			return result;
4c4e16
+	}
4c4e16
+
4c4e16
+	return err;
4c4e16
+}
4c4e16
+
4c4e16
+static int snd_pcm_ioplug_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
4c4e16
+				     snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames)
4c4e16
+{
4c4e16
+	if (pcm->stream == SND_PCM_STREAM_PLAYBACK)
4c4e16
+		return __snd_pcm_mmap_begin_generic(pcm, areas, offset, frames);
4c4e16
+	return snd_pcm_ioplug_mmap_begin_capture(pcm, areas, offset, frames);
4c4e16
+}
4c4e16
+
4c4e16
 static snd_pcm_sframes_t snd_pcm_ioplug_mmap_commit(snd_pcm_t *pcm,
4c4e16
 						    snd_pcm_uframes_t offset,
4c4e16
 						    snd_pcm_uframes_t size)
4c4e16
@@ -707,7 +739,7 @@ static snd_pcm_sframes_t snd_pcm_ioplug_mmap_commit(snd_pcm_t *pcm,
4c4e16
 		const snd_pcm_channel_area_t *areas;
4c4e16
 		snd_pcm_uframes_t ofs, frames = size;
4c4e16
 
4c4e16
-		__snd_pcm_mmap_begin(pcm, &areas, &ofs, &frames);
4c4e16
+		__snd_pcm_mmap_begin_generic(pcm, &areas, &ofs, &frames);
4c4e16
 		if (ofs != offset)
4c4e16
 			return -EIO;
4c4e16
 		return ioplug_priv_transfer_areas(pcm, areas, offset, frames);
4c4e16
@@ -727,31 +759,6 @@ static snd_pcm_sframes_t snd_pcm_ioplug_avail_update(snd_pcm_t *pcm)
4c4e16
 		return -EPIPE;
4c4e16
 
4c4e16
 	avail = snd_pcm_mmap_avail(pcm);
4c4e16
-	if (pcm->stream == SND_PCM_STREAM_CAPTURE &&
4c4e16
-	    pcm->access != SND_PCM_ACCESS_RW_INTERLEAVED &&
4c4e16
-	    pcm->access != SND_PCM_ACCESS_RW_NONINTERLEAVED) {
4c4e16
-		if (io->data->callback->transfer) {
4c4e16
-			const snd_pcm_channel_area_t *areas;
4c4e16
-			snd_pcm_uframes_t offset, size = UINT_MAX;
4c4e16
-			snd_pcm_sframes_t result;
4c4e16
-
4c4e16
-			__snd_pcm_mmap_begin(pcm, &areas, &offset, &size);
4c4e16
-			result = io->data->callback->transfer(io->data, areas, offset, size);
4c4e16
-			if (result < 0)
4c4e16
-				return result;
4c4e16
-
4c4e16
-			/* If the available data doesn't fit in the
4c4e16
-			   contiguous area at the end of the mmap we
4c4e16
-			   must transfer the remaining data to the
4c4e16
-			   beginning of the mmap. */
4c4e16
-			if (size < avail) {
4c4e16
-				result = io->data->callback->transfer(io->data, areas,
4c4e16
-								      0, avail - size);
4c4e16
-				if (result < 0)
4c4e16
-					return result;
4c4e16
-			}
4c4e16
-		}
4c4e16
-	}
4c4e16
 	if (avail > io->avail_max)
4c4e16
 		io->avail_max = avail;
4c4e16
 	return (snd_pcm_sframes_t)avail;
4c4e16
@@ -947,6 +954,7 @@ static const snd_pcm_fast_ops_t snd_pcm_ioplug_fast_ops = {
4c4e16
 	.poll_descriptors_count = snd_pcm_ioplug_poll_descriptors_count,
4c4e16
 	.poll_descriptors = snd_pcm_ioplug_poll_descriptors,
4c4e16
 	.poll_revents = snd_pcm_ioplug_poll_revents,
4c4e16
+	.mmap_begin = snd_pcm_ioplug_mmap_begin,
4c4e16
 };
4c4e16
 
4c4e16
 #endif /* !DOC_HIDDEN */
4c4e16
diff --git a/src/pcm/pcm_local.h b/src/pcm/pcm_local.h
4c4e16
index bec5a408..a63f4be0 100644
4c4e16
--- a/src/pcm/pcm_local.h
4c4e16
+++ b/src/pcm/pcm_local.h
4c4e16
@@ -420,6 +420,8 @@ int _snd_pcm_poll_descriptor(snd_pcm_t *pcm);
4c4e16
 #define _snd_pcm_async_descriptor _snd_pcm_poll_descriptor /* FIXME */
4c4e16
 
4c4e16
 /* locked versions */
4c4e16
+int __snd_pcm_mmap_begin_generic(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
4c4e16
+				 snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames);
4c4e16
 int __snd_pcm_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas,
4c4e16
 			 snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames);
4c4e16
 snd_pcm_sframes_t __snd_pcm_mmap_commit(snd_pcm_t *pcm,
4c4e16
-- 
4c4e16
2.29.2
4c4e16