Index: uspace/lib/drv/generic/remote_audio_pcm.c
===================================================================
--- uspace/lib/drv/generic/remote_audio_pcm.c	(revision 1bebadeef8c0e20e4858c16afc1cb5411a16aeaa)
+++ uspace/lib/drv/generic/remote_audio_pcm.c	(revision 2e01b3f1105b1f5750b3f7d726b038336feb514e)
@@ -45,4 +45,5 @@
 typedef enum {
 	IPC_M_AUDIO_PCM_GET_INFO_STR,
+	IPC_M_AUDIO_PCM_QUERY_CAPS,
 	IPC_M_AUDIO_PCM_TEST_FORMAT,
 	IPC_M_AUDIO_PCM_GET_BUFFER,
@@ -104,4 +105,18 @@
 	}
 	async_exchange_end(exch);
+	return ret;
+}
+
+int audio_pcm_query_cap(audio_pcm_sess_t *sess, audio_cap_t cap, unsigned *val)
+{
+	if (!val)
+		return EINVAL;
+	async_exch_t *exch = async_exchange_begin(sess);
+	sysarg_t value = *val;
+	const int ret = async_req_2_1(exch,
+	    DEV_IFACE_ID(AUDIO_PCM_BUFFER_IFACE), IPC_M_AUDIO_PCM_QUERY_CAPS,
+	    value, &value);
+	if (ret == EOK)
+		*val = value;
 	return ret;
 }
@@ -232,4 +247,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_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 *);
@@ -243,4 +259,5 @@
 static remote_iface_func_ptr_t remote_audio_pcm_iface_ops[] = {
 	[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_TEST_FORMAT] = remote_audio_pcm_test_format,
 	[IPC_M_AUDIO_PCM_GET_BUFFER] = remote_audio_pcm_get_buffer,
@@ -288,5 +305,17 @@
 }
 
-static void remote_audio_pcm_test_format(ddf_fun_t *fun, void *iface, ipc_callid_t callid, ipc_call_t *call)
+void remote_audio_pcm_query_caps(ddf_fun_t *fun, void *iface, ipc_callid_t callid, ipc_call_t *call)
+{
+	const audio_pcm_iface_t *pcm_iface = iface;
+	const audio_cap_t cap = DEV_IPC_GET_ARG1(*call);
+	if (pcm_iface->query_cap) {
+		const unsigned value = pcm_iface->query_cap(fun, cap);
+		async_answer_1(callid, EOK, value);
+	} else {
+		async_answer_0(callid, ENOTSUP);
+	}
+}
+
+void remote_audio_pcm_test_format(ddf_fun_t *fun, void *iface, ipc_callid_t callid, ipc_call_t *call)
 {
 	const audio_pcm_iface_t *pcm_iface = iface;
Index: uspace/lib/drv/include/audio_pcm_iface.h
===================================================================
--- uspace/lib/drv/include/audio_pcm_iface.h	(revision 1bebadeef8c0e20e4858c16afc1cb5411a16aeaa)
+++ uspace/lib/drv/include/audio_pcm_iface.h	(revision 2e01b3f1105b1f5750b3f7d726b038336feb514e)
@@ -44,4 +44,14 @@
 #include "ddf/driver.h"
 
+typedef enum {
+	AUDIO_CAP_RECORD,
+	AUDIO_CAP_PLAYBACK,
+	AUDIO_CAP_MAX_BUFFER,
+	AUDIO_CAP_BUFFER_POS,
+	AUDIO_CAP_INTERRUPT,
+	AUDIO_CAP_INTERRUPT_MIN_FRAMES,
+	AUDIO_CAP_INTERRUPT_MAX_FRAMES,
+} audio_cap_t;
+
 enum {
 	PCM_EVENT_FRAMES_PLAYED = IPC_FIRST_USER_METHOD,
@@ -60,4 +70,5 @@
 int audio_pcm_test_format(audio_pcm_sess_t *, unsigned *, unsigned *,
     pcm_sample_format_t *);
+int audio_pcm_query_cap(audio_pcm_sess_t *, audio_cap_t, unsigned *);
 
 int audio_pcm_get_buffer(audio_pcm_sess_t *, void **, size_t *,
@@ -78,4 +89,5 @@
 	int (*test_format)(ddf_fun_t *, unsigned *, unsigned *,
 	    pcm_sample_format_t *);
+	unsigned (*query_cap)(ddf_fun_t *, audio_cap_t);
 	int (*get_buffer)(ddf_fun_t *, void **, size_t *);
 	int (*release_buffer)(ddf_fun_t *);
