Media Session API: added seekto + state update (duration/position)
This commit is contained in:
+48
-28
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user