diff --git a/pd/nw/dialog_prefs.html b/pd/nw/dialog_prefs.html
index 1789ace9c15e0e4bc8cbba204bd9860ca1fcb1d0..7a808d875725b0e63448e441893850145f8e3305 100644
--- a/pd/nw/dialog_prefs.html
+++ b/pd/nw/dialog_prefs.html
@@ -32,48 +32,56 @@
         </label>
 
         <div class="tab1">
-<div>
-          <label data-i18n="[title]prefs.audio.api_tt">
-            <span data-i18n="prefs.audio.api"></span>
-            <select id="audio_api" onchange="change_api(this);">
-            </select>
-          </label>
+          <div class="audio_dev_settings">
+            <label data-i18n="[title]prefs.audio.api_tt">
+              <span data-i18n="prefs.audio.api"></span>
+              <select id="audio_api" onchange="change_api(this);">
+              </select>
+            </label>
 
-          <label data-i18n="[title]prefs.audio.sr_tt">
-            <span data-i18n="prefs.audio.sr"></span>
-            <input type="text"
-                   id="rate"
-                   name="rate"
-                   onchange="attr_change(this);">
-          </label>
-</div>
-<div class="audio_dev_settings">
-          <label data-i18n="[title]prefs.audio.blocksize_tt">
-            <span data-i18n="prefs.audio.blocksize"></span>
-            <select id="blocksize"
-                    onchange="attr_change(this);">
-              <option value="64">64</option>
-              <option value="128">128</option>
-              <option value="256">256</option>
-              <option value="512">512</option>
-              <option value="1024">1024</option>
-              <option value="2048">2048</option>
-            </select>
-          </label>
-          <label data-i18n="[title]prefs.audio.advance_tt">
-            <span data-i18n="prefs.audio.advance"></span>
-            <input type="text"
-                   id="advance"
-                   name="advance"
-                   onchange="attr_change(this);">
-          </label>
-</div class="audio_dev_settings">
-          <div id="callback_container" class="hidden">
-            <label data-i18n="[title]prefs.audio.callback_tt">
-              <span data-i18n="prefs.audio.callback"></span>
-              <input type="checkbox" id="callback" name="callback">
+            <label data-i18n="[title]prefs.audio.sr_tt">
+              <span data-i18n="prefs.audio.sr"></span>
+              <input type="text"
+                     id="rate"
+                     name="rate"
+                     onchange="attr_change(this);">
+            </label>
+          </div>
+          <div class="audio_dev_settings">
+            <label data-i18n="[title]prefs.audio.blocksize_tt">
+              <span data-i18n="prefs.audio.blocksize"></span>
+              <select id="blocksize"
+                      onchange="attr_change(this);">
+                <option value="64">64</option>
+                <option value="128">128</option>
+                <option value="256">256</option>
+                <option value="512">512</option>
+                <option value="1024">1024</option>
+                <option value="2048">2048</option>
+              </select>
+            </label>
+            <label data-i18n="[title]prefs.audio.advance_tt">
+              <span data-i18n="prefs.audio.advance"></span>
+              <input type="text"
+                     id="advance"
+                     name="advance"
+                     onchange="attr_change(this);">
             </label>
           </div>
+          <div class="audio_dev_settings">
+            <span id="callback_container" class="hidden">
+              <label data-i18n="[title]prefs.audio.callback_tt">
+                <span data-i18n="prefs.audio.callback"></span>
+                <input type="checkbox" id="callback" name="callback">
+              </label>
+            </span>
+            <span id="multi_dev_container" class="hidden">
+              <label data-i18n="[title]prefs.audio.callback_tt">
+                <span data-i18n="prefs.audio.callback"></span>
+                <input type="checkbox" id="multi-dev" name="multi-dev">
+              </label>
+            </span>
+          </div>
           <table>
             <tr>
               <td>
@@ -199,9 +207,15 @@
         </div>
 
         <div class="tab2">
-          <select id="midi_api" onchange="change_api(this);">
-          </select>
-          <br/>
+
+          <div class="audio_dev_settings">
+            <label data-i18n="[title]prefs.midi.api_tt">
+              <span data-i18n="prefs.midi.api"></span>
+              <select id="midi_api" onchange="change_api(this);">
+              </select>
+            </label>
+          </div>
+
           <select id="midi_in1" onchange="dev_change(this);"></select>
           <br/>
           <select id="midi_in2" onchange="dev_change(this);"></select>
@@ -301,6 +315,9 @@ function dev_change(elem) {
     attrs[index] = elem.value;
     pdgui.post("id is " + elem.id);
     pdgui.post("new chan attrs is " + attrs);
+
+    disable_unused_chans("in");
+    disable_unused_chans("out");
 }
 
 function attr_change(elem) {
@@ -484,6 +501,31 @@ function populate_midi_devs(type, attrs) {
     }
 }
 
+function disable_unused_chans(type) {
+    var i, chan_elem;
+    for (i = 0; i < 4; i++) {
+        chan_elem = document.getElementById(type + "chans" + (i+1));
+        if (+document.getElementById(type + (i+1)).value === -1) {
+            chan_elem.disabled = true;
+        } else {
+            chan_elem.disabled = false;
+        }
+    }
+}
+
+function disable_unused_devs(type, canmulti) {
+    var i;
+    if (+canmulti < 2) {
+        for (i = 0; i < 3; i++) {
+            document.getElementById(type + (i+2)).disabled = true;
+        }
+    } else {
+        for (i = 0; i < 4; i++) {
+            document.getElementById(type + (i+1)).disabled = false;
+        }
+    }
+}
+
 function audio_prefs_callback(attrs) {
     pd_audio_attrs = attrs;
     var api_select = document.getElementById("audio_api");
@@ -524,6 +566,12 @@ function audio_prefs_callback(attrs) {
     set_chans("in", get_attr("pd-inchans", attrs));
     set_chans("out", get_attr("pd-outchans", attrs));
 
+    disable_unused_chans("in");
+    disable_unused_chans("out");
+
+    disable_unused_devs("in", get_attr("canmulti", attrs));
+    disable_unused_devs("out", get_attr("canmulti", attrs));
+
     pdgui.resize_window(pd_object_callback);
 }