App-MHFS

 view release on metacpan or  search on metacpan

share/public_html/static/music_worklet_inprogress/player/mhfsplayer.js  view on Meta::CPAN

import { MHFSCLDecoder } from '../decoder/mhfscl.js'
import { Float32AudioRingBufferWriter, Float32AudioRingBufferReader } from './AudioWriterReader.js'

let CDIMAGE;

// FIFO mutex
class Mutex {
    constructor() {
      this._locking = Promise.resolve();
      this._locked = false;
    }
  
    isLocked() {
      return this._locked;
    }
  
    lock() {
      this._locked = true;
      let unlockNext;
      let willLock = new Promise(resolve => unlockNext = resolve);
      willLock.then(() => this._locked = false);
      let willUnlock = this._locking.then(() => unlockNext);
      this._locking = this._locking.then(() => willLock);
      return willUnlock;
    }
}

const abortablesleep = (ms, signal) => new Promise(function(resolve) {
    const onTimerDone = function() {
        resolve();
        signal.removeEventListener('abort', stoptimer);
    };
    let timer = setTimeout(function() {
        //console.log('sleep done ' + ms);
        onTimerDone();
    }, ms);

    const stoptimer = function() {
        console.log('aborted sleep');            
        onTimerDone();
        clearTimeout(timer);            
    };
    signal.addEventListener('abort', stoptimer);
});

const abortablesleep_status = async function (ms, signal) {
    await abortablesleep(ms, signal);
    if(signal.aborted) {
        return false;
    }
    return true;
}

/*
const TrackQueue = function(starttrack, time) {
    let that = {};

    // store the tail so we don't have to search for it
    that.tail = starttrack;
    for(; that.tail.next; that.tail = that.tail.next);

    const waitForTrack = function() {
        const _waitfortrack = new Promise((resolve) => {
            that.ontrackadded = resolve;
        });
        return _waitfortrack;
    };

    that._FAQ = async function(track, time) {
        if(!track) {
            track = await waitForTrack(); 
        }       
    };

    that.push = function(track) {
        that.tail.next = track;
        that.tail = track;
        track.prev = that.tail;
        // resume FAQ
        if(that.ontrackadded) {
            that.ontrackadded(track);
            that.ontrackadded = null;
        }                
    };

    that.stop() = function (){

    };

    that.onrepeattrackturnedon = function() {
        // determine the currently queuing track
        // stop decodes after it
        // delete after it
    };

    that.onrepeattrackturnedoff = function() {
        // stop decodes of not AQ[0]
        // delete after AQ[0]
    };

    that._FAQ(starttrack, time);
    return that;
};



( run in 2.762 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )