diff --git a/CHANGELOG.md b/CHANGELOG.md index 97e55a9fc2..5f87f5e592 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ # Changelog +[1.0.6] - 2025-05-27 +* [iOS] Added native audio route picker for iOS +* [Android] Expanded the mapping for audio device types +* Synced flutter-webrtc v0.14.1 + * [Android] fix: Recording bug (#1839) + * [Android] fix: calls in terminated mode by disabling orientation manager (#1840) + * [Android] fix: Wait for audio and video thread to fully stop to avoid corrupted recordings (#1836) + [1.0.5] - 2025-05-20 * [iOS] Bumped StreamWebRTC version to 125.6422.070 * Synced flutter-webrtc v0.14.0 diff --git a/android/src/main/java/io/getstream/webrtc/flutter/record/VideoFileRenderer.java b/android/src/main/java/io/getstream/webrtc/flutter/record/VideoFileRenderer.java index 05c6a4cc14..e7c9ad9bf7 100644 --- a/android/src/main/java/io/getstream/webrtc/flutter/record/VideoFileRenderer.java +++ b/android/src/main/java/io/getstream/webrtc/flutter/record/VideoFileRenderer.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.nio.ByteBuffer; +import java.util.concurrent.CountDownLatch; class VideoFileRenderer implements VideoSink, SamplesReadyCallback { private static final String TAG = "VideoFileRenderer"; @@ -127,27 +128,50 @@ private void renderFrameOnRenderThread(VideoFrame frame) { /** * Release all resources. All already posted frames will be rendered first. */ + // Start Signify modification void release() { isRunning = false; - if (audioThreadHandler != null) + CountDownLatch latch = new CountDownLatch(audioThreadHandler != null ? 2 : 1); + if (audioThreadHandler != null) { audioThreadHandler.post(() -> { - if (audioEncoder != null) { - audioEncoder.stop(); - audioEncoder.release(); + try{ + if (audioEncoder != null) { + audioEncoder.stop(); + audioEncoder.release(); + } + audioThread.quit(); + } finally { + latch.countDown(); } - audioThread.quit(); }); + } + renderThreadHandler.post(() -> { - if (encoder != null) { - encoder.stop(); - encoder.release(); + try { + if (encoder != null) { + encoder.stop(); + encoder.release(); + } + eglBase.release(); + if (muxerStarted) { + mediaMuxer.stop(); + mediaMuxer.release(); + muxerStarted = false; + } + renderThread.quit(); + } finally { + latch.countDown(); } - eglBase.release(); - mediaMuxer.stop(); - mediaMuxer.release(); - renderThread.quit(); }); + + try { + latch.await(); + } catch (InterruptedException e) { + Log.e(TAG, "Release interrupted", e); + Thread.currentThread().interrupt(); + } } + // End Signify modification private boolean encoderStarted = false; private volatile boolean muxerStarted = false; @@ -174,7 +198,7 @@ private void drainEncoder() { Log.e(TAG, "encoder output format changed: " + newFormat); trackIndex = mediaMuxer.addTrack(newFormat); - if (audioTrackIndex != -1 && !muxerStarted) { + if (trackIndex != -1 && !muxerStarted) { mediaMuxer.start(); muxerStarted = true; } @@ -230,7 +254,7 @@ private void drainAudio() { Log.w(TAG, "encoder output format changed: " + newFormat); audioTrackIndex = mediaMuxer.addTrack(newFormat); - if (trackIndex != -1 && !muxerStarted) { + if (audioTrackIndex != -1 && !muxerStarted) { mediaMuxer.start(); muxerStarted = true; } diff --git a/android/src/main/java/io/getstream/webrtc/flutter/video/camera/CameraUtils.java b/android/src/main/java/io/getstream/webrtc/flutter/video/camera/CameraUtils.java index efc131f8ca..d2204befbc 100644 --- a/android/src/main/java/io/getstream/webrtc/flutter/video/camera/CameraUtils.java +++ b/android/src/main/java/io/getstream/webrtc/flutter/video/camera/CameraUtils.java @@ -45,7 +45,14 @@ public CameraUtils(GetUserMediaImpl getUserMediaImpl, Activity activity) { this.getUserMediaImpl = getUserMediaImpl; this.activity = activity; this.deviceOrientationManager = new DeviceOrientationManager(activity, 0); - this.deviceOrientationManager.start(); + // commented out because you cannot register a reciever when the app is terminated + // because the activity is null? + // this causes the call to break if the app is terminated + // the manager seems to end up at handleOrientationChange which does not do + // anything at the moment so this should be ok + + // TODO: get a proper fix at some point + // this.deviceOrientationManager.start(); } public void setFocusMode(MethodCall call, AnyThreadResult result) { diff --git a/ios/stream_webrtc_flutter.podspec b/ios/stream_webrtc_flutter.podspec index 231d158750..1b6b58e070 100644 --- a/ios/stream_webrtc_flutter.podspec +++ b/ios/stream_webrtc_flutter.podspec @@ -3,7 +3,7 @@ # Pod::Spec.new do |s| s.name = 'stream_webrtc_flutter' - s.version = '1.0.5' + s.version = '1.0.6' s.summary = 'Flutter WebRTC plugin for iOS.' s.description = <<-DESC A new flutter plugin project. diff --git a/macos/stream_webrtc_flutter.podspec b/macos/stream_webrtc_flutter.podspec index 9c873f278c..0318e0e3bb 100644 --- a/macos/stream_webrtc_flutter.podspec +++ b/macos/stream_webrtc_flutter.podspec @@ -3,7 +3,7 @@ # Pod::Spec.new do |s| s.name = 'stream_webrtc_flutter' - s.version = '1.0.5' + s.version = '1.0.6' s.summary = 'Flutter WebRTC plugin for macOS.' s.description = <<-DESC A new flutter plugin project. diff --git a/pubspec.yaml b/pubspec.yaml index c5d74da373..399f59586e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: stream_webrtc_flutter description: Flutter WebRTC plugin for iOS/Android/Destkop/Web, based on GoogleWebRTC. -version: 1.0.5 +version: 1.0.6 homepage: https://github.com/GetStream/webrtc-flutter environment: sdk: ">=3.3.0 <4.0.0"