All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] alsa-plugins: Pulse: only underrun if no more data has been written
@ 2011-08-18 15:06 David Henningsson
  2011-08-19  7:43 ` Takashi Iwai
  0 siblings, 1 reply; 14+ messages in thread
From: David Henningsson @ 2011-08-18 15:06 UTC (permalink / raw)
  To: ALSA Development Mailing List

[-- Attachment #1: Type: text/plain, Size: 718 bytes --]

With the new/upcoming version of PulseAudio (0.99.x) there is a protocol 
addition that makes it possible to handle underruns better in the pulse 
plugin.

The attached patch implements that, but it has two flaws I wouldn't mind 
getting some help with if possible:

1) Since this uses the new API function pa_stream_get_underflow_index, 
it won't compile with current stable PulseAudio versions, only the 
upcoming version.

2) So now there are three possibilities for handle_underrun ( 0 = never, 
1 = always, 2 = the new improved one that IMO should be used). Since 
handle_underrun is a bool in the config, it can not be set to "2", only 
0 or 1.

-- 
David Henningsson, Canonical Ltd.
http://launchpad.net/~diwic

[-- Attachment #2: 0001-alsa-plugins-Pulse-only-underrun-if-no-more-data-has.patch --]
[-- Type: text/x-patch, Size: 2032 bytes --]

>From 4e31ba395b751a6ab3254256dc8a227b3be67932 Mon Sep 17 00:00:00 2001
From: David Henningsson <david.henningsson@canonical.com>
Date: Tue, 2 Aug 2011 14:49:04 +0200
Subject: [PATCH] alsa-plugins: Pulse: only underrun if no more data has been written

If more data has already been written after the underrun, the underrun
will automatically end and therefore we should not report it or
restart the stream.

Signed-off-by: David Henningsson <david.henningsson@canonical.com>
---
 pulse/pcm_pulse.c |   10 +++++++---
 1 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/pulse/pcm_pulse.c b/pulse/pcm_pulse.c
index d6c6792..9c4a7e5 100644
--- a/pulse/pcm_pulse.c
+++ b/pulse/pcm_pulse.c
@@ -39,9 +39,10 @@ typedef struct snd_pcm_pulse {
 	size_t last_size;
 	size_t ptr;
 	int underrun;
-	int handle_underrun;
+	int handle_underrun; /* can be 0=never, 1=always or 2=only if more data has not been written */
 
 	size_t offset;
+	int64_t written;
 
 	pa_stream *stream;
 
@@ -459,6 +460,7 @@ static snd_pcm_sframes_t pulse_write(snd_pcm_ioplug_t * io,
 	}
 
 	/* Make sure the buffer pointer is in sync */
+	pcm->written += writebytes;
 	pcm->last_size -= writebytes;
 	ret = update_ptr(pcm);
 	if (ret < 0)
@@ -594,7 +596,8 @@ static void stream_underrun_cb(pa_stream * p, void *userdata)
 	if (!pcm->p)
 		return;
 
-	pcm->underrun = 1;
+	if (pcm->handle_underrun == 1 || pcm->written <= pa_stream_get_underflow_index(p))
+		pcm->underrun = 1;
 }
 
 static void stream_latency_cb(pa_stream *p, void *userdata) {
@@ -691,6 +694,7 @@ static int pulse_prepare(snd_pcm_ioplug_t * io)
 		goto finish;
 	}
 
+	pcm->written = 0;
 	pa_stream_set_state_callback(pcm->stream, stream_state_cb, pcm);
 	pa_stream_set_latency_update_callback(pcm->stream, stream_latency_cb, pcm);
 
@@ -983,7 +987,7 @@ SND_PCM_PLUGIN_DEFINE_FUNC(pulse)
 	const char *server = NULL;
 	const char *device = NULL;
 	const char *fallback_name = NULL;
-	int handle_underrun = 0;
+	int handle_underrun = 2;
 	int err;
 	snd_pcm_pulse_t *pcm;
 
-- 
1.7.4.1


[-- Attachment #3: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply related	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2011-09-22  6:12 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-08-18 15:06 [PATCH] alsa-plugins: Pulse: only underrun if no more data has been written David Henningsson
2011-08-19  7:43 ` Takashi Iwai
2011-08-19  9:49   ` David Henningsson
2011-08-19 12:46     ` Takashi Iwai
2011-08-23 11:56       ` David Henningsson
2011-08-23 13:40         ` Takashi Iwai
2011-08-23 13:57           ` David Henningsson
2011-08-23 15:07             ` Takashi Iwai
2011-08-25  5:53           ` Raymond Yau
2011-08-25  6:17             ` David Henningsson
2011-08-25  6:25               ` Raymond Yau
2011-08-25  6:41                 ` David Henningsson
2011-08-26  7:46               ` Takashi Iwai
2011-09-22  6:12                 ` Raymond Yau

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.