better isNaN + fade + fix preload seek:

* use Number.isFinite or shim it, rejecting strings
* fade-in/out was too quick on volumes < 100%
* fades (especially -out) was too slow on chrome
* seek to start if playing into the previously played file
* and let π raise if it wants to
This commit is contained in:
ed 2022-08-29 19:23:23 +02:00
parent 993213e2c0
commit 27f08cdbfa
3 changed files with 26 additions and 13 deletions

View file

@ -1287,7 +1287,7 @@ function MPlayer() {
r.ftimer = null;
r.fade_in = function () {
r.fvol = 0;
r.fdir = 0.025;
r.fdir = 0.025 * r.vol * (CHROME ? 1.5 : 1);
if (r.au) {
r.ftid = r.au.tid;
r.au.play();
@ -1297,7 +1297,7 @@ function MPlayer() {
};
r.fade_out = function () {
r.fvol = r.vol;
r.fdir = -0.05;
r.fdir = -0.05 * r.vol * (CHROME ? 2 : 1);
r.ftid = r.au.tid;
fader();
};
@ -1312,14 +1312,14 @@ function MPlayer() {
return;
var done = true;
r.fvol += r.fdir;
r.fvol += r.fdir / (r.fdir < 0 && r.fvol < r.vol / 4 ? 2 : 1);
if (r.fvol < 0) {
r.fvol = 0;
r.au.pause();
mpl.pp();
var t = mp.au.currentTime - 0.8;
if (isFinite(t))
if (isNum(t))
mp.au.currentTime = Math.max(t, 0);
}
else if (r.fvol > r.vol)
@ -1569,7 +1569,7 @@ var pbar = (function () {
pctx.clearRect(0, 0, pc.w, pc.h);
if (!mp || !mp.au || isNaN(adur = mp.au.duration) || isNaN(apos = mp.au.currentTime) || apos < 0 || adur < apos)
if (!mp || !mp.au || !isNum(adur = mp.au.duration) || !isNum(apos = mp.au.currentTime) || apos < 0 || adur < apos)
return; // not-init || unsupp-codec
var sm = bc.w * 1.0 / adur,
@ -1724,7 +1724,7 @@ function seek_au_sec(seek) {
return;
console.log('seek: ' + seek);
if (!isFinite(seek))
if (!isNum(seek))
return;
mp.au.currentTime = seek;
@ -2108,7 +2108,7 @@ var audio_eq = (function () {
vs = that.value,
v = parseFloat(vs);
if (isNaN(v) || v + '' != vs)
if (!isNum(v) || v + '' != vs)
throw new Error('inval band');
if (sb == 'amp')
@ -2251,6 +2251,9 @@ function play(tid, is_ev, seek) {
mp.au.onprogress = pbar.drawpos;
mp.au.onplaying = mpui.progress_updater;
mp.au.onended = next_song;
t = mp.au.currentTime;
if (isNum(t) && t > 0.1)
mp.au.currentTime = 0;
}
else
mp.au.src = mp.au.rsrc = url;
@ -5054,7 +5057,7 @@ var treectl = (function () {
function scaletree(e) {
ev(e);
treesz += parseInt(this.getAttribute("step"));
if (isNaN(treesz))
if (!isNum(treesz))
treesz = 16;
treesz = clamp(treesz, 2, 120);

View file

@ -2106,7 +2106,7 @@ function up2k_init(subtle) {
spd2 = (t.size / ((t.t_uploaded - t.t_uploading) / 1000.)) / (1024 * 1024.);
pvis.seth(t.n, 2, 'hash {0}, up {1} MB/s'.format(
f2f(spd1, 2), isNaN(spd2) ? '--' : f2f(spd2, 2)));
f2f(spd1, 2), !isNum(spd2) ? '--' : f2f(spd2, 2)));
pvis.move(t.n, 'ok');
if (!pvis.ctr.bz && !pvis.ctr.q)

View file

@ -108,7 +108,7 @@ catch (ex) {
console.log = console.stdlog;
console.log('console capture failed', ex);
}
var crashed = false, ignexd = {};
var crashed = false, ignexd = {}, evalex_fatal = false;
function vis_exh(msg, url, lineNo, columnNo, error) {
if ((msg + '').indexOf('ResizeObserver') + 1)
return; // chrome issue 809574 (benign, from <video>)
@ -119,7 +119,7 @@ function vis_exh(msg, url, lineNo, columnNo, error) {
if (!/\.js($|\?)/.exec('' + url))
return; // chrome debugger
if ((url + '').indexOf(' > eval') + 1)
if ((url + '').indexOf(' > eval') + 1 && !evalex_fatal)
return; // md timer
var ekey = url + '\n' + lineNo + '\n' + msg;
@ -649,6 +649,14 @@ function s2ms(s) {
}
var isNum = function (v) {
var n = parseFloat(v);
return !isNaN(v - n) && n === v;
};
if (window.Number)
isNum = Number.isFinite;
function f2f(val, nd) {
// 10.toFixed(1) returns 10.00 for certain values of 10
val = (val * Math.pow(10, nd)).toFixed(0).split('.')[0];
@ -1406,8 +1414,10 @@ function repl(e) {
if (!cmd)
return toast.inf(3, 'eval aborted');
if (cmd.startsWith(','))
return modal.alert(esc(eval(cmd.slice(1)) + ''))
if (cmd.startsWith(',')) {
evalex_fatal = true;
return modal.alert(esc(eval(cmd.slice(1)) + ''));
}
try {
modal.alert(esc(eval(cmd) + ''));