Index: uspace/drv/audio/sb16/dsp.c
===================================================================
--- uspace/drv/audio/sb16/dsp.c	(revision 57e8b3ba054d7a008b430e7b6b67994b03197240)
+++ uspace/drv/audio/sb16/dsp.c	(revision a9aae16e62a6d224ed168129b4de751cdac35a49)
@@ -53,4 +53,5 @@
 
 #define DSP_RESET_RESPONSE 0xaa
+#define DSP_RATE_LIMIT 45000
 
 #define AUTO_DMA_MODE
@@ -223,4 +224,25 @@
 }
 
+int sb_dsp_test_format(sb_dsp_t *dsp, unsigned *channels, unsigned *rate,
+  pcm_sample_format_t *format)
+{
+	int ret = EOK;
+	if (*channels == 0 || *channels > 2) {
+		*channels = 2;
+		ret = ELIMIT;
+	}
+	if (*rate > DSP_RATE_LIMIT) {
+		*rate = DSP_RATE_LIMIT;
+		ret = ELIMIT;
+	}
+	//TODO 8bit DMA supports 8bit formats
+	if (*format != PCM_SAMPLE_SINT16_LE && *format != PCM_SAMPLE_UINT16_LE) {
+		*format = pcm_sample_format_is_signed(*format) ?
+		    PCM_SAMPLE_SINT16_LE : PCM_SAMPLE_UINT16_LE;
+		ret = ELIMIT;
+	}
+	return ret;
+}
+
 int sb_dsp_get_buffer(sb_dsp_t *dsp, void **buffer, size_t *size)
 {
@@ -283,5 +305,5 @@
 	if (channels != 1 && channels != 2)
 		return ENOTSUP;
-	if (sampling_rate > 44100)
+	if (sampling_rate > DSP_RATE_LIMIT)
 		return ENOTSUP;
 	// FIXME We only support 16 bit playback
@@ -351,5 +373,5 @@
 	if (channels != 1 && channels != 2)
 		return ENOTSUP;
-	if (sampling_rate > 44100)
+	if (sampling_rate > DSP_RATE_LIMIT)
 		return ENOTSUP;
 	// FIXME We only support 16 bit recording
Index: uspace/drv/audio/sb16/dsp.h
===================================================================
--- uspace/drv/audio/sb16/dsp.h	(revision 57e8b3ba054d7a008b430e7b6b67994b03197240)
+++ uspace/drv/audio/sb16/dsp.h	(revision a9aae16e62a6d224ed168129b4de751cdac35a49)
@@ -73,4 +73,6 @@
 void sb_dsp_interrupt(sb_dsp_t *dsp);
 
+int sb_dsp_test_format(sb_dsp_t *dsp, unsigned *channels, unsigned *rate,
+  pcm_sample_format_t *format);
 int sb_dsp_get_buffer(sb_dsp_t *dsp, void **buffer, size_t *size);
 int sb_dsp_set_event_session(sb_dsp_t *dsp, async_sess_t *session);
Index: uspace/drv/audio/sb16/pcm_iface.c
===================================================================
--- uspace/drv/audio/sb16/pcm_iface.c	(revision 57e8b3ba054d7a008b430e7b6b67994b03197240)
+++ uspace/drv/audio/sb16/pcm_iface.c	(revision a9aae16e62a6d224ed168129b4de751cdac35a49)
@@ -46,5 +46,12 @@
 	return EOK;
 }
-
+static int sb_test_format(ddf_fun_t *fun, unsigned *channels, unsigned *rate,
+    pcm_sample_format_t *format)
+{
+	assert(fun);
+	assert(fun->driver_data);
+	sb_dsp_t *dsp = fun->driver_data;
+	return sb_dsp_test_format(dsp, channels, rate, format);
+}
 static int sb_get_buffer(ddf_fun_t *fun, void **buffer, size_t *size)
 {
@@ -108,4 +115,5 @@
 audio_pcm_iface_t sb_pcm_iface = {
 	.get_info_str = sb_get_info_str,
+	.test_format = sb_test_format,
 
 	.get_buffer = sb_get_buffer,
