Index: uspace/lib/drv/generic/remote_audio_pcm.c
===================================================================
--- uspace/lib/drv/generic/remote_audio_pcm.c	(revision d86c973619c86de977bf698bcb1ebae602e372ce)
+++ uspace/lib/drv/generic/remote_audio_pcm.c	(revision fa91c0f9439c4e8812fbfb112e834da880e5fd06)
@@ -49,4 +49,5 @@
 	IPC_M_AUDIO_PCM_GET_BUFFER,
 	IPC_M_AUDIO_PCM_RELEASE_BUFFER,
+	IPC_M_AUDIO_PCM_GET_BUFFER_POS,
 	IPC_M_AUDIO_PCM_START_PLAYBACK,
 	IPC_M_AUDIO_PCM_STOP_PLAYBACK,
@@ -113,10 +114,26 @@
 		return EINVAL;
 	async_exch_t *exch = async_exchange_begin(sess);
-	sysarg_t value = *val;
+	sysarg_t value = 0;
 	const int ret = async_req_2_1(exch,
 	    DEV_IFACE_ID(AUDIO_PCM_BUFFER_IFACE), IPC_M_AUDIO_PCM_QUERY_CAPS,
-	    value, &value);
+	    cap, &value);
 	if (ret == EOK)
 		*val = value;
+	async_exchange_end(exch);
+	return ret;
+}
+
+int audio_pcm_get_buffer_pos(audio_pcm_sess_t *sess, size_t *pos)
+{
+	if (!pos)
+		return EINVAL;
+	async_exch_t *exch = async_exchange_begin(sess);
+	sysarg_t value = 0;;
+	const int ret = async_req_1_1(exch,
+	    DEV_IFACE_ID(AUDIO_PCM_BUFFER_IFACE),
+	    IPC_M_AUDIO_PCM_GET_BUFFER_POS, &value);
+	if (ret == EOK)
+		*pos = value;
+	async_exchange_end(exch);
 	return ret;
 }
@@ -248,4 +265,5 @@
 static void remote_audio_pcm_get_info_str(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
 static void remote_audio_pcm_query_caps(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
+static void remote_audio_pcm_get_buffer_pos(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
 static void remote_audio_pcm_test_format(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
 static void remote_audio_pcm_get_buffer(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);
@@ -260,4 +278,5 @@
 	[IPC_M_AUDIO_PCM_GET_INFO_STR] = remote_audio_pcm_get_info_str,
 	[IPC_M_AUDIO_PCM_QUERY_CAPS] = remote_audio_pcm_query_caps,
+	[IPC_M_AUDIO_PCM_GET_BUFFER_POS] = remote_audio_pcm_get_buffer_pos,
 	[IPC_M_AUDIO_PCM_TEST_FORMAT] = remote_audio_pcm_test_format,
 	[IPC_M_AUDIO_PCM_GET_BUFFER] = remote_audio_pcm_get_buffer,
@@ -315,4 +334,12 @@
 		async_answer_0(callid, ENOTSUP);
 	}
+}
+void remote_audio_pcm_get_buffer_pos(ddf_fun_t *fun, void *iface, ipc_callid_t callid, ipc_call_t *call)
+{
+	const audio_pcm_iface_t *pcm_iface = iface;
+	size_t pos = 0;
+	const int ret = pcm_iface->get_buffer_pos ?
+	    pcm_iface->get_buffer_pos(fun, &pos) : ENOTSUP;
+	async_answer_1(callid, ret, pos);
 }
 
Index: uspace/lib/drv/include/audio_pcm_iface.h
===================================================================
--- uspace/lib/drv/include/audio_pcm_iface.h	(revision d86c973619c86de977bf698bcb1ebae602e372ce)
+++ uspace/lib/drv/include/audio_pcm_iface.h	(revision fa91c0f9439c4e8812fbfb112e834da880e5fd06)
@@ -71,4 +71,5 @@
     pcm_sample_format_t *);
 int audio_pcm_query_cap(audio_pcm_sess_t *, audio_cap_t, unsigned *);
+int audio_pcm_get_buffer_pos(audio_pcm_sess_t *, size_t *);
 
 int audio_pcm_get_buffer(audio_pcm_sess_t *, void **, size_t *,
@@ -90,4 +91,5 @@
 	    pcm_sample_format_t *);
 	unsigned (*query_cap)(ddf_fun_t *, audio_cap_t);
+	int (*get_buffer_pos)(ddf_fun_t *, size_t *);
 	int (*get_buffer)(ddf_fun_t *, void **, size_t *);
 	int (*release_buffer)(ddf_fun_t *);
