(jobId, loadedStemNames = STEM_NAMES)
| 18 | } |
| 19 | |
| 20 | export async function loadMixIntoState(jobId, loadedStemNames = STEM_NAMES) { |
| 21 | let stored = {}; |
| 22 | try { |
| 23 | const data = await storeGet(`stemdeck:mix:${jobId}`, {}); |
| 24 | if (data && typeof data === "object") stored = data; |
| 25 | } catch (e) { console.warn("[mixer] failed to load mix state:", e); } |
| 26 | for (const name of TRACK_NAMES) { |
| 27 | Object.assign(mixerState[name], defaultMixerEntry(), stored[name] || {}); |
| 28 | } |
| 29 | // If all loaded stems are muted the session is unplayable -- unmute as recovery. |
| 30 | const loadedStems = loadedStemNames.filter((n) => mixerState[n]); |
| 31 | if (loadedStems.length > 0 && loadedStems.every((n) => mixerState[n].muted)) { |
| 32 | for (const name of loadedStems) mixerState[name].muted = false; |
| 33 | } |
| 34 | } |
| 35 | |
| 36 | export function resetMixerState() { |
| 37 | for (const name of TRACK_NAMES) { |
no test coverage detected