Index: uspace/drv/audio/sb16/dsp.c
===================================================================
--- uspace/drv/audio/sb16/dsp.c	(revision c17c872c3cfb158cf87a3cb6e2a50ba3482ca0d1)
+++ uspace/drv/audio/sb16/dsp.c	(revision f8608f23cd2eea0f19263eeb1749baea3b62166f)
@@ -113,8 +113,10 @@
 }
 /*----------------------------------------------------------------------------*/
-static inline int sb_setup_buffer(sb_dsp_t *dsp)
-{
-	assert(dsp);
-	uint8_t *buffer = dma_create_buffer24(BUFFER_SIZE);
+static inline int sb_setup_buffer(sb_dsp_t *dsp, size_t size)
+{
+	assert(dsp);
+	if (size > BUFFER_SIZE || size == 0 || (size % 2) == 1)
+		size = BUFFER_SIZE;
+	uint8_t *buffer = dma_create_buffer24(size);
 	if (buffer == NULL) {
 		ddf_log_error("Failed to allocate buffer.\n");
@@ -125,9 +127,9 @@
 	assert(pa < (1 << 25));
 	/* Set 16 bit channel */
-	const int ret = sb_setup_dma(dsp, pa, BUFFER_SIZE);
+	const int ret = sb_setup_dma(dsp, pa, size);
 	if (ret == EOK) {
 		dsp->buffer.data = buffer;
-		dsp->buffer.size = BUFFER_SIZE;
-		bzero(buffer, BUFFER_SIZE);
+		dsp->buffer.size = size;
+		bzero(dsp->buffer.data, dsp->buffer.size);
 	} else {
 		ddf_log_error("Failed to setup DMA16 channel %s.\n",
@@ -197,7 +199,10 @@
 {
 	assert(dsp);
-	const int ret = sb_setup_buffer(dsp);
-	ddf_log_debug("Providing buffer(%u): %p, %zu.\n",
+	assert(size);
+
+	const int ret = sb_setup_buffer(dsp, *size);
+	ddf_log_debug("Providing buffer(%u): %p, %zu B.\n",
 	    BUFFER_ID, dsp->buffer.data, dsp->buffer.size);
+
 	if (ret == EOK && buffer)
 		*buffer = dsp->buffer.data;
