aboutsummaryrefslogtreecommitdiffstats
path: root/src/output/alsa_plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/output/alsa_plugin.c')
-rw-r--r--src/output/alsa_plugin.c31
1 files changed, 11 insertions, 20 deletions
diff --git a/src/output/alsa_plugin.c b/src/output/alsa_plugin.c
index bbb03e80b..05e097513 100644
--- a/src/output/alsa_plugin.c
+++ b/src/output/alsa_plugin.c
@@ -441,7 +441,7 @@ alsa_close(void *data)
mixer_close(ad->mixer);
}
-static bool
+static size_t
alsa_play(void *data, const char *chunk, size_t size)
{
struct alsa_data *ad = data;
@@ -449,28 +449,19 @@ alsa_play(void *data, const char *chunk, size_t size)
size /= ad->frame_size;
- while (size > 0) {
+ while (true) {
ret = ad->writei(ad->pcm, chunk, size);
-
- if (ret == -EAGAIN || ret == -EINTR)
- continue;
-
- if (ret < 0) {
- if (alsa_recover(ad, ret) < 0) {
- g_warning("closing ALSA device \"%s\" due to write "
- "error: %s\n",
- alsa_device(ad), snd_strerror(-errno));
- return false;
- }
-
- continue;
+ if (ret > 0)
+ return ret * ad->frame_size;
+
+ if (ret < 0 && ret != -EAGAIN && ret != -EINTR &&
+ alsa_recover(ad, ret) < 0) {
+ g_warning("closing ALSA device \"%s\" due to write "
+ "error: %s\n",
+ alsa_device(ad), snd_strerror(-errno));
+ return 0;
}
-
- chunk += ret * ad->frame_size;
- size -= ret;
}
-
- return true;
}
const struct audio_output_plugin alsaPlugin = {