|
1 | 1 | /*! |
2 | | - * howler.js v2.2.4 |
| 2 | + * howler.js v2.2.5 |
3 | 3 | * howlerjs.com |
4 | 4 | * |
5 | 5 | * (c) 2013-2020, James Simpson of GoldFire Studios |
|
993 | 993 | }; |
994 | 994 | node.addEventListener(Howler._canPlayEvent, listener, false); |
995 | 995 |
|
| 996 | + // (IOS 17.4 PATCH) |
| 997 | + // the node is not actually playing (has received suspend event and NETWORK_IDLE) |
| 998 | + if (node.networkState === 1 && node._wasSuspended) { |
| 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 | + // IOS17.4 PATCH |
| 1773 | + sounds[i]._node.removeEventListener('loadedmetadata', sounds[i]._loadFn, false); |
| 1774 | + sounds[i]._node.removeEventListener('suspend', setAudioNodeWasSuspendedFromEvent, false); |
| 1775 | + |
1766 | 1776 | sounds[i]._node.removeEventListener('ended', sounds[i]._endFn, false); |
1767 | 1777 |
|
1768 | 1778 | // Release the Audio object back to the pool. |
|
2264 | 2274 | self._loadFn = self._loadListener.bind(self); |
2265 | 2275 | self._node.addEventListener(Howler._canPlayEvent, self._loadFn, false); |
2266 | 2276 |
|
| 2277 | + // IOS17.4 PATCH |
| 2278 | + // cancplaythrough may not fire if the audio node is suspended |
| 2279 | + // ensure event queue is started here |
| 2280 | + // may have side effects beyond the _wasSuspended |
| 2281 | + self._node.addEventListener('loadedmetadata', self._loadFn, false); |
| 2282 | + |
2267 | 2283 | // Listen for the 'ended' event on the sound to account for edge-case where |
2268 | 2284 | // a finite sound has a duration of Infinity. |
2269 | 2285 | self._endFn = self._endListener.bind(self); |
|
2274 | 2290 | self._node.preload = parent._preload === true ? 'auto' : parent._preload; |
2275 | 2291 | self._node.volume = volume * Howler.volume(); |
2276 | 2292 |
|
| 2293 | + // IOS 17.4 PATCH |
| 2294 | + // record suspended event with dirty param for later mitigation |
| 2295 | + self._node._wasSuspended = false; |
| 2296 | + self._node.addEventListener('suspend', setAudioNodeWasSuspendedFromEvent, false); |
| 2297 | + |
| 2298 | + |
2277 | 2299 | // Begin loading the source. |
2278 | 2300 | self._node.load(); |
2279 | 2301 | } |
|
2340 | 2362 | parent._loadQueue(); |
2341 | 2363 | } |
2342 | 2364 |
|
2343 | | - // Clear the event listener. |
| 2365 | + // Clear the event listener(s). |
| 2366 | + // IOS 17.4 PATCH |
2344 | 2367 | self._node.removeEventListener(Howler._canPlayEvent, self._loadFn, false); |
| 2368 | + self._node.removeEventListener('loadedmetadata', self._loadFn, false); |
2345 | 2369 | }, |
2346 | 2370 |
|
2347 | 2371 | /** |
|
2506 | 2530 | } |
2507 | 2531 | }; |
2508 | 2532 |
|
| 2533 | + |
| 2534 | + // IOS17.4 PATCH |
| 2535 | + var setAudioNodeWasSuspendedFromEvent = function(event) { |
| 2536 | + event.target._wasSuspended = true; |
| 2537 | + } |
| 2538 | + |
2509 | 2539 | /** |
2510 | 2540 | * Setup the audio context when available, or switch to HTML5 Audio mode. |
2511 | 2541 | */ |
|
2590 | 2620 | /*! |
2591 | 2621 | * Spatial Plugin - Adds support for stereo and 3D audio where Web Audio is supported. |
2592 | 2622 | * |
2593 | | - * howler.js v2.2.4 |
| 2623 | + * howler.js v2.2.5 |
2594 | 2624 | * howlerjs.com |
2595 | 2625 | * |
2596 | 2626 | * (c) 2013-2020, James Simpson of GoldFire Studios |
|
0 commit comments