Media Session API: added seekto + state update (duration/position)

This commit is contained in:
emeric
2024-02-08 20:56:42 +01:00
parent 7d53aba755
commit de4a0cf583
+48 -28
View File
@@ -66,6 +66,9 @@ LMS.mediaplayer = function () {
navigator.mediaSession.setActionHandler("nexttrack", function() { navigator.mediaSession.setActionHandler("nexttrack", function() {
_playNext(); _playNext();
}); });
navigator.mediaSession.setActionHandler("seekto", function(e) {
_seekTo(e.seekTime);
});
} }
if (_pendingTrackParameters != null) { if (_pendingTrackParameters != null) {
@@ -81,16 +84,10 @@ LMS.mediaplayer = function () {
if (_elems.audio.paused) { if (_elems.audio.paused) {
_elems.playpause.firstElementChild.classList.remove(pauseClass); _elems.playpause.firstElementChild.classList.remove(pauseClass);
_elems.playpause.firstElementChild.classList.add(playClass); _elems.playpause.firstElementChild.classList.add(playClass);
if ("mediaSession" in navigator) {
navigator.mediaSession.playbackState = "paused";
}
} }
else { else {
_elems.playpause.firstElementChild.classList.remove(playClass); _elems.playpause.firstElementChild.classList.remove(playClass);
_elems.playpause.firstElementChild.classList.add(pauseClass); _elems.playpause.firstElementChild.classList.add(pauseClass);
if ("mediaSession" in navigator) {
navigator.mediaSession.playbackState = "playing";
}
} }
} }
@@ -202,6 +199,46 @@ LMS.mediaplayer = function () {
_gainNode.gain.value = Math.pow(10, (_settings.replayGain.preAmpGain + replayGain) / 20); _gainNode.gain.value = Math.pow(10, (_settings.replayGain.preAmpGain + replayGain) / 20);
} }
let _seekTo = function(seekTime) {
_initAudioCtx();
let mode = _getAudioMode();
if (!mode)
return;
switch (mode) {
case Mode.Transcoding:
_offset = seekTime;
_removeAudioSources();
_addAudioSource(_audioTranscodingSrc + "&offset=" + _offset);
_elems.audio.load();
_elems.audio.currentTime = 0;
_playTrack();
break;
case Mode.File:
_elems.audio.currentTime = seekTime;
_playTrack();
break;
}
_updateMediaSessionState();
}
let _updateMediaSessionState = function() {
if ("mediaSession" in navigator) {
navigator.mediaSession.setPositionState({
duration: _duration,
playbackRate: 1,
position: _offset + _elems.audio.currentTime,
});
if (_elems.audio.paused)
navigator.mediaSession.playbackState = "paused";
else
navigator.mediaSession.playbackState = "playing";
}
}
let init = function(root, defaultSettings) { let init = function(root, defaultSettings) {
_root = root; _root = root;
@@ -228,34 +265,17 @@ LMS.mediaplayer = function () {
_playNext(); _playNext();
}); });
_elems.seek.addEventListener("change", function() { _elems.seek.addEventListener("change", function() {
_initAudioCtx(); _seekTo(parseInt(_elems.seek.value, 10));
let mode = _getAudioMode();
if (!mode)
return;
let selectedOffset = parseInt(_elems.seek.value, 10);
switch (mode) {
case Mode.Transcoding:
_offset = selectedOffset;
_removeAudioSources();
_addAudioSource(_audioTranscodingSrc + "&offset=" + _offset);
_elems.audio.load();
_elems.audio.currentTime = 0;
_playTrack();
break;
case Mode.File:
_elems.audio.currentTime = selectedOffset;
_playTrack();
break;
}
}); });
_elems.audio.addEventListener("play", _updateControls); _elems.audio.addEventListener("play", _updateControls);
_elems.audio.addEventListener("playing", _updateControls); _elems.audio.addEventListener("playing", _updateControls);
_elems.audio.addEventListener("pause", _updateControls); _elems.audio.addEventListener("pause", _updateControls);
_elems.audio.addEventListener("play", _updateMediaSessionState);
_elems.audio.addEventListener("playing", _updateMediaSessionState);
_elems.audio.addEventListener("pause", _updateMediaSessionState);
_elems.audio.addEventListener("pause", _stopTimer); _elems.audio.addEventListener("pause", _stopTimer);
_elems.audio.addEventListener("playing", _startTimer); _elems.audio.addEventListener("playing", _startTimer);
_elems.audio.addEventListener("waiting", _stopTimer); _elems.audio.addEventListener("waiting", _stopTimer);