App-MHFS
view release on metacpan or search on metacpan
share/public_html/static/music_inc/music_inc_module.js view on Meta::CPAN
return;
}
NWDRFLAC = nwdrflac;
track.duration = nwdrflac.totalPCMFrameCount / nwdrflac.sampleRate;
track.sampleRate = nwdrflac.sampleRate;
}
catch(error) {
console.error(error);
if(mysignal.aborted) {
console.log('open aborted catch');
unlock();
return;
}
failedtimes++;
console.log('Encountered error OPEN');
if(failedtimes == 2) {
console.log('Encountered error twice, advancing to next track');
continue TRACKLOOP;
}
}
}
// queue the track
let dectime = 0;
if(time) {
dectime = Math.floor(time * NWDRFLAC.sampleRate);
time = 0;
}
let isStart = true;
while(dectime < NWDRFLAC.totalPCMFrameCount) {
let todec = Math.min(NWDRFLAC.sampleRate, NWDRFLAC.totalPCMFrameCount - dectime);
// if plenty of audio is queued. Don't download yet
let todecsecs = todec / NWDRFLAC.sampleRate;
const nextendtime = function(){
return (AQ_unqueuedTime()+todecsecs);
};
console.log('nextendtime ' + nextendtime() + ' curdecsecs ' + todecsecs);
while(nextendtime() > AQMaxDecodedTime) {
let mssleep = (nextendtime() - AQMaxDecodedTime) * 1000;
await abortablesleep(mssleep, mysignal);
if(mysignal.aborted) {
console.log('handling aborted sleep');
unlock();
return;
}
}
// decode
let buffer;
for(let failedcount = 0;!buffer;) {
try {
buffer = await NWDRFLAC.read_pcm_frames_to_AudioBuffer(dectime, todec, mysignal, MainAudioContext);
if(mysignal.aborted) {
console.log('aborted decodeaudiodata success');
unlock();
return;
}
if(buffer.duration !== (todec / NWDRFLAC.sampleRate)) {
buffer = null;
throw('network error? buffer wrong length');
}
}
catch(error) {
console.error(error);
if(mysignal.aborted) {
console.log('aborted read_pcm_frames decodeaudiodata catch');
unlock();
return;
}
failedcount++;
if(failedcount == 2) {
console.log('Encountered error twice, advancing to next track');
// assume it's corrupted. force free it
await NWDRFLAC.close();
NWDRFLAC = null;
continue TRACKLOOP;
}
}
}
// Add to the audio queue
let aqItem = { 'buffer' : buffer, 'duration' : todec, 'aqid' : AQID, 'skiptime' : (dectime / NWDRFLAC.sampleRate), 'track' : track, 'playbackinfo' : {}, 'timers' : []};
// At start and end track update the GUI
let isEnd = ((dectime+todec) === NWDRFLAC.totalPCMFrameCount);
if(isStart || isEnd) {
aqItem.func = function(startTime, endTime) {
if(isStart) {
console.log('aqid: ' + aqItem.aqid + ' start timer at ' + startTime + ' currentTime ' + MainAudioContext.currentTime);
aqItem.timers.push({'time': startTime, 'func': function() {
seekbar.min = 0;
seekbar.max = track.duration;
SetEndtimeText(track.duration);
SetPlayText(track.trackname);
let prevtext = track.prev ? track.prev.trackname : '';
SetPrevText(prevtext);
let nexttext = track.next ? track.next.trackname : '';
SetNextText(nexttext);
}});
isStart = false;
}
if(isEnd) {
console.log('aqid: ' + aqItem.aqid + ' end timer at ' + endTime + ' currentTime ' + MainAudioContext.currentTime);
aqItem.timers.push({'time': endTime, 'func': function(){
let curTime = 0;
SetEndtimeText(0);
SetCurtimeText(curTime);
SetSeekbarValue(curTime);
SetPrevText(track.trackname);
SetPlayText('');
SetNextText('');
}});
}
}
}
AudioQueue.push(aqItem);
dectime += todec;
}
}
unlock();
}
( run in 1.187 second using v1.01-cache-2.11-cpan-99c4e6809bf )