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	Mon Jun 09 21:47:01 2008 +0400
@@ -94,6 +94,9 @@
   int used_chmask;
 
   int state_bits;
+
+  /* Sync control stuff */
+  int next_syncdev;
 }
 envy24ht_portc;
 
@@ -191,6 +194,10 @@
   int mute;
   int reclevel;
   timeout_id_t timeout_id;	/* Juli@ */
+
+  /* Sync control stuff */
+  int syncdev_to_start;
+  int first_syncdev;
 }
 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	Mon Jun 09 21:47:01 2008 +0400
@@ -1747,6 +1747,56 @@
   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, enable_new, intrmask_new;
+  oss_native_word flags;
+
+  MUTEX_ENTER_IRQDISABLE (devc->mutex, flags);
+  if(event == SYNC_PREPARE)
+  {
+    devc->syncdev_to_start = dev;
+    devc->first_syncdev = -1;
+  }
+  else if(event == SYNC_TRIGGER)
+  {
+    portc->next_syncdev = devc->first_syncdev;
+    devc->first_syncdev = dev;
+
+    if(dev == devc->syncdev_to_start)
+    {
+      enable = enable_new = INB (devc->osdev, devc->mt_base + 0x18);
+      intrmask = intrmask_new = INB (devc->osdev, devc->mt_base + 0x03);
+
+      int cur_syncdev = devc->first_syncdev;
+      while(cur_syncdev != -1)
+      {
+        envy24ht_portc *cur_portc = audio_engines[cur_syncdev]->portc;
+
+        if(cur_portc->open_mode & OPEN_WRITE)
+          cur_portc->state_bits = PCM_ENABLE_OUTPUT;
+        if(cur_portc->open_mode & OPEN_READ)
+          cur_portc->state_bits = PCM_ENABLE_INPUT;
+
+        enable_new |= cur_portc->mask;
+        intrmask_new &= ~cur_portc->mask;
+
+        cur_syncdev = cur_portc->next_syncdev;
+      }
+      if(enable_new != enable || intrmask_new != intrmask)
+      {
+        OUTB (devc->osdev, enable_new, devc->mt_base + 0x18);
+        OUTB (devc->osdev, intrmask_new, devc->mt_base + 0x03);
+      }
+    }
+  }
+  MUTEX_EXIT_IRQRESTORE (devc->mutex, flags);
+  return 0;
+}
+
 #if 0
 static int
 envy24ht_check_output (int dev)
@@ -1791,7 +1841,9 @@
   NULL,				/* envy24ht_free_buffer */
   NULL,
   NULL,
-  envy24ht_get_buffer_pointer
+  envy24ht_get_buffer_pointer,
+  NULL,
+  envy24ht_sync_control
 };
 
 
@@ -1820,7 +1872,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] = {
