@@ -57,7 +57,15 @@ pq_cb_alsa_output(void *_state, uint8_t *out, const uint8_t *in, unsigned int in
struct pq_state_alsa *state = _state;
unsigned int num_samples = in_len/2;
int rv;
+
rv = snd_pcm_writei(state->pcm_handle, in, num_samples);
+ if (rv == -EPIPE) {
+ /* Recover from buffer underrun */
+ snd_pcm_prepare(state->pcm_handle);
+ /* Send a new sample again */
+ rv = snd_pcm_writei(state->pcm_handle, in, num_samples);
+ }
+
return rv == num_samples ? 0 : -1;
}
--
2.14.1
From 8f1b0a9bf966cd561b10d2d33c6a47dd02e17dcf Mon Sep 17 00:00:00 2001
From: Vadim Yanitskiy <axilirator@gmail.com>
Date: Sat, 2 Sep 2017 18:02:45 +0700
Subject: [PATCH 2/2] pq_alsa.c: print error message if device init fails
To: openbsc@lists.osmocom.org
Cc: 246tnt@gmail.com,
laforge@gnumonks.org,
axilirator@gmail.com
---
src/pq_alsa.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
@@ -85,13 +85,16 @@ pq_queue_alsa_op(struct pq *pq, const char *alsa_dev, unsigned int blk_len, int
int rc = -1;
state = calloc(1, sizeof(struct pq_state_alsa));
- if (!state)
- return -ENOMEM;
+ if (!state) {
+ rc = -ENOMEM;
+ goto out_print;
+ }
rc = snd_pcm_open(&state->pcm_handle, alsa_dev,
in_out_n ? SND_PCM_STREAM_CAPTURE : SND_PCM_STREAM_PLAYBACK, 0);
if (rc < 0)
- return rc;
+ goto out_print;
+
state->blk_len = blk_len;
rc = snd_pcm_hw_params_malloc(&hw_params);
@@ -143,6 +146,9 @@ out_free_par:
out_close:
snd_pcm_close(state->pcm_handle);
free(state);
+out_print:
+ fprintf(stderr, "[!] Couldn't init ALSA device '%s': %s\n",
+ alsa_dev, snd_strerror(rc));
return rc;
}