diff --git a/channels/chan_alsa.c b/channels/chan_alsa.c
index 991f2c2bba296ac7527c3a956ae76df534f1a9b5..0de29004246b976489e6ca18c505a0884b8a84a5 100644
--- a/channels/chan_alsa.c
+++ b/channels/chan_alsa.c
@@ -381,13 +381,17 @@ static int alsa_write(struct ast_channel *chan, struct ast_frame *f)
 		state = snd_pcm_state(alsa.ocard);
 		if (state == SND_PCM_STATE_XRUN)
 			snd_pcm_prepare(alsa.ocard);
-		res = snd_pcm_writei(alsa.ocard, sizbuf, len / 2);
+		while ((res = snd_pcm_writei(alsa.ocard, sizbuf, len / 2)) == -EAGAIN) {
+			usleep(1);
+		}
 		if (res == -EPIPE) {
 #if DEBUG
 			ast_debug(1, "XRUN write\n");
 #endif
 			snd_pcm_prepare(alsa.ocard);
-			res = snd_pcm_writei(alsa.ocard, sizbuf, len / 2);
+			while ((res = snd_pcm_writei(alsa.ocard, sizbuf, len / 2)) == -EAGAIN) {
+				usleep(1);
+			}
 			if (res != len / 2) {
 				ast_log(LOG_ERROR, "Write error: %s\n", snd_strerror(res));
 				res = -1;