From 544a9ec143de5670072bae8114834272ced98bcd Mon Sep 17 00:00:00 2001 Message-Id: <544a9ec143de5670072bae8114834272ced98bcd.1715158950.git.mdw@distorted.org.uk> From: Mark Wooding Date: Sun, 23 Sep 2007 20:06:54 +0100 Subject: [PATCH 1/1] speaker refactoring Organization: Straylight/Edgeware From: rjk@greenend.org.uk <> --- server/speaker.c | 50 ++++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/server/speaker.c b/server/speaker.c index e65ce91..d3aea99 100644 --- a/server/speaker.c +++ b/server/speaker.c @@ -605,30 +605,7 @@ static void play(size_t frames) { switch(config->speaker_backend) { #if API_ALSA case BACKEND_ALSA: { - snd_pcm_sframes_t pcm_written_frames; - int err; - - pcm_written_frames = snd_pcm_writei(pcm, - playing->buffer + playing->start, - avail_frames); - D(("actually play %zu frames, wrote %d", - avail_frames, (int)pcm_written_frames)); - if(pcm_written_frames < 0) { - switch(pcm_written_frames) { - case -EPIPE: /* underrun */ - error(0, "snd_pcm_writei reports underrun"); - if((err = snd_pcm_prepare(pcm)) < 0) - fatal(0, "error calling snd_pcm_prepare: %d", err); - return; - case -EAGAIN: - return; - default: - fatal(0, "error calling snd_pcm_writei: %d", - (int)pcm_written_frames); - } - } - written_frames = pcm_written_frames; - written_bytes = written_frames * bpf; + written_frames = backend->play(avail_frames); break; } #endif @@ -763,6 +740,7 @@ static void play(size_t frames) { default: assert(!"reached"); } + written_bytes = written_frames * bpf; /* written_bytes and written_frames had better both be set and correct by * this point */ playing->start += written_bytes; @@ -920,7 +898,29 @@ error: /** @brief Play via ALSA */ static size_t alsa_play(size_t frames) { - return frames; + snd_pcm_sframes_t pcm_written_frames; + int err; + + pcm_written_frames = snd_pcm_writei(pcm, + playing->buffer + playing->start, + frames); + D(("actually play %zu frames, wrote %d", + frames, (int)pcm_written_frames)); + if(pcm_written_frames < 0) { + switch(pcm_written_frames) { + case -EPIPE: /* underrun */ + error(0, "snd_pcm_writei reports underrun"); + if((err = snd_pcm_prepare(pcm)) < 0) + fatal(0, "error calling snd_pcm_prepare: %d", err); + return 0; + case -EAGAIN: + return 0; + default: + fatal(0, "error calling snd_pcm_writei: %d", + (int)pcm_written_frames); + } + } else + return pcm_written_frames; } /** @brief ALSA deactivation */ -- [mdw]