Index: uspace/app/dplay/dplay.c
===================================================================
--- uspace/app/dplay/dplay.c	(revision 94694a4d5c22308da28bb67be20435720a8ad2b0)
+++ uspace/app/dplay/dplay.c	(revision 346643c2f57ffde73d6cc28deeda63ae2db724b7)
@@ -112,12 +112,12 @@
 
 
-static void play(playback_t *pb, unsigned sampling_rate, unsigned sample_size,
-    unsigned channels, bool sign)
+static void play(playback_t *pb, unsigned channels,  unsigned sampling_rate,
+    pcm_sample_format_t format)
 {
 	assert(pb);
 	assert(pb->device);
 	pb->buffer.position = pb->buffer.base;
-	printf("Playing: %dHz, %d-bit %ssigned samples, %d channel(s).\n",
-	    sampling_rate, sample_size, sign ? "": "un", channels);
+	printf("Playing: %dHz, %s, %d channel(s).\n",
+	    sampling_rate, pcm_sample_format_str(format), channels);
 	const size_t bytes = fread(pb->buffer.base, sizeof(uint8_t),
 	    pb->buffer.size, pb->source);
@@ -127,5 +127,5 @@
 	fibril_mutex_lock(&pb->mutex);
 	int ret = audio_pcm_start_playback(pb->device, pb->buffer.id,
-	    SUBBUFFERS, sampling_rate, sample_size, channels, sign);
+	    SUBBUFFERS, channels, sampling_rate, format);
 	if (ret != EOK) {
 		fibril_mutex_unlock(&pb->mutex);
@@ -212,9 +212,9 @@
 	wave_header_t header;
 	fread(&header, sizeof(header), 1, pb.source);
-	unsigned rate, sample_size, channels;
-	bool sign;
+	unsigned rate, channels;
+	pcm_sample_format_t format;
 	const char *error;
-	ret = wav_parse_header(&header, NULL, NULL, &rate, &sample_size,
-	    &channels, &sign, &error);
+	ret = wav_parse_header(&header, NULL, NULL, &channels, &rate, &format,
+	    &error);
 	if (ret != EOK) {
 		printf("Error parsing wav header: %s.\n", error);
@@ -223,5 +223,5 @@
 	}
 
-	play(&pb, rate, sample_size, channels, sign);
+	play(&pb, channels, rate, format);
 	fclose(pb.source);
 
Index: uspace/app/dplay/wave.c
===================================================================
--- uspace/app/dplay/wave.c	(revision 94694a4d5c22308da28bb67be20435720a8ad2b0)
+++ uspace/app/dplay/wave.c	(revision 346643c2f57ffde73d6cc28deeda63ae2db724b7)
@@ -40,6 +40,6 @@
 
 int wav_parse_header(void *file, const void **data, size_t *data_size,
-    unsigned *sampling_rate, unsigned *sample_size, unsigned *channels,
-    bool *sign, const char **error)
+    unsigned *channels, unsigned *sampling_rate, pcm_sample_format_t *format,
+    const char **error)
 {
 	if (!file) {
@@ -86,4 +86,5 @@
 	}
 
+
 	if (data)
 		*data = header->data;
@@ -93,11 +94,18 @@
 	if (sampling_rate)
 		*sampling_rate = uint32_t_le2host(header->sampling_rate);
-	if (sample_size)
-		*sample_size = uint32_t_le2host(header->sample_size);
 	if (channels)
 		*channels = uint16_t_le2host(header->channels);
-	if (sign)
-		*sign = uint32_t_le2host(header->sample_size) == 16
-		    ? true : false;
+	if (format) {
+		const unsigned size = uint32_t_le2host(header->sample_size);
+		switch (size) {
+		case 8: *format = PCM_SAMPLE_UINT8; break;
+		case 16: *format = PCM_SAMPLE_SINT16_LE; break;
+		case 24: *format = PCM_SAMPLE_SINT24_LE; break;
+		case 32: *format = PCM_SAMPLE_SINT32_LE; break;
+		default:
+			*error = "Unknown format";
+			return ENOTSUP;
+		}
+	}
 	if (error)
 		*error = "no error";
Index: uspace/app/dplay/wave.h
===================================================================
--- uspace/app/dplay/wave.h	(revision 94694a4d5c22308da28bb67be20435720a8ad2b0)
+++ uspace/app/dplay/wave.h	(revision 346643c2f57ffde73d6cc28deeda63ae2db724b7)
@@ -37,4 +37,5 @@
 #include <stdint.h>
 #include <bool.h>
+#include <pcm_sample_format.h>
 
 /** Wave file header format.
@@ -90,5 +91,5 @@
 
 int wav_parse_header(void *, const void**, size_t *, unsigned *, unsigned *,
-    unsigned *, bool *, const char **error_str);
+    pcm_sample_format_t *, const char **);
 
 #endif
Index: uspace/app/drec/drec.c
===================================================================
--- uspace/app/drec/drec.c	(revision 94694a4d5c22308da28bb67be20435720a8ad2b0)
+++ uspace/app/drec/drec.c	(revision 346643c2f57ffde73d6cc28deeda63ae2db724b7)
@@ -47,4 +47,5 @@
 #include <stdio.h>
 #include <macros.h>
+#include <pcm_sample_format.h>
 
 #include "wave.h"
@@ -53,6 +54,6 @@
 #define SUBBUFFERS 2
 
-const unsigned sampling_rate = 44100, sample_size = 16, channels = 2;
-bool sign = true;
+const unsigned sampling_rate = 44100, channels = 2, sample_size = 16;
+const pcm_sample_format_t format = PCM_SAMPLE_SINT16_LE;
 
 typedef struct {
@@ -104,14 +105,14 @@
 
 
-static void record(record_t *rec, unsigned sampling_rate, unsigned sample_size,
-    unsigned channels, bool sign)
+static void record(record_t *rec, unsigned channels, unsigned sampling_rate,
+    pcm_sample_format_t format)
 {
 	assert(rec);
 	assert(rec->device);
 	rec->buffer.position = rec->buffer.base;
-	printf("Recording: %dHz, %d-bit %ssigned samples, %d channel(s).\n",
-	    sampling_rate, sample_size, sign ? "": "un", channels);
+	printf("Recording: %dHz, %s, %d channel(s).\n",
+	    sampling_rate, pcm_sample_format_str(format), channels);
 	int ret = audio_pcm_start_record(rec->device, rec->buffer.id,
-	    SUBBUFFERS, sampling_rate, sample_size, channels, sign);
+	    SUBBUFFERS, channels, sampling_rate, format);
 	if (ret != EOK) {
 		printf("Failed to start recording: %s.\n", str_error(ret));
@@ -201,10 +202,10 @@
 		.sampling_rate = sampling_rate,
 		.sample_size = sample_size,
-		.byte_rate = (sampling_rate / 8) * channels,
-		.block_align = (sampling_rate / 8) * channels,
+		.byte_rate = sampling_rate * (sample_size / 8) * channels,
+		.block_align = (sample_size / 8) * channels,
 		.subchunk2_id = SUBCHUNK2_ID,
 	};
 	fwrite(&header, sizeof(header), 1, rec.file);
-	record(&rec, sampling_rate, sample_size, channels, sign);
+	record(&rec, sampling_rate, channels, format);
 	fclose(rec.file);
 
Index: uspace/app/drec/wave.c
===================================================================
--- uspace/app/drec/wave.c	(revision 94694a4d5c22308da28bb67be20435720a8ad2b0)
+++ uspace/app/drec/wave.c	(revision 346643c2f57ffde73d6cc28deeda63ae2db724b7)
@@ -40,6 +40,6 @@
 
 int wav_parse_header(void *file, const void **data, size_t *data_size,
-    unsigned *sampling_rate, unsigned *sample_size, unsigned *channels,
-    bool *sign, const char **error)
+    unsigned *channels, unsigned *sampling_rate, pcm_sample_format_t *format,
+    const char **error)
 {
 	if (!file) {
@@ -86,4 +86,5 @@
 	}
 
+
 	if (data)
 		*data = header->data;
@@ -93,11 +94,18 @@
 	if (sampling_rate)
 		*sampling_rate = uint32_t_le2host(header->sampling_rate);
-	if (sample_size)
-		*sample_size = uint32_t_le2host(header->sample_size);
 	if (channels)
 		*channels = uint16_t_le2host(header->channels);
-	if (sign)
-		*sign = uint32_t_le2host(header->sample_size) == 16
-		    ? true : false;
+	if (format) {
+		const unsigned size = uint32_t_le2host(header->sample_size);
+		switch (size) {
+		case 8: *format = PCM_SAMPLE_UINT8; break;
+		case 16: *format = PCM_SAMPLE_SINT16_LE; break;
+		case 24: *format = PCM_SAMPLE_SINT24_LE; break;
+		case 32: *format = PCM_SAMPLE_SINT32_LE; break;
+		default:
+			*error = "Unknown format";
+			return ENOTSUP;
+		}
+	}
 	if (error)
 		*error = "no error";
Index: uspace/app/drec/wave.h
===================================================================
--- uspace/app/drec/wave.h	(revision 94694a4d5c22308da28bb67be20435720a8ad2b0)
+++ uspace/app/drec/wave.h	(revision 346643c2f57ffde73d6cc28deeda63ae2db724b7)
@@ -37,4 +37,5 @@
 #include <stdint.h>
 #include <bool.h>
+#include <pcm_sample_format.h>
 
 /** Wave file header format.
@@ -90,5 +91,5 @@
 
 int wav_parse_header(void *, const void**, size_t *, unsigned *, unsigned *,
-    unsigned *, bool *, const char **error_str);
+    pcm_sample_format_t *, const char **);
 
 #endif
Index: uspace/drv/audio/sb16/dsp.c
===================================================================
--- uspace/drv/audio/sb16/dsp.c	(revision 94694a4d5c22308da28bb67be20435720a8ad2b0)
+++ uspace/drv/audio/sb16/dsp.c	(revision 346643c2f57ffde73d6cc28deeda63ae2db724b7)
@@ -147,10 +147,7 @@
 }
 
-static inline size_t sample_count(unsigned sample_size, size_t byte_count)
-{
-	if (sample_size == 16) {
-		return byte_count / 2;
-	}
-	return byte_count;
+static inline size_t sample_count(pcm_sample_format_t format, size_t byte_count)
+{
+	return byte_count / pcm_sample_format_size(format);
 }
 
@@ -261,5 +258,5 @@
 
 int sb_dsp_start_playback(sb_dsp_t *dsp, unsigned id, unsigned parts,
-    unsigned sampling_rate, unsigned sample_size, unsigned channels, bool sign)
+    unsigned channels, unsigned sampling_rate, pcm_sample_format_t format)
 {
 	assert(dsp);
@@ -276,13 +273,14 @@
 	/* Check supported parameters */
 	ddf_log_debug("Requested playback on buffer \"%u\" (%u parts): %uHz, "
-	    "%ssinged %u bit, %u channel(s).", id, parts, sampling_rate,
-	    sign ? "" : "un", sample_size, channels);
-	if (id != BUFFER_ID)
-		return ENOENT;
-	if (sample_size != 16) // FIXME We only support 16 bit playback
-		return ENOTSUP;
+	    "%s, %u channel(s).", id, parts, sampling_rate,
+	    pcm_sample_format_str(format), channels);
+	if (id != BUFFER_ID)
+		return ENOENT;
 	if (channels != 1 && channels != 2)
 		return ENOTSUP;
 	if (sampling_rate > 44100)
+		return ENOTSUP;
+	// FIXME We only support 16 bit playback
+	if (format != PCM_SAMPLE_UINT16_LE && format != PCM_SAMPLE_SINT16_LE)
 		return ENOTSUP;
 
@@ -291,9 +289,11 @@
 		return ENOMEM;
 
+	const bool sign = (format == PCM_SAMPLE_SINT16_LE);
+
 	sb_dsp_write(dsp, SET_SAMPLING_RATE_OUTPUT);
 	sb_dsp_write(dsp, sampling_rate >> 8);
 	sb_dsp_write(dsp, sampling_rate & 0xff);
 
-	ddf_log_verbose("Sampling rate: %hhx:%hhx.",
+	ddf_log_verbose("Sample rate: %hhx:%hhx.",
 	    sampling_rate >> 8, sampling_rate & 0xff);
 
@@ -308,5 +308,5 @@
 	sb_dsp_write(dsp, dsp->active.mode);
 
-	dsp->active.samples = sample_count(sample_size, play_block_size);
+	dsp->active.samples = sample_count(format, play_block_size);
 	sb_dsp_write(dsp, (dsp->active.samples - 1) & 0xff);
 	sb_dsp_write(dsp, (dsp->active.samples - 1) >> 8);
@@ -314,5 +314,5 @@
 	ddf_log_verbose("Playback started, interrupt every %u samples "
 	    "(~1/%u sec)", dsp->active.samples,
-	    sampling_rate / dsp->active.samples);
+	    sampling_rate / (dsp->active.samples * channels));
 
 	dsp->active.playing = true;
@@ -332,5 +332,5 @@
 
 int sb_dsp_start_record(sb_dsp_t *dsp, unsigned id, unsigned parts,
-    unsigned sampling_rate, unsigned sample_size, unsigned channels, bool sign)
+    unsigned channels, unsigned sampling_rate, pcm_sample_format_t format)
 {
 	assert(dsp);
@@ -347,13 +347,14 @@
 	/* Check supported parameters */
 	ddf_log_debug("Requested recording on buffer \"%u\" (%u parts): %uHz, "
-	    "%ssinged %u bit, %u channel(s).", id, parts, sampling_rate,
-	    sign ? "" : "un", sample_size, channels);
-	if (id != BUFFER_ID)
-		return ENOENT;
-	if (sample_size != 16) // FIXME We only support 16 bit playback
-		return ENOTSUP;
+	    "%s, %u channel(s).", id, parts, sampling_rate,
+	    pcm_sample_format_str(format), channels);
+	if (id != BUFFER_ID)
+		return ENOENT;
 	if (channels != 1 && channels != 2)
 		return ENOTSUP;
 	if (sampling_rate > 44100)
+		return ENOTSUP;
+	// FIXME We only support 16 bit recording
+	if (format != PCM_SAMPLE_UINT16_LE && format != PCM_SAMPLE_SINT16_LE)
 		return ENOTSUP;
 
@@ -361,4 +362,6 @@
 	if (!dsp->event_exchange)
 		return ENOMEM;
+
+	const bool sign = (format == PCM_SAMPLE_SINT16_LE);
 
 	sb_dsp_write(dsp, SET_SAMPLING_RATE_OUTPUT);
@@ -379,5 +382,5 @@
 	sb_dsp_write(dsp, dsp->active.mode);
 
-	dsp->active.samples = sample_count(sample_size, play_block_size);
+	dsp->active.samples = sample_count(format, play_block_size);
 	sb_dsp_write(dsp, (dsp->active.samples - 1) & 0xff);
 	sb_dsp_write(dsp, (dsp->active.samples - 1) >> 8);
@@ -385,5 +388,5 @@
 	ddf_log_verbose("Recording started started, interrupt every %u samples "
 	    "(~1/%u sec)", dsp->active.samples,
-	    sampling_rate / dsp->active.samples);
+	    sampling_rate / (dsp->active.samples * channels));
 	dsp->active.playing = false;
 
Index: uspace/drv/audio/sb16/dsp.h
===================================================================
--- uspace/drv/audio/sb16/dsp.h	(revision 94694a4d5c22308da28bb67be20435720a8ad2b0)
+++ uspace/drv/audio/sb16/dsp.h	(revision 346643c2f57ffde73d6cc28deeda63ae2db724b7)
@@ -38,4 +38,5 @@
 #include <libarch/ddi.h>
 #include <errno.h>
+#include <pcm_sample_format.h>
 
 #include "registers.h"
@@ -71,8 +72,8 @@
 int sb_dsp_release_buffer(sb_dsp_t *dsp, unsigned id);
 int sb_dsp_start_playback(sb_dsp_t *dsp, unsigned id, unsigned parts,
-    unsigned sample_rate, unsigned sample_size, unsigned channels, bool sign);
+    unsigned channels, unsigned sample_rate, pcm_sample_format_t format);
 int sb_dsp_stop_playback(sb_dsp_t *dsp, unsigned id);
 int sb_dsp_start_record(sb_dsp_t *dsp, unsigned id, unsigned parts,
-    unsigned sample_rate, unsigned sample_size, unsigned channels, bool sign);
+    unsigned channels, unsigned sample_rate, pcm_sample_format_t format);
 int sb_dsp_stop_record(sb_dsp_t *dsp, unsigned id);
 
Index: uspace/drv/audio/sb16/pcm_iface.c
===================================================================
--- uspace/drv/audio/sb16/pcm_iface.c	(revision 94694a4d5c22308da28bb67be20435720a8ad2b0)
+++ uspace/drv/audio/sb16/pcm_iface.c	(revision 346643c2f57ffde73d6cc28deeda63ae2db724b7)
@@ -36,4 +36,5 @@
 #include <errno.h>
 #include <audio_pcm_iface.h>
+#include <pcm_sample_format.h>
 
 #include "dsp.h"
@@ -71,5 +72,5 @@
 
 static int sb_start_playback(ddf_fun_t *fun, unsigned id, unsigned parts,
-    unsigned sample_rate, unsigned sample_size, unsigned channels, bool sign)
+    unsigned channels, unsigned sample_rate, pcm_sample_format_t format)
 {
 	assert(fun);
@@ -77,5 +78,5 @@
 	sb_dsp_t *dsp = fun->driver_data;
 	return sb_dsp_start_playback(
-	    dsp, id, parts, sample_rate, sample_size, channels, sign);
+	    dsp, id, parts, channels, sample_rate, format);
 }
 
@@ -89,5 +90,5 @@
 
 static int sb_start_record(ddf_fun_t *fun, unsigned id, unsigned parts,
-    unsigned sample_rate, unsigned sample_size, unsigned channels, bool sign)
+    unsigned channels, unsigned sample_rate, pcm_sample_format_t format)
 {
 	assert(fun);
@@ -95,5 +96,5 @@
 	sb_dsp_t *dsp = fun->driver_data;
 	return sb_dsp_start_record(
-	    dsp, id, parts, sample_rate, sample_size, channels, sign);
+	    dsp, id, parts, channels, sample_rate, format);
 }
 
Index: uspace/lib/c/include/pcm_sample_format.h
===================================================================
--- uspace/lib/c/include/pcm_sample_format.h	(revision 346643c2f57ffde73d6cc28deeda63ae2db724b7)
+++ uspace/lib/c/include/pcm_sample_format.h	(revision 346643c2f57ffde73d6cc28deeda63ae2db724b7)
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2012 Jan Vesely
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup audio
+ * @brief PCM sample format
+ * @{
+ */
+/** @file
+ */
+
+#ifndef PCM_SAMPLE_FORMAT_H_
+#define PCM_SAMPLE_FORMAT_H_
+
+typedef enum {
+	PCM_SAMPLE_UINT8,
+	PCM_SAMPLE_SINT8,
+	PCM_SAMPLE_UINT16_LE,
+	PCM_SAMPLE_UINT16_BE,
+	PCM_SAMPLE_SINT16_LE,
+	PCM_SAMPLE_SINT16_BE,
+	PCM_SAMPLE_UINT24_LE,
+	PCM_SAMPLE_UINT24_BE,
+	PCM_SAMPLE_SINT24_LE,
+	PCM_SAMPLE_SINT24_BE,
+	PCM_SAMPLE_UINT24_32_LE,
+	PCM_SAMPLE_UINT24_32_BE,
+	PCM_SAMPLE_SINT24_32_LE,
+	PCM_SAMPLE_SINT24_32_BE,
+	PCM_SAMPLE_UINT32_LE,
+	PCM_SAMPLE_UINT32_BE,
+	PCM_SAMPLE_SINT32_LE,
+	PCM_SAMPLE_SINT32_BE,
+	PCM_SAMPLE_FLOAT32,
+} pcm_sample_format_t;
+
+static inline size_t pcm_sample_format_size(pcm_sample_format_t format)
+{
+	switch(format) {
+		case PCM_SAMPLE_UINT8:
+		case PCM_SAMPLE_SINT8:
+			return 1;
+		case PCM_SAMPLE_UINT16_LE:
+		case PCM_SAMPLE_UINT16_BE:
+		case PCM_SAMPLE_SINT16_LE:
+		case PCM_SAMPLE_SINT16_BE:
+			return 2;
+		case PCM_SAMPLE_UINT24_LE:
+		case PCM_SAMPLE_UINT24_BE:
+		case PCM_SAMPLE_SINT24_LE:
+		case PCM_SAMPLE_SINT24_BE:
+			return 3;
+		case PCM_SAMPLE_UINT24_32_LE:
+		case PCM_SAMPLE_UINT24_32_BE:
+		case PCM_SAMPLE_SINT24_32_LE:
+		case PCM_SAMPLE_SINT24_32_BE:
+		case PCM_SAMPLE_UINT32_LE:
+		case PCM_SAMPLE_UINT32_BE:
+		case PCM_SAMPLE_SINT32_LE:
+		case PCM_SAMPLE_SINT32_BE:
+		case PCM_SAMPLE_FLOAT32:
+			return 4;
+		default:
+			return 0;
+	}
+}
+
+static inline const char * pcm_sample_format_str(pcm_sample_format_t format)
+{
+	switch(format) {
+		case PCM_SAMPLE_UINT8:
+			return "8 bit unsinged";
+		case PCM_SAMPLE_SINT8:
+			return "8 bit singed";
+		case PCM_SAMPLE_UINT16_LE:
+			return "16 bit unsigned(LE)";
+		case PCM_SAMPLE_SINT16_LE:
+			return "16 bit singed(LE)";
+		case PCM_SAMPLE_UINT16_BE:
+			return "16 bit unsigned(BE)";
+		case PCM_SAMPLE_SINT16_BE:
+			return "16 bit signed(BE)";
+		case PCM_SAMPLE_UINT24_LE:
+			return "24 bit unsigned(LE)";
+		case PCM_SAMPLE_SINT24_LE:
+			return "24 bit signed(LE)";
+		case PCM_SAMPLE_UINT24_BE:
+			return "24 bit unsigned(BE)";
+		case PCM_SAMPLE_SINT24_BE:
+			return "24 bit signed(BE)";
+		case PCM_SAMPLE_UINT24_32_LE:
+			return "24 bit(4byte aligned) unsigned(LE)";
+		case PCM_SAMPLE_UINT24_32_BE:
+			return "24 bit(4byte aligned) unsigned(BE)";
+		case PCM_SAMPLE_SINT24_32_LE:
+			return "24 bit(4byte aligned) signed(LE)";
+		case PCM_SAMPLE_SINT24_32_BE:
+			return "24 bit(4byte aligned) signed(BE)";
+		case PCM_SAMPLE_UINT32_LE:
+			return "32 bit unsigned(LE)";
+		case PCM_SAMPLE_UINT32_BE:
+			return "32 bit unsigned(BE)";
+		case PCM_SAMPLE_SINT32_LE:
+			return "32 bit signed(LE)";
+		case PCM_SAMPLE_SINT32_BE:
+			return "32 bit signed(BE)";
+		case PCM_SAMPLE_FLOAT32:
+			return "32 bit float";
+		default:
+			return "Unknown sample format";
+	}
+}
+
+#endif
+
+/**
+ * @}
+ */
+
Index: uspace/lib/drv/generic/remote_audio_pcm.c
===================================================================
--- uspace/lib/drv/generic/remote_audio_pcm.c	(revision 94694a4d5c22308da28bb67be20435720a8ad2b0)
+++ 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 94694a4d5c22308da28bb67be20435720a8ad2b0)
+++ 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;
