Skip to content

Commit 8c80aea

Browse files
committed
v2.0.2
1 parent e5f3429 commit 8c80aea

8 files changed

+80
-57
lines changed

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
## 2.0.2 (December 4, 2016)
2+
- `FIXED` Wait to begin playback until AudioContext has resumed ([#643](https://github.com/goldfire/howler.js/issues/643)).
3+
- `FIXED` Run `noAudio` check on initial setup instead of waiting for first `Howl` ([#619](https://github.com/goldfire/howler.js/issues/619)).
4+
- `FIXED` Add `play` event to start of queue when `autoplay` is used ([#659](https://github.com/goldfire/howler.js/issues/659)).
5+
- `FIXED` Make sure `seek` and `duration` are always >= 0 to prevent errors ([#682](https://github.com/goldfire/howler.js/pull/652)).
6+
- `FIXED` Audio test wouldn't work in IE11 Enhanced Security Mode ([#631](https://github.com/goldfire/howler.js/pull/631)).
7+
- `FIXED` Ensure AudioContext exists on `unload` ([#646](https://github.com/goldfire/howler.js/pull/646)).
8+
- `FIXED` Always fire pause event even if sound is already paused ([#639](https://github.com/goldfire/howler.js/issues/639)).
9+
110
## 2.0.1 (October 14, 2016)
211
- `ADDED` Support for FLAC audio files.
312
- `FIXED` Improve fading performance when short fade times are used ([#621](https://github.com/goldfire/howler.js/issues/621)).

dist/howler.core.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/howler.js

Lines changed: 63 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*!
2-
* howler.js v2.0.1
2+
* howler.js v2.0.2
33
* howlerjs.com
44
*
55
* (c) 2013-2016, James Simpson of GoldFire Studios
@@ -155,7 +155,7 @@
155155
}
156156

157157
// Create a new AudioContext to make sure it is fully reset.
158-
if (self.usingWebAudio && typeof self.ctx.close !== 'undefined') {
158+
if (self.usingWebAudio && self.ctx && typeof self.ctx.close !== 'undefined') {
159159
self.ctx.close();
160160
self.ctx = null;
161161
setupAudioContext();
@@ -186,6 +186,33 @@
186186
// Automatically begin the 30-second suspend process
187187
self._autoSuspend();
188188

189+
// Check if audio is available.
190+
if (!self.usingWebAudio) {
191+
// No audio is available on this system if noAudio is set to true.
192+
if (typeof Audio !== 'undefined') {
193+
try {
194+
var test = new Audio();
195+
196+
// Check if the canplaythrough event is available.
197+
if (typeof test.oncanplaythrough === 'undefined') {
198+
self._canPlayEvent = 'canplay';
199+
}
200+
} catch(e) {
201+
self.noAudio = true;
202+
}
203+
} else {
204+
self.noAudio = true;
205+
}
206+
}
207+
208+
// Test to make sure audio isn't disabled in Internet Explorer.
209+
try {
210+
var test = new Audio();
211+
if (test.muted) {
212+
self.noAudio = true;
213+
}
214+
} catch (e) {}
215+
189216
// Check for supported codecs.
190217
if (!self.noAudio) {
191218
self._setupCodecs();
@@ -200,7 +227,14 @@
200227
*/
201228
_setupCodecs: function() {
202229
var self = this || Howler;
203-
var audioTest = (typeof Audio !== 'undefined') ? new Audio() : null;
230+
var audioTest = null;
231+
232+
// Must wrap in a try/catch because IE11 in server mode throws an error.
233+
try {
234+
audioTest = (typeof Audio !== 'undefined') ? new Audio() : null;
235+
} catch (err) {
236+
return self;
237+
}
204238

205239
if (!audioTest || typeof audioTest.canPlayType !== 'function') {
206240
return self;
@@ -363,6 +397,11 @@
363397
self.state = 'resuming';
364398
self.ctx.resume().then(function() {
365399
self.state = 'running';
400+
401+
// Emit to all Howls that the audio has resumed.
402+
for (var i=0; i<self._howls.length; i++) {
403+
self._howls[i]._emit('resume');
404+
}
366405
});
367406

368407
if (self._suspendTimer) {
@@ -444,6 +483,7 @@
444483
self._onvolume = o.onvolume ? [{fn: o.onvolume}] : [];
445484
self._onrate = o.onrate ? [{fn: o.onrate}] : [];
446485
self._onseek = o.onseek ? [{fn: o.onseek}] : [];
486+
self._onresume = [];
447487

448488
// Web Audio or HTML5 Audio?
449489
self._webAudio = Howler.usingWebAudio && !self._html5;
@@ -456,6 +496,16 @@
456496
// Keep track of this Howl group in the global controller.
457497
Howler._howls.push(self);
458498

499+
// If they selected autoplay, add a play event to the load queue.
500+
if (self._autoplay) {
501+
self._queue.push({
502+
event: 'play',
503+
action: function() {
504+
self.play();
505+
}
506+
});
507+
}
508+
459509
// Load the source file unless otherwise specified.
460510
if (self._preload) {
461511
self.load();
@@ -624,8 +674,8 @@
624674
}
625675

626676
// Determine how long to play for and where to start playing.
627-
var seek = sound._seek > 0 ? sound._seek : self._sprite[sprite][0] / 1000;
628-
var duration = ((self._sprite[sprite][0] + self._sprite[sprite][1]) / 1000) - seek;
677+
var seek = Math.max(0, sound._seek > 0 ? sound._seek : self._sprite[sprite][0] / 1000);
678+
var duration = Math.max(0, ((self._sprite[sprite][0] + self._sprite[sprite][1]) / 1000) - seek);
629679
var timeout = (duration * 1000) / Math.abs(sound._rate);
630680

631681
// Update the parameters of the sound
@@ -668,11 +718,12 @@
668718
}
669719
};
670720

671-
if (self._state === 'loaded') {
721+
var isRunning = (Howler.state === 'running');
722+
if (self._state === 'loaded' && isRunning) {
672723
playWebAudio();
673724
} else {
674725
// Wait for the audio to load and then begin playback.
675-
self.once('load', playWebAudio, sound._id);
726+
self.once(isRunning ? 'load' : 'resume', playWebAudio, isRunning ? sound._id : null);
676727

677728
// Cancel the end timer.
678729
self._clearTimer(sound._id);
@@ -779,11 +830,11 @@
779830
sound._node.pause();
780831
}
781832
}
833+
}
782834

783-
// Fire the pause event, unless `true` is passed as the 2nd argument.
784-
if (!arguments[1]) {
785-
self._emit('pause', sound._id);
786-
}
835+
// Fire the pause event, unless `true` is passed as the 2nd argument.
836+
if (!arguments[1]) {
837+
self._emit('pause', sound ? sound._id : null);
787838
}
788839
}
789840

@@ -1948,10 +1999,6 @@
19481999
parent._loadQueue();
19492000
}
19502001

1951-
if (parent._autoplay) {
1952-
parent.play();
1953-
}
1954-
19552002
// Clear the event listener.
19562003
self._node.removeEventListener(Howler._canPlayEvent, self._loadFn, false);
19572004
}
@@ -2069,19 +2116,12 @@
20692116
self._emit('load');
20702117
self._loadQueue();
20712118
}
2072-
2073-
// Begin playback if specified.
2074-
if (self._autoplay) {
2075-
self.play();
2076-
}
20772119
};
20782120

20792121
/**
20802122
* Setup the audio context when available, or switch to HTML5 Audio mode.
20812123
*/
20822124
var setupAudioContext = function() {
2083-
Howler.noAudio = false;
2084-
20852125
// Check if we are using Web Audio and setup the AudioContext if we are.
20862126
try {
20872127
if (typeof AudioContext !== 'undefined') {
@@ -2095,32 +2135,6 @@
20952135
Howler.usingWebAudio = false;
20962136
}
20972137

2098-
if (!Howler.usingWebAudio) {
2099-
// No audio is available on this system if noAudio is set to true.
2100-
if (typeof Audio !== 'undefined') {
2101-
try {
2102-
var test = new Audio();
2103-
2104-
// Check if the canplaythrough event is available.
2105-
if (typeof test.oncanplaythrough === 'undefined') {
2106-
Howler._canPlayEvent = 'canplay';
2107-
}
2108-
} catch(e) {
2109-
Howler.noAudio = true;
2110-
}
2111-
} else {
2112-
Howler.noAudio = true;
2113-
}
2114-
}
2115-
2116-
// Test to make sure audio isn't disabled in Internet Explorer
2117-
try {
2118-
var test = new Audio();
2119-
if (test.muted) {
2120-
Howler.noAudio = true;
2121-
}
2122-
} catch (e) {}
2123-
21242138
// Check if a webview is being used on iOS8 or earlier (rather than the browser).
21252139
// If it is, disable Web Audio as it causes crashing.
21262140
var iOS = (/iP(hone|od|ad)/.test(Howler._navigator && Howler._navigator.platform));
@@ -2178,7 +2192,7 @@
21782192
/*!
21792193
* Spatial Plugin - Adds support for stereo and 3D audio where Web Audio is supported.
21802194
*
2181-
* howler.js v2.0.1
2195+
* howler.js v2.0.2
21822196
* howlerjs.com
21832197
*
21842198
* (c) 2013-2016, James Simpson of GoldFire Studios

dist/howler.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/howler.spatial.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
"uglify-js": "2.x"
2929
},
3030
"main": "dist/howler.js",
31-
"version": "2.0.1",
31+
"version": "2.0.2",
3232
"license": {
3333
"type": "MIT",
3434
"url": "https://raw.githubusercontent.com/goldfire/howler.js/master/LICENSE.md"

src/howler.core.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*!
2-
* howler.js v2.0.1
2+
* howler.js v2.0.2
33
* howlerjs.com
44
*
55
* (c) 2013-2016, James Simpson of GoldFire Studios

src/plugins/howler.spatial.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*!
22
* Spatial Plugin - Adds support for stereo and 3D audio where Web Audio is supported.
33
*
4-
* howler.js v2.0.1
4+
* howler.js v2.0.2
55
* howlerjs.com
66
*
77
* (c) 2013-2016, James Simpson of GoldFire Studios

0 commit comments

Comments
 (0)