fix: NAM CPU display now responds to bypass

The CPU label in the UI was showing psutil.cpu_percent(interval=None)
which returns total system CPU — barely moves and doesn't change when
the NAM model is bypassed.

Fix:
- Added _calc_nam_cpu() that computes NAM engine CPU from the engine's
  own per-block inference timing (avg_inference_ms) vs the JACK callback
  interval. When the NAM block is bypassed in the chain, returns 0.
- Added 'nam_cpu' field to /api/state response
- Status bar shows NAM CPU % next to VU meters (drops to 0 on bypass)
- Settings CPU row shows NAM CPU with system CPU in dim text beside it
- Changed psutil.cpu_percent(interval=None) → interval=0.2 for a real
  system CPU reading
This commit is contained in:
2026-06-17 17:53:36 -04:00
parent fab8564d09
commit 4a6e7900ce
2 changed files with 38 additions and 4 deletions
+8 -3
View File
@@ -174,6 +174,7 @@ body{display:flex;flex-direction:column;max-height:100vh;user-select:none;-webki
<div class="status-vol" id="statusVolPct">80%</div>
<div class="vu-pair"><span class="vu-lbl">I</span><div class="vu-track"><div class="vu-fill in" id="vuIn" style="width:0%"></div></div></div>
<div class="vu-pair"><span class="vu-lbl">O</span><div class="vu-track"><div class="vu-fill out" id="vuOut" style="width:0%"></div></div></div>
<span id="namCpuLabel" style="font-size:9px;color:var(--text-dim);margin-left:2px;min-width:28px;text-align:right;font-variant-numeric:tabular-nums">0%</span>
<button class="status-btn" id="btnChannel" onclick="cycleInstrument()">🎛</button>
<button class="status-btn" id="btnSettings"></button>
</div>
@@ -392,7 +393,7 @@ body{display:flex;flex-direction:column;max-height:100vh;user-select:none;-webki
<div class="setting-row"><span class="sr-label">🔓 Discoverable</span><span class="sr-value" id="btDiscStatus">On</span><button class="sr-action" id="btDiscToggle">Disable</button></div>
</div>
<div class="setting-group" id="section-system"><div class="setting-group-title">System</div>
<div class="setting-row"><span class="sr-label">🔧 CPU</span><span class="sr-value" id="cpuLabel">0%</span></div>
<div class="setting-row"><span class="sr-label">🔧 CPU</span><span class="sr-value" id="cpuLabel">0%</span><span class="sr-value" id="sysCpuLabel" style="font-size:10px;color:var(--text-dim);min-width:28px"></span></div>
<div class="setting-row"><span class="sr-label">🌡 Temp</span><span class="sr-value" id="sysTemp"></span></div>
<div class="setting-row"><span class="sr-label">⏱ Uptime</span><span class="sr-value" id="sysUptime"></span></div>
<div class="setting-row"><span class="sr-label">💾 Disk</span><span class="sr-value" id="sysDisk"></span></div>
@@ -478,7 +479,7 @@ const API = {
};
// ═══ State ═══
let state={channel:'guitar',connected:false,bypass:false,master_volume:0.8,blocks:[],routing_mode:'4cm',tuner_enabled:false,cpu_percent:0};
let state={channel:'guitar',connected:false,bypass:false,master_volume:0.8,blocks:[],routing_mode:'4cm',tuner_enabled:false,cpu_percent:0,nam_cpu:0};
let currentChannel='guitar';
let channels=['guitar','bass','keys','vocals','backing_tracks'];
let presets=[];
@@ -656,7 +657,11 @@ async function loadState(){
const fs=document.getElementById('footswitch');
if(s.bypass){fs.className='footswitch off';fs.textContent='MUTE';}
else{fs.className='footswitch on';fs.textContent='BYpass';}
document.getElementById('cpuLabel').textContent=(s.cpu_percent!=null?s.cpu_percent:'—')+'%';
document.getElementById('cpuLabel').textContent=(s.nam_cpu!=null?s.nam_cpu:'—')+'%';
const ncEl=document.getElementById('namCpuLabel');
if(ncEl)ncEl.textContent=(s.nam_cpu!=null?s.nam_cpu:'—')+'%';
const scEl=document.getElementById('sysCpuLabel');
if(scEl)scEl.textContent='sys '+(s.cpu_percent!=null?s.cpu_percent:'—')+'%';
const vi=Math.min(100,Math.round((s.input_level||0)*300));
const vo=Math.min(100,Math.round((s.output_level||0)*300));
document.getElementById('vuIn').style.width=vi+'%';