Index: uspace/drv/audio/sb16/dsp.c
===================================================================
--- uspace/drv/audio/sb16/dsp.c	(revision c04ff9f06fcb37ad251130291d15866ef2cc3d34)
+++ uspace/drv/audio/sb16/dsp.c	(revision 0387b92db76b600376ed04be40596b18a3601dad)
@@ -187,4 +187,12 @@
 }
 
+static inline void dsp_report_event(sb_dsp_t *dsp, pcm_event_t event)
+{
+	assert(dsp);
+	if (!dsp->event_exchange)
+		ddf_log_warning("No one listening for event %u", event);
+	async_msg_1(dsp->event_exchange, event, dsp->active.frame_count);
+}
+
 static inline size_t sample_count(pcm_sample_format_t format, size_t byte_count)
 {
@@ -235,6 +243,5 @@
 	{
 	case DSP_PLAYBACK_ACTIVE_EVENTS:
-		async_msg_1(dsp->event_exchange,
-		    PCM_EVENT_FRAMES_PLAYED, dsp->active.frame_count);
+		dsp_report_event(dsp, PCM_EVENT_FRAMES_PLAYED);
 	case DSP_PLAYBACK_NOEVENTS:
 #ifndef AUTO_DMA_MODE
@@ -243,6 +250,5 @@
 		break;
 	case DSP_CAPTURE_ACTIVE_EVENTS:
-		async_msg_1(dsp->event_exchange,
-		    PCM_EVENT_FRAMES_CAPTURED, dsp->active.frame_count);
+		dsp_report_event(dsp, PCM_EVENT_FRAMES_CAPTURED);
 	case DSP_CAPTURE_NOEVENTS:
 #ifndef AUTO_DMA_MODE
@@ -418,4 +424,6 @@
 	sb_dsp_change_state(dsp,
 	    frames ? DSP_PLAYBACK_ACTIVE_EVENTS : DSP_PLAYBACK_NOEVENTS);
+	if (dsp->state == DSP_PLAYBACK_ACTIVE_EVENTS)
+		dsp_report_event(dsp, PCM_EVENT_PLAYBACK_STARTED);
 
 	return EOK;
@@ -425,7 +433,12 @@
 {
 	assert(dsp);
+	if (dsp->state != DSP_PLAYBACK_NOEVENTS &&
+	    dsp->state != DSP_PLAYBACK_ACTIVE_EVENTS)
+		return EINVAL;
+
 	sb_dsp_write(dsp, DMA_16B_EXIT);
 	ddf_log_debug("Stopping playback on buffer.");
-	async_msg_0(dsp->event_exchange, PCM_EVENT_PLAYBACK_TERMINATED);
+	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;
@@ -475,4 +488,6 @@
 	sb_dsp_change_state(dsp,
 	    frames ? DSP_CAPTURE_ACTIVE_EVENTS : DSP_CAPTURE_NOEVENTS);
+	if (dsp->state == DSP_CAPTURE_ACTIVE_EVENTS)
+		dsp_report_event(dsp, PCM_EVENT_CAPTURE_STARTED);
 	return EOK;
 }
@@ -481,7 +496,12 @@
 {
 	assert(dsp);
+	if (dsp->state != DSP_CAPTURE_NOEVENTS &&
+	    dsp->state != DSP_CAPTURE_ACTIVE_EVENTS)
+		return EINVAL;
+
 	sb_dsp_write(dsp, DMA_16B_EXIT);
 	ddf_log_debug("Stopped capture");
-	async_msg_0(dsp->event_exchange, PCM_EVENT_CAPTURE_TERMINATED);
+	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;
