Hello community, here is the log from the commit of package alsa for openSUSE:Factory checked in at 2015-07-05 18:00:29 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/alsa (Old) and /work/SRC/openSUSE:Factory/.alsa.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "alsa" Changes: -------- --- /work/SRC/openSUSE:Factory/alsa/alsa.changes 2015-05-23 12:53:16.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.alsa.new/alsa.changes 2015-07-05 18:00:30.000000000 +0200 @@ -1,0 +2,12 @@ +Thu Jun 18 09:32:07 CEST 2015 - [email protected] + +- Backport upstream fixes: fix bogus assert() in hw_params, a few + PCM dmix/dshare/dsnoop fixes, enhacement of amixer, etc: + 0017-test-pcm-Fix-generated-values-with-float-PCM-format.patch + 0018-test-pcm_min-Fix-error-messages.patch + 0019-pcm-Don-t-assert-in-_snd_pcm_hw_params_internal.patch + 0020-pcm-Fix-snd_pcm_status-for-dmix-co.patch + 0021-control-Allow-cset-ing-specific-values-in-the-multi-.patch + 0022-PCM-snd_pcm_xxxx_drain-maybe-blocked-after-suspend-a.patch + +------------------------------------------------------------------- New: ---- 0017-test-pcm-Fix-generated-values-with-float-PCM-format.patch 0018-test-pcm_min-Fix-error-messages.patch 0019-pcm-Don-t-assert-in-_snd_pcm_hw_params_internal.patch 0020-pcm-Fix-snd_pcm_status-for-dmix-co.patch 0021-control-Allow-cset-ing-specific-values-in-the-multi-.patch 0022-PCM-snd_pcm_xxxx_drain-maybe-blocked-after-suspend-a.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ alsa.spec ++++++ --- /var/tmp/diff_new_pack.1yN1RW/_old 2015-07-05 18:00:32.000000000 +0200 +++ /var/tmp/diff_new_pack.1yN1RW/_new 2015-07-05 18:00:32.000000000 +0200 @@ -65,6 +65,12 @@ Patch14: 0014-conf-ucm-broadwell-rt286-change-to-set-capture-volum.patch Patch15: 0015-ucm-allow-multiple-devices-in-JackHWMute.patch Patch16: 0016-pcm-Remove-assert-from-snd_pcm_hw_params_slave.patch +Patch17: 0017-test-pcm-Fix-generated-values-with-float-PCM-format.patch +Patch18: 0018-test-pcm_min-Fix-error-messages.patch +Patch19: 0019-pcm-Don-t-assert-in-_snd_pcm_hw_params_internal.patch +Patch20: 0020-pcm-Fix-snd_pcm_status-for-dmix-co.patch +Patch21: 0021-control-Allow-cset-ing-specific-values-in-the-multi-.patch +Patch22: 0022-PCM-snd_pcm_xxxx_drain-maybe-blocked-after-suspend-a.patch # rest suse patches Patch99: alsa-lib-doxygen-avoid-crash-for-11.3.diff # suppress timestamp in documents @@ -151,6 +157,12 @@ %patch14 -p1 %patch15 -p1 %patch16 -p1 +%patch17 -p1 +%patch18 -p1 +%patch19 -p1 +%patch20 -p1 +%patch21 -p1 +%patch22 -p1 %if 0%{?suse_version} == 1130 %patch99 -p1 %endif ++++++ 0017-test-pcm-Fix-generated-values-with-float-PCM-format.patch ++++++ >From 9120f2de8608f49ee1cd4501b9eee39a1c71778f Mon Sep 17 00:00:00 2001 From: Christophe Lohr <[email protected]> Date: Mon, 1 Jun 2015 13:41:49 +0200 Subject: [PATCH] test/pcm: Fix generated values with float PCM format The float format should be generated [-1.0..1.0]. Signed-off-by: Takashi Iwai <[email protected]> --- test/pcm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pcm.c b/test/pcm.c index abb83e4c3014..18b61762b236 100644 --- a/test/pcm.c +++ b/test/pcm.c @@ -68,7 +68,7 @@ static void generate_sine(const snd_pcm_channel_area_t *areas, } fval; int res, i; if (is_float) { - fval.f = sin(phase) * maxval; + fval.f = sin(phase); res = fval.i; } else res = sin(phase) * maxval; -- 2.4.3 ++++++ 0018-test-pcm_min-Fix-error-messages.patch ++++++ >From 8551fe258791c165892583006b0aa5142f41b621 Mon Sep 17 00:00:00 2001 From: Christophe Lohr <[email protected]> Date: Mon, 1 Jun 2015 13:43:36 +0200 Subject: [PATCH] test/pcm_min: Fix error messages Fix the wrongly referred error code for error messages from snd_pcm_writei() and other calls. Signed-off-by: Takashi Iwai <[email protected]> --- test/pcm_min.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pcm_min.c b/test/pcm_min.c index e971405ee64f..7462a45fef33 100644 --- a/test/pcm_min.c +++ b/test/pcm_min.c @@ -39,7 +39,7 @@ int main(void) if (frames < 0) frames = snd_pcm_recover(handle, frames, 0); if (frames < 0) { - printf("snd_pcm_writei failed: %s\n", snd_strerror(err)); + printf("snd_pcm_writei failed: %s\n", snd_strerror(frames)); break; } if (frames > 0 && frames < (long)sizeof(buffer)) -- 2.4.3 ++++++ 0019-pcm-Don-t-assert-in-_snd_pcm_hw_params_internal.patch ++++++ >From a5e5e3cd3c85eafcced7a93b1cf37201560f2a28 Mon Sep 17 00:00:00 2001 From: Takashi Iwai <[email protected]> Date: Mon, 1 Jun 2015 13:45:01 +0200 Subject: [PATCH] pcm: Don't assert in _snd_pcm_hw_params_internal() It's no fatal error from sw params, and it's really bad habit to use assert() and abort the operation as a system library. Signed-off-by: Takashi Iwai <[email protected]> --- src/pcm/pcm_params.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pcm/pcm_params.c b/src/pcm/pcm_params.c index 1d667a583151..60d99ad96167 100644 --- a/src/pcm/pcm_params.c +++ b/src/pcm/pcm_params.c @@ -2361,7 +2361,8 @@ int _snd_pcm_hw_params_internal(snd_pcm_t *pcm, snd_pcm_hw_params_t *params) memset(&sw, 0, sizeof(sw)); snd_pcm_sw_params_default(pcm, &sw); err = snd_pcm_sw_params(pcm, &sw); - assert(err >= 0); + if (err < 0) + return err; if (pcm->mmap_rw || pcm->access == SND_PCM_ACCESS_MMAP_INTERLEAVED || -- 2.4.3 ++++++ 0020-pcm-Fix-snd_pcm_status-for-dmix-co.patch ++++++ >From 18ce3ec9caa266086c5f364a2bdbab27a8db9d77 Mon Sep 17 00:00:00 2001 From: Takashi Iwai <[email protected]> Date: Tue, 2 Jun 2015 16:47:50 +0200 Subject: [PATCH] pcm: Fix snd_pcm_status() for dmix & co Fetch the timestamp and other status fields by issuing snd_pcm_status() for the slave PCM. Also, fill the delay field properly. This should fix longstanding PA's complaints. Reported-by: Dan Hordern <[email protected]> Signed-off-by: Takashi Iwai <[email protected]> --- src/pcm/pcm_dmix.c | 3 ++- src/pcm/pcm_dshare.c | 3 ++- src/pcm/pcm_dsnoop.c | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c index babde6a15efe..4acbaf0e0265 100644 --- a/src/pcm/pcm_dmix.c +++ b/src/pcm/pcm_dmix.c @@ -475,12 +475,13 @@ static int snd_pcm_dmix_status(snd_pcm_t *pcm, snd_pcm_status_t * status) break; } memset(status, 0, sizeof(*status)); + snd_pcm_status(dmix->spcm, status); status->state = snd_pcm_dmix_state(pcm); status->trigger_tstamp = dmix->trigger_tstamp; - gettimestamp(&status->tstamp, pcm->tstamp_type); status->avail = snd_pcm_mmap_playback_avail(pcm); status->avail_max = status->avail > dmix->avail_max ? status->avail : dmix->avail_max; dmix->avail_max = 0; + status->delay = snd_pcm_mmap_playback_delay(pcm); return 0; } diff --git a/src/pcm/pcm_dshare.c b/src/pcm/pcm_dshare.c index 020e6f7d9307..b51758fb22a2 100644 --- a/src/pcm/pcm_dshare.c +++ b/src/pcm/pcm_dshare.c @@ -224,12 +224,13 @@ static int snd_pcm_dshare_status(snd_pcm_t *pcm, snd_pcm_status_t * status) break; } memset(status, 0, sizeof(*status)); + snd_pcm_status(dshare->spcm, status); status->state = snd_pcm_state(dshare->spcm); status->trigger_tstamp = dshare->trigger_tstamp; - gettimestamp(&status->tstamp, pcm->tstamp_type); status->avail = snd_pcm_mmap_playback_avail(pcm); status->avail_max = status->avail > dshare->avail_max ? status->avail : dshare->avail_max; dshare->avail_max = 0; + status->delay = snd_pcm_mmap_playback_delay(pcm); return 0; } diff --git a/src/pcm/pcm_dsnoop.c b/src/pcm/pcm_dsnoop.c index 8333eefdaf4c..8a2e87ad0ae1 100644 --- a/src/pcm/pcm_dsnoop.c +++ b/src/pcm/pcm_dsnoop.c @@ -187,13 +187,14 @@ static int snd_pcm_dsnoop_status(snd_pcm_t *pcm, snd_pcm_status_t * status) break; } memset(status, 0, sizeof(*status)); + snd_pcm_status(dsnoop->spcm, status); state = snd_pcm_state(dsnoop->spcm); status->state = state == SND_PCM_STATE_RUNNING ? dsnoop->state : state; status->trigger_tstamp = dsnoop->trigger_tstamp; - status->tstamp = dsnoop->update_tstamp; status->avail = snd_pcm_mmap_capture_avail(pcm); status->avail_max = status->avail > dsnoop->avail_max ? status->avail : dsnoop->avail_max; dsnoop->avail_max = 0; + status->delay = snd_pcm_mmap_capture_delay(pcm); return 0; } -- 2.4.3 ++++++ 0021-control-Allow-cset-ing-specific-values-in-the-multi-.patch ++++++ >From 2fd098b587e8e5137c05ea6248c2aa87294e13c2 Mon Sep 17 00:00:00 2001 From: Takashi Iwai <[email protected]> Date: Wed, 10 Jun 2015 11:56:23 +0200 Subject: [PATCH] control: Allow cset'ing specific values in the multi-value case Improve the parser to allow empty elements followed by a comma. Now amixer works like below for setting only the third element. % amixer cset 'IIR1 Band1' ,,200 Reported-and-tested-by: Arun Raghavan <[email protected]> Signed-off-by: Takashi Iwai <[email protected]> --- src/control/ctlparse.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/control/ctlparse.c b/src/control/ctlparse.c index 8d6c3859bec4..877a05e3a1f1 100644 --- a/src/control/ctlparse.c +++ b/src/control/ctlparse.c @@ -325,6 +325,8 @@ int snd_ctl_ascii_value_parse(snd_ctl_t *handle, snd_ctl_elem_value_set_id(dst, myid); for (idx = 0; idx < count && idx < 128 && ptr && *ptr; idx++) { + if (*ptr == ',') + goto skip; switch (type) { case SND_CTL_ELEM_TYPE_BOOLEAN: tmp = 0; @@ -375,6 +377,7 @@ int snd_ctl_ascii_value_parse(snd_ctl_t *handle, default: break; } + skip: if (!strchr(value, ',')) ptr = value; else if (*ptr == ',') -- 2.4.3 ++++++ 0022-PCM-snd_pcm_xxxx_drain-maybe-blocked-after-suspend-a.patch ++++++ >From 9ee6ec80b80268932a372522ca192168e7812ccf Mon Sep 17 00:00:00 2001 From: Shengjiu Wang <[email protected]> Date: Fri, 12 Jun 2015 16:15:08 +0800 Subject: [PATCH] PCM: snd_pcm_xxxx_drain() maybe blocked after suspend and resume After suspend and resume, the alsa driver is stopped. But if alsa-lib run into snd_pcm_xxxx_drain(), it need to wait avail >= pcm->stop_threshold, otherwise, it will not exit the loop, so finally it is blocked at poll() of snd_pcm_wait_nocheck(pcm, -1). This patch is to add state check after snd_pcm_wait_nocheck(pcm, -1), if the state is SND_PCM_STATE_SUSPENDED, then return error. Signed-off-by: Shengjiu Wang <[email protected]> Signed-off-by: Takashi Iwai <[email protected]> --- src/pcm/pcm_dmix.c | 14 ++++++++++++++ src/pcm/pcm_dshare.c | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c index 4acbaf0e0265..58e4975d5225 100644 --- a/src/pcm/pcm_dmix.c +++ b/src/pcm/pcm_dmix.c @@ -617,6 +617,13 @@ static int snd_pcm_dmix_drain(snd_pcm_t *pcm) snd_pcm_uframes_t stop_threshold; int err; + switch (snd_pcm_state(dmix->spcm)) { + case SND_PCM_STATE_SUSPENDED: + return -ESTRPIPE; + default: + break; + } + if (dmix->state == SND_PCM_STATE_OPEN) return -EBADFD; if (pcm->mode & SND_PCM_NONBLOCK) @@ -649,6 +656,13 @@ static int snd_pcm_dmix_drain(snd_pcm_t *pcm) snd_pcm_dmix_sync_area(pcm); snd_pcm_wait_nocheck(pcm, -1); snd_pcm_direct_clear_timer_queue(dmix); /* force poll to wait */ + + switch (snd_pcm_state(dmix->spcm)) { + case SND_PCM_STATE_SUSPENDED: + return -ESTRPIPE; + default: + break; + } } } while (dmix->state == SND_PCM_STATE_DRAINING); pcm->stop_threshold = stop_threshold; diff --git a/src/pcm/pcm_dshare.c b/src/pcm/pcm_dshare.c index b51758fb22a2..02370dc7082d 100644 --- a/src/pcm/pcm_dshare.c +++ b/src/pcm/pcm_dshare.c @@ -368,6 +368,13 @@ static int snd_pcm_dshare_drain(snd_pcm_t *pcm) snd_pcm_uframes_t stop_threshold; int err; + switch (snd_pcm_state(dshare->spcm)) { + case SND_PCM_STATE_SUSPENDED: + return -ESTRPIPE; + default: + break; + } + if (dshare->state == SND_PCM_STATE_OPEN) return -EBADFD; if (pcm->mode & SND_PCM_NONBLOCK) @@ -400,6 +407,13 @@ static int snd_pcm_dshare_drain(snd_pcm_t *pcm) snd_pcm_dshare_sync_area(pcm); snd_pcm_wait_nocheck(pcm, -1); snd_pcm_direct_clear_timer_queue(dshare); /* force poll to wait */ + + switch (snd_pcm_state(dshare->spcm)) { + case SND_PCM_STATE_SUSPENDED: + return -ESTRPIPE; + default: + break; + } } } while (dshare->state == SND_PCM_STATE_DRAINING); pcm->stop_threshold = stop_threshold; -- 2.4.3
