Changeset 5e72413 in Klonkt for test/mixtape-ui.test.js


Ignore:
Timestamp:
08/22/2026 11:23:57 AM (2 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
1e194e4, fbacddc
Parents:
c0e463b
Message:

Seek over de hele band (shaer-tmyn, stap 4 en laatste)

De balk TOONDE al de hele band -- de teller rekent sinds c0e463b met de
trackduren -- maar aanklikken seekte binnen het lopende nummer. En de keten
houdt het lopende nummer plus een vooruit, dus op een band van twaalf nummers
reikte die balk in werkelijkheid tot nummer twee. Een balk die belooft wat hij
niet doet is erger dan geen balk.

bandPositie(ratio) rekent de verhouding om naar nummer + positie daarin, met
dezelfde duren als de teller. Ligt het doel in het lopende nummer, dan wordt de
positie gewoon verzet: geen herlaadsprong voor een paar seconden. Ligt het
verderop, dan zet hij pendingSeek en laadt dat nummer -- exact de weg die het
sessieherstel al gebruikt -- met de speelstand mee, zodat springen niet stiekem
start of stopt.

Er valt een hoorbaar gat bij zo'n sprong. Dat hoort bij spoelen naar een plek
die niet in de buffer zit, en het is eerlijker dan een balk die daar nooit komt.

DEZELFDE OMREKENING IS OOK DE ENIGE DIE OP iOS KAN: de blob-motor heeft geen
doorlopende tijdlijn, dus daar bestaat "seek over de keten" niet eens. Nu delen
beide motoren een model in plaats van twee.

Nagemeten op dev, klikken op vijf plekken van de balk (band van 373 s,
nummers van 103, 144 en 126 s):

10% -> 39 s, nummer 1 50% -> 189 s, nummer 2
25% -> 95 s, nummer 1 85% -> 319 s, nummer 3
95% -> 356 s, nummer 3

Steeds twee seconden voor op de verwachting, en dat is het doorspelen tijdens
het meten zelf.

audio-player v39.

Co-Authored-By: Claude Opus 5 <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/mixtape-ui.test.js

    rc0e463b r5e72413  
    245245    'zonder dit las de teller de lengte van wat toevallig gebufferd was');
    246246});
     247
     248test('de balk is in bandmodus de hele band (shaer-tmyn, stap 4)', () => {
     249  const speler = fs.readFileSync('src/assets/js/audio-player.js', 'utf8');
     250
     251  // De omrekening ratio -> nummer + positie erin. Zonder dit seekt de balk
     252  // binnen het lopende nummer, terwijl hij de hele band TOONT: een balk die
     253  // belooft wat hij niet doet is erger dan geen balk.
     254  assert.match(speler, /function bandPositie\(ratio\)/);
     255  assert.match(speler, /const plek = tapeMode \? bandPositie\(ratio\) : null;/);
     256
     257  // Zit het doel in het lopende nummer, dan geen herlaadsprong -- anders hoor
     258  // je een gat bij het verzetten van een paar seconden.
     259  assert.match(speler, /if \(plek\.index === currentIndex\)/);
     260
     261  // En anders langs pendingSeek, dezelfde weg die het sessieherstel gebruikt.
     262  assert.match(speler, /pendingSeek = plek\.binnen;\s*\n\s*loadTrack\(plek\.index, !audio\.paused\);/,
     263    'de speelstand hoort mee te gaan: springen mag niet stiekem starten of stoppen');
     264
     265  // De niet-bandmodus mag hier niets van merken.
     266  assert.match(speler, /if \(useMse\(\) && chain\.length\) \{\s*\n\s*\/\/ Seek within the CURRENT track/,
     267    'het oude gedrag hoort te blijven staan voor een gewone wachtrij');
     268});
Note: See TracChangeset for help on using the changeset viewer.