Index: uspace/drv/audio/sb16/dsp.c
===================================================================
--- uspace/drv/audio/sb16/dsp.c	(revision 5984107bf71d1c48a96509ee321496cf109cad0a)
+++ uspace/drv/audio/sb16/dsp.c	(revision ac149d5809dfd45468e67a08ab547c0866fa2457)
@@ -196,9 +196,11 @@
 	if (remain_size == 0) {
 		ddf_log_note("Nothing more to play");
-		sb_dsp_write(dsp, DMA_16B_EXIT);
+		if (AUTO_DMA_MODE) {
+			sb_dsp_write(dsp, DMA_16B_EXIT);
+		}
 		sb_clear_buffer(dsp);
 		return;
 	}
-	if (remain_size < PLAY_BLOCK_SIZE) {
+	if (remain_size <= PLAY_BLOCK_SIZE) {
 		ddf_log_note("Last %zu bytes to play.\n", remain_size);
 		/* This is the last block */
@@ -264,15 +266,18 @@
 	const size_t play_size =
 	    size < PLAY_BLOCK_SIZE ? size : PLAY_BLOCK_SIZE;
-	memcpy(dsp->buffer.data, dsp->playing.data, play_size);
-
-	ddf_log_debug("Playing sound: %zu(%zu) bytes.\n", play_size, size);
+	const size_t copy_size =
+	    size < BUFFER_SIZE ? size : BUFFER_SIZE;
+
 
 	dsp->playing.data = data;
-	dsp->playing.position = data + play_size;
+	dsp->playing.position = data + copy_size;
 	dsp->playing.size = size;
 	dsp->playing.mode =
 	    (bit_depth == 16 ? 0x10 : 0) | (channels == 2 ? 0x20 : 0);
-
 	ddf_log_debug("Setting mode %hhx.\n", dsp->playing.mode);
+
+	ddf_log_debug("Playing sound: %zu(%zu) bytes.\n", play_size, size);
+	memcpy(dsp->buffer.data, dsp->playing.data, copy_size);
+
 	sb_dsp_write(dsp, SET_SAMPLING_RATE_OUTPUT);
 	sb_dsp_write(dsp, sampling_rate >> 8);
