Index: uspace/srv/audio/hound/hound_ctx.c
===================================================================
--- uspace/srv/audio/hound/hound_ctx.c	(revision 2c0b3482c5e276da6a8f1aaa92ddbd88044a9b68)
+++ uspace/srv/audio/hound/hound_ctx.c	(revision 78aca91bc6b26239df024c7691bdeb7323fc44a1)
@@ -111,4 +111,6 @@
 	int flags;
 	size_t allowed_size;
+	fibril_mutex_t guard;
+	fibril_condvar_t change;
 } hound_ctx_stream_t;
 
@@ -144,4 +146,6 @@
 		audio_pipe_init(&stream->fifo);
 		link_initialize(&stream->link);
+		fibril_mutex_initialize(&stream->guard);
+		fibril_condvar_initialize(&stream->change);
 		stream->ctx = ctx;
 		stream->flags = flags;
@@ -182,9 +186,15 @@
 		return EINVAL;
 
-	if (stream->allowed_size &&
-	    (audio_pipe_bytes(&stream->fifo) + size > stream->allowed_size))
-		return EBUSY;
-
-	return audio_pipe_push_data(&stream->fifo, data, size, stream->format);
+	fibril_mutex_lock(&stream->guard);
+	while (stream->allowed_size &&
+	    (audio_pipe_bytes(&stream->fifo) + size > stream->allowed_size)) {
+	    fibril_condvar_wait(&stream->change, &stream->guard);
+
+	}
+
+	const int ret =
+	    audio_pipe_push_data(&stream->fifo, data, size, stream->format);
+	fibril_mutex_unlock(&stream->guard);
+	return ret;
 }
 
@@ -199,9 +209,9 @@
 {
 	assert(stream);
-	const ssize_t copied_size =
-	    audio_pipe_mix_data(&stream->fifo, data, size, f);
-	if (copied_size != (ssize_t)size)
-		log_warning("Not enough data in stream buffer");
-	return copied_size;
+	fibril_mutex_lock(&stream->guard);
+	const int ret = audio_pipe_mix_data(&stream->fifo, data, size, f);
+	fibril_condvar_signal(&stream->change);
+	fibril_mutex_unlock(&stream->guard);
+	return ret;
 }
 
@@ -210,6 +220,8 @@
 	assert(stream);
 	log_debug("Draining stream");
+	fibril_mutex_lock(&stream->guard);
 	while (audio_pipe_bytes(&stream->fifo))
-		async_usleep(10000);
+		fibril_condvar_wait(&stream->change, &stream->guard);
+	fibril_mutex_unlock(&stream->guard);
 }
 
@@ -233,5 +245,8 @@
 	list_foreach(ctx->streams, it) {
 		hound_ctx_stream_t *stream = hound_ctx_stream_from_link(it);
-		hound_ctx_stream_add_self(stream, buffer, size, &source->format);
+		ssize_t copied = hound_ctx_stream_add_self(
+		    stream, buffer, size, &source->format);
+		if (copied != (ssize_t)size)
+			log_warning("Not enough data in stream buffer");
 	}
 	log_verbose("CTX: %p. Pushing audio to %zu connections", ctx,
Index: uspace/srv/audio/hound/iface.c
===================================================================
--- uspace/srv/audio/hound/iface.c	(revision 2c0b3482c5e276da6a8f1aaa92ddbd88044a9b68)
+++ uspace/srv/audio/hound/iface.c	(revision 78aca91bc6b26239df024c7691bdeb7323fc44a1)
@@ -83,5 +83,4 @@
 	if (!ctx)
 		return false;
-	log_info("%s: %p, %d", __FUNCTION__, server, id);
 	return hound_ctx_is_record(ctx);
 }
@@ -150,9 +149,5 @@
 static int iface_stream_data_write(void *stream, const void *buffer, size_t size)
 {
-	int ret = EOK;
-	do {
-		ret = hound_ctx_stream_write(stream, buffer, size);
-	} while (ret == EBUSY && (async_usleep(100), 1));
-	return ret;
+	return hound_ctx_stream_write(stream, buffer, size);
 }
 
