From 3d42e2908d0ddf88125da540012494ea59fb6bcb Mon Sep 17 00:00:00 2001 From: Nimit012 <110910723+Nimit012@users.noreply.github.com> Date: Thu, 13 Nov 2025 17:23:29 +0530 Subject: [PATCH] fix: fix iphone audio playback by adding loadedmetadata listener --- src/preloadjs/loaders/AbstractMediaLoader.js | 2 ++ src/preloadjs/net/MediaTagRequest.js | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/src/preloadjs/loaders/AbstractMediaLoader.js b/src/preloadjs/loaders/AbstractMediaLoader.js index a3a0298e..24203fc9 100644 --- a/src/preloadjs/loaders/AbstractMediaLoader.js +++ b/src/preloadjs/loaders/AbstractMediaLoader.js @@ -116,6 +116,8 @@ this.createjs = this.createjs || {}; */ p._formatResult = function (loader) { this._tag.removeEventListener && this._tag.removeEventListener("canplaythrough", this._loadedHandler); + this._tag.removeEventListener && this._tag.removeEventListener("loadedmetadata", this._loadedHandler); + this._tag.onstalled = null; if (this._preferXHR) { var URL = window.URL || window.webkitURL; diff --git a/src/preloadjs/net/MediaTagRequest.js b/src/preloadjs/net/MediaTagRequest.js index 39c0fe02..f1c19929 100644 --- a/src/preloadjs/net/MediaTagRequest.js +++ b/src/preloadjs/net/MediaTagRequest.js @@ -72,6 +72,9 @@ this.createjs = this.createjs || {}; // This will tell us when audio is buffered enough to play through, but not when its loaded. // The tag doesn't keep loading in Chrome once enough has buffered, and we have decided that behaviour is sufficient. this._tag.addEventListener && this._tag.addEventListener("canplaythrough", this._loadedHandler, false); // canplaythrough callback doesn't work in Chrome, so we use an event. + + // iOS fallback: canplaythrough doesn't always fire on iPhone, so loadedmetadata ensures the handler is called + this._tag.addEventListener && this._tag.addEventListener("loadedmetadata", this._loadedHandler, false); this.TagRequest_load(); }; @@ -110,6 +113,8 @@ this.createjs = this.createjs || {}; // protected methods p._clean = function () { this._tag.removeEventListener && this._tag.removeEventListener("canplaythrough", this._loadedHandler); + this._tag.removeEventListener && this._tag.removeEventListener("loadedmetadata", this._loadedHandler, false); + this._tag.removeEventListener("stalled", this._stalledCallback); this._tag.removeEventListener("progress", this._progressCallback);