From 67b4c62bca453c2fbc6276fe3c6895733c8e16dd Mon Sep 17 00:00:00 2001 From: Joe Hart Date: Tue, 9 Sep 2025 21:57:11 -0400 Subject: [PATCH 1/3] fix: gracefully handle InvalidStateError: Failed to start the audio device --- src/howler.core.js | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/howler.core.js b/src/howler.core.js index 5198bdfc..2a40a278 100644 --- a/src/howler.core.js +++ b/src/howler.core.js @@ -382,7 +382,12 @@ // Calling resume() on a stack initiated by user gesture is what actually unlocks the audio on Android Chrome >= 55. if (typeof self.ctx.resume === 'function') { - self.ctx.resume(); + try { + self.ctx.resume(); + } catch (err) { + // Handle AudioContext resume errors gracefully during unlock + console.warn('AudioContext resume failed during unlock:', err.name + ':', err.message); + } } // Setup a timeout to check that we are unlocked on the next event loop. @@ -529,6 +534,17 @@ for (var i=0; i Date: Tue, 9 Sep 2025 22:12:20 -0400 Subject: [PATCH 2/3] fix: gracefully handle InvalidStateError: Failed to start the audio device --- src/howler.core.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/howler.core.js b/src/howler.core.js index 2a40a278..32a0a07e 100644 --- a/src/howler.core.js +++ b/src/howler.core.js @@ -382,12 +382,9 @@ // Calling resume() on a stack initiated by user gesture is what actually unlocks the audio on Android Chrome >= 55. if (typeof self.ctx.resume === 'function') { - try { - self.ctx.resume(); - } catch (err) { - // Handle AudioContext resume errors gracefully during unlock + self.ctx.resume().catch(function(err) { console.warn('AudioContext resume failed during unlock:', err.name + ':', err.message); - } + }); } // Setup a timeout to check that we are unlocked on the next event loop. From 8dfe1728024f294b192dc2cdf811738fa8d18dee Mon Sep 17 00:00:00 2001 From: Joe Hart Date: Tue, 9 Sep 2025 22:15:14 -0400 Subject: [PATCH 3/3] fix: gracefully handle InvalidStateError: Failed to start the audio device --- src/howler.core.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/howler.core.js b/src/howler.core.js index 32a0a07e..0e64e8c4 100644 --- a/src/howler.core.js +++ b/src/howler.core.js @@ -532,10 +532,7 @@ self._howls[i]._emit('resume'); } }).catch(function(err) { - // Handle AudioContext resume errors gracefully. console.warn('AudioContext resume failed:', err.name + ':', err.message); - - // Keep state as suspended since resume failed. self.state = 'suspended'; // Emit resume error event to all Howls so they can handle it appropriately.