Index: uspace/drv/audio/sb16/dsp.c
===================================================================
--- uspace/drv/audio/sb16/dsp.c	(revision e7bf5f694af775cddbd323d99463913ddd798461)
+++ uspace/drv/audio/sb16/dsp.c	(revision daed68960a66f386b8ff98210a529234564682e2)
@@ -256,4 +256,16 @@
 #endif
 		break;
+	case DSP_CAPTURE_TERMINATE:
+		dsp_report_event(dsp, PCM_EVENT_CAPTURE_TERMINATED);
+		async_exchange_end(dsp->event_exchange);
+		dsp->event_exchange = NULL;
+		sb_dsp_change_state(dsp, DSP_STOPPED);
+		break;
+	case DSP_PLAYBACK_TERMINATE:
+		dsp_report_event(dsp, PCM_EVENT_PLAYBACK_TERMINATED);
+		async_exchange_end(dsp->event_exchange);
+		dsp->event_exchange = NULL;
+		sb_dsp_change_state(dsp, DSP_STOPPED);
+		break;
 	default:
 		ddf_log_warning("Interrupt while DSP not active");
@@ -439,9 +451,5 @@
 	sb_dsp_write(dsp, DMA_16B_EXIT);
 	ddf_log_debug("Stopping playback on buffer.");
-	if (dsp->state == DSP_PLAYBACK_ACTIVE_EVENTS)
-		dsp_report_event(dsp, PCM_EVENT_PLAYBACK_TERMINATED);
-	async_exchange_end(dsp->event_exchange);
-	dsp->event_exchange = NULL;
-	sb_dsp_change_state(dsp, DSP_STOPPED);
+	sb_dsp_change_state(dsp, DSP_PLAYBACK_TERMINATE);
 	return EOK;
 }
@@ -502,9 +510,5 @@
 	sb_dsp_write(dsp, DMA_16B_EXIT);
 	ddf_log_debug("Stopped capture");
-	if (dsp->state == DSP_CAPTURE_ACTIVE_EVENTS)
-		dsp_report_event(dsp, PCM_EVENT_CAPTURE_TERMINATED);
-	async_exchange_end(dsp->event_exchange);
-	dsp->event_exchange = NULL;
-	sb_dsp_change_state(dsp, DSP_STOPPED);
+	sb_dsp_change_state(dsp, DSP_CAPTURE_TERMINATE);
 	return EOK;
 }
Index: uspace/drv/audio/sb16/dsp.h
===================================================================
--- uspace/drv/audio/sb16/dsp.h	(revision e7bf5f694af775cddbd323d99463913ddd798461)
+++ uspace/drv/audio/sb16/dsp.h	(revision daed68960a66f386b8ff98210a529234564682e2)
@@ -47,4 +47,6 @@
 	DSP_PLAYBACK_NOEVENTS,
 	DSP_CAPTURE_NOEVENTS,
+	DSP_PLAYBACK_TERMINATE,
+	DSP_CAPTURE_TERMINATE,
 	DSP_STOPPED,
 	DSP_READY,
