Index: uspace/drv/audio/sb16/dsp.c
===================================================================
--- uspace/drv/audio/sb16/dsp.c	(revision b881226fb046fe137ec28e412cb72b709aeefb61)
+++ uspace/drv/audio/sb16/dsp.c	(revision ff396eab3112645fe1c7607eb45a89d6f77be1a8)
@@ -167,4 +167,5 @@
 	dsp->sb_dev = dev;
 	dsp->status = DSP_STOPPED;
+	dsp->ignore_interrupts = false;
 	sb_dsp_reset(dsp);
 	/* "DSP takes about 100 microseconds to initialize itself" */
@@ -192,4 +193,24 @@
 {
 	assert(dsp);
+
+#ifndef AUTO_DMA_MODE
+	if (dsp->status == DSP_PLAYBACK) {
+		sb_dsp_write(dsp, SINGLE_DMA_16B_DA);
+		sb_dsp_write(dsp, dsp->active.mode);
+		sb_dsp_write(dsp, (dsp->active.samples - 1) & 0xff);
+		sb_dsp_write(dsp, (dsp->active.samples - 1) >> 8);
+	}
+
+	if (dsp->status == DSP_RECORDING) {
+		sb_dsp_write(dsp, SINGLE_DMA_16B_AD);
+		sb_dsp_write(dsp, dsp->active.mode);
+		sb_dsp_write(dsp, (dsp->active.samples - 1) & 0xff);
+		sb_dsp_write(dsp, (dsp->active.samples - 1) >> 8);
+	}
+#endif
+
+	if (dsp->ignore_interrupts)
+		return;
+
 	dsp->active.frame_count +=
 	    dsp->active.samples / ((dsp->active.mode & DSP_MODE_STEREO) ? 2 : 1);
@@ -215,14 +236,4 @@
 		ddf_log_warning("Interrupt with no event consumer.");
 	}
-#ifndef AUTO_DMA_MODE
-	if (dsp->active.playing)
-		sb_dsp_write(dsp, SINGLE_DMA_16B_DA);
-	else
-		sb_dsp_write(dsp, SINGLE_DMA_16B_AD);
-
-	sb_dsp_write(dsp, dsp->active.mode);
-	sb_dsp_write(dsp, (dsp->active.samples - 1) & 0xff);
-	sb_dsp_write(dsp, (dsp->active.samples - 1) >> 8);
-#endif
 }
 
@@ -333,7 +344,11 @@
 		return ENOTSUP;
 
-	dsp->event_exchange = async_exchange_begin(dsp->event_session);
-	if (!dsp->event_exchange)
-		return ENOMEM;
+	/* Client requested regular interrupts */
+	if (frames) {
+		dsp->event_exchange = async_exchange_begin(dsp->event_session);
+		if (!dsp->event_exchange)
+			return ENOMEM;
+		dsp->ignore_interrupts = false;
+	}
 
 	const bool sign = (format == PCM_SAMPLE_SINT16_LE);
@@ -349,5 +364,5 @@
 	sb_dsp_write(dsp, AUTO_DMA_16B_DA_FIFO);
 #else
-	sb_dsp_write(dsp, SINGLE_DMA_16B_DA_FIFO);
+	sb_dsp_write(dsp, SINGLE_DMA_16B_DA);
 #endif
 
@@ -401,7 +416,11 @@
 		return ENOTSUP;
 
-	dsp->event_exchange = async_exchange_begin(dsp->event_session);
-	if (!dsp->event_exchange)
-		return ENOMEM;
+	/* client requested regular interrupts */
+	if (frames) {
+		dsp->event_exchange = async_exchange_begin(dsp->event_session);
+		if (!dsp->event_exchange)
+			return ENOMEM;
+		dsp->ignore_interrupts = false;
+	}
 
 	const bool sign = (format == PCM_SAMPLE_SINT16_LE);
@@ -417,5 +436,5 @@
 	sb_dsp_write(dsp, AUTO_DMA_16B_AD_FIFO);
 #else
-	sb_dsp_write(dsp, SINGLE_DMA_16B_AD_FIFO);
+	sb_dsp_write(dsp, SINGLE_DMA_16B_AD);
 #endif
 
Index: uspace/drv/audio/sb16/dsp.h
===================================================================
--- uspace/drv/audio/sb16/dsp.h	(revision b881226fb046fe137ec28e412cb72b709aeefb61)
+++ uspace/drv/audio/sb16/dsp.h	(revision ff396eab3112645fe1c7607eb45a89d6f77be1a8)
@@ -47,4 +47,5 @@
 	int dma8_channel;
 	int dma16_channel;
+	bool ignore_interrupts;
 	struct {
 		uint8_t major;
