Accepting request 896395 from multimedia:libs

OBS-URL: https://build.opensuse.org/request/show/896395
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/alsa?expand=0&rev=209
This commit is contained in:
Dominique Leuenberger 2021-06-05 21:30:28 +00:00 committed by Git OBS Bridge
commit 4cb728036f
51 changed files with 62 additions and 2306 deletions

View File

@ -1,32 +0,0 @@
From ad8c8e5503980295dd8e5e54a6285d2d7e32eb1e Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Thu, 22 Oct 2020 20:57:32 +0200
Subject: [PATCH 01/33] dlmisc: the snd_plugin_dir_set / snd_plugin_dir must be
declared even for \!DL_ORIGIN_AVAILABLE
Fixes: 8580c081c2 ("dlsym: add support for ALSA_PLUGIN_DIR environment variable")
BugLink: https://github.com/alsa-project/alsa-lib/issues/91
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/dlmisc.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/src/dlmisc.c b/src/dlmisc.c
index c9517c5519a1..f20eb59373cf 100644
--- a/src/dlmisc.c
+++ b/src/dlmisc.c
@@ -42,11 +42,9 @@
#ifndef PIC
struct snd_dlsym_link *snd_dlsym_start = NULL;
#endif
-#ifdef DL_ORIGIN_AVAILABLE
static int snd_plugin_dir_set = 0;
static char *snd_plugin_dir = NULL;
#endif
-#endif
#if defined(DL_ORIGIN_AVAILABLE) && defined(HAVE_LIBPTHREAD)
static pthread_mutex_t snd_dlpath_mutex = PTHREAD_MUTEX_INITIALIZER;
--
2.26.2

View File

@ -1,41 +0,0 @@
From 1d993b37ab4e0b9b6e6b795d7be84ce97b29e20b Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Thu, 29 Oct 2020 20:31:19 +0100
Subject: [PATCH 02/33] dlmisc: fix snd_plugin_dir locking for not
DL_ORIGIN_AVAILABLE
Fixes: 8580c081c2 ("dlsym: add support for ALSA_PLUGIN_DIR environment variable")
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/dlmisc.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/src/dlmisc.c b/src/dlmisc.c
index f20eb59373cf..1dd9135641c1 100644
--- a/src/dlmisc.c
+++ b/src/dlmisc.c
@@ -46,7 +46,7 @@ static int snd_plugin_dir_set = 0;
static char *snd_plugin_dir = NULL;
#endif
-#if defined(DL_ORIGIN_AVAILABLE) && defined(HAVE_LIBPTHREAD)
+#ifdef HAVE_LIBPTHREAD
static pthread_mutex_t snd_dlpath_mutex = PTHREAD_MUTEX_INITIALIZER;
static inline void snd_dlpath_lock(void)
@@ -440,12 +440,10 @@ void snd_dlobj_cache_cleanup(void)
free(c);
}
snd_dlobj_unlock();
-#ifdef DL_ORIGIN_AVAILABLE
snd_dlpath_lock();
snd_plugin_dir_set = 0;
free(snd_plugin_dir);
snd_plugin_dir = NULL;
snd_dlpath_unlock();
-#endif
}
#endif
--
2.26.2

View File

@ -1,28 +0,0 @@
From 2757191e3b85d491705b31c6ecca2dbd96d26ade Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Thu, 29 Oct 2020 20:34:17 +0100
Subject: [PATCH 03/33] pcm: snd_pcm_mmap_readi - fix typo in comment
\param size frames to be *read*
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/pcm/pcm_mmap.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/pcm/pcm_mmap.c b/src/pcm/pcm_mmap.c
index 9600c3831238..9cbaae05250a 100644
--- a/src/pcm/pcm_mmap.c
+++ b/src/pcm/pcm_mmap.c
@@ -183,7 +183,7 @@ snd_pcm_sframes_t snd_pcm_mmap_writen(snd_pcm_t *pcm, void **bufs, snd_pcm_ufram
* \brief Read interleaved frames from a PCM using direct buffer (mmap)
* \param pcm PCM handle
* \param buffer frames containing buffer
- * \param size frames to be written
+ * \param size frames to be read
* \return a positive number of frames actually read otherwise a
* negative error code
* \retval -EBADFD PCM is not in the right state (#SND_PCM_STATE_PREPARED or #SND_PCM_STATE_RUNNING)
--
2.26.2

View File

@ -1,148 +0,0 @@
From 39bd0e1a5be3620f9123f7fe72ffa6cb7d463b21 Mon Sep 17 00:00:00 2001
From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Date: Thu, 12 Nov 2020 10:29:38 -0600
Subject: [PATCH 04/44] topology: use inclusive language for bclk
use bclk_provider for structure fields, 'codec_provider' and
'codec_consumer' for options and modify #defines to use CP and CC
suffixes.
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
include/sound/uapi/asoc.h | 11 +++++++----
include/topology.h | 2 +-
src/topology/pcm.c | 36 ++++++++++++++++++++++++++----------
3 files changed, 34 insertions(+), 15 deletions(-)
diff --git a/include/sound/uapi/asoc.h b/include/sound/uapi/asoc.h
index 4efb4ec42500..ceafb1a90b98 100644
--- a/include/sound/uapi/asoc.h
+++ b/include/sound/uapi/asoc.h
@@ -169,10 +169,13 @@
#define SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP (1 << 3)
/* DAI topology BCLK parameter
- * For the backwards capability, by default codec is bclk master
+ * For the backwards capability, by default codec is bclk provider
*/
-#define SND_SOC_TPLG_BCLK_CM 0 /* codec is bclk master */
-#define SND_SOC_TPLG_BCLK_CS 1 /* codec is bclk slave */
+#define SND_SOC_TPLG_BCLK_CP 0 /* codec is bclk provider */
+#define SND_SOC_TPLG_BCLK_CC 1 /* codec is bclk consumer */
+/* keep previous definitions for compatibility */
+#define SND_SOC_TPLG_BCLK_CM SND_SOC_TPLG_BCLK_CP
+#define SND_SOC_TPLG_BCLK_CS SND_SOC_TPLG_BCLK_CC
/* DAI topology FSYNC parameter
* For the backwards capability, by default codec is fsync master
@@ -335,7 +338,7 @@ struct snd_soc_tplg_hw_config {
__u8 clock_gated; /* SND_SOC_TPLG_DAI_CLK_GATE_ value */
__u8 invert_bclk; /* 1 for inverted BCLK, 0 for normal */
__u8 invert_fsync; /* 1 for inverted frame clock, 0 for normal */
- __u8 bclk_master; /* SND_SOC_TPLG_BCLK_ value */
+ __u8 bclk_provider; /* SND_SOC_TPLG_BCLK_ value */
__u8 fsync_master; /* SND_SOC_TPLG_FSYNC_ value */
__u8 mclk_direction; /* SND_SOC_TPLG_MCLK_ value */
__le16 reserved; /* for 32bit alignment */
diff --git a/include/topology.h b/include/topology.h
index 1f52e66ea7b0..6c9706496fc3 100644
--- a/include/topology.h
+++ b/include/topology.h
@@ -1028,7 +1028,7 @@ struct snd_tplg_hw_config_template {
unsigned char clock_gated; /* SND_SOC_TPLG_DAI_CLK_GATE_ value */
unsigned char invert_bclk; /* 1 for inverted BCLK, 0 for normal */
unsigned char invert_fsync; /* 1 for inverted frame clock, 0 for normal */
- unsigned char bclk_master; /* SND_SOC_TPLG_BCLK_ value */
+ unsigned char bclk_provider; /* SND_SOC_TPLG_BCLK_ value */
unsigned char fsync_master; /* SND_SOC_TPLG_FSYNC_ value */
unsigned char mclk_direction; /* SND_SOC_TPLG_MCLK_ value */
unsigned short reserved; /* for 32bit alignment */
diff --git a/src/topology/pcm.c b/src/topology/pcm.c
index 191b7a0a92da..f05df348fa23 100644
--- a/src/topology/pcm.c
+++ b/src/topology/pcm.c
@@ -1411,6 +1411,7 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
snd_config_t *n;
const char *id, *val = NULL;
int ret, ival;
+ bool provider_legacy;
elem = tplg_elem_new_common(tplg, cfg, NULL, SND_TPLG_TYPE_HW_CONFIG);
if (!elem)
@@ -1451,8 +1452,15 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
continue;
}
- if (strcmp(id, "bclk") == 0 ||
- strcmp(id, "bclk_master") == 0) {
+ provider_legacy = false;
+ if (strcmp(id, "bclk_master") == 0) {
+ SNDERR("deprecated option %s, please use 'bclk'\n", id);
+ provider_legacy = true;
+ }
+
+ if (provider_legacy ||
+ strcmp(id, "bclk") == 0) {
+
if (snd_config_get_string(n, &val) < 0)
return -EINVAL;
@@ -1462,11 +1470,19 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
*/
SNDERR("deprecated bclk value '%s'", val);
- hw_cfg->bclk_master = SND_SOC_TPLG_BCLK_CS;
+ hw_cfg->bclk_provider = SND_SOC_TPLG_BCLK_CC;
} else if (!strcmp(val, "codec_slave")) {
- hw_cfg->bclk_master = SND_SOC_TPLG_BCLK_CS;
+ SNDERR("deprecated bclk value '%s', use 'codec_consumer'", val);
+
+ hw_cfg->bclk_provider = SND_SOC_TPLG_BCLK_CC;
+ } else if (!strcmp(val, "codec_consumer")) {
+ hw_cfg->bclk_provider = SND_SOC_TPLG_BCLK_CC;
} else if (!strcmp(val, "codec_master")) {
- hw_cfg->bclk_master = SND_SOC_TPLG_BCLK_CM;
+ SNDERR("deprecated bclk value '%s', use 'codec_provider", val);
+
+ hw_cfg->bclk_provider = SND_SOC_TPLG_BCLK_CP;
+ } else if (!strcmp(val, "codec_provider")) {
+ hw_cfg->bclk_provider = SND_SOC_TPLG_BCLK_CP;
}
continue;
}
@@ -1623,10 +1639,10 @@ int tplg_save_hw_config(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
if (err >= 0 && hc->fmt)
err = tplg_save_printf(dst, pfx, "\tformat '%s'\n",
get_audio_hw_format_name(hc->fmt));
- if (err >= 0 && hc->bclk_master)
+ if (err >= 0 && hc->bclk_provider)
err = tplg_save_printf(dst, pfx, "\tbclk '%s'\n",
- hc->bclk_master == SND_SOC_TPLG_BCLK_CS ?
- "codec_slave" : "codec_master");
+ hc->bclk_provider == SND_SOC_TPLG_BCLK_CC ?
+ "codec_consumer" : "codec_provider");
if (err >= 0 && hc->bclk_rate)
err = tplg_save_printf(dst, pfx, "\tbclk_freq %u\n",
hc->bclk_rate);
@@ -1791,7 +1807,7 @@ static int set_link_hw_config(struct snd_soc_tplg_hw_config *cfg,
cfg->clock_gated = tpl->clock_gated;
cfg->invert_bclk = tpl->invert_bclk;
cfg->invert_fsync = tpl->invert_fsync;
- cfg->bclk_master = tpl->bclk_master;
+ cfg->bclk_provider = tpl->bclk_provider;
cfg->fsync_master = tpl->fsync_master;
cfg->mclk_direction = tpl->mclk_direction;
cfg->reserved = tpl->reserved;
@@ -2174,7 +2190,7 @@ next:
hw->clock_gated = link->hw_config[i].clock_gated;
hw->invert_bclk = link->hw_config[i].invert_bclk;
hw->invert_fsync = link->hw_config[i].invert_fsync;
- hw->bclk_master = link->hw_config[i].bclk_master;
+ hw->bclk_provider = link->hw_config[i].bclk_provider;
hw->fsync_master = link->hw_config[i].fsync_master;
hw->mclk_direction = link->hw_config[i].mclk_direction;
hw->mclk_rate = link->hw_config[i].mclk_rate;
--
2.26.2

View File

@ -1,141 +0,0 @@
From 706192341d1d0bbb906d690b227b9dee5c1fc4b5 Mon Sep 17 00:00:00 2001
From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Date: Thu, 12 Nov 2020 10:29:39 -0600
Subject: [PATCH 05/44] topology: use inclusive language for fsync
use fsync_provider for structure fields, 'codec_provider' and
'codec_consumer' for options and modify #defines to use CP and CC
suffixes.
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
include/sound/uapi/asoc.h | 11 +++++++----
include/topology.h | 2 +-
src/topology/pcm.c | 37 ++++++++++++++++++++++++++-----------
3 files changed, 34 insertions(+), 16 deletions(-)
diff --git a/include/sound/uapi/asoc.h b/include/sound/uapi/asoc.h
index ceafb1a90b98..f32c56972d3f 100644
--- a/include/sound/uapi/asoc.h
+++ b/include/sound/uapi/asoc.h
@@ -178,10 +178,13 @@
#define SND_SOC_TPLG_BCLK_CS SND_SOC_TPLG_BCLK_CC
/* DAI topology FSYNC parameter
- * For the backwards capability, by default codec is fsync master
+ * For the backwards capability, by default codec is fsync provider
*/
-#define SND_SOC_TPLG_FSYNC_CM 0 /* codec is fsync master */
-#define SND_SOC_TPLG_FSYNC_CS 1 /* codec is fsync slave */
+#define SND_SOC_TPLG_FSYNC_CP 0 /* codec is fsync provider */
+#define SND_SOC_TPLG_FSYNC_CC 1 /* codec is fsync consumer */
+/* keep previous definitions for compatibility */
+#define SND_SOC_TPLG_FSYNC_CM SND_SOC_TPLG_FSYNC_CP
+#define SND_SOC_TPLG_FSYNC_CS SND_SOC_TPLG_FSYNC_CC
/*
* Block Header.
@@ -339,7 +342,7 @@ struct snd_soc_tplg_hw_config {
__u8 invert_bclk; /* 1 for inverted BCLK, 0 for normal */
__u8 invert_fsync; /* 1 for inverted frame clock, 0 for normal */
__u8 bclk_provider; /* SND_SOC_TPLG_BCLK_ value */
- __u8 fsync_master; /* SND_SOC_TPLG_FSYNC_ value */
+ __u8 fsync_provider; /* SND_SOC_TPLG_FSYNC_ value */
__u8 mclk_direction; /* SND_SOC_TPLG_MCLK_ value */
__le16 reserved; /* for 32bit alignment */
__le32 mclk_rate; /* MCLK or SYSCLK freqency in Hz */
diff --git a/include/topology.h b/include/topology.h
index 6c9706496fc3..4ade20df0751 100644
--- a/include/topology.h
+++ b/include/topology.h
@@ -1029,7 +1029,7 @@ struct snd_tplg_hw_config_template {
unsigned char invert_bclk; /* 1 for inverted BCLK, 0 for normal */
unsigned char invert_fsync; /* 1 for inverted frame clock, 0 for normal */
unsigned char bclk_provider; /* SND_SOC_TPLG_BCLK_ value */
- unsigned char fsync_master; /* SND_SOC_TPLG_FSYNC_ value */
+ unsigned char fsync_provider; /* SND_SOC_TPLG_FSYNC_ value */
unsigned char mclk_direction; /* SND_SOC_TPLG_MCLK_ value */
unsigned short reserved; /* for 32bit alignment */
unsigned int mclk_rate; /* MCLK or SYSCLK freqency in Hz */
diff --git a/src/topology/pcm.c b/src/topology/pcm.c
index f05df348fa23..c8f418621323 100644
--- a/src/topology/pcm.c
+++ b/src/topology/pcm.c
@@ -1504,8 +1504,15 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
continue;
}
- if (strcmp(id, "fsync") == 0 ||
- strcmp(id, "fsync_master") == 0) {
+ provider_legacy = false;
+ if (strcmp(id, "fsync_master") == 0) {
+ SNDERR("deprecated option %s, please use 'fsync'\n", id);
+ provider_legacy = true;
+ }
+
+ if (provider_legacy ||
+ strcmp(id, "fsync") == 0) {
+
if (snd_config_get_string(n, &val) < 0)
return -EINVAL;
@@ -1515,11 +1522,19 @@ int tplg_parse_hw_config(snd_tplg_t *tplg, snd_config_t *cfg,
*/
SNDERR("deprecated fsync value '%s'", val);
- hw_cfg->fsync_master = SND_SOC_TPLG_FSYNC_CS;
+ hw_cfg->fsync_provider = SND_SOC_TPLG_FSYNC_CC;
} else if (!strcmp(val, "codec_slave")) {
- hw_cfg->fsync_master = SND_SOC_TPLG_FSYNC_CS;
+ SNDERR("deprecated fsync value '%s', use 'codec_consumer'", val);
+
+ hw_cfg->fsync_provider = SND_SOC_TPLG_FSYNC_CC;
+ } else if (!strcmp(val, "codec_consumer")) {
+ hw_cfg->fsync_provider = SND_SOC_TPLG_FSYNC_CC;
} else if (!strcmp(val, "codec_master")) {
- hw_cfg->fsync_master = SND_SOC_TPLG_FSYNC_CM;
+ SNDERR("deprecated fsync value '%s', use 'codec_provider'", val);
+
+ hw_cfg->fsync_provider = SND_SOC_TPLG_FSYNC_CP;
+ } else if (!strcmp(val, "codec_provider")) {
+ hw_cfg->fsync_provider = SND_SOC_TPLG_FSYNC_CP;
}
continue;
}
@@ -1648,10 +1663,10 @@ int tplg_save_hw_config(snd_tplg_t *tplg ATTRIBUTE_UNUSED,
hc->bclk_rate);
if (err >= 0 && hc->invert_bclk)
err = tplg_save_printf(dst, pfx, "\tbclk_invert 1\n");
- if (err >= 0 && hc->fsync_master)
- err = tplg_save_printf(dst, pfx, "\tfsync_master '%s'\n",
- hc->fsync_master == SND_SOC_TPLG_FSYNC_CS ?
- "codec_slave" : "codec_master");
+ if (err >= 0 && hc->fsync_provider)
+ err = tplg_save_printf(dst, pfx, "\tfsync_provider '%s'\n",
+ hc->fsync_provider == SND_SOC_TPLG_FSYNC_CC ?
+ "codec_consumer" : "codec_provider");
if (err >= 0 && hc->fsync_rate)
err = tplg_save_printf(dst, pfx, "\tfsync_freq %u\n",
hc->fsync_rate);
@@ -1808,7 +1823,7 @@ static int set_link_hw_config(struct snd_soc_tplg_hw_config *cfg,
cfg->invert_bclk = tpl->invert_bclk;
cfg->invert_fsync = tpl->invert_fsync;
cfg->bclk_provider = tpl->bclk_provider;
- cfg->fsync_master = tpl->fsync_master;
+ cfg->fsync_provider = tpl->fsync_provider;
cfg->mclk_direction = tpl->mclk_direction;
cfg->reserved = tpl->reserved;
cfg->mclk_rate = tpl->mclk_rate;
@@ -2191,7 +2206,7 @@ next:
hw->invert_bclk = link->hw_config[i].invert_bclk;
hw->invert_fsync = link->hw_config[i].invert_fsync;
hw->bclk_provider = link->hw_config[i].bclk_provider;
- hw->fsync_master = link->hw_config[i].fsync_master;
+ hw->fsync_provider = link->hw_config[i].fsync_provider;
hw->mclk_direction = link->hw_config[i].mclk_direction;
hw->mclk_rate = link->hw_config[i].mclk_rate;
hw->bclk_rate = link->hw_config[i].bclk_rate;
--
2.26.2

View File

@ -1,31 +0,0 @@
From e5c350d7bc6f3d45702059c0ae8d32b3603273c1 Mon Sep 17 00:00:00 2001
From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Date: Thu, 12 Nov 2020 10:29:40 -0600
Subject: [PATCH 06/44] topology: use inclusive language in documentation
Use codec_provider and codec_consumer for bclk and fsync
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
include/topology.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/include/topology.h b/include/topology.h
index 4ade20df0751..d1feee4d9e25 100644
--- a/include/topology.h
+++ b/include/topology.h
@@ -658,8 +658,8 @@ extern "C" {
*
* id "1" # used for binding to the config
* format "I2S" # physical audio format.
- * bclk "master" # Platform is master of bit clock
- * fsync "slave" # Platform is slave of fsync
+ * bclk "codec_provider" # Codec provides the bit clock
+ * fsync "codec_consumer" # Codec follows the fsync
* }
* </pre>
*
--
2.26.2

View File

@ -1,29 +0,0 @@
From 7d36895225d09ae26868997382445cc7ad2e9513 Mon Sep 17 00:00:00 2001
From: Jonas Holmberg <jonashg@axis.com>
Date: Wed, 4 Nov 2020 14:49:56 +0100
Subject: [PATCH 07/33] pcm: set the snd_pcm_ioplug_status() tstamp field
Set the status tstamp field so that it can be accessed with
snd_pcm_status_get_htstamp().
Signed-off-by: Jonas Holmberg <jonashg@axis.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
src/pcm/pcm_ioplug.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c
index a437ca326778..9b1b8ac3b6fc 100644
--- a/src/pcm/pcm_ioplug.c
+++ b/src/pcm/pcm_ioplug.c
@@ -115,6 +115,7 @@ static int snd_pcm_ioplug_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
snd_pcm_ioplug_hw_ptr_update(pcm);
status->state = io->data->state;
status->trigger_tstamp = io->trigger_tstamp;
+ gettimestamp(&status->tstamp, pcm->tstamp_type);
status->avail = snd_pcm_mmap_avail(pcm);
status->avail_max = io->avail_max;
return 0;
--
2.26.2

View File

@ -1,44 +0,0 @@
From ea02dbd20a535085638c63c6b8bec94e628486c4 Mon Sep 17 00:00:00 2001
From: David Henningsson <diwic@ubuntu.com>
Date: Wed, 16 Dec 2020 19:55:22 +0100
Subject: [PATCH 09/33] pcm: Add snd_pcm_audio_tstamp_type_t constants
These are mostly a copy-paste from the kernel headers. But since functions
snd_pcm_audio_tstamp_config make use of these they should be added to the
public API as well.
Reported-by: Alex Moon <alex.r.moon@gmail.com>
Signed-off-by: David Henningsson <diwic@ubuntu.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
include/pcm.h | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/include/pcm.h b/include/pcm.h
index 5b0782315585..cf1eea8bbc9b 100644
--- a/include/pcm.h
+++ b/include/pcm.h
@@ -350,6 +350,20 @@ typedef enum _snd_pcm_tstamp_type {
SND_PCM_TSTAMP_TYPE_LAST = SND_PCM_TSTAMP_TYPE_MONOTONIC_RAW,
} snd_pcm_tstamp_type_t;
+typedef enum _snd_pcm_audio_tstamp_type {
+ /**
+ * first definition for backwards compatibility only,
+ * maps to wallclock/link time for HDAudio playback and DEFAULT/DMA time for everything else
+ */
+ SND_PCM_AUDIO_TSTAMP_TYPE_COMPAT = 0,
+ SND_PCM_AUDIO_TSTAMP_TYPE_DEFAULT = 1, /**< DMA time, reported as per hw_ptr */
+ SND_PCM_AUDIO_TSTAMP_TYPE_LINK = 2, /**< link time reported by sample or wallclock counter, reset on startup */
+ SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ABSOLUTE = 3, /**< link time reported by sample or wallclock counter, not reset on startup */
+ SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ESTIMATED = 4, /**< link time estimated indirectly */
+ SND_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED = 5, /**< link time synchronized with system time */
+ SND_PCM_AUDIO_TSTAMP_TYPE_LAST = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED
+} snd_pcm_audio_tstamp_type_t;
+
typedef struct _snd_pcm_audio_tstamp_config {
/* 5 of max 16 bits used */
unsigned int type_requested:4;
--
2.26.2

View File

@ -1,78 +0,0 @@
From dcda999d0000cbdabe61d3d175943b5f23c30057 Mon Sep 17 00:00:00 2001
From: David Henningsson <diwic@ubuntu.com>
Date: Wed, 16 Dec 2020 20:02:52 +0100
Subject: [PATCH 10/33] test/audio_time: Make use of SND_PCM_AUDIO_TSTAMP_TYPE
constants
Also fixup the usage row which seemed wrong to me.
Signed-off-by: David Henningsson <diwic@ubuntu.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
test/audio_time.c | 26 +++++++++++++-------------
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/test/audio_time.c b/test/audio_time.c
index 530922d92d43..e4d4a9448c6d 100644
--- a/test/audio_time.c
+++ b/test/audio_time.c
@@ -32,7 +32,7 @@ static void usage(char *command)
"-d, --delay add delay \n"
"-D, --device=NAME select PCM by name \n"
"-p, --playback playback tstamps \n"
- "-t, --ts_type=TYPE Default(0),link(1),link_estimated(2),synchronized(3) \n"
+ "-t, --ts_type=TYPE Compat(0),default(1),link(2),link_absolute(3),link_estimated(4),link_synchronized(5) \n"
"-r, --report show audio timestamp and accuracy validity\n"
, command);
}
@@ -201,17 +201,17 @@ int main(int argc, char *argv[])
goto _exit;
}
- if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, 0))
+ if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, SND_PCM_AUDIO_TSTAMP_TYPE_COMPAT))
printf("Playback supports audio compat timestamps\n");
- if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, 1))
+ if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, SND_PCM_AUDIO_TSTAMP_TYPE_DEFAULT))
printf("Playback supports audio default timestamps\n");
- if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, 2))
+ if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, SND_PCM_AUDIO_TSTAMP_TYPE_LINK))
printf("Playback supports audio link timestamps\n");
- if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, 3))
+ if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ABSOLUTE))
printf("Playback supports audio link absolute timestamps\n");
- if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, 4))
+ if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ESTIMATED))
printf("Playback supports audio link estimated timestamps\n");
- if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, 5))
+ if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_p, SND_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED))
printf("Playback supports audio link synchronized timestamps\n");
snd_pcm_sw_params_alloca(&swparams_p);
@@ -269,17 +269,17 @@ int main(int argc, char *argv[])
goto _exit;
}
- if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, 0))
+ if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, SND_PCM_AUDIO_TSTAMP_TYPE_COMPAT))
printf("Capture supports audio compat timestamps\n");
- if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, 1))
+ if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, SND_PCM_AUDIO_TSTAMP_TYPE_DEFAULT))
printf("Capture supports audio default timestamps\n");
- if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, 2))
+ if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, SND_PCM_AUDIO_TSTAMP_TYPE_LINK))
printf("Capture supports audio link timestamps\n");
- if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, 3))
+ if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ABSOLUTE))
printf("Capture supports audio link absolute timestamps\n");
- if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, 4))
+ if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ESTIMATED))
printf("Capture supports audio link estimated timestamps\n");
- if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, 5))
+ if (snd_pcm_hw_params_supports_audio_ts_type(hwparams_c, SND_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED))
printf("Capture supports audio link synchronized timestamps\n");
snd_pcm_sw_params_alloca(&swparams_c);
--
2.26.2

View File

@ -1,30 +0,0 @@
From a9cbfecd87777d76a83e5a912ca9bdcf48e31fa9 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Tue, 22 Dec 2020 16:10:16 +0100
Subject: [PATCH 11/33] pcm: Fix a typo in SND_PCM_AUDIO_TSTAMP_TYPE_LAST
definition
It was wrongly defined with SNDRV_ prefix. Fix it.
Fixes: ea02dbd20a53 ("pcm: Add snd_pcm_audio_tstamp_type_t constants")
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
include/pcm.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/pcm.h b/include/pcm.h
index cf1eea8bbc9b..e300b951c076 100644
--- a/include/pcm.h
+++ b/include/pcm.h
@@ -361,7 +361,7 @@ typedef enum _snd_pcm_audio_tstamp_type {
SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ABSOLUTE = 3, /**< link time reported by sample or wallclock counter, not reset on startup */
SND_PCM_AUDIO_TSTAMP_TYPE_LINK_ESTIMATED = 4, /**< link time estimated indirectly */
SND_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED = 5, /**< link time synchronized with system time */
- SND_PCM_AUDIO_TSTAMP_TYPE_LAST = SNDRV_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED
+ SND_PCM_AUDIO_TSTAMP_TYPE_LAST = SND_PCM_AUDIO_TSTAMP_TYPE_LINK_SYNCHRONIZED
} snd_pcm_audio_tstamp_type_t;
typedef struct _snd_pcm_audio_tstamp_config {
--
2.26.2

View File

@ -1,30 +0,0 @@
From 5275d170e05639473e68e5feb349aec65bf26428 Mon Sep 17 00:00:00 2001
From: Alex Henrie <alexhenrie24@gmail.com>
Date: Sat, 26 Dec 2020 14:35:39 -0700
Subject: [PATCH 12/33] conf: fix use after free in
_snd_config_load_with_include
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
src/conf.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/conf.c b/src/conf.c
index 7df2b4e77759..44d1bfde66ad 100644
--- a/src/conf.c
+++ b/src/conf.c
@@ -1970,7 +1970,9 @@ int _snd_config_load_with_include(snd_config_t *config, snd_input_t *in,
SNDERR("%s:%d:%d:%s", fd->name ? fd->name : "_toplevel_", fd->line, fd->column, str);
goto _end;
}
- if (get_char(&input) != LOCAL_UNEXPECTED_EOF) {
+ err = get_char(&input);
+ fd = input.current;
+ if (err != LOCAL_UNEXPECTED_EOF) {
SNDERR("%s:%d:%d:Unexpected }", fd->name ? fd->name : "", fd->line, fd->column);
err = -EINVAL;
goto _end;
--
2.26.2

View File

@ -1,36 +0,0 @@
From 0f4821ec1729cd72a3dde3ea63f7857e92a10919 Mon Sep 17 00:00:00 2001
From: Alex Henrie <alexhenrie24@gmail.com>
Date: Sat, 26 Dec 2020 14:35:40 -0700
Subject: [PATCH 13/33] ucm: fix bad frees in get_list0 and get_list20
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
src/ucm/main.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/ucm/main.c b/src/ucm/main.c
index 3871d5aab90b..754b967e9c07 100644
--- a/src/ucm/main.c
+++ b/src/ucm/main.c
@@ -666,7 +666,7 @@ static int get_list0(struct list_head *list,
}
return cnt;
__fail:
- snd_use_case_free_list((const char **)res, cnt);
+ snd_use_case_free_list(*result, cnt);
return -ENOMEM;
}
@@ -724,7 +724,7 @@ static int get_list20(struct list_head *list,
}
return cnt;
__fail:
- snd_use_case_free_list((const char **)res, cnt);
+ snd_use_case_free_list(*result, cnt);
return -ENOMEM;
}
--
2.26.2

View File

@ -1,35 +0,0 @@
From c56278cfda55b9f5d106890c7354176dba8c8f4d Mon Sep 17 00:00:00 2001
From: Alex Henrie <alexhenrie24@gmail.com>
Date: Sat, 26 Dec 2020 14:35:41 -0700
Subject: [PATCH 14/33] rawmidi: fix memory leak in snd_rawmidi_virtual_open
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
src/rawmidi/rawmidi_virt.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/rawmidi/rawmidi_virt.c b/src/rawmidi/rawmidi_virt.c
index 2c4c27f5b2ca..884b8ff8deee 100644
--- a/src/rawmidi/rawmidi_virt.c
+++ b/src/rawmidi/rawmidi_virt.c
@@ -315,7 +315,7 @@ int snd_rawmidi_virtual_open(snd_rawmidi_t **inputp, snd_rawmidi_t **outputp,
int merge, int mode)
{
int err;
- snd_rawmidi_t *rmidi;
+ snd_rawmidi_t *rmidi = NULL;
snd_rawmidi_virtual_t *virt = NULL;
struct pollfd pfd;
@@ -392,6 +392,7 @@ int snd_rawmidi_virtual_open(snd_rawmidi_t **inputp, snd_rawmidi_t **outputp,
free(*inputp);
if (outputp)
free(*outputp);
+ free(rmidi);
return err;
}
--
2.26.2

View File

@ -1,28 +0,0 @@
From aa28847248f2f416d9ecc6cbfa75192455400f6f Mon Sep 17 00:00:00 2001
From: Alex Henrie <alexhenrie24@gmail.com>
Date: Sat, 26 Dec 2020 14:35:43 -0700
Subject: [PATCH 15/33] timer: fix sizeof operator mismatch in
snd_timer_query_hw_open
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
src/timer/timer_query_hw.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/timer/timer_query_hw.c b/src/timer/timer_query_hw.c
index dad228c8ef01..d8bac6e7f0e4 100644
--- a/src/timer/timer_query_hw.c
+++ b/src/timer/timer_query_hw.c
@@ -104,7 +104,7 @@ int snd_timer_query_hw_open(snd_timer_query_t **handle, const char *name, int mo
close(fd);
return -SND_ERROR_INCOMPATIBLE_VERSION;
}
- tmr = (snd_timer_query_t *) calloc(1, sizeof(snd_timer_t));
+ tmr = (snd_timer_query_t *) calloc(1, sizeof(snd_timer_query_t));
if (tmr == NULL) {
close(fd);
return -ENOMEM;
--
2.26.2

View File

@ -1,35 +0,0 @@
From 2e470d59d84a563a9efa81572ddc48d9858ceb92 Mon Sep 17 00:00:00 2001
From: Alex Henrie <alexhenrie24@gmail.com>
Date: Sat, 26 Dec 2020 14:35:44 -0700
Subject: [PATCH 16/33] pcm: remove dead assignments from
snd_pcm_rate_(commit_area|grab_next_period)
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
src/pcm/pcm_rate.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c
index 5bf7dbb94a61..dc38e95e1116 100644
--- a/src/pcm/pcm_rate.c
+++ b/src/pcm/pcm_rate.c
@@ -746,7 +746,6 @@ static int snd_pcm_rate_commit_area(snd_pcm_t *pcm, snd_pcm_rate_t *rate,
if (result < 0)
return result;
__partial:
- xfer = 0;
cont = slave_frames;
if (cont > slave_size)
cont = slave_size;
@@ -846,7 +845,6 @@ static int snd_pcm_rate_grab_next_period(snd_pcm_t *pcm, snd_pcm_uframes_t hw_of
if (result < 0)
return result;
__partial:
- xfer = 0;
cont = slave_frames;
if (cont > rate->gen.slave->period_size)
cont = rate->gen.slave->period_size;
--
2.26.2

View File

@ -1,27 +0,0 @@
From fc719bfe4e97bbfce899cc7e67df08ecd573c5d3 Mon Sep 17 00:00:00 2001
From: Alex Henrie <alexhenrie24@gmail.com>
Date: Sat, 26 Dec 2020 14:35:45 -0700
Subject: [PATCH 17/33] pcm_multi: remove dead assignment from
_snd_pcm_multi_open
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
src/pcm/pcm_multi.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/pcm/pcm_multi.c b/src/pcm/pcm_multi.c
index 53c414d5f863..5fa09b9bf5d0 100644
--- a/src/pcm/pcm_multi.c
+++ b/src/pcm/pcm_multi.c
@@ -1323,7 +1323,6 @@ int _snd_pcm_multi_open(snd_pcm_t **pcmp, const char *name,
err = -ENOMEM;
goto _free;
}
- idx = 0;
for (idx = 0; idx < channels_count; ++idx)
channels_sidx[idx] = -1;
idx = 0;
--
2.26.2

View File

@ -1,27 +0,0 @@
From 9ebd29d2d31df0f8967f3e60cf24bb63c95d4984 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sun, 27 Dec 2020 13:17:26 +0100
Subject: [PATCH 18/33] conf: fix get_hexachar() return value
Reported-by: Alex Henrie <alexhenrie24@gmail.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/conf.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/conf.c b/src/conf.c
index 44d1bfde66ad..6cfe65bfe8cd 100644
--- a/src/conf.c
+++ b/src/conf.c
@@ -887,7 +887,7 @@ static inline int get_hexachar(input_t *input)
if (c >= '0' && c <= '9') num |= (c - '0') << 0;
else if (c >= 'a' && c <= 'f') num |= (c - 'a') << 0;
else if (c >= 'A' && c <= 'F') num |= (c - 'A') << 0;
- return c;
+ return num;
}
static int get_quotedchar(input_t *input)
--
2.26.2

View File

@ -1,33 +0,0 @@
From 36aff79747b23b9535e81befe8b7b2972837bce3 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sun, 27 Dec 2020 13:29:33 +0100
Subject: [PATCH 19/33] pcm: fix __snd_pcm_state() return value
The __snd_pcm_state() must return a valid state, not an error value
when the plugin callback is not defined. Use the first state
SND_PCM_STATE_OPEN - the other functions will return the error
code depending on this state.
Link: https://lore.kernel.org/alsa-devel/20201226213547.175071-10-alexhenrie24@gmail.com/
Reported-by: Alex Henrie <alexhenrie24@gmail.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/pcm/pcm_local.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/pcm/pcm_local.h b/src/pcm/pcm_local.h
index fe77e50def28..bec5a40855dc 100644
--- a/src/pcm/pcm_local.h
+++ b/src/pcm/pcm_local.h
@@ -444,7 +444,7 @@ static inline int __snd_pcm_start(snd_pcm_t *pcm)
static inline snd_pcm_state_t __snd_pcm_state(snd_pcm_t *pcm)
{
if (!pcm->fast_ops->state)
- return -ENOSYS;
+ return SND_PCM_STATE_OPEN;
return pcm->fast_ops->state(pcm->fast_op_arg);
}
--
2.26.2

View File

@ -1,36 +0,0 @@
From a92ad2fea4b36d7282f4a571275fb492dd1bba75 Mon Sep 17 00:00:00 2001
From: Alex Henrie <alexhenrie24@gmail.com>
Date: Sun, 27 Dec 2020 18:43:15 -0700
Subject: [PATCH 20/33] confmisc: fix memory leak in snd_func_concat
Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
src/confmisc.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/confmisc.c b/src/confmisc.c
index eb8218c1e150..3ce95c7a942c 100644
--- a/src/confmisc.c
+++ b/src/confmisc.c
@@ -419,7 +419,6 @@ int snd_func_concat(snd_config_t **dst, snd_config_t *root, snd_config_t *src,
tmp = realloc(res, len + len1 + 1);
if (tmp == NULL) {
free(ptr);
- free(res);
err = -ENOMEM;
goto __error;
}
@@ -440,8 +439,8 @@ int snd_func_concat(snd_config_t **dst, snd_config_t *root, snd_config_t *src,
err = snd_config_get_id(src, &id);
if (err >= 0)
err = snd_config_imake_string(dst, id, res);
- free(res);
__error:
+ free(res);
return err;
}
#ifndef DOC_HIDDEN
--
2.26.2

View File

@ -1,27 +0,0 @@
From 6c24cd2e60cc9c1fca809ffeeb7ffe8af94b201e Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Tue, 29 Dec 2020 11:15:46 +0100
Subject: [PATCH 21/33] conf: fix return code in _snd_config_load_with_include
Fixes: 5275d170e0 ("conf: fix use after free in _snd_config_load_with_include")
BugLink: https://github.com/alsa-project/alsa-lib/issues/108
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/conf.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/conf.c b/src/conf.c
index 6cfe65bfe8cd..3c943db2b576 100644
--- a/src/conf.c
+++ b/src/conf.c
@@ -1977,6 +1977,7 @@ int _snd_config_load_with_include(snd_config_t *config, snd_input_t *in,
err = -EINVAL;
goto _end;
}
+ err = 0;
_end:
while (fd->next) {
fd_next = fd->next;
--
2.26.2

View File

@ -1,46 +0,0 @@
From afe6ff3b33ee6e5ea3511fe458bfd4e516b10bcf Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Wed, 30 Dec 2020 09:31:10 +0100
Subject: [PATCH 22/33] pcm: plugin status - fix the return value (regression)
The snd_pcm_plugin_avail_update() error code in snd_pcm_plugin_status()
should not be reported to the caller. The state errors can be determined
using the state member in the status structure.
Fixes: 4f90392f07e ("pcm: fix the snd_pcm_plugin_status() avail and delay fields")
BugLink: https://github.com/alsa-project/alsa-lib/issues/107
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/pcm/pcm_plugin.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
index 5739cfc2eb07..76a524fa801d 100644
--- a/src/pcm/pcm_plugin.c
+++ b/src/pcm/pcm_plugin.c
@@ -541,19 +541,17 @@ static snd_pcm_sframes_t snd_pcm_plugin_avail_update(snd_pcm_t *pcm)
static int snd_pcm_plugin_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
{
snd_pcm_plugin_t *plugin = pcm->private_data;
- snd_pcm_sframes_t err, avail;
+ snd_pcm_sframes_t err;
/* sync with the latest hw and appl ptrs */
- avail = snd_pcm_plugin_avail_update(pcm);
- if (avail < 0)
- return avail;
+ snd_pcm_plugin_avail_update(pcm);
err = snd_pcm_status(plugin->gen.slave, status);
if (err < 0)
return err;
status->appl_ptr = *pcm->appl.ptr;
status->hw_ptr = *pcm->hw.ptr;
- status->avail = avail;
+ status->avail = snd_pcm_mmap_avail(pcm);
status->delay = snd_pcm_mmap_delay(pcm);
return 0;
}
--
2.26.2

View File

@ -1,34 +0,0 @@
From 49eea5d7bc7d39f9a4cc1f3b3a813e90b90519eb Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sun, 3 Jan 2021 16:16:10 +0100
Subject: [PATCH 23/33] pcm: plugin status - revert the recent changes
It's no reason to sync the avail/delay fields using the mirrored
buffer pointers. The slave information must be valid.
The original report probably tries to fix something for
the specific plugin. Revert all changes.
Fixes: afe6ff3b33e ("pcm: plugin status - fix the return value (regression)")
Fixes: 4f90392f07e ("pcm: fix the snd_pcm_plugin_status() avail and delay fields")
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/pcm/pcm_plugin.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
index 76a524fa801d..ea60eb98986e 100644
--- a/src/pcm/pcm_plugin.c
+++ b/src/pcm/pcm_plugin.c
@@ -551,8 +551,6 @@ static int snd_pcm_plugin_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
return err;
status->appl_ptr = *pcm->appl.ptr;
status->hw_ptr = *pcm->hw.ptr;
- status->avail = snd_pcm_mmap_avail(pcm);
- status->delay = snd_pcm_mmap_delay(pcm);
return 0;
}
--
2.26.2

View File

@ -1,179 +0,0 @@
From fa1895aa2b4f3f154e537bee92860fe793045643 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sun, 3 Jan 2021 16:34:04 +0100
Subject: [PATCH 24/33] pcm: plugin - tidy snd_pcm_plugin_avail_update()
No functional changes - move the code to snd_pcm_plugin_sync_hw_ptr()
and put the mmap capture updates to separate function for readability.
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/pcm/pcm_plugin.c | 142 +++++++++++++++++++++++--------------------
1 file changed, 76 insertions(+), 66 deletions(-)
diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
index ea60eb98986e..83793397a7f0 100644
--- a/src/pcm/pcm_plugin.c
+++ b/src/pcm/pcm_plugin.c
@@ -460,82 +460,92 @@ snd_pcm_plugin_mmap_commit(snd_pcm_t *pcm,
return xfer > 0 ? xfer : err;
}
-static snd_pcm_sframes_t snd_pcm_plugin_avail_update(snd_pcm_t *pcm)
+static snd_pcm_sframes_t
+snd_pcm_plugin_sync_hw_ptr_capture(snd_pcm_t *pcm,
+ snd_pcm_sframes_t slave_size)
{
snd_pcm_plugin_t *plugin = pcm->private_data;
snd_pcm_t *slave = plugin->gen.slave;
- snd_pcm_sframes_t slave_size;
+ const snd_pcm_channel_area_t *areas;
+ snd_pcm_uframes_t xfer, hw_offset, size;
int err;
- slave_size = snd_pcm_avail_update(slave);
+ xfer = snd_pcm_mmap_capture_avail(pcm);
+ size = pcm->buffer_size - xfer;
+ areas = snd_pcm_mmap_areas(pcm);
+ hw_offset = snd_pcm_mmap_hw_offset(pcm);
+ while (size > 0 && slave_size > 0) {
+ snd_pcm_uframes_t frames = size;
+ snd_pcm_uframes_t cont = pcm->buffer_size - hw_offset;
+ const snd_pcm_channel_area_t *slave_areas;
+ snd_pcm_uframes_t slave_offset;
+ snd_pcm_uframes_t slave_frames = ULONG_MAX;
+ snd_pcm_sframes_t result;
+ /* As mentioned in the ALSA API (see pcm/pcm.c:942):
+ * The function #snd_pcm_avail_update()
+ * have to be called before any mmap begin+commit operation.
+ * Otherwise the snd_pcm_areas_copy will not called a second time.
+ * But this is needed, if the ring buffer wrap is reached and
+ * there is more data available.
+ */
+ slave_size = snd_pcm_avail_update(slave);
+ result = snd_pcm_mmap_begin(slave, &slave_areas, &slave_offset, &slave_frames);
+ if (result < 0) {
+ err = result;
+ goto error;
+ }
+ if (frames > cont)
+ frames = cont;
+ frames = (plugin->read)(pcm, areas, hw_offset, frames,
+ slave_areas, slave_offset, &slave_frames);
+ result = snd_pcm_mmap_commit(slave, slave_offset, slave_frames);
+ if (result > 0 && (snd_pcm_uframes_t)result != slave_frames) {
+ snd_pcm_sframes_t res;
+ res = plugin->undo_read(slave, areas, hw_offset, frames, slave_frames - result);
+ if (res < 0) {
+ err = res;
+ goto error;
+ }
+ frames -= res;
+ }
+ if (result <= 0) {
+ err = result;
+ goto error;
+ }
+ snd_pcm_mmap_hw_forward(pcm, frames);
+ if (frames == cont)
+ hw_offset = 0;
+ else
+ hw_offset += frames;
+ size -= frames;
+ slave_size -= slave_frames;
+ xfer += frames;
+ }
+ return (snd_pcm_sframes_t)xfer;
+error:
+ return xfer > 0 ? (snd_pcm_sframes_t)xfer : err;
+}
+
+static snd_pcm_sframes_t snd_pcm_plugin_sync_hw_ptr(snd_pcm_t *pcm,
+ snd_pcm_uframes_t slave_hw_ptr,
+ snd_pcm_sframes_t slave_size)
+{
if (pcm->stream == SND_PCM_STREAM_CAPTURE &&
pcm->access != SND_PCM_ACCESS_RW_INTERLEAVED &&
pcm->access != SND_PCM_ACCESS_RW_NONINTERLEAVED)
- goto _capture;
- *pcm->hw.ptr = *slave->hw.ptr;
+ return snd_pcm_plugin_sync_hw_ptr_capture(pcm, slave_size);
+ *pcm->hw.ptr = slave_hw_ptr;
return slave_size;
- _capture:
- {
- const snd_pcm_channel_area_t *areas;
- snd_pcm_uframes_t xfer, hw_offset, size;
-
- xfer = snd_pcm_mmap_capture_avail(pcm);
- size = pcm->buffer_size - xfer;
- areas = snd_pcm_mmap_areas(pcm);
- hw_offset = snd_pcm_mmap_hw_offset(pcm);
- while (size > 0 && slave_size > 0) {
- snd_pcm_uframes_t frames = size;
- snd_pcm_uframes_t cont = pcm->buffer_size - hw_offset;
- const snd_pcm_channel_area_t *slave_areas;
- snd_pcm_uframes_t slave_offset;
- snd_pcm_uframes_t slave_frames = ULONG_MAX;
- snd_pcm_sframes_t result;
- /* As mentioned in the ALSA API (see pcm/pcm.c:942):
- * The function #snd_pcm_avail_update()
- * have to be called before any mmap begin+commit operation.
- * Otherwise the snd_pcm_areas_copy will not called a second time.
- * But this is needed, if the ring buffer wrap is reached and
- * there is more data available.
- */
- slave_size = snd_pcm_avail_update(slave);
- result = snd_pcm_mmap_begin(slave, &slave_areas, &slave_offset, &slave_frames);
- if (result < 0) {
- err = result;
- goto error;
- }
- if (frames > cont)
- frames = cont;
- frames = (plugin->read)(pcm, areas, hw_offset, frames,
- slave_areas, slave_offset, &slave_frames);
- result = snd_pcm_mmap_commit(slave, slave_offset, slave_frames);
- if (result > 0 && (snd_pcm_uframes_t)result != slave_frames) {
- snd_pcm_sframes_t res;
-
- res = plugin->undo_read(slave, areas, hw_offset, frames, slave_frames - result);
- if (res < 0) {
- err = res;
- goto error;
- }
- frames -= res;
- }
- if (result <= 0) {
- err = result;
- goto error;
- }
- snd_pcm_mmap_hw_forward(pcm, frames);
- if (frames == cont)
- hw_offset = 0;
- else
- hw_offset += frames;
- size -= frames;
- slave_size -= slave_frames;
- xfer += frames;
- }
- return (snd_pcm_sframes_t)xfer;
+}
- error:
- return xfer > 0 ? (snd_pcm_sframes_t)xfer : err;
- }
+static snd_pcm_sframes_t snd_pcm_plugin_avail_update(snd_pcm_t *pcm)
+{
+ snd_pcm_plugin_t *plugin = pcm->private_data;
+ snd_pcm_t *slave = plugin->gen.slave;
+ snd_pcm_sframes_t slave_size;
+
+ slave_size = snd_pcm_avail_update(slave);
+ return snd_pcm_plugin_sync_hw_ptr(pcm, *slave->hw.ptr, slave_size);
}
static int snd_pcm_plugin_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
--
2.26.2

View File

@ -1,40 +0,0 @@
From 28cc099d9ea3962b033cb1cb9c3e07db828d9ff7 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sun, 3 Jan 2021 16:41:29 +0100
Subject: [PATCH 25/33] pcm: plugin - optimize sync in snd_pcm_plugin_status()
Do hw_ptr sync only once after the status call. This avoids
double update.
Also, the application pointer must not change when
the status is called. Add assert() call for this condition.
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/pcm/pcm_plugin.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
index 83793397a7f0..6a8151453efb 100644
--- a/src/pcm/pcm_plugin.c
+++ b/src/pcm/pcm_plugin.c
@@ -553,14 +553,11 @@ static int snd_pcm_plugin_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
snd_pcm_plugin_t *plugin = pcm->private_data;
snd_pcm_sframes_t err;
- /* sync with the latest hw and appl ptrs */
- snd_pcm_plugin_avail_update(pcm);
-
err = snd_pcm_status(plugin->gen.slave, status);
if (err < 0)
return err;
- status->appl_ptr = *pcm->appl.ptr;
- status->hw_ptr = *pcm->hw.ptr;
+ assert(status->appl_ptr == *pcm->appl.ptr);
+ snd_pcm_plugin_sync_hw_ptr(pcm, status->hw_ptr, status->avail);
return 0;
}
--
2.26.2

View File

@ -1,35 +0,0 @@
From 21549e6583f1dfe5b2fe1aaa88345e4645dd96d0 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Wed, 30 Dec 2020 17:49:33 +0100
Subject: [PATCH 26/33] Revert "pcm_plugin: fix delay"
This reverts commit aba87e509898ec9ddb3e319267d7c267409ff100.
The commit does not look good. The plugins must handle
the delay value correctly.
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/pcm/pcm_plugin.c | 6 ------
1 file changed, 6 deletions(-)
diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
index 6a8151453efb..5787a43d09f4 100644
--- a/src/pcm/pcm_plugin.c
+++ b/src/pcm/pcm_plugin.c
@@ -142,12 +142,6 @@ static int snd_pcm_plugin_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
int err = snd_pcm_delay(plugin->gen.slave, &sd);
if (err < 0)
return err;
- if (pcm->stream == SND_PCM_STREAM_CAPTURE &&
- pcm->access != SND_PCM_ACCESS_RW_INTERLEAVED &&
- pcm->access != SND_PCM_ACCESS_RW_NONINTERLEAVED) {
- sd += snd_pcm_mmap_capture_avail(pcm);
- }
-
*delayp = sd;
return 0;
}
--
2.26.2

View File

@ -1,74 +0,0 @@
From 6ca01c07ee13435d6c2db4e9121d9a86cc4b1457 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Wed, 30 Dec 2020 19:14:25 +0100
Subject: [PATCH 27/33] pcm: ioplug - fix the delay calculation in the status
callback
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/pcm/pcm_ioplug.c | 32 ++++++++++++++++++--------------
1 file changed, 18 insertions(+), 14 deletions(-)
diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c
index 9b1b8ac3b6fc..f2315a10e87c 100644
--- a/src/pcm/pcm_ioplug.c
+++ b/src/pcm/pcm_ioplug.c
@@ -107,9 +107,24 @@ static int snd_pcm_ioplug_channel_info(snd_pcm_t *pcm, snd_pcm_channel_info_t *i
return snd_pcm_channel_info_shm(pcm, info, -1);
}
+static int snd_pcm_ioplug_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
+{
+ ioplug_priv_t *io = pcm->private_data;
+
+ if (io->data->version >= 0x010001 &&
+ io->data->callback->delay)
+ return io->data->callback->delay(io->data, delayp);
+ else {
+ snd_pcm_ioplug_hw_ptr_update(pcm);
+ *delayp = snd_pcm_mmap_hw_avail(pcm);
+ }
+ return 0;
+}
+
static int snd_pcm_ioplug_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
{
ioplug_priv_t *io = pcm->private_data;
+ snd_pcm_sframes_t sd;
memset(status, 0, sizeof(*status));
snd_pcm_ioplug_hw_ptr_update(pcm);
@@ -118,6 +133,9 @@ static int snd_pcm_ioplug_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
gettimestamp(&status->tstamp, pcm->tstamp_type);
status->avail = snd_pcm_mmap_avail(pcm);
status->avail_max = io->avail_max;
+ if (snd_pcm_ioplug_delay(pcm, &sd) < 0)
+ sd = snd_pcm_mmap_delay(pcm);
+ status->delay = sd;
return 0;
}
@@ -133,20 +151,6 @@ static int snd_pcm_ioplug_hwsync(snd_pcm_t *pcm)
return 0;
}
-static int snd_pcm_ioplug_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
-{
- ioplug_priv_t *io = pcm->private_data;
-
- if (io->data->version >= 0x010001 &&
- io->data->callback->delay)
- return io->data->callback->delay(io->data, delayp);
- else {
- snd_pcm_ioplug_hw_ptr_update(pcm);
- *delayp = snd_pcm_mmap_hw_avail(pcm);
- }
- return 0;
-}
-
static int snd_pcm_ioplug_reset(snd_pcm_t *pcm)
{
ioplug_priv_t *io = pcm->private_data;
--
2.26.2

View File

@ -1,85 +0,0 @@
From 5988bb3ff42827ab4c13f248291ad1767c8d973d Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sun, 3 Jan 2021 16:56:38 +0100
Subject: [PATCH 28/33] pcm: rate - tidy up snd_pcm_rate_avail_update()
No functional change - just move the capture code to
a separate function for the better readability.
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/pcm/pcm_rate.c | 37 +++++++++++++++++++++----------------
1 file changed, 21 insertions(+), 16 deletions(-)
diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c
index dc38e95e1116..7073f8ab6c63 100644
--- a/src/pcm/pcm_rate.c
+++ b/src/pcm/pcm_rate.c
@@ -964,29 +964,18 @@ static snd_pcm_sframes_t snd_pcm_rate_mmap_commit(snd_pcm_t *pcm,
return size;
}
-static snd_pcm_sframes_t snd_pcm_rate_avail_update(snd_pcm_t *pcm)
+static snd_pcm_sframes_t snd_pcm_rate_avail_update_capture(snd_pcm_t *pcm,
+ snd_pcm_sframes_t slave_size)
{
snd_pcm_rate_t *rate = pcm->private_data;
snd_pcm_t *slave = rate->gen.slave;
- snd_pcm_sframes_t slave_size;
-
- slave_size = snd_pcm_avail_update(slave);
- if (slave_size < 0)
- return slave_size;
-
- if (pcm->stream == SND_PCM_STREAM_CAPTURE)
- goto _capture;
- snd_pcm_rate_sync_hwptr(pcm);
- snd_pcm_rate_sync_playback_area(pcm, rate->appl_ptr);
- return snd_pcm_mmap_avail(pcm);
- _capture: {
snd_pcm_uframes_t xfer, hw_offset, size;
xfer = snd_pcm_mmap_capture_avail(pcm);
size = pcm->buffer_size - xfer;
hw_offset = snd_pcm_mmap_hw_offset(pcm);
while (size >= pcm->period_size &&
- (snd_pcm_uframes_t)slave_size >= rate->gen.slave->period_size) {
+ (snd_pcm_uframes_t)slave_size >= slave->period_size) {
int err = snd_pcm_rate_grab_next_period(pcm, hw_offset);
if (err < 0)
return err;
@@ -994,13 +983,29 @@ static snd_pcm_sframes_t snd_pcm_rate_avail_update(snd_pcm_t *pcm)
return (snd_pcm_sframes_t)xfer;
xfer += pcm->period_size;
size -= pcm->period_size;
- slave_size -= rate->gen.slave->period_size;
+ slave_size -= slave->period_size;
hw_offset += pcm->period_size;
hw_offset %= pcm->buffer_size;
snd_pcm_mmap_hw_forward(pcm, pcm->period_size);
}
return (snd_pcm_sframes_t)xfer;
- }
+}
+
+static snd_pcm_sframes_t snd_pcm_rate_avail_update(snd_pcm_t *pcm)
+{
+ snd_pcm_rate_t *rate = pcm->private_data;
+ snd_pcm_sframes_t slave_size;
+
+ slave_size = snd_pcm_avail_update(rate->gen.slave);
+ if (slave_size < 0)
+ return slave_size;
+
+ if (pcm->stream == SND_PCM_STREAM_CAPTURE)
+ return snd_pcm_rate_avail_update_capture(pcm, slave_size);
+
+ snd_pcm_rate_sync_hwptr(pcm);
+ snd_pcm_rate_sync_playback_area(pcm, rate->appl_ptr);
+ return snd_pcm_mmap_avail(pcm);
}
static int snd_pcm_rate_htimestamp(snd_pcm_t *pcm,
--
2.26.2

View File

@ -1,26 +0,0 @@
From 6cee452eabc5cfdf0a6955033b8ac8f6e12ea883 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Sun, 3 Jan 2021 17:13:50 +0100
Subject: [PATCH 29/33] pcm: ioplug - fix the delay calculation for old plugins
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/pcm/pcm_ioplug.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c
index f2315a10e87c..e141b1f98da7 100644
--- a/src/pcm/pcm_ioplug.c
+++ b/src/pcm/pcm_ioplug.c
@@ -116,7 +116,7 @@ static int snd_pcm_ioplug_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
return io->data->callback->delay(io->data, delayp);
else {
snd_pcm_ioplug_hw_ptr_update(pcm);
- *delayp = snd_pcm_mmap_hw_avail(pcm);
+ *delayp = snd_pcm_mmap_delay(pcm);
}
return 0;
}
--
2.26.2

View File

@ -1,31 +0,0 @@
From fc0f7af9ee7bd4c31c2bab229e8e79eb96e908fa Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Mon, 4 Jan 2021 12:29:00 +0100
Subject: [PATCH 30/33] pcm: rate - use pcm_frame_diff() in
snd_pcm_rate_playback_internal_delay()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/pcm/pcm_rate.c | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c
index 7073f8ab6c63..abb2753f6055 100644
--- a/src/pcm/pcm_rate.c
+++ b/src/pcm/pcm_rate.c
@@ -612,11 +612,7 @@ static snd_pcm_uframes_t snd_pcm_rate_playback_internal_delay(snd_pcm_t *pcm)
{
snd_pcm_rate_t *rate = pcm->private_data;
- if (rate->appl_ptr < rate->last_commit_ptr) {
- return rate->appl_ptr - rate->last_commit_ptr + pcm->boundary;
- } else {
- return rate->appl_ptr - rate->last_commit_ptr;
- }
+ return pcm_frame_diff(rate->appl_ptr, rate->last_commit_ptr, pcm->boundary);
}
static int snd_pcm_rate_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
--
2.26.2

View File

@ -1,54 +0,0 @@
From da5b70d3fae091a8568b80a476c1cf340965805a Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Mon, 4 Jan 2021 12:32:25 +0100
Subject: [PATCH 31/33] pcm: plugin - fix status code for capture
The recent updates do not take in account the possible
calls for the capture stream. Fix the avail and delay
inconsistencies (and assert).
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/pcm/pcm_plugin.c | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
index 5787a43d09f4..7ed6f25a2eea 100644
--- a/src/pcm/pcm_plugin.c
+++ b/src/pcm/pcm_plugin.c
@@ -545,13 +545,30 @@ static snd_pcm_sframes_t snd_pcm_plugin_avail_update(snd_pcm_t *pcm)
static int snd_pcm_plugin_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
{
snd_pcm_plugin_t *plugin = pcm->private_data;
- snd_pcm_sframes_t err;
+ snd_pcm_sframes_t err, diff;
err = snd_pcm_status(plugin->gen.slave, status);
if (err < 0)
return err;
- assert(status->appl_ptr == *pcm->appl.ptr);
snd_pcm_plugin_sync_hw_ptr(pcm, status->hw_ptr, status->avail);
+ /*
+ * For capture stream, the situation is more complicated, because
+ * snd_pcm_plugin_avail_update() commits the data to the slave pcm.
+ * It means that the slave appl_ptr is updated. Calculate diff and
+ * update the delay and avail.
+ *
+ * This resolves the data inconsistency for immediate calls:
+ * snd_pcm_avail_update()
+ * snd_pcm_status()
+ */
+ if (pcm->stream == SND_PCM_STREAM_CAPTURE) {
+ status->appl_ptr = *pcm->appl.ptr;
+ diff = pcm_frame_diff(status->appl_ptr, *pcm->appl.ptr, pcm->boundary);
+ status->avail += diff;
+ status->delay += diff;
+ } else {
+ assert(status->appl_ptr == *pcm->appl.ptr);
+ }
return 0;
}
--
2.26.2

View File

@ -1,63 +0,0 @@
From ac520b2ed11f31e789a4da1d55e360e3eaeac50d Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Mon, 4 Jan 2021 17:14:42 +0100
Subject: [PATCH 32/33] pcm: rate - use pcm_frame_diff() on related places
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/pcm/pcm_rate.c | 20 +++++++-------------
1 file changed, 7 insertions(+), 13 deletions(-)
diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c
index abb2753f6055..3d301d0e317b 100644
--- a/src/pcm/pcm_rate.c
+++ b/src/pcm/pcm_rate.c
@@ -561,17 +561,16 @@ snd_pcm_rate_read_areas1(snd_pcm_t *pcm,
static inline void snd_pcm_rate_sync_hwptr0(snd_pcm_t *pcm, snd_pcm_uframes_t slave_hw_ptr)
{
- snd_pcm_rate_t *rate = pcm->private_data;
-
- snd_pcm_sframes_t slave_hw_ptr_diff = slave_hw_ptr - rate->last_slave_hw_ptr;
+ snd_pcm_rate_t *rate;
+ snd_pcm_sframes_t slave_hw_ptr_diff;
snd_pcm_sframes_t last_slave_hw_ptr_frac;
if (pcm->stream != SND_PCM_STREAM_PLAYBACK)
return;
- if (slave_hw_ptr_diff < 0)
- slave_hw_ptr_diff += rate->gen.slave->boundary; /* slave boundary wraparound */
- else if (slave_hw_ptr_diff == 0)
+ rate = pcm->private_data;
+ slave_hw_ptr_diff = pcm_frame_diff(slave_hw_ptr, rate->last_slave_hw_ptr, rate->gen.slave->boundary);
+ if (slave_hw_ptr_diff == 0)
return;
last_slave_hw_ptr_frac = rate->last_slave_hw_ptr % rate->gen.slave->period_size;
/* While handling fraction part fo slave period, rounded value will be
@@ -922,10 +921,7 @@ static int snd_pcm_rate_sync_playback_area(snd_pcm_t *pcm, snd_pcm_uframes_t app
if (slave_size < 0)
return slave_size;
- if (appl_ptr < rate->last_commit_ptr)
- xfer = appl_ptr - rate->last_commit_ptr + pcm->boundary;
- else
- xfer = appl_ptr - rate->last_commit_ptr;
+ xfer = pcm_frame_diff(appl_ptr, rate->last_commit_ptr, pcm->boundary);
while (xfer >= pcm->period_size &&
(snd_pcm_uframes_t)slave_size >= rate->gen.slave->period_size) {
err = snd_pcm_rate_commit_next_period(pcm, rate->last_commit_ptr % pcm->buffer_size);
@@ -1059,9 +1055,7 @@ static int snd_pcm_rate_drain(snd_pcm_t *pcm)
sw_params.avail_min = 1;
snd_pcm_sw_params(rate->gen.slave, &sw_params);
- size = rate->appl_ptr - rate->last_commit_ptr;
- if (size > pcm->boundary)
- size -= pcm->boundary;
+ size = pcm_frame_diff(rate->appl_ptr, rate->last_commit_ptr, pcm->boundary);
ofs = rate->last_commit_ptr % pcm->buffer_size;
while (size > 0) {
snd_pcm_uframes_t psize, spsize;
--
2.26.2

View File

@ -1,43 +0,0 @@
From b62f66442bfbcea7c11afe4917e196fa95a65083 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Mon, 4 Jan 2021 17:27:32 +0100
Subject: [PATCH 33/33] pcm: rate - fix the capture delay values
Use the correct snd_pcm_mmap_capture_delay() function instead
snd_pcm_mmap_capture_hw_avail().
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/pcm/pcm_rate.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c
index 3d301d0e317b..770aafea567d 100644
--- a/src/pcm/pcm_rate.c
+++ b/src/pcm/pcm_rate.c
@@ -632,7 +632,7 @@ static int snd_pcm_rate_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
+ snd_pcm_rate_playback_internal_delay(pcm);
} else {
*delayp = rate->ops.output_frames(rate->obj, slave_delay)
- + snd_pcm_mmap_capture_hw_avail(pcm);
+ + snd_pcm_mmap_capture_delay(pcm);
}
return 0;
}
@@ -1157,12 +1157,8 @@ static int snd_pcm_rate_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
status->avail = snd_pcm_mmap_playback_avail(pcm);
status->avail_max = rate->ops.input_frames(rate->obj, status->avail_max);
} else {
- /* FIXME: Maybe possible to somthing similar to
- * snd_pcm_rate_playback_internal_delay()
- * for the capture case.
- */
status->delay = rate->ops.output_frames(rate->obj, status->delay)
- + snd_pcm_mmap_capture_hw_avail(pcm);
+ + snd_pcm_mmap_capture_delay(pcm);
status->avail = snd_pcm_mmap_capture_avail(pcm);
status->avail_max = rate->ops.output_frames(rate->obj, status->avail_max);
}
--
2.26.2

View File

@ -1,26 +0,0 @@
From 437b5b3aae8b1d9f65289f563deb0fa6356a0fa6 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Thu, 7 Jan 2021 17:32:11 +0100
Subject: [PATCH 34/44] ucm: fix possible memory leak in parse_verb_file()
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/ucm/parser.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ucm/parser.c b/src/ucm/parser.c
index 75b78826f260..c8bee1f2e1dd 100644
--- a/src/ucm/parser.c
+++ b/src/ucm/parser.c
@@ -1575,7 +1575,7 @@ static int parse_verb_file(snd_use_case_mgr_t *uc_mgr,
/* in-place evaluation */
err = uc_mgr_evaluate_inplace(uc_mgr, cfg);
if (err < 0)
- return err;
+ goto _err;
/* parse master config sections */
snd_config_for_each(i, next, cfg) {
--
2.26.2

View File

@ -1,27 +0,0 @@
From d0bb8f84c92357bfd0e024efe5f6d53a963c4d7a Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Thu, 7 Jan 2021 17:34:00 +0100
Subject: [PATCH 35/44] topology: tplg_pprint_integer() fix coverity
uninitalized variable error
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/save.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/topology/save.c b/src/topology/save.c
index c7a5a801372e..f7af7af3e8c2 100644
--- a/src/topology/save.c
+++ b/src/topology/save.c
@@ -133,6 +133,8 @@ static int tplg_pprint_integer(snd_config_t *n, char **ret)
if (llval < INT_MIN || llval > UINT_MAX)
return snd_config_get_ascii(n, ret);
lval = llval;
+ } else {
+ lval = 0;
}
err = tplg_nice_value_format(buf, sizeof(buf), (unsigned int)lval);
if (err < 0)
--
2.26.2

View File

@ -1,26 +0,0 @@
From b8764a061b83284be60adc01c1f7b035c4484ace Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Thu, 7 Jan 2021 17:36:04 +0100
Subject: [PATCH 36/44] topology: tplg_add_widget_object() - do not use invalid
elem_ctl
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/dapm.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/topology/dapm.c b/src/topology/dapm.c
index 92dc01aa864d..f6a84a6035ce 100644
--- a/src/topology/dapm.c
+++ b/src/topology/dapm.c
@@ -836,6 +836,7 @@ int tplg_add_widget_object(snd_tplg_t *tplg, snd_tplg_obj_template_t *t)
default:
SNDERR("widget %s: invalid type %d for ctl %d",
wt->name, ct->type, i);
+ ret = -EINVAL;
break;
}
--
2.26.2

View File

@ -1,27 +0,0 @@
From 0dbaba95f4bc59602bf2d3fb12a60db7444e5892 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Thu, 7 Jan 2021 17:38:50 +0100
Subject: [PATCH 37/44] topology: tplg_decode_pcm() - add missing log argument
(compress)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/pcm.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/topology/pcm.c b/src/topology/pcm.c
index c8f418621323..a473b59b4c5c 100644
--- a/src/topology/pcm.c
+++ b/src/topology/pcm.c
@@ -2020,7 +2020,7 @@ next:
pt->playback = pcm->playback;
pt->capture = pcm->capture;
pt->compress = pcm->compress;
- tplg_log(tplg, 'D', pos, "pcm: playback %d capture %d compress",
+ tplg_log(tplg, 'D', pos, "pcm: playback %d capture %d compress %d",
pt->playback, pt->capture, pt->compress);
pt->num_streams = pcm->num_streams;
pt->flag_mask = pcm->flag_mask;
--
2.26.2

View File

@ -1,27 +0,0 @@
From 51e1d486ce4535923692bd1d7e59d5aa3a29cd50 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Thu, 7 Jan 2021 17:40:42 +0100
Subject: [PATCH 38/44] topology: parse_tuple_set() - remove dead condition
code
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/data.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/topology/data.c b/src/topology/data.c
index c2931bd2bbb3..5633cdc34dd9 100644
--- a/src/topology/data.c
+++ b/src/topology/data.c
@@ -860,7 +860,7 @@ static int parse_tuple_set(snd_config_t *cfg,
}
if ((type == SND_SOC_TPLG_TUPLE_TYPE_WORD
- && tuple_val > UINT_MAX)
+ /* && tuple_val > UINT_MAX */)
|| (type == SND_SOC_TPLG_TUPLE_TYPE_SHORT
&& tuple_val > USHRT_MAX)
|| (type == SND_SOC_TPLG_TUPLE_TYPE_BYTE
--
2.26.2

View File

@ -1,31 +0,0 @@
From 3f63dc26445ae7c215e48a57af83b6da325f166d Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Thu, 7 Jan 2021 17:41:38 +0100
Subject: [PATCH 39/44] ucm: uc_mgr_substitute_tree() fix use after free
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/ucm/ucm_subs.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/ucm/ucm_subs.c b/src/ucm/ucm_subs.c
index f608bb0955a6..df6d736fc820 100644
--- a/src/ucm/ucm_subs.c
+++ b/src/ucm/ucm_subs.c
@@ -417,11 +417,12 @@ int uc_mgr_substitute_tree(snd_use_case_mgr_t *uc_mgr, snd_config_t *node)
if (err < 0)
return err;
err = snd_config_set_id(node, s);
- free(s);
if (err < 0) {
uc_error("unable to set substituted id '%s' (old id '%s')", s, id);
+ free(s);
return err;
}
+ free(s);
}
if (snd_config_get_type(node) != SND_CONFIG_TYPE_COMPOUND) {
if (snd_config_get_type(node) == SND_CONFIG_TYPE_STRING) {
--
2.26.2

View File

@ -1,55 +0,0 @@
From 45f503632acf24877c466a7c1c74d8a26414bf3e Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Thu, 7 Jan 2021 17:45:27 +0100
Subject: [PATCH 40/44] topology: sort_config() cleanups - use goto for the
error path
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/save.c | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/src/topology/save.c b/src/topology/save.c
index f7af7af3e8c2..fecbc6a5dfa8 100644
--- a/src/topology/save.c
+++ b/src/topology/save.c
@@ -180,29 +180,28 @@ static snd_config_t *sort_config(const char *id, snd_config_t *src)
}
if (array <= 0)
qsort(a, count, sizeof(a[0]), _compar);
- if (snd_config_make_compound(&dst, id, count == 1)) {
- free(a);
- return NULL;
- }
+ if (snd_config_make_compound(&dst, id, count == 1))
+ goto lerr;
for (index = 0; index < count; index++) {
snd_config_t *s = a[index];
const char *id2;
if (snd_config_get_id(s, &id2)) {
snd_config_delete(dst);
- free(a);
- return NULL;
+ goto lerr;
}
s = sort_config(id2, s);
if (s == NULL || snd_config_add(dst, s)) {
if (s)
snd_config_delete(s);
snd_config_delete(dst);
- free(a);
- return NULL;
+ goto lerr;
}
}
free(a);
return dst;
+lerr:
+ free(a);
+ return NULL;
}
static int tplg_check_quoted(const unsigned char *p)
--
2.26.2

View File

@ -1,27 +0,0 @@
From 93752fb4de397554e92a4eb9079f77dabaec7d7f Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Thu, 7 Jan 2021 17:49:25 +0100
Subject: [PATCH 41/44] conf: USB - add "Xonar U7 MKII" to
USB-Audio.pcm.iec958_device
BugLink: https://github.com/alsa-project/alsa-lib/issues/100
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/conf/cards/USB-Audio.conf | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/conf/cards/USB-Audio.conf b/src/conf/cards/USB-Audio.conf
index 9b64af3c0da9..b1b74b02cb1d 100644
--- a/src/conf/cards/USB-Audio.conf
+++ b/src/conf/cards/USB-Audio.conf
@@ -39,6 +39,7 @@ USB-Audio.pcm.iec958_device {
# "NoiseBlaster 3000" 42
"USB Sound Blaster HD" 1
"Xonar U7" 1
+ "Xonar U7 MKII" 1
"ASUS XONAR U5" 1
"XONAR U5" 1
"XONAR SOUND CARD" 1
--
2.26.2

View File

@ -1,77 +0,0 @@
From 644514e85da169670e4a490b7b15b5ecfcec92c0 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Mon, 18 Jan 2021 21:09:43 +0100
Subject: [PATCH 42/44] pcm_plugin: set the initial hw_ptr/appl_ptr from the
child pcm
The direct plugins (dmix & etc.) sets own initial
hw_ptr and appl_ptr. Use this initial settings
to export correct values in snd_pcm_status().
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/pcm/pcm_plugin.c | 32 +++++++++++++++++---------------
1 file changed, 17 insertions(+), 15 deletions(-)
diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c
index 7ed6f25a2eea..ff254eba9988 100644
--- a/src/pcm/pcm_plugin.c
+++ b/src/pcm/pcm_plugin.c
@@ -146,15 +146,14 @@ static int snd_pcm_plugin_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
return 0;
}
-static int snd_pcm_plugin_prepare(snd_pcm_t *pcm)
+static int snd_pcm_plugin_call_init_cb(snd_pcm_t *pcm, snd_pcm_plugin_t *plugin)
{
- snd_pcm_plugin_t *plugin = pcm->private_data;
+ snd_pcm_t *slave = plugin->gen.slave;
int err;
- err = snd_pcm_prepare(plugin->gen.slave);
- if (err < 0)
- return err;
- *pcm->hw.ptr = 0;
- *pcm->appl.ptr = 0;
+
+ assert(pcm->boundary == slave->boundary);
+ *pcm->hw.ptr = *slave->hw.ptr;
+ *pcm->appl.ptr = *slave->appl.ptr;
if (plugin->init) {
err = plugin->init(pcm);
if (err < 0)
@@ -163,6 +162,16 @@ static int snd_pcm_plugin_prepare(snd_pcm_t *pcm)
return 0;
}
+static int snd_pcm_plugin_prepare(snd_pcm_t *pcm)
+{
+ snd_pcm_plugin_t *plugin = pcm->private_data;
+ int err;
+ err = snd_pcm_prepare(plugin->gen.slave);
+ if (err < 0)
+ return err;
+ return snd_pcm_plugin_call_init_cb(pcm, plugin);
+}
+
static int snd_pcm_plugin_reset(snd_pcm_t *pcm)
{
snd_pcm_plugin_t *plugin = pcm->private_data;
@@ -170,14 +179,7 @@ static int snd_pcm_plugin_reset(snd_pcm_t *pcm)
err = snd_pcm_reset(plugin->gen.slave);
if (err < 0)
return err;
- *pcm->hw.ptr = 0;
- *pcm->appl.ptr = 0;
- if (plugin->init) {
- err = plugin->init(pcm);
- if (err < 0)
- return err;
- }
- return 0;
+ return snd_pcm_plugin_call_init_cb(pcm, plugin);
}
static snd_pcm_sframes_t snd_pcm_plugin_rewindable(snd_pcm_t *pcm)
--
2.26.2

View File

@ -1,64 +0,0 @@
From 0de72e63d7bd180566c71f6fb01d7719525ee326 Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Tue, 19 Jan 2021 11:17:00 +0100
Subject: [PATCH 43/44] pcm: dmix/dshare - delay calculation fixes and cleanups
Unfortunately, we cannot use status->avail from slave, because this value
does not wrap to the buffer size and it may even overflow slave boundary
(endless run). We can use only hw_ptr from slave.
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/pcm/pcm_dmix.c | 5 ++---
src/pcm/pcm_dshare.c | 5 ++---
2 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c
index 5b7472d90c58..be2675aff0f3 100644
--- a/src/pcm/pcm_dmix.c
+++ b/src/pcm/pcm_dmix.c
@@ -488,8 +488,7 @@ static int snd_pcm_dmix_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
case SNDRV_PCM_STATE_DRAINING:
case SNDRV_PCM_STATE_RUNNING:
snd_pcm_dmix_sync_ptr0(pcm, status->hw_ptr);
- status->delay += snd_pcm_mmap_playback_delay(pcm)
- + status->avail - dmix->spcm->buffer_size;
+ status->delay = snd_pcm_mmap_playback_delay(pcm);
break;
default:
break;
@@ -518,7 +517,7 @@ static int snd_pcm_dmix_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
case SNDRV_PCM_STATE_PREPARED:
case SNDRV_PCM_STATE_SUSPENDED:
case STATE_RUN_PENDING:
- *delayp = snd_pcm_mmap_playback_hw_avail(pcm);
+ *delayp = snd_pcm_mmap_playback_delay(pcm);
return 0;
case SNDRV_PCM_STATE_XRUN:
return -EPIPE;
diff --git a/src/pcm/pcm_dshare.c b/src/pcm/pcm_dshare.c
index 8a6725729bc7..10243013714d 100644
--- a/src/pcm/pcm_dshare.c
+++ b/src/pcm/pcm_dshare.c
@@ -237,8 +237,7 @@ static int snd_pcm_dshare_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
case SNDRV_PCM_STATE_DRAINING:
case SNDRV_PCM_STATE_RUNNING:
snd_pcm_dshare_sync_ptr0(pcm, status->hw_ptr);
- status->delay += snd_pcm_mmap_playback_delay(pcm)
- + status->avail - dshare->spcm->buffer_size;
+ status->delay += snd_pcm_mmap_playback_delay(pcm);
break;
default:
break;
@@ -290,7 +289,7 @@ static int snd_pcm_dshare_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
case SNDRV_PCM_STATE_PREPARED:
case SNDRV_PCM_STATE_SUSPENDED:
case STATE_RUN_PENDING:
- *delayp = snd_pcm_mmap_playback_hw_avail(pcm);
+ *delayp = snd_pcm_mmap_playback_delay(pcm);
return 0;
case SNDRV_PCM_STATE_XRUN:
return -EPIPE;
--
2.26.2

View File

@ -1,40 +0,0 @@
From ae7362c996e0b991c399cc26c6d0b3c8e295e83c Mon Sep 17 00:00:00 2001
From: Jaroslav Kysela <perex@perex.cz>
Date: Wed, 20 Jan 2021 16:58:33 +0100
Subject: [PATCH 44/44] topology: fix 'parse_tuple_set() - remove dead
condition code'
The whole SND_SOC_TPLG_TUPLE_TYPE_WORD condition part must be
commented out, otherwise the condition is always true.
Fixes: 51e1d486ce ("topology: parse_tuple_set() - remove dead condition code")
BugLink: https://github.com/alsa-project/alsa-lib/issues/114
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
src/topology/data.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/topology/data.c b/src/topology/data.c
index 5633cdc34dd9..0546d63e478c 100644
--- a/src/topology/data.c
+++ b/src/topology/data.c
@@ -859,11 +859,11 @@ static int parse_tuple_set(snd_config_t *cfg,
goto err;
}
- if ((type == SND_SOC_TPLG_TUPLE_TYPE_WORD
- /* && tuple_val > UINT_MAX */)
- || (type == SND_SOC_TPLG_TUPLE_TYPE_SHORT
- && tuple_val > USHRT_MAX)
- || (type == SND_SOC_TPLG_TUPLE_TYPE_BYTE
+ if (/* (type == SND_SOC_TPLG_TUPLE_TYPE_WORD
+ && tuple_val > UINT_MAX) || */
+ (type == SND_SOC_TPLG_TUPLE_TYPE_SHORT
+ && tuple_val > USHRT_MAX) ||
+ (type == SND_SOC_TPLG_TUPLE_TYPE_BYTE
&& tuple_val > UCHAR_MAX)) {
SNDERR("tuple %s: invalid value", id);
goto err;
--
2.26.2

View File

@ -1,61 +0,0 @@
From 8e15c712ed96ea8d1314e94b15a946916394b17b Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Fri, 22 Jan 2021 15:37:08 +0100
Subject: [PATCH 45/48] pcm: direct: Fix the missing appl_ptr update
A snd_pcm_status() call for the direct plugins receives the status
from the slave PCM, but this doesn't contain a valid appl_ptr, since
the slave PCM for the direct plugins is in a free-wheel mode, hence
the appl_ptr is always zero. This result in the inconsistent
status->appl_ptr and pcm->appl.ptr, hitting the recently introduced
assert() call.
Fix it by transferring the plugin's appl_ptr to the upper caller.
BugLink: https://bugzilla.opensuse.org/show_bug.cgi?id=1181194
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
src/pcm/pcm_dmix.c | 1 +
src/pcm/pcm_dshare.c | 1 +
src/pcm/pcm_dsnoop.c | 1 +
3 files changed, 3 insertions(+)
diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c
index be2675aff0f3..d8495065d5d7 100644
--- a/src/pcm/pcm_dmix.c
+++ b/src/pcm/pcm_dmix.c
@@ -495,6 +495,7 @@ static int snd_pcm_dmix_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
}
status->state = snd_pcm_dmix_state(pcm);
+ status->appl_ptr = *pcm->appl.ptr; /* slave PCM doesn't set appl_ptr */
status->trigger_tstamp = dmix->trigger_tstamp;
status->avail = snd_pcm_mmap_playback_avail(pcm);
status->avail_max = status->avail > dmix->avail_max ? status->avail : dmix->avail_max;
diff --git a/src/pcm/pcm_dshare.c b/src/pcm/pcm_dshare.c
index 10243013714d..dccb137be253 100644
--- a/src/pcm/pcm_dshare.c
+++ b/src/pcm/pcm_dshare.c
@@ -243,6 +243,7 @@ static int snd_pcm_dshare_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
break;
}
status->state = snd_pcm_dshare_state(pcm);
+ status->appl_ptr = *pcm->appl.ptr; /* slave PCM doesn't set appl_ptr */
status->trigger_tstamp = dshare->trigger_tstamp;
status->avail = snd_pcm_mmap_playback_avail(pcm);
status->avail_max = status->avail > dshare->avail_max ? status->avail : dshare->avail_max;
diff --git a/src/pcm/pcm_dsnoop.c b/src/pcm/pcm_dsnoop.c
index c6e8cd279b53..695bf4aa340e 100644
--- a/src/pcm/pcm_dsnoop.c
+++ b/src/pcm/pcm_dsnoop.c
@@ -193,6 +193,7 @@ static int snd_pcm_dsnoop_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
snd_pcm_status(dsnoop->spcm, status);
state = snd_pcm_state(dsnoop->spcm);
status->state = state == SND_PCM_STATE_RUNNING ? dsnoop->state : state;
+ status->appl_ptr = *pcm->appl.ptr; /* slave PCM doesn't set appl_ptr */
status->trigger_tstamp = dsnoop->trigger_tstamp;
status->avail = snd_pcm_mmap_capture_avail(pcm);
status->avail_max = status->avail > dsnoop->avail_max ? status->avail : dsnoop->avail_max;
--
2.26.2

View File

@ -1,31 +0,0 @@
From 2c57c2c959941de50a4492f151cfd9973c46d41e Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Fri, 22 Jan 2021 15:41:15 +0100
Subject: [PATCH 46/48] pcm: ioplug: Pass appl_ptr and hw_ptr in
snd_pcm_status()
The snd_pcm_status() of the ioplug doesn't return the current
positions of hw_ptr and appl_ptr as advertised. Fix it by copying the
current values stored in the plugin data.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
src/pcm/pcm_ioplug.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c
index e141b1f98da7..a1463bf6b50a 100644
--- a/src/pcm/pcm_ioplug.c
+++ b/src/pcm/pcm_ioplug.c
@@ -133,6 +133,8 @@ static int snd_pcm_ioplug_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
gettimestamp(&status->tstamp, pcm->tstamp_type);
status->avail = snd_pcm_mmap_avail(pcm);
status->avail_max = io->avail_max;
+ status->appl_ptr = *pcm->appl.ptr;
+ status->hw_ptr = *pcm->hw.ptr;
if (snd_pcm_ioplug_delay(pcm, &sd) < 0)
sd = snd_pcm_mmap_delay(pcm);
status->delay = sd;
--
2.26.2

View File

@ -1,29 +0,0 @@
From 440c42ec5c90e3e345dd72c6c1d604a30b6a8e94 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Fri, 22 Jan 2021 15:42:38 +0100
Subject: [PATCH 47/48] pcm: null: Pass appl_ptr and hw_ptr in snd_pcm_status()
Just like the previous fix for ioplug, the null plugin also misses the
appl_ptr and hw_ptr updates for snd_pcm_status(). Fix it as well.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
src/pcm/pcm_null.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/pcm/pcm_null.c b/src/pcm/pcm_null.c
index 1d81548569f0..c8ea9b38785f 100644
--- a/src/pcm/pcm_null.c
+++ b/src/pcm/pcm_null.c
@@ -96,6 +96,8 @@ static int snd_pcm_null_status(snd_pcm_t *pcm, snd_pcm_status_t * status)
memset(status, 0, sizeof(*status));
status->state = null->state;
status->trigger_tstamp = null->trigger_tstamp;
+ status->appl_ptr = *pcm->appl.ptr;
+ status->hw_ptr = *pcm->hw.ptr;
gettimestamp(&status->tstamp, pcm->tstamp_type);
status->avail = snd_pcm_null_avail_update(pcm);
status->avail_max = pcm->buffer_size;
--
2.26.2

View File

@ -1,30 +0,0 @@
From 1705e7c0aba0a9e010e55c8e76851fe57e1e3c70 Mon Sep 17 00:00:00 2001
From: Takashi Iwai <tiwai@suse.de>
Date: Fri, 22 Jan 2021 15:43:28 +0100
Subject: [PATCH 48/48] pcm: share: Pass appl_ptr and hw_ptr in
snd_pcm_status()
This one also has the same problem as others; the appl_ptr and hw_ptr
of share plugin aren't updated in snd_pcm_status() call. Fix it.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
src/pcm/pcm_share.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/pcm/pcm_share.c b/src/pcm/pcm_share.c
index bff9507d6422..72509491b366 100644
--- a/src/pcm/pcm_share.c
+++ b/src/pcm/pcm_share.c
@@ -711,6 +711,8 @@ static int snd_pcm_share_status(snd_pcm_t *pcm, snd_pcm_status_t *status)
_notrunning:
status->delay = sd + d;
status->state = share->state;
+ status->appl_ptr = *pcm->appl.ptr;
+ status->hw_ptr = *pcm->hw.ptr;
status->trigger_tstamp = share->trigger_tstamp;
_end:
Pthread_mutex_unlock(&slave->mutex);
--
2.26.2

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f7554be1a56cdff468b58fc1c29b95b64864c590038dd309c7a978c7116908f7
size 1044405

3
alsa-lib-1.2.5.tar.bz2 Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9092894a8c083b33acf8d6deb901b58f5d20d6da583789f814e8e46f2850ef18
size 1068496

View File

@ -1,3 +1,57 @@
-------------------------------------------------------------------
Mon May 31 11:54:06 UTC 2021 - Ferdinand Thiessen <rpm@fthiessen.de>
- Update to version 1.2.5
* https://www.alsa-project.org/wiki/Changes_v1.2.4_v1.2.5#alsa-lib
- Drop upstream fixed patches
* 0001-dlmisc-the-snd_plugin_dir_set-snd_plugin_dir-must-be.patch
* 0002-dlmisc-fix-snd_plugin_dir-locking-for-not-DL_ORIGIN_.patch
* 0003-pcm-snd_pcm_mmap_readi-fix-typo-in-comment.patch
* 0004-topology-use-inclusive-language-for-bclk.patch
* 0005-topology-use-inclusive-language-for-fsync.patch
* 0006-topology-use-inclusive-language-in-documentation.patch
* 0007-pcm-set-the-snd_pcm_ioplug_status-tstamp-field.patch
* 0009-pcm-Add-snd_pcm_audio_tstamp_type_t-constants.patch
* 0045-pcm-direct-Fix-the-missing-appl_ptr-update.patch
* 0019-pcm-fix-__snd_pcm_state-return-value.patch
* 0025-pcm-plugin-optimize-sync-in-snd_pcm_plugin_status.patch
* 0026-Revert-pcm_plugin-fix-delay.patch
* 0014-rawmidi-fix-memory-leak-in-snd_rawmidi_virtual_open.patch
* 0037-topology-tplg_decode_pcm-add-missing-log-argument-co.patch
* 0040-topology-sort_config-cleanups-use-goto-for-the-error.patch
* 0028-pcm-rate-tidy-up-snd_pcm_rate_avail_update.patch
* 0046-pcm-ioplug-Pass-appl_ptr-and-hw_ptr-in-snd_pcm_statu.patch
* 0030-pcm-rate-use-pcm_frame_diff-in-snd_pcm_rate_playback.patch
* 0047-pcm-null-Pass-appl_ptr-and-hw_ptr-in-snd_pcm_status.patch
* 0043-pcm-dmix-dshare-delay-calculation-fixes-and-cleanups.patch
* 0042-pcm_plugin-set-the-initial-hw_ptr-appl_ptr-from-the-.patch
* 0011-pcm-Fix-a-typo-in-SND_PCM_AUDIO_TSTAMP_TYPE_LAST-def.patch
* 0017-pcm_multi-remove-dead-assignment-from-_snd_pcm_multi.patch
* 0027-pcm-ioplug-fix-the-delay-calculation-in-the-status-c.patch
* 0041-conf-USB-add-Xonar-U7-MKII-to-USB-Audio.pcm.iec958_d.patch
* 0016-pcm-remove-dead-assignments-from-snd_pcm_rate_-commi.patch
* 0035-topology-tplg_pprint_integer-fix-coverity-uninitaliz.patch
* 0034-ucm-fix-possible-memory-leak-in-parse_verb_file.patch
* 0021-conf-fix-return-code-in-_snd_config_load_with_includ.patch
* 0023-pcm-plugin-status-revert-the-recent-changes.patch
* 0020-confmisc-fix-memory-leak-in-snd_func_concat.patch
* 0029-pcm-ioplug-fix-the-delay-calculation-for-old-plugins.patch
* 0039-ucm-uc_mgr_substitute_tree-fix-use-after-free.patch
* 0024-pcm-plugin-tidy-snd_pcm_plugin_avail_update.patch
* 0010-test-audio_time-Make-use-of-SND_PCM_AUDIO_TSTAMP_TYP.patch
* 0033-pcm-rate-fix-the-capture-delay-values.patch
* 0015-timer-fix-sizeof-operator-mismatch-in-snd_timer_quer.patch
* 0036-topology-tplg_add_widget_object-do-not-use-invalid-e.patch
* 0044-topology-fix-parse_tuple_set-remove-dead-condition-c.patch
* 0038-topology-parse_tuple_set-remove-dead-condition-code.patch
* 0018-conf-fix-get_hexachar-return-value.patch
* 0013-ucm-fix-bad-frees-in-get_list0-and-get_list20.patch
* 0012-conf-fix-use-after-free-in-_snd_config_load_with_inc.patch
* 0031-pcm-plugin-fix-status-code-for-capture.patch
* 0048-pcm-share-Pass-appl_ptr-and-hw_ptr-in-snd_pcm_status.patch
* 0032-pcm-rate-use-pcm_frame_diff-on-related-places.patch
* 0022-pcm-plugin-status-fix-the-return-value-regression.patch
-------------------------------------------------------------------
Fri Jan 22 15:50:07 CET 2021 - tiwai@suse.de

104
alsa.spec
View File

@ -32,13 +32,13 @@
%endif
Name: alsa
Version: 1.2.4
Version: 1.2.5
Release: 0
Summary: Advanced Linux Sound Architecture
License: LGPL-2.1-or-later
Group: System/Libraries
URL: http://www.alsa-project.org/
Source: ftp://ftp.alsa-project.org/pub/lib/alsa-lib-%{version}.tar.bz2
URL: https://www.alsa-project.org
Source: https://www.alsa-project.org/files/pub/lib/alsa-lib-%{version}.tar.bz2
Source2: baselibs.conf
Source8: 40-alsa.rules
Source11: alsasound
@ -52,53 +52,6 @@ Source30: all_notes_off
Source31: all_notes_off.bin
Source32: all_notes_off.mid
Source34: alsa-init.sh
Patch1: 0001-dlmisc-the-snd_plugin_dir_set-snd_plugin_dir-must-be.patch
Patch2: 0002-dlmisc-fix-snd_plugin_dir-locking-for-not-DL_ORIGIN_.patch
Patch3: 0003-pcm-snd_pcm_mmap_readi-fix-typo-in-comment.patch
Patch4: 0004-topology-use-inclusive-language-for-bclk.patch
Patch5: 0005-topology-use-inclusive-language-for-fsync.patch
Patch6: 0006-topology-use-inclusive-language-in-documentation.patch
Patch7: 0007-pcm-set-the-snd_pcm_ioplug_status-tstamp-field.patch
Patch9: 0009-pcm-Add-snd_pcm_audio_tstamp_type_t-constants.patch
Patch10: 0010-test-audio_time-Make-use-of-SND_PCM_AUDIO_TSTAMP_TYP.patch
Patch11: 0011-pcm-Fix-a-typo-in-SND_PCM_AUDIO_TSTAMP_TYPE_LAST-def.patch
Patch12: 0012-conf-fix-use-after-free-in-_snd_config_load_with_inc.patch
Patch13: 0013-ucm-fix-bad-frees-in-get_list0-and-get_list20.patch
Patch14: 0014-rawmidi-fix-memory-leak-in-snd_rawmidi_virtual_open.patch
Patch15: 0015-timer-fix-sizeof-operator-mismatch-in-snd_timer_quer.patch
Patch16: 0016-pcm-remove-dead-assignments-from-snd_pcm_rate_-commi.patch
Patch17: 0017-pcm_multi-remove-dead-assignment-from-_snd_pcm_multi.patch
Patch18: 0018-conf-fix-get_hexachar-return-value.patch
Patch19: 0019-pcm-fix-__snd_pcm_state-return-value.patch
Patch20: 0020-confmisc-fix-memory-leak-in-snd_func_concat.patch
Patch21: 0021-conf-fix-return-code-in-_snd_config_load_with_includ.patch
Patch22: 0022-pcm-plugin-status-fix-the-return-value-regression.patch
Patch23: 0023-pcm-plugin-status-revert-the-recent-changes.patch
Patch24: 0024-pcm-plugin-tidy-snd_pcm_plugin_avail_update.patch
Patch25: 0025-pcm-plugin-optimize-sync-in-snd_pcm_plugin_status.patch
Patch26: 0026-Revert-pcm_plugin-fix-delay.patch
Patch27: 0027-pcm-ioplug-fix-the-delay-calculation-in-the-status-c.patch
Patch28: 0028-pcm-rate-tidy-up-snd_pcm_rate_avail_update.patch
Patch29: 0029-pcm-ioplug-fix-the-delay-calculation-for-old-plugins.patch
Patch30: 0030-pcm-rate-use-pcm_frame_diff-in-snd_pcm_rate_playback.patch
Patch31: 0031-pcm-plugin-fix-status-code-for-capture.patch
Patch32: 0032-pcm-rate-use-pcm_frame_diff-on-related-places.patch
Patch33: 0033-pcm-rate-fix-the-capture-delay-values.patch
Patch34: 0034-ucm-fix-possible-memory-leak-in-parse_verb_file.patch
Patch35: 0035-topology-tplg_pprint_integer-fix-coverity-uninitaliz.patch
Patch36: 0036-topology-tplg_add_widget_object-do-not-use-invalid-e.patch
Patch37: 0037-topology-tplg_decode_pcm-add-missing-log-argument-co.patch
Patch38: 0038-topology-parse_tuple_set-remove-dead-condition-code.patch
Patch39: 0039-ucm-uc_mgr_substitute_tree-fix-use-after-free.patch
Patch40: 0040-topology-sort_config-cleanups-use-goto-for-the-error.patch
Patch41: 0041-conf-USB-add-Xonar-U7-MKII-to-USB-Audio.pcm.iec958_d.patch
Patch42: 0042-pcm_plugin-set-the-initial-hw_ptr-appl_ptr-from-the-.patch
Patch43: 0043-pcm-dmix-dshare-delay-calculation-fixes-and-cleanups.patch
Patch44: 0044-topology-fix-parse_tuple_set-remove-dead-condition-c.patch
Patch45: 0045-pcm-direct-Fix-the-missing-appl_ptr-update.patch
Patch46: 0046-pcm-ioplug-Pass-appl_ptr-and-hw_ptr-in-snd_pcm_statu.patch
Patch47: 0047-pcm-null-Pass-appl_ptr-and-hw_ptr-in-snd_pcm_status.patch
Patch48: 0048-pcm-share-Pass-appl_ptr-and-hw_ptr-in-snd_pcm_status.patch
# rest suse fixes
Patch101: alsa-lib-ignore-non-accessible-ALSA_CONFIG_PATH.patch
BuildRequires: doxygen
@ -187,53 +140,6 @@ This package contains the library for ALSA topology support.
%prep
%setup -q -n alsa-lib-%{version}
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%patch14 -p1
%patch15 -p1
%patch16 -p1
%patch17 -p1
%patch18 -p1
%patch19 -p1
%patch20 -p1
%patch21 -p1
%patch22 -p1
%patch23 -p1
%patch24 -p1
%patch25 -p1
%patch26 -p1
%patch27 -p1
%patch28 -p1
%patch29 -p1
%patch30 -p1
%patch31 -p1
%patch32 -p1
%patch33 -p1
%patch34 -p1
%patch35 -p1
%patch36 -p1
%patch37 -p1
%patch38 -p1
%patch39 -p1
%patch40 -p1
%patch41 -p1
%patch42 -p1
%patch43 -p1
%patch44 -p1
%patch45 -p1
%patch46 -p1
%patch47 -p1
%patch48 -p1
%patch101 -p1
%build
@ -260,7 +166,7 @@ make -C doc doc %{?_smp_mflags}
%make_install
# clean up unneeded files
rm -f %{buildroot}%{_libdir}/*.*a
# rm -f %{buildroot}%{_libdir}/alsa-lib/smixer/*.*a
# rm -f %%{buildroot}%%{_libdir}/alsa-lib/smixer/*.*a
rm -f %{buildroot}%{_bindir}/aserver
%if !%enable_topology
rm -f %{buildroot}%{_libdir}/pkgconfig/alsa-topology.pc
@ -307,7 +213,7 @@ install -c -m 0644 %{SOURCE8} %{buildroot}%{_udevrulesdir}
%endif
#
# install template to update rc.config and sysconfig files:
# (updating the actual files is done in the %post-script)
# (updating the actual files is done in the %% post-script)
#
mkdir -p -m 755 %{buildroot}%{_fillupdir}
mkdir -p -m 755 %{buildroot}%{_sysconfdir}/sysconfig