From 5b97ad71f4af5ca442cdbab51d0f245417607df5 Mon Sep 17 00:00:00 2001 From: nift4 Date: Sat, 22 Feb 2025 21:18:14 +0100 Subject: [PATCH 1/4] Make MIDI renderer respect custom audio sink --- .../androidx/media3/decoder/midi/MidiRenderer.java | 9 ++++++++- libraries/exoplayer/proguard-rules.txt | 2 +- .../media3/exoplayer/DefaultRenderersFactory.java | 10 ++++++++-- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/MidiRenderer.java b/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/MidiRenderer.java index d9c3cce9df..6c1d39c88f 100644 --- a/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/MidiRenderer.java +++ b/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/MidiRenderer.java @@ -16,12 +16,15 @@ package androidx.media3.decoder.midi; import android.content.Context; +import android.os.Handler; import androidx.annotation.Nullable; import androidx.media3.common.C; import androidx.media3.common.Format; import androidx.media3.common.MimeTypes; import androidx.media3.common.util.UnstableApi; import androidx.media3.decoder.CryptoConfig; +import androidx.media3.exoplayer.audio.AudioRendererEventListener; +import androidx.media3.exoplayer.audio.AudioSink; import androidx.media3.exoplayer.audio.DecoderAudioRenderer; /** Decodes and renders MIDI audio. */ @@ -31,7 +34,11 @@ public final class MidiRenderer extends DecoderAudioRenderer { private final Context context; /** Creates the renderer instance. */ - public MidiRenderer(Context context) { + public MidiRenderer(Context context, + @Nullable Handler eventHandler, + @Nullable AudioRendererEventListener eventListener, + AudioSink audioSink) { + super(eventHandler, eventListener, audioSink); this.context = context.getApplicationContext(); } diff --git a/libraries/exoplayer/proguard-rules.txt b/libraries/exoplayer/proguard-rules.txt index 66ab9e34b5..e439ce04e3 100644 --- a/libraries/exoplayer/proguard-rules.txt +++ b/libraries/exoplayer/proguard-rules.txt @@ -31,7 +31,7 @@ } -dontnote androidx.media3.decoder.midi.MidiRenderer -keepclassmembers class androidx.media3.decoder.midi.MidiRenderer { - (android.content.Context); + (android.content.Context, android.os.Handler, androidx.media3.exoplayer.audio.AudioRendererEventListener, androidx.media3.exoplayer.audio.AudioSink); } -dontnote androidx.media3.decoder.mpegh.MpeghAudioRenderer -keepclassmembers class androidx.media3.decoder.mpegh.MpeghAudioRenderer { diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRenderersFactory.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRenderersFactory.java index b867c6224e..768fee8a72 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRenderersFactory.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRenderersFactory.java @@ -557,9 +557,15 @@ public class DefaultRenderersFactory implements RenderersFactory { // Full class names used for constructor args so the LINT rule triggers if any of them move. // LINT.IfChange Class clazz = Class.forName("androidx.media3.decoder.midi.MidiRenderer"); - Constructor constructor = clazz.getConstructor(Context.class); + Constructor constructor = + clazz.getConstructor( + Context.class, + android.os.Handler.class, + androidx.media3.exoplayer.audio.AudioRendererEventListener.class, + androidx.media3.exoplayer.audio.AudioSink.class); // LINT.ThenChange(../../../../../../proguard-rules.txt) - Renderer renderer = (Renderer) constructor.newInstance(context); + Renderer renderer = + (Renderer) constructor.newInstance(context, eventHandler, eventListener, audioSink); out.add(extensionRendererIndex++, renderer); Log.i(TAG, "Loaded MidiRenderer."); } catch (ClassNotFoundException e) { From c950f1c5e393dc298597bd69152bf728dc712865 Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Tue, 25 Feb 2025 14:22:47 +0000 Subject: [PATCH 2/4] Format with google-java-format --- .../main/java/androidx/media3/decoder/midi/MidiRenderer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/MidiRenderer.java b/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/MidiRenderer.java index 6c1d39c88f..6fd1b516a9 100644 --- a/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/MidiRenderer.java +++ b/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/MidiRenderer.java @@ -34,7 +34,8 @@ public final class MidiRenderer extends DecoderAudioRenderer { private final Context context; /** Creates the renderer instance. */ - public MidiRenderer(Context context, + public MidiRenderer( + Context context, @Nullable Handler eventHandler, @Nullable AudioRendererEventListener eventListener, AudioSink audioSink) { From 4f08312ea555597be0c872569ea47685ce492020 Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Tue, 25 Feb 2025 14:24:19 +0000 Subject: [PATCH 3/4] Add release note --- RELEASENOTES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 9622efb60a..ab174f38c6 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -55,6 +55,8 @@ * RTSP Extension: * Decoder Extensions (FFmpeg, VP9, AV1, etc.): * MIDI extension: + * Plumb custom `AudioSink` and `AudioRendererEventListener` instances into + `MidiRenderer`. * Leanback extension: * Cast Extension: * Test Utilities: From 51eb4d65042779207e66cbb653e7267ee27efd3e Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Tue, 25 Feb 2025 14:34:15 +0000 Subject: [PATCH 4/4] Keep the old MidiRenderer constructor deprecated for now --- .../androidx/media3/decoder/midi/MidiRenderer.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/MidiRenderer.java b/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/MidiRenderer.java index 6fd1b516a9..ff58e3de2a 100644 --- a/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/MidiRenderer.java +++ b/libraries/decoder_midi/src/main/java/androidx/media3/decoder/midi/MidiRenderer.java @@ -33,7 +33,18 @@ public final class MidiRenderer extends DecoderAudioRenderer { private final Context context; - /** Creates the renderer instance. */ + /** + * @deprecated Use {@link #MidiRenderer(Context, Handler, AudioRendererEventListener, AudioSink)} + * instead. + */ + @Deprecated + public MidiRenderer(Context context) { + this.context = context.getApplicationContext(); + } + + /** + * Creates the renderer instance. + */ public MidiRenderer( Context context, @Nullable Handler eventHandler,