Index: uspace/lib/drv/generic/remote_audio_pcm.c
===================================================================
--- uspace/lib/drv/generic/remote_audio_pcm.c	(revision 90f05b0f4f16751a93b3c2f95d3193c4c1955296)
+++ uspace/lib/drv/generic/remote_audio_pcm.c	(revision 346643c2f57ffde73d6cc28deeda63ae2db724b7)
@@ -118,13 +118,14 @@
 }
 
-int audio_pcm_start_playback(async_exch_t *exch, unsigned id,
-    unsigned parts, unsigned sample_rate, uint16_t sample_size,
-    uint8_t channels, bool sign)
+int audio_pcm_start_playback(async_exch_t *exch, unsigned id, unsigned parts,
+    unsigned channels, unsigned sample_rate, pcm_sample_format_t format)
 {
 	if (!exch)
 		return EINVAL;
+	if (parts > UINT8_MAX || channels > UINT8_MAX)
+		return EINVAL;
+	assert((format & UINT16_MAX) == format);
 	const sysarg_t packed =
-	    (sample_size << 16) | (channels << 8) |
-	    ((parts & 0x7f) << 1) | (sign ? 1 : 0);
+	    (parts << 24) | (channels << 16) | (format & UINT16_MAX);
 	return async_req_4_0(exch, DEV_IFACE_ID(AUDIO_PCM_BUFFER_IFACE),
 	    IPC_M_AUDIO_PCM_START_PLAYBACK, id, sample_rate, packed);
@@ -139,13 +140,14 @@
 }
 
-int audio_pcm_start_record(async_exch_t *exch, unsigned id,
-    unsigned parts, unsigned sample_rate, uint16_t sample_size,
-    uint8_t channels, bool sign)
+int audio_pcm_start_record(async_exch_t *exch, unsigned id, unsigned parts,
+    unsigned channels, unsigned sample_rate, pcm_sample_format_t format)
 {
 	if (!exch)
 		return EINVAL;
-	sysarg_t packed =
-	    (sample_size << 16) | (channels << 8) |
-	    ((parts & 0x7f) << 1) | (sign ? 1 : 0);
+	if (parts > UINT8_MAX || channels > UINT8_MAX)
+		return EINVAL;
+	assert((format & UINT16_MAX) == format);
+	const sysarg_t packed =
+	    (parts << 24) | (channels << 16) | (format & UINT16_MAX);
 	return async_req_4_0(exch, DEV_IFACE_ID(AUDIO_PCM_BUFFER_IFACE),
 	    IPC_M_AUDIO_PCM_START_RECORD, id, sample_rate, packed);
@@ -309,11 +311,10 @@
 	const unsigned id = DEV_IPC_GET_ARG1(*call);
 	const unsigned rate = DEV_IPC_GET_ARG2(*call);
-	const unsigned size = DEV_IPC_GET_ARG3(*call) >> 16;
-	const unsigned channels = (DEV_IPC_GET_ARG3(*call) >> 8) & UINT8_MAX;
-	const unsigned parts = (DEV_IPC_GET_ARG3(*call) >> 1) & 0x7f;
-	const bool sign = (bool)(DEV_IPC_GET_ARG3(*call) & 1);
+	const unsigned parts = (DEV_IPC_GET_ARG3(*call) >> 24) & UINT8_MAX;
+	const unsigned channels = (DEV_IPC_GET_ARG3(*call) >> 16) & UINT8_MAX;
+	const pcm_sample_format_t format =DEV_IPC_GET_ARG3(*call) & UINT16_MAX;
 
 	const int ret = pcm_iface->start_playback
-	    ? pcm_iface->start_playback(fun, id, parts, rate, size, channels, sign)
+	    ? pcm_iface->start_playback(fun, id, parts, channels, rate, format)
 	    : ENOTSUP;
 	async_answer_0(callid, ret);
@@ -338,11 +339,10 @@
 	const unsigned id = DEV_IPC_GET_ARG1(*call);
 	const unsigned rate = DEV_IPC_GET_ARG2(*call);
-	const unsigned size = DEV_IPC_GET_ARG3(*call) >> 16;
-	const unsigned channels = (DEV_IPC_GET_ARG3(*call) >> 8) & UINT8_MAX;
-	const unsigned parts = (DEV_IPC_GET_ARG3(*call) >> 1) & 0x7f;
-	const bool sign = (bool)(DEV_IPC_GET_ARG3(*call) & 1);
+	const unsigned parts = (DEV_IPC_GET_ARG3(*call) >> 24) & UINT8_MAX;
+	const unsigned channels = (DEV_IPC_GET_ARG3(*call) >> 16) & UINT8_MAX;
+	const pcm_sample_format_t format =DEV_IPC_GET_ARG3(*call) & UINT16_MAX;
 
 	const int ret = pcm_iface->start_record
-	    ? pcm_iface->start_record(fun, id, parts, rate, size, channels, sign)
+	    ? pcm_iface->start_record(fun, id, parts, channels, rate, format)
 	    : ENOTSUP;
 	async_answer_0(callid, ret);
Index: uspace/lib/drv/include/audio_pcm_iface.h
===================================================================
--- uspace/lib/drv/include/audio_pcm_iface.h	(revision 90f05b0f4f16751a93b3c2f95d3193c4c1955296)
+++ uspace/lib/drv/include/audio_pcm_iface.h	(revision 346643c2f57ffde73d6cc28deeda63ae2db724b7)
@@ -39,4 +39,5 @@
 #include <async.h>
 #include <bool.h>
+#include <pcm_sample_format.h>
 
 #include "ddf/driver.h"
@@ -48,9 +49,9 @@
 
 int audio_pcm_start_playback(async_exch_t *, unsigned, unsigned,
-    unsigned, uint16_t, uint8_t, bool);
+    unsigned, unsigned, pcm_sample_format_t);
 int audio_pcm_stop_playback(async_exch_t *, unsigned);
 
 int audio_pcm_start_record(async_exch_t *, unsigned, unsigned,
-    unsigned, uint16_t, uint8_t, bool);
+    unsigned, unsigned, pcm_sample_format_t);
 int audio_pcm_stop_record(async_exch_t *, unsigned);
 
@@ -62,8 +63,8 @@
 	int (*set_event_session)(ddf_fun_t *, unsigned, async_sess_t *);
 	int (*start_playback)(ddf_fun_t *, unsigned, unsigned,
-	    unsigned, unsigned, unsigned, bool);
+	    unsigned, unsigned, pcm_sample_format_t);
 	int (*stop_playback)(ddf_fun_t *, unsigned);
 	int (*start_record)(ddf_fun_t *, unsigned, unsigned,
-	    unsigned, unsigned, unsigned, bool);
+	    unsigned, unsigned, pcm_sample_format_t);
 	int (*stop_record)(ddf_fun_t *, unsigned);
 } audio_pcm_iface_t;
