diff options
Diffstat (limited to 'audio')
-rw-r--r-- | audio/alsaaudio.c | 63 | ||||
-rw-r--r-- | audio/audio_int.h | 2 |
2 files changed, 34 insertions, 31 deletions
diff --git a/audio/alsaaudio.c b/audio/alsaaudio.c index 65a0a0d2eb..f7748ca82f 100644 --- a/audio/alsaaudio.c +++ b/audio/alsaaudio.c @@ -570,36 +570,39 @@ static int alsa_run_out (HWVoiceOut *hw) hw->clip (dst, src, convert_samples); - again: - written = snd_pcm_writei (alsa->handle, dst, convert_samples); - - if (written < 0) { - switch (written) { - case -EPIPE: - if (!alsa_recover (alsa->handle)) { - goto again; - } - dolog ( - "Failed to write %d frames to %p, handle %p not prepared\n", - convert_samples, - dst, - alsa->handle - ); - goto exit; + while (convert_samples) { + written = snd_pcm_writei (alsa->handle, dst, convert_samples); - case -EAGAIN: - goto again; + if (written < 0) { + switch (written) { + case -EPIPE: + if (!alsa_recover (alsa->handle)) { + continue; + } + dolog ("Failed to write %d frames to %p, " + "handle %p not prepared\n", + convert_samples, + dst, + alsa->handle); + goto exit; - default: - alsa_logerr (written, "Failed to write %d frames to %p\n", - convert_samples, dst); - goto exit; + case -EAGAIN: + continue; + + default: + alsa_logerr (written, "Failed to write %d frames to %p\n", + convert_samples, dst); + goto exit; + } } - } - mixeng_clear (src, written); - rpos = (rpos + written) % hw->samples; - samples -= written; + mixeng_clear (src, written); + rpos = (rpos + written) % hw->samples; + samples -= written; + convert_samples -= written; + dst = advance (dst, written << hw->info.shift); + src += written; + } } exit: @@ -661,8 +664,8 @@ static int alsa_init_out (HWVoiceOut *hw, audsettings_t *as) alsa->pcm_buf = audio_calloc (AUDIO_FUNC, obt.samples, 1 << hw->info.shift); if (!alsa->pcm_buf) { - dolog ("Could not allocate DAC buffer (%d bytes)\n", - hw->samples << hw->info.shift); + dolog ("Could not allocate DAC buffer (%d samples, each %d bytes)\n", + hw->samples, 1 << hw->info.shift); alsa_anal_close (&handle); return -1; } @@ -751,8 +754,8 @@ static int alsa_init_in (HWVoiceIn *hw, audsettings_t *as) alsa->pcm_buf = audio_calloc (AUDIO_FUNC, hw->samples, 1 << hw->info.shift); if (!alsa->pcm_buf) { - dolog ("Could not allocate ADC buffer (%d bytes)\n", - hw->samples << hw->info.shift); + dolog ("Could not allocate ADC buffer (%d samples, each %d bytes)\n", + hw->samples, 1 << hw->info.shift); alsa_anal_close (&handle); return -1; } diff --git a/audio/audio_int.h b/audio/audio_int.h index 6d4c32b068..8fee7b96fa 100644 --- a/audio/audio_int.h +++ b/audio/audio_int.h @@ -216,7 +216,7 @@ static inline int audio_need_to_swap_endian (int endianness) #if defined __GNUC__ #define GCC_ATTR __attribute__ ((__unused__, __format__ (__printf__, 1, 2))) #define INIT_FIELD(f) . f -#define GCC_FMT_ATTR(n, m) __attribute__ ((__format__ (printf, n, m))) +#define GCC_FMT_ATTR(n, m) __attribute__ ((__format__ (__printf__, n, m))) #else #define GCC_ATTR /**/ #define INIT_FIELD(f) /**/ |