var PlayList=function(el){
var playList= el,
files={},
list=[],
loops=4,
status = {
playing : false,
current : 0,
currentLoop : 0
},
audioBuffer = null;
window.AudioContext = window.AudioContext || window.webkitAudioContext;
var context = new AudioContext();
function addItem(data){
list.push(data.url);
playList.innerHTML+='
'+
data.url+
'';
if(!status.playing)
play(data.url);
}
function play(data){
audioBuffer = context.createBufferSource();
audioBuffer.buffer=(typeof data=='string')?
(
function(){
status.currentLoop=0;
return files[data];
}
)():data;
audioBuffer.connect(context.destination);
status.playing=true;
audioBuffer.start(0);
audioBuffer.onended=function(){
status.currentLoop++;
if(status.currentLoop>=loops){
status.playing=false;
next();
return;
}
play(this.buffer);
}
}
function next(){
var count = list.length;
status.current++;
if(status.current>=count)
status.current=0;
if(!status.playing)
play(list[status.current]);
}
function recievedAudio(data){
if(files[data.url]){
data.file=null;
addItem(data);
return;
}
var audioBinary=Base64Binary.decodeArrayBuffer(data.file);
context.decodeAudioData(
audioBinary,
function(buffer) {
files[data.url]=buffer;
data.file=null;
addItem(data);
}
);
}
return {
add : addItem,
is : status,
on : {
add:recievedAudio
}
}
}