X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/22b9fa74de8e80471a5033ea067d3b360930b91d..94ddd3e3779fee737969ffcbb0e8f161548d4e0f:/server/speaker-alsa.c
diff --git a/server/speaker-alsa.c b/server/speaker-alsa.c
index fa9e6c3..d10ec19 100644
--- a/server/speaker-alsa.c
+++ b/server/speaker-alsa.c
@@ -2,29 +2,25 @@
* This file is part of DisOrder
* Copyright (C) 2005, 2006, 2007 Richard Kettlewell
*
- * This program is free software; you can redistribute it and/or modify
+ * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
+ * along with this program. If not, see .
*/
/** @file server/speaker-alsa.c
* @brief Support for @ref BACKEND_ALSA */
-#include
-
-#if API_ALSA
+#include "common.h"
-#include "types.h"
+#if HAVE_ALSA_ASOUNDLIB_H
#include
#include
@@ -51,7 +47,6 @@ static void alsa_init(void) {
static void log_params(snd_pcm_hw_params_t *hwparams,
snd_pcm_sw_params_t *swparams) {
snd_pcm_uframes_t f;
- unsigned u;
return; /* too verbose */
if(hwparams) {
@@ -62,14 +57,22 @@ static void log_params(snd_pcm_hw_params_t *hwparams,
info("sw silence_size=%lu", (unsigned long)f);
snd_pcm_sw_params_get_silence_threshold(swparams, &f);
info("sw silence_threshold=%lu", (unsigned long)f);
- snd_pcm_sw_params_get_sleep_min(swparams, &u);
- info("sw sleep_min=%lu", (unsigned long)u);
+#if HAVE_SND_PCM_SW_PARAMS_GET_SLEEP_MIN
+ {
+ unsigned u;
+
+ snd_pcm_sw_params_get_sleep_min(swparams, &u);
+ info("sw sleep_min=%lu", (unsigned long)u);
+ }
+#endif
snd_pcm_sw_params_get_start_threshold(swparams, &f);
info("sw start_threshold=%lu", (unsigned long)f);
snd_pcm_sw_params_get_stop_threshold(swparams, &f);
info("sw stop_threshold=%lu", (unsigned long)f);
+#if HAVE_SND_PCM_SW_PARAMS_GET_XFER_ALIGN
snd_pcm_sw_params_get_xfer_align(swparams, &f);
info("sw xfer_align=%lu", (unsigned long)f);
+#endif
}
}
@@ -92,10 +95,6 @@ static void alsa_deactivate(void) {
/** @brief ALSA backend activation */
static void alsa_activate(void) {
- /* If we need to change format then close the current device. */
- if(pcm && !formats_equal(&playing->format, &device_format))
- alsa_deactivate();
- /* Now if the sound device is open it must have the right format */
if(!pcm) {
snd_pcm_hw_params_t *hwparams;
snd_pcm_sw_params_t *swparams;
@@ -119,21 +118,21 @@ static void alsa_activate(void) {
if((err = snd_pcm_hw_params_set_access(pcm, hwparams,
SND_PCM_ACCESS_RW_INTERLEAVED)) < 0)
fatal(0, "error from snd_pcm_hw_params_set_access: %d", err);
- switch(playing->format.bits) {
+ switch(config->sample_format.bits) {
case 8:
sample_format = SND_PCM_FORMAT_S8;
break;
case 16:
- switch(playing->format.byte_format) {
- case AO_FMT_NATIVE: sample_format = SND_PCM_FORMAT_S16; break;
- case AO_FMT_LITTLE: sample_format = SND_PCM_FORMAT_S16_LE; break;
- case AO_FMT_BIG: sample_format = SND_PCM_FORMAT_S16_BE; break;
- error(0, "unrecognized byte format %d", playing->format.byte_format);
+ switch(config->sample_format.endian) {
+ case ENDIAN_LITTLE: sample_format = SND_PCM_FORMAT_S16_LE; break;
+ case ENDIAN_BIG: sample_format = SND_PCM_FORMAT_S16_BE; break;
+ default:
+ error(0, "unrecognized byte format %d", config->sample_format.endian);
goto fatal;
}
break;
default:
- error(0, "unsupported sample size %d", playing->format.bits);
+ error(0, "unsupported sample size %d", config->sample_format.bits);
goto fatal;
}
if((err = snd_pcm_hw_params_set_format(pcm, hwparams,
@@ -142,18 +141,18 @@ static void alsa_activate(void) {
sample_format, err);
goto fatal;
}
- rate = playing->format.rate;
+ rate = config->sample_format.rate;
if((err = snd_pcm_hw_params_set_rate_near(pcm, hwparams, &rate, 0)) < 0) {
error(0, "error from snd_pcm_hw_params_set_rate (%d): %d",
- playing->format.rate, err);
+ config->sample_format.rate, err);
goto fatal;
}
- if(rate != (unsigned)playing->format.rate)
- info("want rate %d, got %u", playing->format.rate, rate);
- if((err = snd_pcm_hw_params_set_channels(pcm, hwparams,
- playing->format.channels)) < 0) {
+ if(rate != (unsigned)config->sample_format.rate)
+ info("want rate %d, got %u", config->sample_format.rate, rate);
+ if((err = snd_pcm_hw_params_set_channels
+ (pcm, hwparams, config->sample_format.channels)) < 0) {
error(0, "error from snd_pcm_hw_params_set_channels (%d): %d",
- playing->format.channels, err);
+ config->sample_format.channels, err);
goto fatal;
}
pcm_bufsize = 3 * FRAMES;
@@ -176,7 +175,6 @@ static void alsa_activate(void) {
FRAMES, err);
if((err = snd_pcm_sw_params(pcm, swparams)) < 0)
fatal(0, "error calling snd_pcm_sw_params: %d", err);
- device_format = playing->format;
D(("acquired audio device"));
log_params(hwparams, swparams);
device_state = device_open;
@@ -224,7 +222,7 @@ static size_t alsa_play(size_t frames) {
static int alsa_slots, alsa_nslots = -1;
/** @brief Fill in poll fd array for ALSA */
-static void alsa_beforepoll(void) {
+static void alsa_beforepoll(int attribute((unused)) *timeoutp) {
/* We send sample data to ALSA as fast as it can accept it, relying on
* the fact that it has a relatively small buffer to minimize pause
* latency. */