From 8962497a8c4ed7f0e7dea869b615f7b48139b4f3 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 21 May 2017 13:07:19 -0700 Subject: [PATCH] Fix deadlocks in audio and video stream shutdown using the new callbacks --- .../binding/audio/AndroidAudioRenderer.java | 14 +++++++--- .../video/MediaCodecDecoderRenderer.java | 27 +++++++++---------- moonlight-common | 2 +- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/limelight/binding/audio/AndroidAudioRenderer.java b/app/src/main/java/com/limelight/binding/audio/AndroidAudioRenderer.java index b05b5b44..bc297ebe 100644 --- a/app/src/main/java/com/limelight/binding/audio/AndroidAudioRenderer.java +++ b/app/src/main/java/com/limelight/binding/audio/AndroidAudioRenderer.java @@ -84,10 +84,18 @@ public class AndroidAudioRenderer implements AudioRenderer { track.write(audioData, 0, audioData.length); } + @Override + public void start() {} + + @Override + public void stop() { + // Immediately drop all pending data + track.pause(); + track.flush(); + } + @Override public void cleanup() { - if (track != null) { - track.release(); - } + track.release(); } } diff --git a/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java b/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java index e8df3c96..88466af2 100644 --- a/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java +++ b/app/src/main/java/com/limelight/binding/video/MediaCodecDecoderRenderer.java @@ -260,8 +260,6 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer { return -5; } - startRendererThread(); - return 0; } @@ -380,26 +378,25 @@ public class MediaCodecDecoderRenderer extends VideoDecoderRenderer { return index; } - // This method is used by the hack in Game, not called by the streaming core. + @Override + public void start() { + startRendererThread(); + } + + @Override public void stop() { stopping = true; - if (rendererThread != null) { - // Halt the rendering thread - rendererThread.interrupt(); - try { - rendererThread.join(); - } catch (InterruptedException ignored) { } - } + // Halt the rendering thread + rendererThread.interrupt(); + try { + rendererThread.join(); + } catch (InterruptedException ignored) { } } @Override public void cleanup() { - stop(); - - if (videoDecoder != null) { - videoDecoder.release(); - } + videoDecoder.release(); } private boolean queueInputBuffer(int inputBufferIndex, int offset, int length, long timestampUs, int codecFlags) { diff --git a/moonlight-common b/moonlight-common index 525a8ac3..4c2dc16a 160000 --- a/moonlight-common +++ b/moonlight-common @@ -1 +1 @@ -Subproject commit 525a8ac322129ee54d674da5d0a3518f6f56ef64 +Subproject commit 4c2dc16aefbb516da42399c0fb06bff19a2629e6