diff --git a/components/VideoPlayer/demo/src/jvmMain/kotlin/org/jetbrains/compose/videoplayer/demo/Main.kt b/components/VideoPlayer/demo/src/jvmMain/kotlin/org/jetbrains/compose/videoplayer/demo/Main.kt index c497b2f6b0..22a41231bd 100644 --- a/components/VideoPlayer/demo/src/jvmMain/kotlin/org/jetbrains/compose/videoplayer/demo/Main.kt +++ b/components/VideoPlayer/demo/src/jvmMain/kotlin/org/jetbrains/compose/videoplayer/demo/Main.kt @@ -13,7 +13,11 @@ fun main() { ) { MaterialTheme { DesktopTheme { - VideoPlayer("/System/Library/Compositions/Yosemite.mov", 640, 480) + VideoPlayer( + url = "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4", + width = 640, + height = 480 + ) } } } diff --git a/components/VideoPlayer/library/src/desktopMain/kotlin/org/jetbrains/compose/videoplayer/DesktopVideoPlayer.kt b/components/VideoPlayer/library/src/desktopMain/kotlin/org/jetbrains/compose/videoplayer/DesktopVideoPlayer.kt index a37953b5de..daf330cb20 100644 --- a/components/VideoPlayer/library/src/desktopMain/kotlin/org/jetbrains/compose/videoplayer/DesktopVideoPlayer.kt +++ b/components/VideoPlayer/library/src/desktopMain/kotlin/org/jetbrains/compose/videoplayer/DesktopVideoPlayer.kt @@ -1,22 +1,31 @@ package org.jetbrains.compose.videoplayer -import androidx.compose.desktop.SwingPanel import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.SideEffect import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCompositionContext import androidx.compose.ui.Modifier +import androidx.compose.ui.awt.SwingPanel import androidx.compose.ui.graphics.Color import uk.co.caprica.vlcj.factory.discovery.NativeDiscovery +import uk.co.caprica.vlcj.player.base.MediaPlayer +import uk.co.caprica.vlcj.player.component.CallbackMediaPlayerComponent import uk.co.caprica.vlcj.player.component.EmbeddedMediaPlayerComponent +import java.util.* + @Composable internal actual fun VideoPlayerImpl(url: String, width: Int, height: Int) { println("Video player for $url") NativeDiscovery().discover() - // Doesn't work on macOS, see https://github.com/caprica/vlcj/issues/887 for suggestions. - val mediaPlayerComponent = remember { EmbeddedMediaPlayerComponent() } + val mediaPlayerComponent = remember { + // see https://github.com/caprica/vlcj/issues/887#issuecomment-503288294 for why we're using CallbackMediaPlayerComponent for macOS. + if (isMacOS()) { + CallbackMediaPlayerComponent() + } else { + EmbeddedMediaPlayerComponent() + } + } SideEffect { val ok = mediaPlayerComponent.mediaPlayer().media().play(url) println("play gave $ok") @@ -29,3 +38,21 @@ internal actual fun VideoPlayerImpl(url: String, width: Int, height: Int) { } ) } + +/** + * To return mediaPlayer from player components. + * The method names are same, but they don't share the same parent/interface. + * That's why need this method. + */ +private fun Any.mediaPlayer(): MediaPlayer { + return when (this) { + is CallbackMediaPlayerComponent -> mediaPlayer() + is EmbeddedMediaPlayerComponent -> mediaPlayer() + else -> throw IllegalArgumentException("You can only call mediaPlayer() on vlcj player component") + } +} + +private fun isMacOS(): Boolean { + val os = System.getProperty("os.name", "generic").lowercase(Locale.ENGLISH) + return os.indexOf("mac") >= 0 || os.indexOf("darwin") >= 0 +}