Skip to content

Commit 457dcb6

Browse files
committed
Fixed an edge case with Safari ("infinite" html5 audio -> the end event won't run)
1 parent 96e8a96 commit 457dcb6

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

src/howler.core.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1926,6 +1926,11 @@
19261926
self._loadFn = self._loadListener.bind(self);
19271927
self._node.addEventListener(Howler._canPlayEvent, self._loadFn, false);
19281928

1929+
// Listen for 'ended' event to let us know the sound has ended.
1930+
// Normally we'd do fine without, but this will help a Safari edge case with infinite html5 audio
1931+
self._endFn = self._endListener.bind(self);
1932+
self._node.addEventListener('ended', self._endFn, false);
1933+
19291934
// Setup the new audio node.
19301935
self._node.src = parent._src;
19311936
self._node.preload = 'auto';
@@ -2000,6 +2005,21 @@
20002005

20012006
// Clear the event listener.
20022007
self._node.removeEventListener(Howler._canPlayEvent, self._loadFn, false);
2008+
},
2009+
2010+
/**
2011+
* HTML5 Audio ended listener callback.
2012+
*/
2013+
_endListener: function() {
2014+
var self = this;
2015+
2016+
// Fire an end event - the duration should have been infinite but the audio ended anyways.
2017+
if (self._parent._duration === Infinity) {
2018+
self._parent._ended(self);
2019+
}
2020+
2021+
// Clear the event listener.
2022+
self._node.removeEventListener('ended', self._endFn, false);
20032023
}
20042024
};
20052025

0 commit comments

Comments
 (0)