This commit is contained in:
El-yazide MOHAMED 2025-06-07 07:00:55 +02:00
parent 3b7b46f25b
commit 533cd1052e

View File

@ -11,6 +11,8 @@ const loopBtn = document.getElementById('loop');
// 2. Variables utiles
let isPlaying = false;
let isLooping = false;
let idleTimeout = null;
let reverseInterval = null;
// 3. Variables pour calculer la vitesse de rotation
let lastPosition = null;
@ -24,24 +26,37 @@ socket.on('position', (position) => {
if (lastPosition !== null && lastTime !== null) {
const deltaPos = position - lastPosition;
const deltaTime = (now - lastTime) / 1000; // en secondes
const deltaTime = (now - lastTime) / 1000;
const speed = deltaPos / deltaTime; // ticks par seconde
const speed = deltaPos / deltaTime;
console.log('instant speed:', speed);
// Seuil minimal pour stopper la lecture si la balle ne tourne plus
clearTimeout(idleTimeout);
if (Math.abs(speed) < 2) {
controlPlayback(0); // stop
stopPlayback();
} else {
// Mappe la vitesse vers une valeur de lecture entre 0.5 et 2
let playbackSpeed = 1 + speed * 0.01; // facteur à ajuster selon ton encoder
playbackSpeed = Math.max(0.5, Math.min(2, playbackSpeed));
controlPlayback(playbackSpeed);
const isReverse = speed < 0;
// Simuler reverse
if (isReverse) {
simulateReverse(Math.abs(speed));
} else {
stopReverse();
let playbackSpeed = 1 + speed * 0.01;
playbackSpeed = Math.max(0.5, Math.min(2, playbackSpeed));
controlPlayback(playbackSpeed);
}
}
}
lastPosition = position;
lastTime = now;
// Détecter l'inactivité : si pas de mise à jour pendant 300ms → stop
idleTimeout = setTimeout(() => {
stopPlayback();
}, 300);
});
// 5. Fonctions
@ -77,7 +92,9 @@ function setProgress(e) {
}
// Fonction pour régler la lecture selon la vitesse
function controlPlayback(speed) {
stopReverse(); // On stoppe le reverse si actif
if (speed > 0) {
if (!isPlaying) {
audio.play();
@ -85,13 +102,42 @@ function controlPlayback(speed) {
isPlaying = true;
}
audio.playbackRate = speed;
} else {
if (isPlaying) {
audio.pause();
vinyl.style.animationPlayState = 'paused';
isPlaying = false;
}
}
function stopPlayback() {
audio.pause();
vinyl.style.animationPlayState = 'paused';
isPlaying = false;
}
function simulateReverse(speed) {
// vitesse = ticks/sec → convertir en vitesse de recul
const reverseSpeed = Math.min(speed * 0.01, 2); // seconds per step
if (!reverseInterval) {
reverseInterval = setInterval(() => {
if (audio.currentTime > 0.05) {
audio.currentTime -= reverseSpeed * 0.1;
vinyl.style.animationPlayState = 'running';
} else {
stopPlayback();
}
}, 100);
if (!isPlaying) {
isPlaying = true;
}
}
audio.pause(); // on met en pause le vrai son pour éviter conflit
}
function stopReverse() {
if (reverseInterval) {
clearInterval(reverseInterval);
reverseInterval = null;
}
}
// 6. Événements