From ad57e02a15decb0795724ce56bd7883fef6f3cf8 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 1 Oct 2007 19:44:48 +0000 Subject: [PATCH] properly reflect xrun state back to the application. Required to make xmms work with the pulse plugin for alsa --- 1.0.14-state-xrun.patch | 82 +++++++++++++++++++++++++++++++++++++++++ alsa-plugins.spec | 8 +++- 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 1.0.14-state-xrun.patch diff --git a/1.0.14-state-xrun.patch b/1.0.14-state-xrun.patch new file mode 100644 index 0000000..97b2ad6 --- /dev/null +++ b/1.0.14-state-xrun.patch @@ -0,0 +1,82 @@ +--- alsa-plugins-1.0.14.lennart/pulse/pcm_pulse.c 2007-09-24 01:43:01.000000000 +0200 ++++ alsa-plugins-1.0.14/pulse/pcm_pulse.c 2007-10-01 21:36:53.000000000 +0200 +@@ -36,6 +36,7 @@ + /* Since ALSA expects a ring buffer we must do some voodoo. */ + size_t last_size; + size_t ptr; ++ int underrun; + + size_t offset; + +@@ -90,7 +91,9 @@ + if (err < 0) { + err = -EIO; + goto finish; +- } ++ } else ++ pcm->underrun = 0; ++ + + finish: + pa_threaded_mainloop_unlock(pcm->p->mainloop); +@@ -200,6 +203,9 @@ + + err = snd_pcm_bytes_to_frames(io->pcm, pcm->ptr); + ++ if (pcm->underrun) ++ err = -EPIPE; ++ + finish: + pa_threaded_mainloop_unlock(pcm->p->mainloop); + +@@ -231,6 +237,10 @@ + + *delayp = snd_pcm_bytes_to_frames(io->pcm, pa_usec_to_bytes(lat, &pcm->ss)); + ++ /* Yes, this is evil, and we're not supposed to do this. */ ++ if (pcm->underrun && pcm->io.state == SND_PCM_STATE_RUNNING) ++ pcm->io.state = SND_PCM_STATE_XRUN; ++ + finish: + pa_threaded_mainloop_unlock(pcm->p->mainloop); + +@@ -273,6 +283,7 @@ + pulse_poll_deactivate(pcm->p); + + err = size; ++ pcm->underrun = 0; + + finish: + pa_threaded_mainloop_unlock(pcm->p->mainloop); +@@ -354,6 +365,15 @@ + pulse_poll_activate(pcm->p); + } + ++static void stream_underrun_cb(pa_stream *p, void *userdata) { ++ snd_pcm_pulse_t *pcm = userdata; ++ ++ assert(pcm); ++ assert(pcm->p); ++ ++ pcm->underrun = 1; ++} ++ + static int pulse_pcm_poll_descriptors_count(snd_pcm_ioplug_t *io) + { + snd_pcm_pulse_t *pcm = io->private_data; +@@ -461,6 +481,7 @@ + + 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); + pa_stream_connect_playback(pcm->stream, pcm->device, &pcm->buffer_attr, + PA_STREAM_AUTO_TIMING_UPDATE | PA_STREAM_INTERPOLATE_TIMING, NULL, NULL); + } else { +@@ -480,6 +501,7 @@ + pcm->last_size = 0; + pcm->ptr = 0; + pcm->offset = 0; ++ pcm->underrun = 0; + + finish: + pa_threaded_mainloop_unlock(pcm->p->mainloop); diff --git a/alsa-plugins.spec b/alsa-plugins.spec index 67313ef..f1bf245 100644 --- a/alsa-plugins.spec +++ b/alsa-plugins.spec @@ -1,6 +1,6 @@ Name: alsa-plugins Version: 1.0.14 -Release: 3%{?dist} +Release: 4%{?dist} Summary: The Advanced Linux Sound Architecture (ALSA) Plugins # All packages are LGPLv2+ with the exception of samplerate which is GPLv2+ License: GPLv2+ and LGPLv2+ @@ -14,6 +14,7 @@ Source4: samplerate.conf Source5: upmix.conf Source6: vdownmix.conf Patch0: 1.0.14-buffer-attr.patch +Patch1: 1.0.14-state-xrun.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: alsa-lib-devel @@ -95,6 +96,7 @@ surround". %prep %setup -q -n %{name}-%{version} %patch0 -p1 -b .buffer_attr +%patch1 -p1 -b .state_xrun %build %configure --disable-static \ @@ -162,6 +164,10 @@ rm -rf $RPM_BUILD_ROOT %{_libdir}/alsa-lib/libasound_module_pcm_vdownmix.so %changelog +* Mon Oct 1 2007 Lennart Poettering - 1.0.14-4 +- In the pulse plugin: reflect the XRUN state back to the application. + Makes XMMS work on top of the alsa plugin. (#307341) + * Mon Sep 24 2007 Lennart Poettering - 1.0.14-3 - Change PulseAudio buffering defaults to more sane values