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() {
|
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);
|
||||||
|
|||||||
Reference in New Issue
Block a user