Allow multichannel audio sources as direct CSS and value source input
Add resolve_audio_source() that accepts both MultichannelAudioSource (defaults to mono mix) and MonoAudioSource. Update CSS and brightness value source dropdowns to show all audio sources with type badges. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -517,13 +517,14 @@ async function _loadAudioSources() {
|
||||
const select = document.getElementById('css-editor-audio-source');
|
||||
if (!select) return;
|
||||
try {
|
||||
const resp = await fetchWithAuth('/audio-sources?source_type=mono');
|
||||
const resp = await fetchWithAuth('/audio-sources');
|
||||
if (!resp.ok) throw new Error('fetch failed');
|
||||
const data = await resp.json();
|
||||
const sources = data.sources || [];
|
||||
select.innerHTML = sources.map(s =>
|
||||
`<option value="${s.id}">${escapeHtml(s.name)}</option>`
|
||||
).join('');
|
||||
select.innerHTML = sources.map(s => {
|
||||
const badge = s.source_type === 'multichannel' ? ' [multichannel]' : ' [mono]';
|
||||
return `<option value="${s.id}">${escapeHtml(s.name)}${badge}</option>`;
|
||||
}).join('');
|
||||
if (sources.length === 0) {
|
||||
select.innerHTML = '';
|
||||
}
|
||||
|
||||
@@ -79,6 +79,8 @@ export async function showValueSourceModal(editData) {
|
||||
document.getElementById('value-source-mode').value = editData.mode || 'rms';
|
||||
_setSlider('value-source-sensitivity', editData.sensitivity ?? 1.0);
|
||||
_setSlider('value-source-smoothing', editData.smoothing ?? 0.3);
|
||||
_setSlider('value-source-audio-min-value', editData.min_value ?? 0);
|
||||
_setSlider('value-source-audio-max-value', editData.max_value ?? 1);
|
||||
} else if (editData.source_type === 'adaptive_time') {
|
||||
_populateScheduleUI(editData.schedule);
|
||||
_setSlider('value-source-adaptive-min-value', editData.min_value ?? 0);
|
||||
@@ -105,6 +107,8 @@ export async function showValueSourceModal(editData) {
|
||||
document.getElementById('value-source-mode').value = 'rms';
|
||||
_setSlider('value-source-sensitivity', 1.0);
|
||||
_setSlider('value-source-smoothing', 0.3);
|
||||
_setSlider('value-source-audio-min-value', 0);
|
||||
_setSlider('value-source-audio-max-value', 1);
|
||||
// Adaptive defaults
|
||||
_populateScheduleUI([]);
|
||||
_populatePictureSourceDropdown('');
|
||||
@@ -176,6 +180,8 @@ export async function saveValueSource() {
|
||||
payload.mode = document.getElementById('value-source-mode').value;
|
||||
payload.sensitivity = parseFloat(document.getElementById('value-source-sensitivity').value);
|
||||
payload.smoothing = parseFloat(document.getElementById('value-source-smoothing').value);
|
||||
payload.min_value = parseFloat(document.getElementById('value-source-audio-min-value').value);
|
||||
payload.max_value = parseFloat(document.getElementById('value-source-audio-max-value').value);
|
||||
} else if (sourceType === 'adaptive_time') {
|
||||
payload.schedule = _getScheduleFromUI();
|
||||
if (payload.schedule.length < 2) {
|
||||
@@ -270,6 +276,7 @@ export function createValueSourceCard(src) {
|
||||
propsHtml = `
|
||||
<span class="stream-card-prop" title="${escapeHtml(t('value_source.audio_source'))}">${escapeHtml(audioName)}</span>
|
||||
<span class="stream-card-prop">${modeLabel.toUpperCase()}</span>
|
||||
<span class="stream-card-prop">${src.min_value ?? 0}–${src.max_value ?? 1}</span>
|
||||
`;
|
||||
} else if (src.source_type === 'adaptive_time') {
|
||||
const pts = (src.schedule || []).length;
|
||||
@@ -315,10 +322,10 @@ function _setSlider(id, value) {
|
||||
function _populateAudioSourceDropdown(selectedId) {
|
||||
const select = document.getElementById('value-source-audio-source');
|
||||
if (!select) return;
|
||||
const mono = _cachedAudioSources.filter(s => s.source_type === 'mono');
|
||||
select.innerHTML = mono.map(s =>
|
||||
`<option value="${s.id}"${s.id === selectedId ? ' selected' : ''}>${escapeHtml(s.name)}</option>`
|
||||
).join('');
|
||||
select.innerHTML = _cachedAudioSources.map(s => {
|
||||
const badge = s.source_type === 'multichannel' ? ' [multichannel]' : ' [mono]';
|
||||
return `<option value="${s.id}"${s.id === selectedId ? ' selected' : ''}>${escapeHtml(s.name)}${badge}</option>`;
|
||||
}).join('');
|
||||
}
|
||||
|
||||
// ── Adaptive helpers ──────────────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user