|
993 | 993 | };
|
994 | 994 | node.addEventListener(Howler._canPlayEvent, listener, false);
|
995 | 995 |
|
| 996 | + // the node is not actually playing (has received suspend event & NETWORK_IDLE) |
| 997 | + if (node.networkState === 1 && node._wasSuspended) { |
| 998 | + console.log('wake up suspended audio node') |
| 999 | + node.play() |
| 1000 | + } |
| 1001 | + |
996 | 1002 | // Cancel the end timer.
|
997 | 1003 | self._clearTimer(sound._id);
|
998 | 1004 | }
|
|
1763 | 1769 | // Remove any event listeners.
|
1764 | 1770 | sounds[i]._node.removeEventListener('error', sounds[i]._errorFn, false);
|
1765 | 1771 | sounds[i]._node.removeEventListener(Howler._canPlayEvent, sounds[i]._loadFn, false);
|
| 1772 | + sounds[i]._node.removeEventListener('loadedmetadata', sounds[i]._loadFn, false); |
| 1773 | + sounds[i]._node.removeEventListener('suspend', setAudioNodeWasSuspendedFromEvent, false); |
1766 | 1774 | sounds[i]._node.removeEventListener('ended', sounds[i]._endFn, false);
|
1767 | 1775 |
|
1768 | 1776 | // Release the Audio object back to the pool.
|
|
2264 | 2272 | self._loadFn = self._loadListener.bind(self);
|
2265 | 2273 | self._node.addEventListener(Howler._canPlayEvent, self._loadFn, false);
|
2266 | 2274 |
|
| 2275 | + // sometimes canplaythrough does not fire if the audio node is suspended (see below) |
| 2276 | + // so we make extra sure to kick off the event queue here |
| 2277 | + // TODO: this could have side effects beyond the _wasSuspended mitigation... |
| 2278 | + self._node.addEventListener('loadedmetadata', self._loadFn, false); |
| 2279 | + |
2267 | 2280 | // Listen for the 'ended' event on the sound to account for edge-case where
|
2268 | 2281 | // a finite sound has a duration of Infinity.
|
2269 | 2282 | self._endFn = self._endListener.bind(self);
|
|
2274 | 2287 | self._node.preload = parent._preload === true ? 'auto' : parent._preload;
|
2275 | 2288 | self._node.volume = volume * Howler.volume();
|
2276 | 2289 |
|
| 2290 | + // we record the suspend event with a dirty param in case we need to mitigate it later |
| 2291 | + self._node._wasSuspended = false |
| 2292 | + self._node.addEventListener('suspend', setAudioNodeWasSuspendedFromEvent, false) |
| 2293 | + |
2277 | 2294 | // Begin loading the source.
|
2278 | 2295 | self._node.load();
|
2279 | 2296 | }
|
|
2340 | 2357 | parent._loadQueue();
|
2341 | 2358 | }
|
2342 | 2359 |
|
2343 |
| - // Clear the event listener. |
| 2360 | + // Clear the event listeners |
2344 | 2361 | self._node.removeEventListener(Howler._canPlayEvent, self._loadFn, false);
|
| 2362 | + self._node.removeEventListener('loadedmetadata', self._loadFn, false); |
2345 | 2363 | },
|
2346 | 2364 |
|
2347 | 2365 | /**
|
|
2506 | 2524 | }
|
2507 | 2525 | };
|
2508 | 2526 |
|
| 2527 | + var setAudioNodeWasSuspendedFromEvent = function(evt) { |
| 2528 | + evt.target._wasSuspended = true |
| 2529 | + } |
| 2530 | + |
2509 | 2531 | /**
|
2510 | 2532 | * Setup the audio context when available, or switch to HTML5 Audio mode.
|
2511 | 2533 | */
|
|
0 commit comments