Index: uspace/srv/audio/hound/audio_device.c
===================================================================
--- uspace/srv/audio/hound/audio_device.c	(revision d1f144a70f5d9b1ea04f5c6d292951db9bb1a75f)
+++ uspace/srv/audio/hound/audio_device.c	(revision bee53490fd25b6b457f36535f0c58753255c9d6c)
@@ -83,5 +83,5 @@
 
 	audio_sink_init(&dev->sink, name, dev, device_sink_connection_callback,
-	    device_check_format, &AUDIO_FORMAT_ANY);
+	    device_check_format, NULL, &AUDIO_FORMAT_ANY);
 	audio_source_init(&dev->source, name, dev,
 	    device_source_connection_callback, NULL, &AUDIO_FORMAT_ANY);
Index: uspace/srv/audio/hound/audio_sink.c
===================================================================
--- uspace/srv/audio/hound/audio_sink.c	(revision d1f144a70f5d9b1ea04f5c6d292951db9bb1a75f)
+++ uspace/srv/audio/hound/audio_sink.c	(revision bee53490fd25b6b457f36535f0c58753255c9d6c)
@@ -49,9 +49,15 @@
  * @param sink The structure to initialize.
  * @param name string identifier
- * @param private_data backa
+ * @param private_data backend data
+ * @param connection_change connect/disconnect callback
+ * @param check_format format testing callback
+ * @param data_available trigger data prcoessing
+ * @param f sink format
+ * @return Error code.
  */
-int audio_sink_init(audio_sink_t *sink, const char *name,
-    void *private_data, int (*connection_change)(audio_sink_t *, bool),
-    int (*check_format)(audio_sink_t *sink), const pcm_format_t *f)
+int audio_sink_init(audio_sink_t *sink, const char *name, void *private_data,
+    int (*connection_change)(audio_sink_t *, bool),
+    int (*check_format)(audio_sink_t *), int (*data_available)(audio_sink_t *),
+    const pcm_format_t *f)
 {
 	assert(sink);
@@ -67,4 +73,5 @@
 	sink->connection_change = connection_change;
 	sink->check_format = check_format;
+	sink->data_available = data_available;
 	log_verbose("Initialized sink (%p) '%s'", sink, sink->name);
 	return EOK;
Index: uspace/srv/audio/hound/audio_sink.h
===================================================================
--- uspace/srv/audio/hound/audio_sink.h	(revision d1f144a70f5d9b1ea04f5c6d292951db9bb1a75f)
+++ uspace/srv/audio/hound/audio_sink.h	(revision bee53490fd25b6b457f36535f0c58753255c9d6c)
@@ -63,4 +63,6 @@
 	/** Backend callback to check data */
 	int (*check_format)(audio_sink_t *);
+	/** new data notifier */
+	int (*data_available)(audio_sink_t *);
 };
 
@@ -75,7 +77,8 @@
 }
 
-int audio_sink_init(audio_sink_t *sink, const char *name,
-    void *private_data, int (*connection_change)(audio_sink_t *, bool),
-    int (*check_format)(audio_sink_t *), const pcm_format_t *f);
+int audio_sink_init(audio_sink_t *sink, const char *name, void *private_data,
+    int (*connection_change)(audio_sink_t *, bool),
+    int (*check_format)(audio_sink_t *), int (*data_available)(audio_sink_t *),
+    const pcm_format_t *f);
 
 void audio_sink_fini(audio_sink_t *sink);
Index: uspace/srv/audio/hound/connection.c
===================================================================
--- uspace/srv/audio/hound/connection.c	(revision d1f144a70f5d9b1ea04f5c6d292951db9bb1a75f)
+++ uspace/srv/audio/hound/connection.c	(revision bee53490fd25b6b457f36535f0c58753255c9d6c)
@@ -123,4 +123,20 @@
 	return ret > 0 ? EOK : ret;
 }
+/**
+ * Add new data to the connection buffer.
+ * @param connection Target conneciton.
+ * @aparam adata Reference counted audio data buffer.
+ * @return Error code.
+ */
+int connection_push_data(connection_t *connection,
+    audio_data_t *adata)
+{
+	assert(connection);
+	assert(adata);
+	const int ret = audio_pipe_push(&connection->fifo, adata);
+	if (ret == EOK && connection->sink->data_available)
+		connection->sink->data_available(connection->sink);
+	return ret;
+}
 
 /**
Index: uspace/srv/audio/hound/connection.h
===================================================================
--- uspace/srv/audio/hound/connection.h	(revision d1f144a70f5d9b1ea04f5c6d292951db9bb1a75f)
+++ uspace/srv/audio/hound/connection.h	(revision bee53490fd25b6b457f36535f0c58753255c9d6c)
@@ -97,17 +97,5 @@
     size_t size, pcm_format_t format);
 
-/**
- * Add new data to the connection buffer.
- * @param connection Target conneciton.
- * @aparam adata Reference counted audio data buffer.
- * @return Error code.
- */
-static inline int connection_push_data(connection_t *connection,
-    audio_data_t *adata)
-{
-	assert(connection);
-	assert(adata);
-	return audio_pipe_push(&connection->fifo, adata);
-}
+int connection_push_data(connection_t *connection, audio_data_t *adata);
 
 /**
Index: uspace/srv/audio/hound/hound_ctx.c
===================================================================
--- uspace/srv/audio/hound/hound_ctx.c	(revision d1f144a70f5d9b1ea04f5c6d292951db9bb1a75f)
+++ uspace/srv/audio/hound/hound_ctx.c	(revision bee53490fd25b6b457f36535f0c58753255c9d6c)
@@ -67,5 +67,5 @@
 		// TODO provide sink functions
 		const int ret = audio_sink_init(ctx->sink, name, ctx, NULL,
-		    NULL, &AUDIO_FORMAT_DEFAULT);
+		    NULL, NULL, &AUDIO_FORMAT_DEFAULT);
 		if (ret != EOK) {
 			free(ctx->sink);
