
2011/8/23 Takashi Iwai tiwai@suse.de: be enough just to have a
boolean for underrun_detect yes/no.
So, the patch would be like below.
What do you think?
Takashi
diff --git a/pulse/pcm_pulse.c b/pulse/pcm_pulse.c index d6c6792..b0e52ab 100644 --- a/pulse/pcm_pulse.c +++ b/pulse/pcm_pulse.c @@ -42,6 +42,7 @@ typedef struct snd_pcm_pulse { int handle_underrun;
size_t offset;
- int64_t written;
pa_stream *stream;
@@ -460,6 +461,7 @@ static snd_pcm_sframes_t pulse_write(snd_pcm_ioplug_t * io,
/* Make sure the buffer pointer is in sync */ pcm->last_size -= writebytes;
- pcm->written += writebytes;
ret = update_ptr(pcm); if (ret < 0) goto finish; @@ -585,6 +587,15 @@ static void stream_request_cb(pa_stream * p, size_t length, void *userdata) update_active(pcm); }
+#if defined(PA_CHECK_VERSION) && PA_CHECK_VERSION(0,99,0)
compile fail at these line since PA_CHECK_VERSION is not defined in pulseaudio 0.9.14
seem that pcm->wriiten is application pointer of pulse device in bytes
does it mean that pa_stream_get_underflow_index(0 is the hardware pointer ?
does it mean that pulse device no longer can be run 7 x 24 non-stop since pcm->written may overflow ?
+#define DEFAULT_HANDLE_UNDERRUN 1 +#define do_underrun_detect(pcm, p) \
- ((pcm)->written <= pa_stream_get_underflow_index(p))
+#else +#define DEFAULT_HANDLE_UNDERRUN 0 +#define do_underrun_detect(pcm, p) 1 /* always true */ +#endif
static void stream_underrun_cb(pa_stream * p, void *userdata) { snd_pcm_pulse_t *pcm = userdata; @@ -594,7 +605,8 @@ static void stream_underrun_cb(pa_stream * p, void *userdata) if (!pcm->p) return;
- pcm->underrun = 1;
- if (do_underrun_detect(pcm, p))
- pcm->underrun = 1;
}
static void stream_latency_cb(pa_stream *p, void *userdata) { @@ -739,6 +751,7 @@ static int pulse_prepare(snd_pcm_ioplug_t * io)
pcm->offset = 0; pcm->underrun = 0;
- pcm->written = 0;
/* Reset fake ringbuffer */ pcm->last_size = 0; @@ -983,7 +996,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 = DEFAULT_HANDLE_UNDERRUN;
int err; snd_pcm_pulse_t *pcm;