Index: uspace/drv/audio/hdaudio/pcm_iface.c
===================================================================
--- uspace/drv/audio/hdaudio/pcm_iface.c	(revision 159c722df07b0966d4101cc1bf3f08ae20b3e6ae)
+++ uspace/drv/audio/hdaudio/pcm_iface.c	(revision 6747b9297510f5d72edefe2e009f418ce447fd06)
@@ -228,6 +228,12 @@
 static int hda_stop_playback(ddf_fun_t *fun, bool immediate)
 {
+	hda_t *hda = fun_to_hda(fun);
+
 	ddf_msg(LVL_NOTE, "hda_stop_playback()");
-	return ENOTSUP;
+	hda_stream_stop(hda->pcm_stream);
+	hda_stream_reset(hda->pcm_stream);
+
+	hda_pcm_event(hda, PCM_EVENT_PLAYBACK_TERMINATED);
+	return EOK;
 }
 
Index: uspace/drv/audio/hdaudio/spec/regs.h
===================================================================
--- uspace/drv/audio/hdaudio/spec/regs.h	(revision 159c722df07b0966d4101cc1bf3f08ae20b3e6ae)
+++ uspace/drv/audio/hdaudio/spec/regs.h	(revision 6747b9297510f5d72edefe2e009f418ce447fd06)
@@ -166,4 +166,17 @@
 
 typedef enum {
+	/** Descriptor Error Interrupt Enable */
+	sdctl1_deie = 4,
+	/** FIFO Error Interrupt Enable */
+	sdctl1_feie = 3,
+	/** Interrupt on Completion Enable */
+	sdctl1_ioce = 2,
+	/** Stream Run */
+	sdctl1_run = 1,
+	/** Stream Reset */
+	sdctl1_srst = 0
+} hda_sdesc_ctl1_bits;
+
+typedef enum {
 	/** Number of Output Streams Supported (H) */
 	gcap_oss_h = 15,
Index: uspace/drv/audio/hdaudio/stream.c
===================================================================
--- uspace/drv/audio/hdaudio/stream.c	(revision 159c722df07b0966d4101cc1bf3f08ae20b3e6ae)
+++ uspace/drv/audio/hdaudio/stream.c	(revision 6747b9297510f5d72edefe2e009f418ce447fd06)
@@ -177,6 +177,30 @@
 
 	ctl = hda_reg8_read(&sdregs->ctl1);
-	ctl = ctl | 2 /* XXX Run */;
+	if (run)
+		ctl = ctl | BIT_V(uint8_t, sdctl1_run);
+	else
+		ctl = ctl & ~BIT_V(uint8_t, sdctl1_run);
+
 	hda_reg8_write(&sdregs->ctl1, ctl);
+}
+
+static void hda_stream_reset_noinit(hda_stream_t *stream)
+{
+	uint32_t ctl;
+	hda_sdesc_regs_t *sdregs;
+
+	sdregs = &stream->hda->regs->sdesc[stream->sdid];
+
+	ctl = hda_reg8_read(&sdregs->ctl1);
+	ctl = ctl | BIT_V(uint8_t, sdctl1_srst);
+	hda_reg8_write(&sdregs->ctl1, ctl);
+
+	async_usleep(100 * 1000);
+
+//	ctl = hda_reg8_read(&sdregs->ctl1);
+//	ctl = ctl & ~BIT_V(uint8_t, sdctl1_srst);
+//	hda_reg8_write(&sdregs->ctl1, ctl);
+
+//	async_usleep(100 * 1000);
 }
 
@@ -214,4 +238,5 @@
 {
 	ddf_msg(LVL_NOTE, "hda_stream_destroy()");
+	hda_stream_reset_noinit(stream);
 	free(stream);
 }
@@ -223,4 +248,17 @@
 }
 
+void hda_stream_stop(hda_stream_t *stream)
+{
+	ddf_msg(LVL_NOTE, "hda_stream_stop()");
+	hda_stream_set_run(stream, false);
+}
+
+void hda_stream_reset(hda_stream_t *stream)
+{
+	ddf_msg(LVL_NOTE, "hda_stream_reset()");
+	hda_stream_reset_noinit(stream);
+	hda_stream_desc_configure(stream);
+}
+
 /** @}
  */
Index: uspace/drv/audio/hdaudio/stream.h
===================================================================
--- uspace/drv/audio/hdaudio/stream.h	(revision 159c722df07b0966d4101cc1bf3f08ae20b3e6ae)
+++ uspace/drv/audio/hdaudio/stream.h	(revision 6747b9297510f5d72edefe2e009f418ce447fd06)
@@ -73,6 +73,8 @@
 
 extern hda_stream_t *hda_stream_create(hda_t *, hda_stream_dir_t, uint32_t);
+extern void hda_stream_destroy(hda_stream_t *);
 extern void hda_stream_start(hda_stream_t *);
-extern void hda_stream_destroy(hda_stream_t *);
+extern void hda_stream_stop(hda_stream_t *);
+extern void hda_stream_reset(hda_stream_t *);
 
 #endif
