From 6b9bb5a321f1ea609e5e2957c0064674dd7ad672 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 26 Feb 2026 15:16:19 +0900 Subject: [PATCH 1/5] fix web AudioContext suspended state --- lib/src/preconnect/audio_frame_capture_web.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/src/preconnect/audio_frame_capture_web.dart b/lib/src/preconnect/audio_frame_capture_web.dart index e956acd78..cefb1c710 100644 --- a/lib/src/preconnect/audio_frame_capture_web.dart +++ b/lib/src/preconnect/audio_frame_capture_web.dart @@ -86,9 +86,10 @@ class AudioFrameCaptureWeb implements AudioFrameCapture { final jsTrack = (track as MediaStreamTrackWeb).jsTrack; final mediaStream = web.MediaStream([jsTrack].toJS); - // 2. Create AudioContext. + // 2. Create AudioContext and ensure it's running (browsers may create it in "suspended" state until a user gesture). _audioContext = web.AudioContext(); final ctx = _audioContext!; + await ctx.resume().toDart; // 3. Register worklet processor via Blob URL. final blob = web.Blob( From cdca3b35339b82f01d7eaeeef68184bb2dd1c6f0 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 26 Feb 2026 15:19:43 +0900 Subject: [PATCH 2/5] add changeset --- .changes/fix-web-audio-context-resume | 1 + 1 file changed, 1 insertion(+) create mode 100644 .changes/fix-web-audio-context-resume diff --git a/.changes/fix-web-audio-context-resume b/.changes/fix-web-audio-context-resume new file mode 100644 index 000000000..4495c5d77 --- /dev/null +++ b/.changes/fix-web-audio-context-resume @@ -0,0 +1 @@ +patch type="fixed" "Fix web audio capture not starting on Safari due to suspended AudioContext" From 0ff48f215114521c76153a456c9b78e3588f950f Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Thu, 26 Feb 2026 17:41:32 +0900 Subject: [PATCH 3/5] try block --- lib/src/preconnect/audio_frame_capture_web.dart | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/src/preconnect/audio_frame_capture_web.dart b/lib/src/preconnect/audio_frame_capture_web.dart index cefb1c710..81b276732 100644 --- a/lib/src/preconnect/audio_frame_capture_web.dart +++ b/lib/src/preconnect/audio_frame_capture_web.dart @@ -86,10 +86,16 @@ class AudioFrameCaptureWeb implements AudioFrameCapture { final jsTrack = (track as MediaStreamTrackWeb).jsTrack; final mediaStream = web.MediaStream([jsTrack].toJS); - // 2. Create AudioContext and ensure it's running (browsers may create it in "suspended" state until a user gesture). + // 2. Create AudioContext and best-effort resume it because some browsers require a user gesture and may reject or stall resume() _audioContext = web.AudioContext(); final ctx = _audioContext!; - await ctx.resume().toDart; + try { + await ctx.resume().toDart.timeout(const Duration(seconds: 3)); + } on TimeoutException { + logger.warning('[AudioFrameCapture] AudioContext resume timed out, continuing setup'); + } catch (e) { + logger.warning('[AudioFrameCapture] AudioContext resume failed: $e, continuing setup'); + } // 3. Register worklet processor via Blob URL. final blob = web.Blob( From 9de85e2af7112249058663e01fa2c417839a5999 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Fri, 27 Feb 2026 01:42:17 +0900 Subject: [PATCH 4/5] fix --- lib/src/preconnect/audio_frame_capture_web.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/src/preconnect/audio_frame_capture_web.dart b/lib/src/preconnect/audio_frame_capture_web.dart index 81b276732..a44e9b4eb 100644 --- a/lib/src/preconnect/audio_frame_capture_web.dart +++ b/lib/src/preconnect/audio_frame_capture_web.dart @@ -86,8 +86,8 @@ class AudioFrameCaptureWeb implements AudioFrameCapture { final jsTrack = (track as MediaStreamTrackWeb).jsTrack; final mediaStream = web.MediaStream([jsTrack].toJS); - // 2. Create AudioContext and best-effort resume it because some browsers require a user gesture and may reject or stall resume() - _audioContext = web.AudioContext(); + // 2. Create AudioContext at the requested sample rate and best-effort resume it because some browsers require a user gesture and may reject or stall resume() + _audioContext = web.AudioContext(web.AudioContextOptions(sampleRate: sampleRate.toDouble())); final ctx = _audioContext!; try { await ctx.resume().toDart.timeout(const Duration(seconds: 3)); From 7d92cd14aa9e2f84093429065387b5413898ab1a Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Fri, 27 Feb 2026 01:44:23 +0900 Subject: [PATCH 5/5] changes --- .changes/fix-web-audio-context-sample-rate | 1 + 1 file changed, 1 insertion(+) create mode 100644 .changes/fix-web-audio-context-sample-rate diff --git a/.changes/fix-web-audio-context-sample-rate b/.changes/fix-web-audio-context-sample-rate new file mode 100644 index 000000000..51bea3ffa --- /dev/null +++ b/.changes/fix-web-audio-context-sample-rate @@ -0,0 +1 @@ +patch type="fixed" "Web pre-connect audio buffer using wrong sample rate"