summaryrefslogtreecommitdiff
path: root/view/poc/class/playList.js
blob: b161ce865dc04a3b822593b52fc0f17e34dc31dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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+='<li>'+
            data.url+
        '</li>';
        
        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
        }
    }
}