Hello community,
here is the log from the commit of package alsa-plugins for openSUSE:Factory
checked in at Fri Sep 3 17:00:53 CEST 2010.
--------
--- alsa-plugins/alsa-plugins.changes 2010-04-19 10:46:15.000000000 +0200
+++ alsa-plugins/alsa-plugins.changes 2010-09-02 16:41:33.000000000 +0200
@@ -1,0 +2,12 @@
+Thu Sep 2 16:34:02 CEST 2010 - tiwai@suse.de
+
+- Backport upstream fix:
+ pulse: Add handle_underrun option
+
+-------------------------------------------------------------------
+Thu Jun 24 08:54:13 CEST 2010 - tiwai@suse.de
+
+- Backport upstream fix:
+ pulse: Fix invalid buffer pointer return value
+
+-------------------------------------------------------------------
calling whatdependson for head-i586
New:
----
0001-pulse-Fix-invalid-buffer-pointer-return-value.patch
0002-pulse-Add-handle_underrun-option.patch
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ alsa-plugins.spec ++++++
--- /var/tmp/diff_new_pack.PCwutE/_old 2010-09-03 17:00:26.000000000 +0200
+++ /var/tmp/diff_new_pack.PCwutE/_new 2010-09-03 17:00:26.000000000 +0200
@@ -38,7 +38,7 @@
Url: http://www.alsa-project.org/
Summary: Extra Plug-Ins for the ALSA Library
Version: 1.0.23
-Release: 1
+Release: 4
License: LGPLv2.1+
Group: System/Libraries
AutoReqProv: on
@@ -49,7 +49,8 @@
Source1: asound-pulse.conf
Source2: alsa-pulse.conf
Source3: baselibs.conf
-# Patch: alsa-plugins-git-fixes.diff
+Patch1: 0001-pulse-Fix-invalid-buffer-pointer-return-value.patch
+Patch2: 0002-pulse-Add-handle_underrun-option.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description
@@ -164,7 +165,8 @@
%prep
%setup -q -n %{name}-%{package_version}
-# %patch -p1
+%patch1 -p1
+%patch2 -p1
%build
export AUTOMAKE_JOBS=%{?jobs:%jobs}
++++++ 0001-pulse-Fix-invalid-buffer-pointer-return-value.patch ++++++
From 1675414eca06dcfc20899adf104ace05acfe26a0 Mon Sep 17 00:00:00 2001
From: David Henningsson
Date: Sat, 9 Jan 2010 09:09:14 +0100
Subject: [PATCH 1/2] pulse: Fix invalid buffer pointer return value
This patch improves recovering from underruns, and prevents hangs inside
snd_pcm_write* and snd_pcm_read* due to snd_pcm_avail* returning too
low values. It especially helps low latency situations.
Signed-off-by: David Henningsson
Signed-off-by: Takashi Iwai
---
pulse/pcm_pulse.c | 15 ++++++++++++++-
1 files changed, 14 insertions(+), 1 deletions(-)
diff --git a/pulse/pcm_pulse.c b/pulse/pcm_pulse.c
index 02a837e..b322898 100644
--- a/pulse/pcm_pulse.c
+++ b/pulse/pcm_pulse.c
@@ -90,6 +90,10 @@ static int update_ptr(snd_pcm_pulse_t *pcm)
if (pcm->io.stream == SND_PCM_STREAM_CAPTURE)
size -= pcm->offset;
+ /* Prevent accidental overrun of the fake ringbuffer */
+ if (size >= pcm->buffer_attr.tlength)
+ size = pcm->buffer_attr.tlength-1;
+
if (size > pcm->last_size) {
pcm->ptr += size - pcm->last_size;
pcm->ptr %= pcm->buffer_attr.tlength;
@@ -424,6 +428,7 @@ static snd_pcm_sframes_t pulse_write(snd_pcm_ioplug_t * io,
snd_pcm_pulse_t *pcm = io->private_data;
const char *buf;
snd_pcm_sframes_t ret = 0;
+ size_t writebytes;
assert(pcm);
@@ -445,13 +450,15 @@ static snd_pcm_sframes_t pulse_write(snd_pcm_ioplug_t * io,
(char *) areas->addr + (areas->first +
areas->step * offset) / 8;
- ret = pa_stream_write(pcm->stream, buf, size * pcm->frame_size, NULL, 0, 0);
+ writebytes = size * pcm->frame_size;
+ ret = pa_stream_write(pcm->stream, buf, writebytes, NULL, 0, 0);
if (ret < 0) {
ret = -EIO;
goto finish;
}
/* Make sure the buffer pointer is in sync */
+ pcm->last_size -= writebytes;
ret = update_ptr(pcm);
if (ret < 0)
goto finish;
@@ -528,6 +535,7 @@ static snd_pcm_sframes_t pulse_read(snd_pcm_ioplug_t * io,
dst_buf = (char *) dst_buf + frag_length;
remain_size -= frag_length;
+ pcm->last_size -= frag_length;
}
/* Make sure the buffer pointer is in sync */
@@ -730,6 +738,11 @@ static int pulse_prepare(snd_pcm_ioplug_t * io)
pcm->offset = 0;
pcm->underrun = 0;
+ /* Reset fake ringbuffer */
+ pcm->last_size = 0;
+ pcm->ptr = 0;
+ update_ptr(pcm);
+
finish:
pa_threaded_mainloop_unlock(pcm->p->mainloop);
--
1.7.2.1
++++++ 0002-pulse-Add-handle_underrun-option.patch ++++++
From c20d516e229620129ee20175d8fee8511cc3a4bd Mon Sep 17 00:00:00 2001
From: Takashi Iwai
Date: Fri, 9 Jul 2010 14:05:03 +0200
Subject: [PATCH 2/2] pulse: Add handle_underrun option
Added a config option "handle_underrun" to specify whether pulse plugin
handles the underrun reported from PA. The default value is now set to
false, i.e. it will ignore underruns in PA (for good reasons below).
You can take back to the old behavior by setting handle_underrun true.
The original idea was brought by David Henningsson ,
while this patch is simplified and makes the behavior configurable.
The reasons for avoiding underruns (cited from David's original patch):
Reporting underruns to ALSA seems to do more bad than good, for these reasons:
* If pulseaudio gets an underrun, the normal way to end that underrun is to
feed it with more buffers. This is different from the ALSA way of dealing
with underruns, which requires hardware buffer pointers to be reset.
* In addition, underrun signals are delivered asynchronously from pulseaudio.
This means that there might be more buffers on the way to pulseaudio when
the underrun is reported, making the underrun obsolete. Unfortunately,
there is currently no known way to determine whether this is the case or
not.
Signed-off-by: Takashi Iwai
---
pulse/pcm_pulse.c | 17 +++++++++++++++--
1 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/pulse/pcm_pulse.c b/pulse/pcm_pulse.c
index b322898..2df0a80 100644
--- a/pulse/pcm_pulse.c
+++ b/pulse/pcm_pulse.c
@@ -39,6 +39,7 @@ typedef struct snd_pcm_pulse {
size_t last_size;
size_t ptr;
int underrun;
+ int handle_underrun;
size_t offset;
@@ -696,8 +697,9 @@ static int pulse_prepare(snd_pcm_ioplug_t * io)
if (io->stream == SND_PCM_STREAM_PLAYBACK) {
pa_stream_set_write_callback(pcm->stream,
stream_request_cb, pcm);
- pa_stream_set_underflow_callback(pcm->stream,
- stream_underrun_cb, pcm);
+ if (pcm->handle_underrun)
+ pa_stream_set_underflow_callback(pcm->stream,
+ stream_underrun_cb, pcm);
r = pa_stream_connect_playback(pcm->stream, pcm->device,
&pcm->buffer_attr,
PA_STREAM_AUTO_TIMING_UPDATE |
@@ -980,6 +982,7 @@ SND_PCM_PLUGIN_DEFINE_FUNC(pulse)
snd_config_iterator_t i, next;
const char *server = NULL;
const char *device = NULL;
+ int handle_underrun = 0;
int err;
snd_pcm_pulse_t *pcm;
@@ -1005,6 +1008,14 @@ SND_PCM_PLUGIN_DEFINE_FUNC(pulse)
}
continue;
}
+ if (strcmp(id, "handle_underrun") == 0) {
+ if ((err = snd_config_get_bool(n)) < 0) {
+ SNDERR("Invalid value for %s", id);
+ return -EINVAL;
+ }
+ handle_underrun = err;
+ continue;
+ }
SNDERR("Unknown field %s", id);
return -EINVAL;
}
@@ -1028,6 +1039,8 @@ SND_PCM_PLUGIN_DEFINE_FUNC(pulse)
goto error;
}
+ pcm->handle_underrun = handle_underrun;
+
err = pulse_connect(pcm->p, server);
if (err < 0)
goto error;
--
1.7.2.1
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org