diff -r 772ceced5508 kernel/drv/oss_envy24ht/envy24ht.h
--- a/kernel/drv/oss_envy24ht/envy24ht.h	Mon Jun 09 13:45:14 2008 +0300
+++ b/kernel/drv/oss_envy24ht/envy24ht.h	Tue Jun 10 02:41:30 2008 +0400
@@ -153,7 +153,7 @@
 
   spdif_devc spdc;
   int gains[6];
-  int monitor[4];
+  int monitor[5];
   int recsrc;
 
 /*
@@ -180,7 +180,7 @@
   int m_SPDIFConfig;		/* Aureon */
   int m_Frontjack;		/* Aureon */
   unsigned char m_fDACMute[12];	/* Aureon */
-  unsigned char m_DACVolume[12];	/* Aureon & Juli@ */
+  unsigned char m_DACVolume[13];	/* Aureon & Juli@ */
   unsigned short m_ADCVolume[8];	/* Aureon */
   unsigned char m_ADCMux;	/* Aureon */
   unsigned char m_fSPDIFRecord;	/* Aureon */
@@ -191,6 +191,8 @@
   int mute;
   int reclevel;
   timeout_id_t timeout_id;	/* Juli@ */
+
+  unsigned char syncstart_mask;
 }
 envy24ht_devc;
 
diff -r 772ceced5508 kernel/drv/oss_envy24ht/oss_envy24ht.c
--- a/kernel/drv/oss_envy24ht/oss_envy24ht.c	Mon Jun 09 13:45:14 2008 +0300
+++ b/kernel/drv/oss_envy24ht/oss_envy24ht.c	Tue Jun 10 02:41:30 2008 +0400
@@ -1747,6 +1747,36 @@
   return dmap->bytes_in_use - pos;
 }
 
+static int
+envy24ht_sync_control(int dev, int event, int mode)
+{
+  envy24ht_devc *devc = audio_engines[dev]->devc;
+  envy24ht_portc *portc = audio_engines[dev]->portc;
+  unsigned char enable, intrmask;
+  oss_native_word flags;
+  MUTEX_ENTER_IRQDISABLE(devc->mutex, flags);
+  if(event == SYNC_PREPARE)
+  {
+    devc->syncstart_mask |= portc->mask;
+    portc->state_bits = mode;
+  }
+  else if(event == SYNC_TRIGGER)
+  {
+    if(devc->syncstart_mask)
+    {
+      enable = INB (devc->osdev, devc->mt_base + 0x18);
+      intrmask = INB (devc->osdev, devc->mt_base + 0x03);
+      enable |= devc->syncstart_mask;
+      intrmask &= ~devc->syncstart_mask;
+      OUTB (devc->osdev, enable, devc->mt_base + 0x18);
+      OUTB (devc->osdev, intrmask, devc->mt_base + 0x03);
+      devc->syncstart_mask = 0;
+    }
+  }
+  MUTEX_EXIT_IRQRESTORE(devc->mutex, flags);
+  return 0;
+}
+
 #if 0
 static int
 envy24ht_check_output (int dev)
@@ -1791,7 +1821,9 @@
   NULL,				/* envy24ht_free_buffer */
   NULL,
   NULL,
-  envy24ht_get_buffer_pointer
+  envy24ht_get_buffer_pointer,
+  NULL,
+  envy24ht_sync_control
 };
 
 
@@ -1820,7 +1852,9 @@
   NULL,				/* envy24ht_free_buffer */
   NULL,
   NULL,
-  envy24ht_get_buffer_pointer
+  envy24ht_get_buffer_pointer,
+  NULL,
+  envy24ht_sync_control
 };
 
 static const int bindings[MAX_ODEV] = {
@@ -2245,6 +2279,7 @@
       i++;
     }
 
+  devc->syncstart_mask = 0;
   devc->speedbits = 0;
   devc->speed = 0;
   devc->pending_speed = 0;
