Add MIDI playback (#6770)

* Add MIDI playback

* Implement PR suggestions
This commit is contained in:
cizra 2026-05-18 08:06:47 +00:00 committed by GitHub
parent a89d37297f
commit e6c3a8ff1d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 19 additions and 4 deletions

View file

@ -111,6 +111,7 @@ androidx_media3_ui = { module = "androidx.media3:media3-ui", version.ref = "medi
androidx_media3_transformer = { module = "androidx.media3:media3-transformer", version.ref = "media3" } androidx_media3_transformer = { module = "androidx.media3:media3-transformer", version.ref = "media3" }
androidx_media3_effect = { module = "androidx.media3:media3-effect", version.ref = "media3" } androidx_media3_effect = { module = "androidx.media3:media3-effect", version.ref = "media3" }
androidx_media3_common = { module = "androidx.media3:media3-common", version.ref = "media3" } androidx_media3_common = { module = "androidx.media3:media3-common", version.ref = "media3" }
androidx_media3_exoplayer_midi = { module = "androidx.media3:media3-exoplayer-midi", version.ref = "media3" }
androidx_biometric = "androidx.biometric:biometric-ktx:1.4.0-alpha02" androidx_biometric = "androidx.biometric:biometric-ktx:1.4.0-alpha02"
androidx_activity_activity = { module = "androidx.activity:activity", version.ref = "activity" } androidx_activity_activity = { module = "androidx.activity:activity", version.ref = "activity" }

View file

@ -31,6 +31,7 @@ dependencies {
implementation(libs.coroutines.core) implementation(libs.coroutines.core)
implementation(libs.coil.compose) implementation(libs.coil.compose)
implementation(libs.androidx.media3.exoplayer) implementation(libs.androidx.media3.exoplayer)
implementation(libs.androidx.media3.exoplayer.midi)
implementation(libs.androidx.media3.ui) implementation(libs.androidx.media3.ui)
implementation(libs.telephoto.zoomableimage) implementation(libs.telephoto.zoomableimage)
implementation(libs.vanniktech.blurhash) implementation(libs.vanniktech.blurhash)

View file

@ -88,7 +88,7 @@ fun MediaAudioView(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
isDisplayed: Boolean = true, isDisplayed: Boolean = true,
) { ) {
val exoPlayer = rememberExoPlayer() val exoPlayer = rememberExoPlayer(forAudioOnly = true)
ExoPlayerMediaAudioView( ExoPlayerMediaAudioView(
isDisplayed = isDisplayed, isDisplayed = isDisplayed,
localMediaViewState = localMediaViewState, localMediaViewState = localMediaViewState,

View file

@ -8,14 +8,18 @@
package io.element.android.libraries.mediaviewer.impl.local.player package io.element.android.libraries.mediaviewer.impl.local.player
import androidx.annotation.OptIn
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.platform.LocalInspectionMode
import androidx.media3.common.util.UnstableApi
import androidx.media3.exoplayer.DefaultRenderersFactory
import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.ExoPlayer
@OptIn(UnstableApi::class)
@Composable @Composable
fun rememberExoPlayer(): ExoPlayer { fun rememberExoPlayer(forAudioOnly: Boolean): ExoPlayer {
return if (LocalInspectionMode.current) { return if (LocalInspectionMode.current) {
remember { remember {
ExoPlayerForPreview() ExoPlayerForPreview()
@ -23,7 +27,14 @@ fun rememberExoPlayer(): ExoPlayer {
} else { } else {
val context = LocalContext.current val context = LocalContext.current
remember { remember {
ExoPlayer.Builder(context).build() if (forAudioOnly) {
// Required for media3-exoplayer-midi to decode MIDI samples produced by DefaultExtractorsFactory.
val renderersFactory = DefaultRenderersFactory(context)
.setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON)
ExoPlayer.Builder(context, renderersFactory).build()
} else {
ExoPlayer.Builder(context).build()
}
} }
} }
} }

View file

@ -73,7 +73,7 @@ fun MediaVideoView(
audioFocus: AudioFocus?, audioFocus: AudioFocus?,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
val exoPlayer = rememberExoPlayer() val exoPlayer = rememberExoPlayer(forAudioOnly = false)
ExoPlayerMediaVideoView( ExoPlayerMediaVideoView(
isDisplayed = isDisplayed, isDisplayed = isDisplayed,
localMediaViewState = localMediaViewState, localMediaViewState = localMediaViewState,

View file

@ -21,6 +21,8 @@ dependencyResolutionManagement {
url = uri("https://www.jitpack.io") url = uri("https://www.jitpack.io")
content { content {
includeModule("com.github.matrix-org", "matrix-analytics-events") includeModule("com.github.matrix-org", "matrix-analytics-events")
// Required transitively by androidx.media3:media3-exoplayer-midi for MIDI playback.
includeModule("com.github.philburk", "jsyn")
} }
} }
google() google()