From 1c05bd996dbc0e68bf2cf075a34443135d7db785 Mon Sep 17 00:00:00 2001
From: Jonathan Wilkes <jancsika@yahoo.com>
Date: Wed, 22 Apr 2015 20:46:41 -0400
Subject: [PATCH] hooked in changes for audio dialog form inputs

---
 pd/nw/dialog_prefs.html | 152 ++++++++++++++++++++++++----------------
 1 file changed, 93 insertions(+), 59 deletions(-)

diff --git a/pd/nw/dialog_prefs.html b/pd/nw/dialog_prefs.html
index 03f72022d..2f77fc267 100644
--- a/pd/nw/dialog_prefs.html
+++ b/pd/nw/dialog_prefs.html
@@ -28,12 +28,18 @@
         <br/>
         <label data-i18n="[title]prefs.audio.sr_tt">
           <span data-i18n="prefs.audio.sr"></span>
-          <input type="text" id="rate" name="rate">
+          <input type="text"
+                 id="rate"
+                 name="rate"
+                 onchange="attr_change(this);">
         </label>
         <br/>
         <label data-i18n="[title]prefs.audio.advance_tt">
           <span data-i18n="prefs.audio.advance"></span>
-          <input type="text" id="advance" name="advance">
+          <input type="text"
+                 id="advance"
+                 name="advance"
+                 onchange="attr_change(this);">
         </label>
         <br/>
         <div id="callback_container" class="hidden">
@@ -43,7 +49,8 @@
           </label>
         </div>
 
-        <select id="blocksize" onchange="attr_change(this);">
+        <select id="blocksize"
+                onchange="attr_change(this);">
           <option value="64">64</option>
           <option value="128">128</option>
           <option value="256">256</option>
@@ -52,58 +59,80 @@
           <option value="2048">2048</option>
         </select>
         <br/>
-        <select id="in1"></select>
+        <select id="in1" onchange="dev_change(this);"></select>
         <label data-i18n="[title]prefs.audio.channels_tt">
           <span data-i18n="prefs.audio.channels"></span>
-          <input type="text" id="inchan1" name="inchan1">
+          <input type="text"
+                 id="inchans1"
+                 name="inchans1"
+                 onchange="dev_change(this);">
         </label>
         <br/>
-        <select id="in2"></select>
+        <select id="in2" onchange="dev_change(this);"></select>
         <label data-i18n="[title]prefs.audio.channels_tt">
           <span data-i18n="prefs.audio.channels"></span>
-          <input type="text" id="inchan2" name="inchan2">
+          <input type="text"
+                 id="inchans2"
+                 name="inchans2"
+                 onchange="dev_change(this);">
         </label>
         <br/>
-        <select id="in3"></select>
+        <select id="in3" onchange="dev_change(this);"></select>
         <label data-i18n="[title]prefs.audio.channels_tt">
           <span data-i18n="prefs.audio.channels"></span>
-          <input type="text" id="inchan3" name="inchan3">
+          <input type="text"
+                 id="inchans3"
+                 name="inchans3"
+                 onchange="dev_change(this);">
         </label>
         <br/>
-        <select id="in4"></select>
+        <select id="in4" onchange="dev_change(this);"></select>
         <label data-i18n="[title]prefs.audio.channels_tt">
           <span data-i18n="prefs.audio.channels"></span>
-          <input type="text" id="inchan4" name="inchan4">
+          <input type="text"
+                 id="inchans4"
+                 name="inchans4"
+                 onchange="dev_change(this);">
         </label>
         <br/>
 
-        <select id="out1"></select>
+        <select id="out1" onchange="dev_change(this);"></select>
         <label data-i18n="[title]prefs.audio.channels_tt">
           <span data-i18n="prefs.audio.channels"></span>
-          <input type="text" id="outchan1" name="outchan1">
+          <input type="text"
+                 id="outchans1"
+                 name="outchans1"
+                 onchange="dev_change(this);">
         </label>
         <br/>
-        <select id="out2"></select>
+        <select id="out2" onchange="dev_change(this);"></select>
         <label data-i18n="[title]prefs.audio.channels_tt">
           <span data-i18n="prefs.audio.channels"></span>
-          <input type="text" id="outchan2" name="outchan2">
+          <input type="text"
+                 id="outchans2"
+                 name="outchans2"
+                 onchange="dev_change(this);">
         </label>
         <br/>
-        <select id="out3"></select>
+        <select id="out3" onchange="dev_change(this);"></select>
         <label data-i18n="[title]prefs.audio.channels_tt">
           <span data-i18n="prefs.audio.channels"></span>
-          <input type="text" id="outchan3" name="outchan3">
+          <input type="text"
+                 id="outchans3"
+                 name="outchans3"
+                 onchange="dev_change(this);">
         </label>
         <br/>
-        <select id="out4"></select>
+        <select id="out4" onchange="dev_change(this);"></select>
         <label data-i18n="[title]prefs.audio.channels_tt">
           <span data-i18n="prefs.audio.channels"></span>
-          <input type="text" id="outchan4" name="outchan4">
+          <input type="text"
+                 id="outchans4"
+                 name="outchans4"
+                 onchange="dev_change(this);">
         </label>
         <br/>
 
-
-
       </fieldset>
 
       <fieldset id="midi">
@@ -226,11 +255,31 @@
         pdgui.gui_post("array is " + attr);
     }
 
+    // callbacks for devices and/or their number of channels
+    function dev_change(elem) {
+        var attrs, id, direction, index;
+        // the same logic works for both channels and
+        // devices-- we use the variable 'type' to
+        // choose the parameter acoordingly
+        var type;
+        id = elem.id;
+        direction = id.slice(0,2) === 'in' ? 'in' : 'out';
+        type = id.indexOf('chans') !== -1 ? 'chans' : 'devs';
+        // This would need to change if there could ever be more than
+        // 9 devices
+        index = +(id.slice(-1)) - 1;
+        pdgui.gui_post("direction is " + direction);
+        attrs = get_attr('pd-' + direction + type, pd_audio_attrs);
+        attrs[index] = elem.value;
+        pdgui.gui_post("id is " + elem.id);
+        pdgui.gui_post("new chan attrs is " + attrs);
+    }
+
     function attr_change(elem) {
-        var attr, name;
+        var attr, id;
         attr = pd_audio_attrs;
-        name = elem.id;
-        attr[attr.indexOf(name) + 1] = elem.value;
+        id = elem.id;
+        attr[attr.indexOf(id) + 1] = elem.value;
         pdgui.gui_post("id is " + elem.id);
         pdgui.gui_post("value is " + elem.value);
     }
@@ -423,24 +472,27 @@ pdgui.gui_post("guistub is " + gfxstub);
     }
 
 function populate_devs(type, attrs) {
-        var devs = get_attr(type === 'in' ? 'sys-indevs' : 'sys-outdevs', attrs);
-        var i, j, opt, elem;
-        pdgui.gui_post("devs are " + devs);
-        pdgui.gui_post("type is " + type + 1);
-        for (i = 1; i < 5; i++) {
-            elem = document.getElementById(type + i);
-            // if the user changed the API, we need to
-            // remove the old devs
-            while (elem.firstChild) {
-                elem.removeChild(elem.firstChild);
-            }
-            for (j = 0; j < devs.length; j++) {
-                opt = document.createElement('option');
-                opt.value = j; 
-                opt.textContent = devs[j];
-                elem.appendChild(opt);
-            }
+    var devs = get_attr(type === 'in' ? 'sys-indevs' : 'sys-outdevs', attrs);
+    var i, j, opt, elem, chan_elem, chans;
+    pdgui.gui_post("devs are " + devs);
+    pdgui.gui_post("type is " + type + 1);
+    chans = get_attr('pd-' + type + 'chans', attrs);
+    for (i = 0; i < 4; i++) {
+        elem = document.getElementById(type + (i+1));
+        chan_elem = document.getElementById(type + 'chans' + (i+1));
+        chan_elem.value = chans[i];
+        // if the user changed the API, we need to
+        // remove the old devs
+        while (elem.firstChild) {
+            elem.removeChild(elem.firstChild);
         }
+        for (j = 0; j < devs.length; j++) {
+            opt = document.createElement('option');
+            opt.value = j; 
+            opt.textContent = devs[j];
+            elem.appendChild(opt);
+        }
+    }
 }
 
     function audio_prefs_callback(attrs) {
@@ -472,24 +524,6 @@ function populate_devs(type, attrs) {
 
         populate_devs('in', attrs);
         populate_devs('out', attrs);
-/*
-        devs = get_attr('sys-indevs', attrs);
-        pdgui.gui_post("devs are " + devs);
-        for (i = 1; i < 5; i++) {
-            elem = document.getElementById('in' + i);
-            // if the user changed the API, we need to
-            // remove the old devs
-            while (elem.firstChild) {
-                elem.removeChild(elem.firstChild);
-            }
-            for (j = 0; j < devs.length; j++) {
-                opt = document.createElement('option');
-                opt.value = j; 
-                opt.textContent = devs[j];
-                elem.appendChild(opt);
-            }
-        }
-*/
 
     }
 
-- 
GitLab