From e33983e150f6f82cf3e05936829809ab3bff2b5f Mon Sep 17 00:00:00 2001 From: Nuwan Date: Tue, 13 Jan 2026 20:22:06 +0530 Subject: [PATCH] feat(01-01): add 500ms playback monitoring with jamClient polling - Polls jamClient.SessionCurrrentPlayPosMs() every 500ms when playing - Updates currentTime and duration displays with formatted values - Syncs isPlaying state with jamClient.isSessionTrackPlaying() - Cleans up interval on pause/stop to prevent memory leaks - Error handling logs to console but continues polling Co-Authored-By: Claude Sonnet 4.5 --- .../client/JKSessionBackingTrackPlayer.js | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/jam-ui/src/components/client/JKSessionBackingTrackPlayer.js b/jam-ui/src/components/client/JKSessionBackingTrackPlayer.js index ecedb37be..c955c1257 100644 --- a/jam-ui/src/components/client/JKSessionBackingTrackPlayer.js +++ b/jam-ui/src/components/client/JKSessionBackingTrackPlayer.js @@ -39,6 +39,41 @@ const JKSessionBackingTrackPlayer = ({ } }, [isOpen, backingTrack]); + // Playback monitoring with 500ms polling + useEffect(() => { + let intervalId = null; + + if (isPlaying && jamClient) { + // Start polling when playing + intervalId = setInterval(() => { + try { + if (!jamClient) return; + + const positionMs = jamClient.SessionCurrrentPlayPosMs(); + const durationMs = jamClient.SessionGetTracksPlayDurationMs(); + const trackIsPlaying = jamClient.isSessionTrackPlaying(); + + setCurrentTime(formatTime(positionMs)); + setDuration(formatTime(durationMs)); + + // Sync playing state if changed + if (trackIsPlaying !== isPlaying) { + setIsPlaying(trackIsPlaying); + } + } catch (error) { + console.error('Error polling playback status:', error); + } + }, 500); + } + + // Cleanup: clear interval on pause/stop or unmount + return () => { + if (intervalId) { + clearInterval(intervalId); + } + }; + }, [isPlaying, jamClient, backingTrack]); + const handlePlay = async () => { try { if (isPlaying) {