Index: uspace/drv/audio/sb16/dsp.c
===================================================================
--- uspace/drv/audio/sb16/dsp.c	(revision 413225d07050928987e7c33a775126703e9d8cca)
+++ uspace/drv/audio/sb16/dsp.c	(revision ed3f8d5117123424214b7374d8b9b4819f38f91d)
@@ -56,11 +56,4 @@
 #define AUTO_DMA_MODE
 
-#ifdef AUTO_DMA_MODE
-#undef AUTO_DMA_MODE
-#define AUTO_DMA_MODE true
-#else
-#define AUTO_DMA_MODE false
-#endif
-
 static inline int sb_dsp_read(sb_dsp_t *dsp, uint8_t *data)
 {
@@ -198,8 +191,8 @@
 
 	if (remain_size == 0) {
+#ifdef AUTO_DMA_MODE
+		sb_dsp_write(dsp, DMA_16B_EXIT);
+#endif
 		ddf_log_note("Nothing more to play");
-		if (AUTO_DMA_MODE) {
-			sb_dsp_write(dsp, DMA_16B_EXIT);
-		}
 		sb_clear_buffer(dsp);
 		return;
@@ -220,6 +213,8 @@
 		return;
 	}
+	/* Copy new data */
 	memcpy(dsp->buffer.position, dsp->playing.position, PLAY_BLOCK_SIZE);
 	write_barrier();
+	/* Adjust position */
 	dsp->playing.position += PLAY_BLOCK_SIZE;
 	dsp->buffer.position += PLAY_BLOCK_SIZE;
@@ -227,10 +222,11 @@
 	if (dsp->buffer.position == (dsp->buffer.data + dsp->buffer.size))
 		dsp->buffer.position = dsp->buffer.data;
-	if (!AUTO_DMA_MODE) {
-		sb_dsp_write(dsp, SINGLE_DMA_16B_DA_FIFO);
-		sb_dsp_write(dsp, dsp->playing.mode);
-		sb_dsp_write(dsp, (PLAY_BLOCK_SIZE - 1) & 0xff);
-		sb_dsp_write(dsp, (PLAY_BLOCK_SIZE - 1) >> 8);
-	}
+#ifndef AUTO_DMA_MODE
+	const size_t samples = sample_count(dsp->playing.mode, PLAY_BLOCK_SIZE);
+	sb_dsp_write(dsp, SINGLE_DMA_16B_DA_FIFO);
+	sb_dsp_write(dsp, dsp->playing.mode);
+	sb_dsp_write(dsp, (samples - 1) & 0xff);
+	sb_dsp_write(dsp, (samples - 1) >> 8);
+#endif
 
 }
@@ -270,8 +266,7 @@
 		return ret;
 
+	const size_t copy_size = size < BUFFER_SIZE ? size : BUFFER_SIZE;
 	const size_t play_size =
 	    size < PLAY_BLOCK_SIZE ? size : PLAY_BLOCK_SIZE;
-	const size_t copy_size =
-	    size < BUFFER_SIZE ? size : BUFFER_SIZE;
 
 	dsp->playing.data = data;
@@ -279,4 +274,5 @@
 	dsp->playing.size = size;
 	dsp->playing.mode = 0;
+
 	if (sample_size == 16)
 		dsp->playing.mode |= DSP_MODE_16BIT;
@@ -299,9 +295,14 @@
 	    sampling_rate >> 8, sampling_rate & 0xff);
 
-	if (!AUTO_DMA_MODE || play_size == size) {
+#ifdef AUTO_DMA_MODE
+	if (play_size < size) {
+		sb_dsp_write(dsp, AUTO_DMA_16B_DA_FIFO);
+	} else {
 		sb_dsp_write(dsp, SINGLE_DMA_16B_DA_FIFO);
-	} else {
-		sb_dsp_write(dsp, AUTO_DMA_16B_DA_FIFO);
-	}
+	}
+#else
+	sb_dsp_write(dsp, SINGLE_DMA_16B_DA_FIFO);
+#endif
+
 	sb_dsp_write(dsp, dsp->playing.mode);
 	sb_dsp_write(dsp, (samples - 1) & 0xff);
