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() {
_playNext();
});
navigator.mediaSession.setActionHandler("seekto", function(e) {
_seekTo(e.seekTime);
});
}
if (_pendingTrackParameters != null) {
@@ -81,16 +84,10 @@ LMS.mediaplayer = function () {
if (_elems.audio.paused) {
_elems.playpause.firstElementChild.classList.remove(pauseClass);
_elems.playpause.firstElementChild.classList.add(playClass);
if ("mediaSession" in navigator) {
navigator.mediaSession.playbackState = "paused";
}
}
else {
_elems.playpause.firstElementChild.classList.remove(playClass);
_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);
}
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) {
_root = root;
@@ -228,34 +265,17 @@ LMS.mediaplayer = function () {
_playNext();
});
_elems.seek.addEventListener("change", function() {
_initAudioCtx();
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;
}
_seekTo(parseInt(_elems.seek.value, 10));
});
_elems.audio.addEventListener("play", _updateControls);
_elems.audio.addEventListener("playing", _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("playing", _startTimer);
_elems.audio.addEventListener("waiting", _stopTimer);