[alsa-devel] [PATCH 3/3] plugio: Check for pointer callback error codes

Arkadiusz (Arkq) Bokowy arkadiusz.bokowy at gmail.com
Sun Jan 7 14:32:14 CET 2018


plugio: Check for pointer callback error codes

By checking error code returned by the pointer callback, we can
determine more precisely PCM state. Previous implementation assumed,
that a software PCM can only produce overrun or underrun. It was
impossible to mark software PCM as disconnected.

Signed-off-by: Arkadiusz Bokowy <arkadiusz.bokowy at gmail.com>
---
 src/pcm/pcm_ioplug.c | 33 +++++++++++++++++++++------------
 1 file changed, 21 insertions(+), 12 deletions(-)

diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c
index 06c20d7b..cc234611 100644
--- a/src/pcm/pcm_ioplug.c
+++ b/src/pcm/pcm_ioplug.c
@@ -53,20 +53,29 @@ static int snd_pcm_ioplug_hw_ptr_update(snd_pcm_t
*pcm) {
 	ioplug_priv_t *io = pcm->private_data;
 	snd_pcm_sframes_t hw;
+	unsigned int delta;
 
 	hw = io->data->callback->pointer(io->data);
-	if (hw >= 0) {
-		unsigned int delta;
-		if ((unsigned int)hw >= io->last_hw)
-			delta = hw - io->last_hw;
-		else
-			delta = pcm->buffer_size + hw - io->last_hw;
-		snd_pcm_mmap_hw_forward(io->data->pcm, delta);
-		io->last_hw = hw;
-		return 0;
-	} else
-		io->data->state = SNDRV_PCM_STATE_XRUN;
-		return -EPIPE;
+	if (hw < 0) {
+		switch (hw) {
+		case -ESTRPIPE:
+			io->data->state = SND_PCM_STATE_SUSPENDED;
+			break;
+		case -ENODEV:
+			io->data->state = SND_PCM_STATE_DISCONNECTED;
+			break;
+		default:
+			io->data->state = SND_PCM_STATE_XRUN;
+		}
+		return hw;
+	}
+	if ((unsigned int)hw >= io->last_hw)
+		delta = hw - io->last_hw;
+	else
+		delta = pcm->buffer_size + hw - io->last_hw;
+	snd_pcm_mmap_hw_forward(io->data->pcm, delta);
+	io->last_hw = hw;
+	return 0;
 }
 
 static int snd_pcm_ioplug_info(snd_pcm_t *pcm, snd_pcm_info_t *info)
-- 
2.13.6



More information about the Alsa-devel mailing list