summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--palsa.c51
1 files changed, 22 insertions, 29 deletions
diff --git a/palsa.c b/palsa.c
index df71eb51..e2c21cc8 100644
--- a/palsa.c
+++ b/palsa.c
@@ -31,6 +31,9 @@
#include "messagepump.h"
#include "messages.h"
+#define trace(...) { fprintf(stderr, __VA_ARGS__); }
+//#define trace(fmt,...)
+
static snd_pcm_t *audio;
static int16_t *samplebuffer;
static int bufsize = 2048*4;
@@ -56,25 +59,25 @@ palsa_init (void) {
alsa_rate = conf_samplerate;
if ((err = snd_pcm_open (&audio, conf_alsa_soundcard, SND_PCM_STREAM_PLAYBACK, 0))) {
- fprintf (stderr, "could not open audio device (%s)\n",
+ trace ("could not open audio device (%s)\n",
snd_strerror (err));
exit (-1);
}
if ((err = snd_pcm_hw_params_malloc (&hw_params)) < 0) {
- fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n",
+ trace ("cannot allocate hardware parameter structure (%s)\n",
snd_strerror (err));
goto open_error;
}
if ((err = snd_pcm_hw_params_any (audio, hw_params)) < 0) {
- fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n",
+ trace ("cannot initialize hardware parameter structure (%s)\n",
snd_strerror (err));
goto open_error;
}
if ((err = snd_pcm_hw_params_set_access (audio, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {
- fprintf (stderr, "cannot set access type (%s)\n",
+ trace ("cannot set access type (%s)\n",
snd_strerror (err));
goto open_error;
}
@@ -86,7 +89,7 @@ palsa_init (void) {
fmt = SND_PCM_FORMAT_S16_LE;
#endif
if ((err = snd_pcm_hw_params_set_format (audio, hw_params, fmt)) < 0) {
- fprintf (stderr, "cannot set sample format (%s)\n",
+ trace ("cannot set sample format (%s)\n",
snd_strerror (err));
goto open_error;
}
@@ -100,7 +103,7 @@ palsa_init (void) {
int ret = 0;
if ((err = snd_pcm_hw_params_set_rate_near (audio, hw_params, &val, &ret)) < 0) {
- fprintf (stderr, "cannot set sample rate (%s)\n",
+ trace ("cannot set sample rate (%s)\n",
snd_strerror (err));
goto open_error;
}
@@ -108,7 +111,7 @@ palsa_init (void) {
printf ("chosen samplerate: %d\n", alsa_rate);
if ((err = snd_pcm_hw_params_set_channels (audio, hw_params, 2)) < 0) {
- fprintf (stderr, "cannot set channel count (%s)\n",
+ trace ("cannot set channel count (%s)\n",
snd_strerror (err));
goto open_error;
}
@@ -118,7 +121,7 @@ palsa_init (void) {
printf ("nchannels: %d\n", nchan);
if ((err = snd_pcm_hw_params (audio, hw_params)) < 0) {
- fprintf (stderr, "cannot set parameters (%s)\n",
+ trace ("cannot set parameters (%s)\n",
snd_strerror (err));
goto open_error;
}
@@ -126,17 +129,17 @@ palsa_init (void) {
snd_pcm_hw_params_free (hw_params);
if ((err = snd_pcm_sw_params_malloc (&sw_params)) < 0) {
- fprintf (stderr, "cannot allocate software parameters structure (%s)\n",
+ trace ("cannot allocate software parameters structure (%s)\n",
snd_strerror (err));
goto open_error;
}
if ((err = snd_pcm_sw_params_current (audio, sw_params)) < 0) {
- fprintf (stderr, "cannot initialize software parameters structure (%s)\n",
+ trace ("cannot initialize software parameters structure (%s)\n",
snd_strerror (err));
goto open_error;
}
if ((err = snd_pcm_sw_params_set_avail_min (audio, sw_params, bufsize/4)) < 0) {
- fprintf (stderr, "cannot set minimum available count (%s)\n",
+ trace ("cannot set minimum available count (%s)\n",
snd_strerror (err));
goto open_error;
}
@@ -147,12 +150,12 @@ palsa_init (void) {
bufsize = nsamp * 4;
if ((err = snd_pcm_sw_params_set_start_threshold (audio, sw_params, 0U)) < 0) {
- fprintf (stderr, "cannot set start mode (%s)\n",
+ trace ("cannot set start mode (%s)\n",
snd_strerror (err));
goto open_error;
}
if ((err = snd_pcm_sw_params (audio, sw_params)) < 0) {
- fprintf (stderr, "cannot set software parameters (%s)\n",
+ trace ("cannot set software parameters (%s)\n",
snd_strerror (err));
goto open_error;
}
@@ -162,7 +165,7 @@ palsa_init (void) {
*/
if ((err = snd_pcm_prepare (audio)) < 0) {
- fprintf (stderr, "cannot prepare audio interface for use (%s)\n",
+ trace ("cannot prepare audio interface for use (%s)\n",
snd_strerror (err));
goto open_error;
}
@@ -238,7 +241,7 @@ palsa_play (void) {
int err;
if (state == 0) {
if ((err = snd_pcm_prepare (audio)) < 0) {
- fprintf (stderr, "cannot prepare audio interface for use (%s)\n",
+ trace ("cannot prepare audio interface for use (%s)\n",
snd_strerror (err));
}
streamer_reset (1);
@@ -310,20 +313,10 @@ palsa_thread (uintptr_t context) {
has elapsed.
*/
if ((err = snd_pcm_wait (audio, 1000)) < 0 && state == 1) {
+ trace ("snd_pcm_wait failed, restarting alsa\n");
messagepump_push (M_REINIT_SOUND, 0, 0, 0);
mutex_unlock (mutex);
break;
-#if 0
- fprintf (stderr, "alsa poll failed (%s)\n", strerror (errno));
- if ((err = snd_pcm_prepare (audio)) < 0) {
- fprintf (stderr, "cannot prepare audio interface for use (%s)\n",
- snd_strerror (err));
- }
- snd_pcm_prepare (audio);
- snd_pcm_start (audio);
- mutex_unlock (mutex);
- continue;
-#endif
}
/* find out how much space is available for playback data */
@@ -332,11 +325,11 @@ palsa_thread (uintptr_t context) {
if ((frames_to_deliver = snd_pcm_avail_update (audio)) < 0) {
if (frames_to_deliver == -EPIPE) {
mutex_unlock (mutex);
- fprintf (stderr, "an xrun occured\n");
+ trace ("an xrun occured\n");
continue;
} else {
mutex_unlock (mutex);
- fprintf (stderr, "unknown ALSA avail update return value (%d)\n",
+ trace ("unknown ALSA avail update return value (%d)\n",
(int)frames_to_deliver);
continue;
}
@@ -348,7 +341,7 @@ palsa_thread (uintptr_t context) {
char buf[bufsize];
palsa_callback (buf, frames_to_deliver*4);
if ((err = snd_pcm_writei (audio, buf, frames_to_deliver)) < 0) {
- //fprintf (stderr, "write failed (%s)\n", snd_strerror (err));
+ trace ("write %d frames failed (%s)\n", frames_to_deliver, snd_strerror (err));
snd_pcm_prepare (audio);
snd_pcm_start (audio);
}