[-,JACK,1/1] jack: Report Xruns to user application
diff mbox

Message ID 1521210212-30923-2-git-send-email-twischer@de.adit-jv.com
State New
Headers show

Commit Message

Timo Wischer March 16, 2018, 2:23 p.m. UTC
From: Timo Wischer <twischer@de.adit-jv.com>

Only increasing the hw_ptr is not sufficient
because it will not be evaluated by the ALSA library
to detect an Xrun.

In addition there is a raise where an Xrun detected by the JACK thread
could not be detected in the ALSA thread.
- In playback use case
- The hw_ptr will be increased by the JACK thread
  (hw_ptr > appl_ptr => Xrun)
- But the ALSA thread increases the appl_ptr before evaluating the
hw_ptr
- Therefore the hw_ptr < appl_ptr again
- ALSA will not detect the Xrun which was already detected by the
JACK thread

Therefore an additional variable is required to report an Xrun from the
JACK thread to ALSA.

Signed-off-by: Timo Wischer <twischer@de.adit-jv.com>

Comments

Takashi Iwai March 16, 2018, 2:41 p.m. UTC | #1
On Fri, 16 Mar 2018 15:23:32 +0100,
<twischer@de.adit-jv.com> wrote:
> 
> From: Timo Wischer <twischer@de.adit-jv.com>
> 
> Only increasing the hw_ptr is not sufficient
> because it will not be evaluated by the ALSA library
> to detect an Xrun.
> 
> In addition there is a raise where an Xrun detected by the JACK thread
> could not be detected in the ALSA thread.
> - In playback use case
> - The hw_ptr will be increased by the JACK thread
>   (hw_ptr > appl_ptr => Xrun)
> - But the ALSA thread increases the appl_ptr before evaluating the
> hw_ptr
> - Therefore the hw_ptr < appl_ptr again
> - ALSA will not detect the Xrun which was already detected by the
> JACK thread
> 
> Therefore an additional variable is required to report an Xrun from the
> JACK thread to ALSA.
> 
> Signed-off-by: Timo Wischer <twischer@de.adit-jv.com>

Thanks, I applied it now.

But, at the next time you send a patchset, please don't continue from
the old thread.  It's pretty confusing.


Takashi
Timo Wischer March 16, 2018, 2:47 p.m. UTC | #2
> But, at the next time you send a patchset, please don't continue from
> the old thread.  It's pretty confusing.

Does it mean I should not replay-to any old mail and send a completely new mail?
But how to mark that this patch was adapted and the updated one was applied?

Best regards

Timo Wischer

Advanced Driver Information Technology GmbH
Engineering Software Base (ADITG/ESB)
Robert-Bosch-Str. 200
31139 Hildesheim
Germany

Tel. +49 5121 49 6938
Fax +49 5121 49 6999
twischer@de.adit-jv.com

ADIT is a joint venture company of Robert Bosch GmbH/Robert Bosch Car Multimedia GmbH and DENSO Corporation
Sitz: Hildesheim, Registergericht: Amtsgericht Hildesheim HRB 3438
Geschäftsführung: Wilhelm Grabow, Ken Yaguchi
Takashi Iwai March 16, 2018, 2:57 p.m. UTC | #3
On Fri, 16 Mar 2018 15:47:04 +0100,
Wischer, Timo (ADITG/ESB) wrote:
> 
> > But, at the next time you send a patchset, please don't continue from
> > the old thread.  It's pretty confusing.
> 
> Does it mean I should not replay-to any old mail and send a completely new mail?

You can reply a mail to the old thread.  But it shouldn't be the start
of another patch series.

If you do submit a new patch series, do it from scratch.  And if it's
a revised patchset, put "v2" or such prefix, too.


Takashi

Patch
diff mbox

diff --git a/jack/pcm_jack.c b/jack/pcm_jack.c
index 7c7c230..a655668 100644
--- a/jack/pcm_jack.c
+++ b/jack/pcm_jack.c
@@ -20,6 +20,7 @@ 
  *
  */
 
+#include <stdbool.h>
 #include <byteswap.h>
 #include <sys/shm.h>
 #include <sys/types.h>
@@ -50,6 +51,9 @@  typedef struct {
 
 	jack_port_t **ports;
 	jack_client_t *client;
+
+	/* JACK thread -> ALSA thread */
+	bool xrun_detected;
 } snd_pcm_jack_t;
 
 static int snd_pcm_jack_stop(snd_pcm_ioplug_t *io);
@@ -133,6 +137,9 @@  static snd_pcm_sframes_t snd_pcm_jack_pointer(snd_pcm_ioplug_t *io)
 {
 	snd_pcm_jack_t *jack = io->private_data;
 
+	if (jack->xrun_detected)
+		return -EPIPE;
+
 #ifdef SND_PCM_IOPLUG_FLAG_BOUNDARY_WA
 	return jack->hw_ptr;
 #else
@@ -196,6 +203,20 @@  snd_pcm_jack_process_cb(jack_nframes_t nframes, snd_pcm_ioplug_t *io)
 			snd_pcm_areas_silence(jack->areas, io->channels, xfer,
 					      frames, io->format);
 		}
+
+		if (io->state == SND_PCM_STATE_PREPARED) {
+			/* After activating this JACK client with
+			 * jack_activate() this process callback will be called.
+			 * But the processing of snd_pcm_jack_start() would take
+			 * a while longer due to the jack_connect() calls.
+			 * Therefore the device was already started
+			 * but it is not yet in RUNNING state.
+			 * Due to this expected behaviour it is not an Xrun.
+			 */
+		} else {
+			/* report Xrun to user application */
+			jack->xrun_detected = true;
+		}
 	}
 
 	pcm_poll_unblock_check(io); /* unblock socket for polling if needed */
@@ -211,6 +232,7 @@  static int snd_pcm_jack_prepare(snd_pcm_ioplug_t *io)
 	int err;
 
 	jack->hw_ptr = 0;
+	jack->xrun_detected = false;
 
 	jack->min_avail = io->period_size;
 	snd_pcm_sw_params_alloca(&swparams);