Faster and flash-like MP3 trimmmer

serial
William Toohey 10 years ago
parent 90fec6c208
commit d7844fa08b
  1. 39
      audioUtils.js

@ -1,3 +1,6 @@
var LAME_DELAY_START = 2258;
var LAME_DELAY_END = 1000;
// callback is given a populated song object // callback is given a populated song object
function loadSong(song, callback) { function loadSong(song, callback) {
if(song.buffer) { if(song.buffer) {
@ -25,9 +28,9 @@ function loadAudioFile(song, isBuild, callback) {
req.response, req.response,
function(buffer) { function(buffer) {
if(isBuild) { if(isBuild) {
song.tmpBuf.build = trimSilence(buffer); song.tmpBuf.build = trimMP3(buffer);
} else { } else {
song.tmpBuf.loop = trimSilence(buffer); song.tmpBuf.loop = trimMP3(buffer);
} }
onSongLoad(song, callback); onSongLoad(song, callback);
}, },
@ -58,39 +61,13 @@ function onSongLoad(song, callback) {
} }
// because MP3 is bad // because MP3 is bad
function trimSilence(buffer) { function trimMP3(buffer) {
// how much silence we have var ret = audio.context.createBuffer(buffer.numberOfChannels, buffer.length - LAME_DELAY_START - LAME_DELAY_END, buffer.sampleRate);
var minSilence = buffer.length;
var maxSilence = 0;
for(var i=0; i<buffer.numberOfChannels; i++) {
var tmp = buffer.getChannelData(i);
for(var j=0; j < tmp.length; j++) {
// end of silence
if(tmp[j] != 0) {
if(j < minSilence) {
minSilence = j;
}
break;
}
}
// because just padding 1 end isn't enough for this codec
for(var j=tmp.length-1; j >= 0 ; j--) {
if(tmp[j] != 0) {
if(j > maxSilence) {
maxSilence = j;
}
break;
}
}
}
// 1152 = one frame, makes the sync better because ID3 tags
// take up that space or some garbage
var ret = audio.context.createBuffer(buffer.numberOfChannels, maxSilence-minSilence-1152, buffer.sampleRate);
for(var i=0; i<buffer.numberOfChannels; i++) { for(var i=0; i<buffer.numberOfChannels; i++) {
var oldBuf = buffer.getChannelData(i); var oldBuf = buffer.getChannelData(i);
var newBuf = ret.getChannelData(i); var newBuf = ret.getChannelData(i);
for(var j=0; j<ret.length; j++) { for(var j=0; j<ret.length; j++) {
newBuf[j] = oldBuf[minSilence + j + 1152]; newBuf[j] = oldBuf[LAME_DELAY_START + j];
} }
} }

Loading…
Cancel
Save