Index: uspace/drv/audio/sb16/dsp.c
===================================================================
--- uspace/drv/audio/sb16/dsp.c	(revision 8de7ef2b8768207ef306d5f2dc1927616c8f7ea6)
+++ uspace/drv/audio/sb16/dsp.c	(revision 7ca22e58d9062449bf04d2af23af0921ce45b622)
@@ -162,4 +162,6 @@
 	dsp->dma8_channel = dma8;
 	dsp->dma16_channel = dma16;
+	dsp->event_session = NULL;
+	dsp->event_exchange = NULL;
 	dsp->sb_dev = dev;
 	sb_dsp_reset(dsp);
@@ -187,6 +189,11 @@
 void sb_dsp_interrupt(sb_dsp_t *dsp)
 {
+	assert(dsp);
+	if (dsp->event_exchange) {
+		async_msg_0(dsp->event_exchange, IPC_FIRST_USER_METHOD);
+	} else {
+		ddf_log_warning("Interrupt with no event consumer.");
+	}
 #ifndef AUTO_DMA_MODE
-	assert(dsp);
 	sb_dsp_write(dsp, SINGLE_DMA_16B_DA);
 	sb_dsp_write(dsp, dsp->playing.mode);
@@ -200,4 +207,9 @@
 	assert(dsp);
 	assert(size);
+
+	/* buffer is already setup by for someone, refuse to work until
+	 * it's released */
+	if (dsp->buffer.data)
+		return EBUSY;
 
 	const int ret = sb_setup_buffer(dsp, *size);
@@ -213,4 +225,16 @@
 	return ret;
 }
+
+int sb_dsp_set_event_session(sb_dsp_t *dsp, unsigned id, async_sess_t *session)
+{
+	assert(dsp);
+	assert(session);
+	if (id != BUFFER_ID)
+		return ENOENT;
+	if (dsp->event_session)
+		return EBUSY;
+	dsp->event_session = session;
+	return EOK;
+}
 /*----------------------------------------------------------------------------*/
 int sb_dsp_release_buffer(sb_dsp_t *dsp, unsigned id)
@@ -220,11 +244,26 @@
 		return ENOENT;
 	sb_clear_buffer(dsp);
-	return EOK;
-}
-/*----------------------------------------------------------------------------*/
-int sb_dsp_start_playback(sb_dsp_t *dsp, unsigned id, unsigned sampling_rate,
-    unsigned sample_size, unsigned channels, bool sign)
-{
-	assert(dsp);
+	if (dsp->event_exchange)
+		async_exchange_end(dsp->event_exchange);
+	dsp->event_exchange = NULL;
+	if (dsp->event_session)
+		async_hangup(dsp->event_session);
+	dsp->event_session = NULL;
+	return EOK;
+}
+/*----------------------------------------------------------------------------*/
+int sb_dsp_start_playback(sb_dsp_t *dsp, unsigned id, unsigned parts,
+    unsigned sampling_rate, unsigned sample_size, unsigned channels, bool sign)
+{
+	assert(dsp);
+
+	if (!dsp->event_session)
+		return EINVAL;
+
+	/* Play block size must be even number (we use DMA 16)*/
+	if (dsp->buffer.size % (parts * 2))
+		return EINVAL;
+
+	const unsigned play_block_size = dsp->buffer.size / parts;
 
 	/* Check supported parameters */
@@ -241,4 +280,7 @@
 		return ENOTSUP;
 
+	dsp->event_exchange = async_exchange_begin(dsp->event_session);
+	if (!dsp->event_exchange)
+		return ENOMEM;
 
 	sb_dsp_write(dsp, SET_SAMPLING_RATE_OUTPUT);
@@ -259,10 +301,9 @@
 	sb_dsp_write(dsp, dsp->playing.mode);
 
-	dsp->playing.samples = sample_count(sample_size, PLAY_BLOCK_SIZE);
+	dsp->playing.samples = sample_count(sample_size, play_block_size);
 	sb_dsp_write(dsp, (dsp->playing.samples - 1) & 0xff);
 	sb_dsp_write(dsp, (dsp->playing.samples - 1) >> 8);
 
 	return EOK;
-	return ENOTSUP;
 }
 /*----------------------------------------------------------------------------*/
@@ -272,4 +313,5 @@
 	if (id != BUFFER_ID)
 		return ENOENT;
+	async_exchange_end(dsp->event_exchange);
 	sb_dsp_write(dsp, DMA_16B_EXIT);
 	return EOK;
Index: uspace/drv/audio/sb16/dsp.h
===================================================================
--- uspace/drv/audio/sb16/dsp.h	(revision 8de7ef2b8768207ef306d5f2dc1927616c8f7ea6)
+++ uspace/drv/audio/sb16/dsp.h	(revision 7ca22e58d9062449bf04d2af23af0921ce45b622)
@@ -57,4 +57,6 @@
 		uint16_t samples;
 	} playing;
+	async_sess_t *event_session;
+	async_exch_t *event_exchange;
 	ddf_dev_t *sb_dev;
 } sb_dsp_t;
@@ -65,7 +67,8 @@
 
 int sb_dsp_get_buffer(sb_dsp_t *dsp, void **buffer, size_t *size, unsigned *id);
+int sb_dsp_set_event_session(sb_dsp_t *dsp, unsigned id, async_sess_t *session);
 int sb_dsp_release_buffer(sb_dsp_t *dsp, unsigned id);
-int sb_dsp_start_playback(sb_dsp_t *dsp, unsigned id, unsigned sample_rate,
-    unsigned sample_size, unsigned channels, bool sign);
+int sb_dsp_start_playback(sb_dsp_t *dsp, unsigned id, unsigned parts,
+    unsigned sample_rate, unsigned sample_size, unsigned channels, bool sign);
 int sb_dsp_stop_playback(sb_dsp_t *dsp, unsigned id);
 int sb_dsp_start_record(sb_dsp_t *dsp, unsigned id, unsigned sample_rate,
Index: uspace/drv/audio/sb16/pcm_iface.c
===================================================================
--- uspace/drv/audio/sb16/pcm_iface.c	(revision 8de7ef2b8768207ef306d5f2dc1927616c8f7ea6)
+++ uspace/drv/audio/sb16/pcm_iface.c	(revision 7ca22e58d9062449bf04d2af23af0921ce45b622)
@@ -33,4 +33,5 @@
  */
 
+#include <async.h>
 #include <errno.h>
 #include <audio_pcm_buffer_iface.h>
@@ -53,4 +54,11 @@
 	return sb_dsp_get_buffer(dsp, buffer, size, id);
 }
+static int sb_set_event_session(ddf_fun_t *fun, unsigned id, async_sess_t *sess)
+{
+	assert(fun);
+	assert(fun->driver_data);
+	sb_dsp_t *dsp = fun->driver_data;
+	return sb_dsp_set_event_session(dsp, id, sess);
+}
 /*----------------------------------------------------------------------------*/
 static int sb_release_buffer(ddf_fun_t *fun, unsigned id)
@@ -62,5 +70,5 @@
 }
 /*----------------------------------------------------------------------------*/
-static int sb_start_playback(ddf_fun_t *fun, unsigned id,
+static int sb_start_playback(ddf_fun_t *fun, unsigned id, unsigned parts,
     unsigned sample_rate, unsigned sample_size, unsigned channels, bool sign)
 {
@@ -69,5 +77,5 @@
 	sb_dsp_t *dsp = fun->driver_data;
 	return sb_dsp_start_playback(
-	    dsp, id, sample_rate, sample_size, channels, sign);
+	    dsp, id, parts, sample_rate, sample_size, channels, sign);
 }
 /*----------------------------------------------------------------------------*/
@@ -104,4 +112,5 @@
 	.get_buffer = sb_get_buffer,
 	.release_buffer = sb_release_buffer,
+	.set_event_session = sb_set_event_session,
 
 	.start_playback = sb_start_playback,
