diff --git a/src/plugins/alsa/ao_alsa.c b/src/plugins/alsa/ao_alsa.c
index 585d11b62a7b52272b53a9db8cda2e47f2711e99..8ec3f887e6bc2394415cdfca037e4a82cce850ce 100644
--- a/src/plugins/alsa/ao_alsa.c
+++ b/src/plugins/alsa/ao_alsa.c
@@ -51,7 +51,6 @@ static ao_info ao_alsa_info =
 	3
 };
 
-
 typedef struct ao_alsa_internal
 {
 	snd_pcm_t *pcm_handle;
@@ -145,7 +144,7 @@ int ao_plugin_open(ao_device *device, ao_sample_format *format)
 	else
 		return 0;
 
-	// Finish filling in the parameter structure
+	/* Finish filling in the parameter structure */
 	param.format.rate = format->rate;
 
 	param.start_mode = SND_PCM_START_FULL;
@@ -193,9 +192,18 @@ int _alsa_write_buffer(ao_alsa_internal *s)
 	snd_pcm_channel_status_t status;
 	snd_pcm_t *pcm_handle = s->pcm_handle;
 	int len = s->buf_end;
+	ssize_t written, snd_pcm_write_ret;
 
 	s->buf_end = 0;
-	snd_pcm_write(pcm_handle, s->buf, len);
+
+	snd_pcm_write_ret = written = 0;
+	while ((snd_pcm_write_ret >= 0) && (written < len)) {
+		while ((snd_pcm_write_ret = snd_pcm_write(pcm_handle, s->buf, len)) == -EINTR)
+			;
+		if (snd_pcm_write_ret > 0)
+			written += snd_pcm_write_ret;
+	}
+
 	memset(&status, 0, sizeof(status));
 	if (snd_pcm_channel_status(pcm_handle, &status) < 0) {
 		fprintf(stderr, "ALSA: could not get channel status\n");