fix: mute race condition + profile loading + add Update button
Bug 1 - Mute unmute not sticking (G560 and others): - Root cause: on_node_info was reading volume/mute from info->props which contains static initial values only — NOT updated at runtime. When any node info event fired, it overwrote the correct runtime state with stale initial data, causing the unmute to revert on the next graph event. - Fix: Subscribe nodes to SPA_PARAM_Props in addition to SPA_PARAM_Format. Handle SPA_PARAM_Props in on_node_param to track volume (both SPA_PROP_volume and SPA_PROP_channelVolumes averaged) and mute from the authoritative live parameter stream. Remove stale volume/mute reads from on_node_info. - Also fix mute detection in /api/mute: check "mute":true precisely instead of searching for bare "true" anywhere in the body. Bug 2 - Loading profiles does not work: - loadProfile was only applying connections when already in "activated" mode. Load now always applies the profile connections immediately. Bug 3 - No option to update an existing profile: - Add "Update" button in profile list that overwrites the profile with current connections (calls saveProfile with the existing name). - Clear the profile name input after "Save Current" succeeds. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -796,13 +796,14 @@
|
||||
<div class="dialog-body">
|
||||
<div class="input-row">
|
||||
<input bind:value={newProfileName} placeholder="Profile name" class="dlg-input" />
|
||||
<button onclick={() => { if (newProfileName.trim()) { saveProfile(newProfileName.trim()); } }}>Save Current</button>
|
||||
<button onclick={() => { if (newProfileName.trim()) { saveProfile(newProfileName.trim()); newProfileName = ''; } }}>Save Current</button>
|
||||
</div>
|
||||
<div class="rule-list">
|
||||
{#each Object.entries($patchbay.profiles) as [name, profile]}
|
||||
<div class="rule-item">
|
||||
<span class:active-profile={name === $patchbay.active_profile}>{name} ({profile.connections.length} rules)</span>
|
||||
<button onclick={() => loadProfile(name)}>Load</button>
|
||||
<button onclick={() => saveProfile(name)} title="Overwrite with current connections">Update</button>
|
||||
<button onclick={() => deleteProfile(name)}>Delete</button>
|
||||
</div>
|
||||
{/each}
|
||||
|
||||
@@ -339,9 +339,8 @@ export async function saveProfile(name: string) {
|
||||
export function loadProfile(name: string) {
|
||||
patchbay.update(pb => ({ ...pb, active_profile: name }));
|
||||
const pb = get_store_value(patchbay);
|
||||
if (pb.activated) {
|
||||
applyPatchbay(pb);
|
||||
}
|
||||
// Always apply connections when explicitly loading a profile
|
||||
applyPatchbay(pb);
|
||||
savePatchbayState();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user