Index: uspace/drv/audio/sb16/dma_controller.c
===================================================================
--- uspace/drv/audio/sb16/dma_controller.c	(revision 1a11a162969d2ad22002439acd730f5f0a13bb55)
+++ uspace/drv/audio/sb16/dma_controller.c	(revision 01aef433be110c7c4b48d9a9d423c5c9c58eba91)
@@ -151,5 +151,5 @@
 
 typedef struct dma_controller {
-	dma_channel_t channel[8];
+	dma_channel_t channels[8];
 	dma_page_regs_t *page_table;
 	dma_controller_regs_first_t *first;
@@ -157,6 +157,6 @@
 } dma_controller_t;
 
-static const dma_controller_t controller_8237 = {
-	.channel = {
+static dma_controller_t controller_8237 = {
+	.channels = {
 	    { (uint8_t*)0x00, (uint8_t*)0x01, (uint8_t*)0x87 },
 	    { (uint8_t*)0x02, (uint8_t*)0x03, (uint8_t*)0x83 },
@@ -209,13 +209,13 @@
 	/* Low byte */
 	value = pa & 0xff;
-	pio_write_8(controller->channel[channel].offset_reg_address, value);
+	pio_write_8(controller->channels[channel].offset_reg_address, value);
 
 	/* High byte */
 	value = (pa >> 8) & 0xff;
-	pio_write_8(controller->channel[channel].offset_reg_address, value);
+	pio_write_8(controller->channels[channel].offset_reg_address, value);
 
 	/* Page address - third byte */
 	value = (pa >> 16) & 0xff;
-	pio_write_8(controller->channel[channel].offset_reg_address, value);
+	pio_write_8(controller->channels[channel].offset_reg_address, value);
 
 	/* Set size -- reset flip-flop */
@@ -224,9 +224,9 @@
 	/* Low byte */
 	value = size & 0xff;
-	pio_write_8(controller->channel[channel].offset_reg_address, value);
+	pio_write_8(controller->channels[channel].offset_reg_address, value);
 
 	/* High byte */
 	value = (size >> 8) & 0xff;
-	pio_write_8(controller->channel[channel].offset_reg_address, value);
+	pio_write_8(controller->channels[channel].offset_reg_address, value);
 
 	/* Unmask DMA request */
@@ -253,13 +253,13 @@
 	/* Low byte */
 	value = pa & 0xff;
-	pio_write_8(controller->channel[channel].offset_reg_address, value);
+	pio_write_8(controller->channels[channel].offset_reg_address, value);
 
 	/* High byte */
 	value = (pa >> 8) & 0xff;
-	pio_write_8(controller->channel[channel].offset_reg_address, value);
+	pio_write_8(controller->channels[channel].offset_reg_address, value);
 
 	/* Page address - third byte */
 	value = (pa >> 16) & 0xff;
-	pio_write_8(controller->channel[channel].offset_reg_address, value);
+	pio_write_8(controller->channels[channel].offset_reg_address, value);
 
 	/* Set size -- reset flip-flop */
@@ -268,9 +268,9 @@
 	/* Low byte */
 	value = size & 0xff;
-	pio_write_8(controller->channel[channel].offset_reg_address, value);
+	pio_write_8(controller->channels[channel].offset_reg_address, value);
 
 	/* High byte */
 	value = (size >> 8) & 0xff;
-	pio_write_8(controller->channel[channel].offset_reg_address, value);
+	pio_write_8(controller->channels[channel].offset_reg_address, value);
 
 	/* Unmask DMA request */
Index: uspace/drv/audio/sb16/dsp.c
===================================================================
--- uspace/drv/audio/sb16/dsp.c	(revision 1a11a162969d2ad22002439acd730f5f0a13bb55)
+++ uspace/drv/audio/sb16/dsp.c	(revision 01aef433be110c7c4b48d9a9d423c5c9c58eba91)
@@ -34,4 +34,5 @@
 
 #include <libarch/ddi.h>
+#include <str_error.h>
 
 #include "dma.h"
@@ -47,4 +48,6 @@
 
 #define DSP_RESET_RESPONSE 0xaa
+#define SB_DMA_CHAN_16 5
+#define SB_DMA_CHAN_8 1
 
 static inline int sb_dsp_read(sb_dsp_t *dsp, uint8_t *data)
@@ -90,4 +93,23 @@
 }
 /*----------------------------------------------------------------------------*/
+static inline int sb_setup_buffer(sb_dsp_t *dsp)
+{
+	assert(dsp);
+	uint8_t *buffer = malloc24(PAGE_SIZE);
+
+	const uintptr_t pa = addr_to_phys(buffer);
+	const int ret = dma_setup_channel(SB_DMA_CHAN_16, pa, PAGE_SIZE);
+	if (ret == EOK) {
+		dsp->buffer.buffer_data = buffer;
+		dsp->buffer.buffer_position = buffer;
+		dsp->buffer.buffer_size = PAGE_SIZE;
+	} else {
+		ddf_log_error("Failed to setup DMA buffer %s.\n",
+		    str_error(ret));
+		free24(buffer);
+	}
+	return ret;
+}
+/*----------------------------------------------------------------------------*/
 int sb_dsp_init(sb_dsp_t *dsp, sb16_regs_t *regs)
 {
@@ -112,5 +134,6 @@
 	sb_dsp_read(dsp, &dsp->version.major);
 	sb_dsp_read(dsp, &dsp->version.minor);
-	return EOK;
+
+	return ret;
 }
 /*----------------------------------------------------------------------------*/
@@ -130,4 +153,22 @@
 	return EOK;
 }
+/*----------------------------------------------------------------------------*/
+int sb_dsp_play(sb_dsp_t *dsp, const uint8_t *data, size_t size,
+    unsigned sampling_rate, unsigned channels, unsigned bit_depth)
+{
+	assert(dsp);
+	if (!data)
+		return EOK;
+
+	/* Check supported parameters */
+	if (bit_depth != 8 && bit_depth != 16)
+		return ENOTSUP;
+	if (channels != 1 && channels != 2)
+		return ENOTSUP;
+
+	const int ret = sb_setup_buffer(dsp);
+
+	return ret;
+}
 /**
  * @}
Index: uspace/drv/audio/sb16/dsp.h
===================================================================
--- uspace/drv/audio/sb16/dsp.h	(revision 1a11a162969d2ad22002439acd730f5f0a13bb55)
+++ uspace/drv/audio/sb16/dsp.h	(revision 01aef433be110c7c4b48d9a9d423c5c9c58eba91)
@@ -46,16 +46,17 @@
 		uint8_t minor;
 	} version;
-	uint8_t *data_buffer;
-	uint8_t *buffer_position;
-	size_t buffer_size;
+	struct {
+		uint8_t *buffer_data;
+		uint8_t *buffer_position;
+		size_t buffer_size;
+	} buffer;
 } sb_dsp_t;
 
-
-
-/*----------------------------------------------------------------------------*/
 int sb_dsp_init(sb_dsp_t *dsp, sb16_regs_t *regs);
-/*----------------------------------------------------------------------------*/
 int sb_dsp_play_direct(sb_dsp_t *dsp, const uint8_t *data, size_t size,
     unsigned sample_rate, unsigned channels, unsigned bit_depth);
+int sb_dsp_play(sb_dsp_t *dsp, const uint8_t *data, size_t size,
+    unsigned sample_rate, unsigned channels, unsigned bit_depth);
+
 #endif
 /**
