Index: uspace/drv/audio/sb16/dsp.c
===================================================================
--- uspace/drv/audio/sb16/dsp.c	(revision d86c973619c86de977bf698bcb1ebae602e372ce)
+++ uspace/drv/audio/sb16/dsp.c	(revision 86fe9d11bb24da4ce5f5aee7b0de493478065508)
@@ -250,8 +250,10 @@
 unsigned sb_dsp_query_cap(sb_dsp_t *dsp, audio_cap_t cap)
 {
+	ddf_log_verbose("Querying cap %u", cap);
 	switch(cap) {
 	case AUDIO_CAP_CAPTURE:
 	case AUDIO_CAP_PLAYBACK:
 	case AUDIO_CAP_INTERRUPT:
+	case AUDIO_CAP_BUFFER_POS:
 		return 1;
 	case AUDIO_CAP_MAX_BUFFER:
@@ -261,8 +263,25 @@
 	case AUDIO_CAP_INTERRUPT_MAX_FRAMES:
 		return 16535;
-	case AUDIO_CAP_BUFFER_POS:
 	default:
 		return 0;
 	}
+}
+
+int sb_dsp_get_buffer_position(sb_dsp_t *dsp, size_t *pos)
+{
+	if (!dsp->buffer.data)
+		return ENOENT;
+
+	async_sess_t *sess = devman_parent_device_connect(EXCHANGE_ATOMIC,
+	    dsp->sb_dev->handle, IPC_FLAG_BLOCKING);
+
+	// TODO: Assumes DMA 16
+	const int remain = hw_res_dma_channel_remain(sess, dsp->dma16_channel);
+	async_hangup(sess);
+	if (remain >= 0) {
+		*pos = dsp->buffer.size - remain;
+		return EOK;
+	}
+	return remain;
 }
 
Index: uspace/drv/audio/sb16/dsp.h
===================================================================
--- uspace/drv/audio/sb16/dsp.h	(revision d86c973619c86de977bf698bcb1ebae602e372ce)
+++ uspace/drv/audio/sb16/dsp.h	(revision 86fe9d11bb24da4ce5f5aee7b0de493478065508)
@@ -75,4 +75,5 @@
 void sb_dsp_interrupt(sb_dsp_t *dsp);
 unsigned sb_dsp_query_cap(sb_dsp_t *dsp, audio_cap_t cap);
+int sb_dsp_get_buffer_position(sb_dsp_t *dsp, size_t *size);
 int sb_dsp_test_format(sb_dsp_t *dsp, unsigned *channels, unsigned *rate,
   pcm_sample_format_t *format);
Index: uspace/drv/audio/sb16/pcm_iface.c
===================================================================
--- uspace/drv/audio/sb16/pcm_iface.c	(revision d86c973619c86de977bf698bcb1ebae602e372ce)
+++ uspace/drv/audio/sb16/pcm_iface.c	(revision 86fe9d11bb24da4ce5f5aee7b0de493478065508)
@@ -70,4 +70,13 @@
 	return sb_dsp_get_buffer(dsp, buffer, size);
 }
+
+static int sb_get_buffer_position(ddf_fun_t *fun, size_t *size)
+{
+	assert(fun);
+	assert(fun->driver_data);
+	sb_dsp_t *dsp = fun->driver_data;
+	return sb_dsp_get_buffer_position(dsp, size);
+}
+
 static int sb_set_event_session(ddf_fun_t *fun, async_sess_t *sess)
 {
@@ -130,4 +139,5 @@
 	.release_buffer = sb_release_buffer,
 	.set_event_session = sb_set_event_session,
+	.get_buffer_pos = sb_get_buffer_position,
 
 	.start_playback = sb_start_playback,
