Files
Alfredv2/alfred/app.backup.camera/static/js/alfred-controls.js
T
2026-10-26 00:06:24 +01:00

94 lines
3.9 KiB
JavaScript

/* Réglages volume/gain dans la fenêtre, mute micro + haut-parleur dans la barre haute. */
(() => {
'use strict';
const panel = document.getElementById('audioSettingsPanel');
const button = document.getElementById('audioSettingsButton');
const close = document.getElementById('closeAudioSettings');
const speaker = document.getElementById('speakerMuteQuick');
const mic = document.getElementById('micMute');
const volume = document.getElementById('volumeSlider');
const volumeValue = document.getElementById('volumeValue');
const gain = document.getElementById('micGainSlider');
const gainValue = document.getElementById('micGainValue');
const message = document.getElementById('audioSettingsMessage');
let settings = { volume:70, mic_gain:null, speaker_muted:false, mic_muted:false };
let volumeTimer, gainTimer;
function render() {
volume.value = settings.volume;
volumeValue.textContent = `${settings.volume} %`;
gain.disabled = !Number.isFinite(settings.mic_gain);
if (!gain.disabled) gain.value = settings.mic_gain;
gainValue.textContent = gain.disabled ? 'N/D' : `${settings.mic_gain} %`;
speaker.setAttribute('aria-pressed', String(settings.speaker_muted));
speaker.setAttribute('aria-label', settings.speaker_muted ? 'Réactiver le son' : 'Couper le son');
speaker.title = speaker.getAttribute('aria-label');
mic.setAttribute('aria-pressed', String(settings.mic_muted));
mic.setAttribute('aria-label', settings.mic_muted ? 'Réactiver le microphone' : 'Couper le microphone');
mic.title = mic.getAttribute('aria-label');
}
async function update(changes) {
message.textContent = '';
try {
const response = await fetch('/api/audio/settings', {
method:'POST',
headers:{'Content-Type':'application/json'},
body:JSON.stringify(changes)
});
const data = await response.json();
if (!response.ok) throw new Error(data.error || `HTTP ${response.status}`);
settings = { ...settings, ...data };
render();
} catch (err) {
message.textContent = `Impossible de modifier le réglage : ${err.message}`;
console.warn('[ALFRED AUDIO]', err);
await refresh();
}
}
async function refresh() {
try {
const response = await fetch('/api/audio/settings', {cache:'no-store'});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
settings = { ...settings, ...await response.json() };
render();
} catch (err) {
message.textContent = 'Réglages indisponibles.';
console.warn('[ALFRED AUDIO]', err);
}
}
function setOpen(open) {
panel.hidden = !open;
button.setAttribute('aria-expanded', String(open));
if (open) { refresh(); close.focus(); } else { button.focus(); }
}
button.addEventListener('click', () => setOpen(panel.hidden));
close.addEventListener('click', () => setOpen(false));
document.addEventListener('pointerdown', e => {
if (!panel.hidden && !panel.contains(e.target) && !button.contains(e.target)) {
panel.hidden = true; button.setAttribute('aria-expanded', 'false');
}
});
document.addEventListener('keydown', e => { if (e.key === 'Escape' && !panel.hidden) setOpen(false); });
volume.addEventListener('input', () => {
settings.volume = Number(volume.value); render();
clearTimeout(volumeTimer);
volumeTimer = setTimeout(() => update({volume:Number(volume.value)}), 220);
});
gain.addEventListener('input', () => {
settings.mic_gain = Number(gain.value); render();
clearTimeout(gainTimer);
gainTimer = setTimeout(() => update({mic_gain:Number(gain.value)}), 250);
});
speaker.addEventListener('click', () => update({speaker_muted:!settings.speaker_muted}));
mic.addEventListener('click', () => update({mic_muted:!settings.mic_muted}));
if (window.alfredSocket) window.alfredSocket.on('audio_settings', data => {
settings = {...settings, ...data}; render();
});
render(); refresh();
})();