diff mbox

[3/3] plugio: Check for pointer callback error codes

Message ID 20180107143214.6d31af53@sambook (mailing list archive)
State New, archived
Headers show

Commit Message

Arkadiusz Bokowy Jan. 7, 2018, 1:32 p.m. UTC
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@gmail.com>
---
 src/pcm/pcm_ioplug.c | 33 +++++++++++++++++++++------------
 1 file changed, 21 insertions(+), 12 deletions(-)
diff mbox

Patch

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)