-
Notifications
You must be signed in to change notification settings - Fork 27
/
audio.js
125 lines (114 loc) · 4.57 KB
/
audio.js
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
Crafty.extend({
audio:{
sounds:{},
supported:{},
codecs :{ // Chart from jPlayer
ogg: 'audio/ogg; codecs="vorbis"', //OGG
wav: 'audio/wav; codecs="1"', // PCM
webma: 'audio/webm; codecs="vorbis"',// WEBM
mp3: 'audio/mpeg; codecs="mp3"', //MP3
m4a: 'audio/mp4; codecs="mp4a.40.2"'// AAC / MP4
},
volume:1, //Global Volume
muted:false,
canPlay:function(){
var audio = this.audioElement(),canplay;
for(var i in this.codecs){
canplay = audio.canPlayType(this.codecs[i]);
if(canplay !== "" && canplay !== "no"){
this.supported[i] = true;
}else{
this.supported[i] = false;
}
}
},
audioElement:function(){
//IE does not support Audio Object
return typeof Audio !== 'undefined' ? new Audio() : document.createElement('audio');
},
add:function(id,url){
Crafty.support.audio = !!this.audioElement().canPlayType; //Setup audio support
if (!Crafty.support.audio) return;
this.canPlay(); //Setup supported Extensions
var audio,source,ext,path;
if(arguments.length === 1 && typeof id === "object"){
for(var i in id){
for(var src in id[i]){
audio = this.audioElement();
audio.id = i;
audio.preload = "auto";
audio.volume = Crafty.audio.volume;
path = id[i][src];
ext = path.substr(path.lastIndexOf('.') + 1).toLowerCase();
if(this.supported[ext]){
audio.src = path;
if (!Crafty.assets[path]) Crafty.assets[path] = audio;
this.sounds[i] = {
obj:audio,
played:0
}
}
}
}
}
if(typeof id === "string"){
audio = this.audioElement();
audio.id = id;
audio.preload = "auto";
audio.volume = Crafty.audio.volume;
ext = url.substr(url.lastIndexOf('.') + 1).toLowerCase();
if(typeof url === "string" && this.supported[ext]){
audio.src = url;
if (!Crafty.assets[url]) Crafty.assets[url] = audio;
}
if(typeof url === "object"){
for(src in url){
path = url[src];
ext = path.substr(path.lastIndexOf('.') + 1).toLowerCase();
source = document.createElement('source');
source.src = path;
source.type=this.srcType[ext];
audio.appendChild(source);
if (!Crafty.assets[path]) Crafty.assets[path] = audio;
}
}
this.sounds[id] = {
obj:audio,
played:0
}
}
},
play:function(id,repeat,volume){
if(repeat == 0 || !Crafty.support.audio || !this.sounds[id]) return;
var s = this.sounds[id];
s.obj.volume = Crafty.audio.volume || volume;
if(s.obj.currentTime) s.obj.currentTime = 0;
s.obj.play();
s.played ++;
s.obj.onended = function(){
if(s.played < repeat || repeat == -1){
if(this.currentTime) this.currentTime = 0;
this.play();
s.played ++;
}
};
},
mute:function(){
var s;
if(!this.muted){
for(var i in this.sounds){
s = this.sounds[i];
s.obj.pause();
}
this.muted = true;
}else{
for(var i in this.sounds){
s = this.sounds[i];
if(s.obj.currentTime && s.obj.currentTime > 0)
this.sounds[i].obj.play();
}
this.muted = false;
}
}
}
});