diff --git a/media_server/routes/media.py b/media_server/routes/media.py index c5afdf7..ef99f7c 100644 --- a/media_server/routes/media.py +++ b/media_server/routes/media.py @@ -309,6 +309,12 @@ async def websocket_endpoint( "type": "status", "data": status_data.model_dump(), }) + elif data.get("type") == "volume": + # Low-latency volume control via WebSocket + volume = data.get("volume") + if volume is not None: + controller = get_media_controller() + await controller.set_volume(int(volume)) except WebSocketDisconnect: await ws_manager.disconnect(websocket) diff --git a/media_server/static/js/app.js b/media_server/static/js/app.js index 19a1066..86cf907 100644 --- a/media_server/static/js/app.js +++ b/media_server/static/js/app.js @@ -236,14 +236,14 @@ const volume = parseInt(e.target.value); document.getElementById('volume-display').textContent = `${volume}%`; - // Throttle volume updates while dragging (update every 50ms) + // Throttle volume updates while dragging (update every 16ms via WebSocket) if (volumeUpdateTimer) { clearTimeout(volumeUpdateTimer); } volumeUpdateTimer = setTimeout(() => { setVolume(volume); volumeUpdateTimer = null; - }, 50); + }, 16); }); volumeSlider.addEventListener('change', (e) => { @@ -302,14 +302,14 @@ document.getElementById('volume-display').textContent = `${volume}%`; document.getElementById('volume-slider').value = volume; - // Throttle volume updates while dragging + // Throttle volume updates while dragging (update every 16ms via WebSocket) if (volumeUpdateTimer) { clearTimeout(volumeUpdateTimer); } volumeUpdateTimer = setTimeout(() => { setVolume(volume); volumeUpdateTimer = null; - }, 50); + }, 16); }); miniVolumeSlider.addEventListener('change', (e) => { @@ -697,7 +697,12 @@ } function setVolume(volume) { - sendCommand('volume', { volume: volume }); + // Use WebSocket for low-latency volume updates + if (ws && ws.readyState === WebSocket.OPEN) { + ws.send(JSON.stringify({ type: 'volume', volume: volume })); + } else { + sendCommand('volume', { volume: volume }); + } } function toggleMute() {