|
@@ -27,7 +27,6 @@ import de.nplusc.izc.iZpl.API.shared.SinglePlayListItem;
|
|
|
import de.nplusc.izc.tools.baseTools.Detectors;
|
|
|
import net.java.truevfs.access.TFile;
|
|
|
import java.awt.Canvas;
|
|
|
-import java.awt.Image;
|
|
|
import java.io.File;
|
|
|
import java.io.IOException;
|
|
|
import java.util.Arrays;
|
|
@@ -35,12 +34,14 @@ import javax.swing.JPanel;
|
|
|
import org.apache.logging.log4j.LogManager;
|
|
|
import org.apache.logging.log4j.Logger;
|
|
|
import uk.co.caprica.vlcj.binding.LibVlc;
|
|
|
-import uk.co.caprica.vlcj.binding.internal.libvlc_media_t;
|
|
|
-import uk.co.caprica.vlcj.player.MediaPlayer;
|
|
|
-import uk.co.caprica.vlcj.player.MediaPlayerEventListener;
|
|
|
-import uk.co.caprica.vlcj.player.MediaPlayerFactory;
|
|
|
+import uk.co.caprica.vlcj.binding.RuntimeUtil;
|
|
|
+import uk.co.caprica.vlcj.player.base.MediaPlayer;
|
|
|
+import uk.co.caprica.vlcj.player.base.MediaPlayerEventListener;
|
|
|
+import uk.co.caprica.vlcj.factory.MediaPlayerFactory;
|
|
|
+import uk.co.caprica.vlcj.media.Media;
|
|
|
+import uk.co.caprica.vlcj.media.MediaRef;
|
|
|
+import uk.co.caprica.vlcj.media.TrackType;
|
|
|
import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
|
|
|
-import uk.co.caprica.vlcj.runtime.RuntimeUtil;
|
|
|
|
|
|
/**
|
|
|
*
|
|
@@ -62,6 +63,8 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
|
|
|
private UIPlugin selectedUIPlugin;
|
|
|
private final String vlcVout;
|
|
|
private boolean voutRequired = false;
|
|
|
+ private int length = 0;
|
|
|
+ private int position = 0;
|
|
|
public VlcInterface ()
|
|
|
{
|
|
|
this(new File(jarschiv).getParent() + "\\vlcbinaries",true);
|
|
@@ -187,12 +190,12 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
|
|
|
@Override
|
|
|
public int getLengthInSeconds()
|
|
|
{
|
|
|
- return adapter.getLengthInSeconds();
|
|
|
+ return length;
|
|
|
}
|
|
|
@Override
|
|
|
public int getPosition()
|
|
|
{
|
|
|
- return adapter.getPosition();
|
|
|
+ return position;
|
|
|
}
|
|
|
@Override
|
|
|
public void seek(int sekunde)
|
|
@@ -282,13 +285,13 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
@Override
|
|
|
- public void mediaChanged(MediaPlayer mp, libvlc_media_t l, String string)
|
|
|
- {
|
|
|
+ public void mediaChanged(MediaPlayer mp, MediaRef mr)
|
|
|
+ {
|
|
|
Thread t = new Thread(() ->
|
|
|
{
|
|
|
- grabMediaData(mp);
|
|
|
+ grabMediaData(mp,mr);
|
|
|
try
|
|
|
{
|
|
|
Thread.sleep(1000);
|
|
@@ -296,69 +299,35 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
|
|
|
catch (InterruptedException devnulled)
|
|
|
{
|
|
|
}
|
|
|
- grabMediaData(mp);
|
|
|
+ grabMediaData(mp,mr);
|
|
|
});
|
|
|
t.setName("VLC MediaDataGrabber");
|
|
|
t.start();
|
|
|
}
|
|
|
|
|
|
- private void grabMediaData(MediaPlayer mp)
|
|
|
+ private void grabMediaData(MediaPlayer mp,MediaRef mr)
|
|
|
{
|
|
|
- mp.parseMedia();
|
|
|
+ Media m = mr.duplicateMedia();
|
|
|
//IZplGUIBackend.setTitle(mp.getMediaMeta().getTitle());
|
|
|
-
|
|
|
- l.trace("{}", mp.getMediaMeta());
|
|
|
- selectedUIPlugin.setTrackLength((int) Math.ceil(mp.getMediaMeta().getLength()/1000.0f));
|
|
|
+ l.trace("Parsing media meta");
|
|
|
+ selectedUIPlugin.setTrackLength((int) Math.ceil(m.info().duration()/1000));
|
|
|
+
|
|
|
+ length = (int) Math.ceil(m.info().duration()/1000);
|
|
|
+ selectedUIPlugin.setTrackLength(length);
|
|
|
+ m.release();
|
|
|
+ // TODO Media img.
|
|
|
+ /*
|
|
|
Image img = mp.getMediaMeta().getArtwork();
|
|
|
if(img !=null)
|
|
|
{
|
|
|
l.info("got media img");
|
|
|
}
|
|
|
selectedUIPlugin.setAlbumArt(img);
|
|
|
+ */
|
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
- public void opening(MediaPlayer mp)
|
|
|
- {
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void buffering(MediaPlayer mp, float f)
|
|
|
- {
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void playing(MediaPlayer mp)
|
|
|
- {
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void paused(MediaPlayer mp)
|
|
|
- {
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void stopped(MediaPlayer mp)
|
|
|
- {
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void forward(MediaPlayer mp)
|
|
|
- {
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void backward(MediaPlayer mp)
|
|
|
- {
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void finished(MediaPlayer mp)
|
|
|
- {
|
|
|
- finished(false);
|
|
|
- }
|
|
|
|
|
|
- public void finished(boolean skip)
|
|
|
+ public void finished_internal(boolean skip)
|
|
|
{
|
|
|
Thread t = new Thread(()-> //HACK, VLC race conditions
|
|
|
{
|
|
@@ -386,173 +355,186 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
|
|
|
t.setName("VLC-HACK");
|
|
|
t.start();
|
|
|
}
|
|
|
- @Override
|
|
|
- public void timeChanged(MediaPlayer mp, long l)
|
|
|
+
|
|
|
+ //@Override
|
|
|
+ public void error(MediaPlayer mp)
|
|
|
{
|
|
|
- selectedUIPlugin.setPlaybackPositionInSeconds((int) Math.ceil(l/1000.0));
|
|
|
+ l.error("Some error happened on the current playlist segment:\n {}",currentTrack.getM3UElement());
|
|
|
+ l.error("Skipping the track!");
|
|
|
+ finished_internal(false);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void positionChanged(MediaPlayer mp, float f)
|
|
|
+ public boolean playingStatus()
|
|
|
{
|
|
|
+ return isPlaying;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void seekableChanged(MediaPlayer mp, int i)
|
|
|
+ public void suppressVideoOut(boolean suppress)
|
|
|
{
|
|
|
+ suppressVideo = suppress;
|
|
|
+ if(adapter !=null)
|
|
|
+ {
|
|
|
+ adapter.suppressVideoOut(suppress);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void pausableChanged(MediaPlayer mp, int i)
|
|
|
+ public void elementaryStreamAdded(MediaPlayer mp, TrackType tt, int i)
|
|
|
{
|
|
|
- }
|
|
|
|
|
|
- @Override
|
|
|
- public void titleChanged(MediaPlayer mp, int i)
|
|
|
- {
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void snapshotTaken(MediaPlayer mp, String string)
|
|
|
+ public void elementaryStreamDeleted(MediaPlayer mp, TrackType tt, int i)
|
|
|
{
|
|
|
- }
|
|
|
|
|
|
- @Override
|
|
|
- public void lengthChanged(MediaPlayer mp, long l)
|
|
|
- {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void videoOutput(MediaPlayer mp, int i)
|
|
|
+ public void elementaryStreamSelected(MediaPlayer mp, TrackType tt, int i)
|
|
|
{
|
|
|
- }
|
|
|
|
|
|
- @Override
|
|
|
- public void error(MediaPlayer mp)
|
|
|
- {
|
|
|
- l.error("Some error happened on the current playlist segment:\n {}",currentTrack.getM3UElement());
|
|
|
- l.error("Skipping the track!");
|
|
|
- finished(false);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void mediaMetaChanged(MediaPlayer mp, int i)
|
|
|
+ public void opening(MediaPlayer mp)
|
|
|
{
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void mediaSubItemAdded(MediaPlayer mp, libvlc_media_t l)
|
|
|
+ public void buffering(MediaPlayer mp, float f)
|
|
|
{
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void mediaDurationChanged(MediaPlayer mp, long l)
|
|
|
+ public void playing(MediaPlayer mp)
|
|
|
{
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void mediaParsedChanged(MediaPlayer mp, int i)
|
|
|
+ public void paused(MediaPlayer mp)
|
|
|
{
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void mediaFreed(MediaPlayer mp)
|
|
|
+ public void stopped(MediaPlayer mp)
|
|
|
{
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void mediaStateChanged(MediaPlayer mp, int i)
|
|
|
+ public void forward(MediaPlayer mp)
|
|
|
{
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void newMedia(MediaPlayer mp)
|
|
|
+ public void backward(MediaPlayer mp)
|
|
|
{
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void subItemPlayed(MediaPlayer mp, int i)
|
|
|
+ public void finished(MediaPlayer mp)
|
|
|
{
|
|
|
+ finished_internal(false);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void subItemFinished(MediaPlayer mp, int i)
|
|
|
+ public void seekableChanged(MediaPlayer mp, int i)
|
|
|
{
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void endOfSubItems(MediaPlayer mp)
|
|
|
+ public void pausableChanged(MediaPlayer mp, int i)
|
|
|
{
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void scrambledChanged(MediaPlayer mp, int i)
|
|
|
+ public void titleChanged(MediaPlayer mp, int i)
|
|
|
{
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void elementaryStreamAdded(MediaPlayer mp, int i, int i1)
|
|
|
+ public void snapshotTaken(MediaPlayer mp, String string)
|
|
|
{
|
|
|
-
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void elementaryStreamDeleted(MediaPlayer mp, int i, int i1)
|
|
|
+ public void lengthChanged(MediaPlayer mp, long l)
|
|
|
{
|
|
|
+ length = (int) Math.ceil(l/1000);
|
|
|
+ selectedUIPlugin.setTrackLength(length);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void elementaryStreamSelected(MediaPlayer mp, int i, int i1)
|
|
|
+ public void videoOutput(MediaPlayer mp, int i)
|
|
|
{
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void mediaSubItemTreeAdded(MediaPlayer mp, libvlc_media_t l)
|
|
|
+ public void scrambledChanged(MediaPlayer mp, int i)
|
|
|
{
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void corked(MediaPlayer mp, boolean bln)
|
|
|
{
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void muted(MediaPlayer mp, boolean bln)
|
|
|
{
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void volumeChanged(MediaPlayer mp, float f)
|
|
|
{
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void audioDeviceChanged(MediaPlayer mp, String string)
|
|
|
{
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void chapterChanged(MediaPlayer mp, int i)
|
|
|
{
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public boolean playingStatus()
|
|
|
+ public void positionChanged(MediaPlayer mediaPlayer, float newPosition)
|
|
|
{
|
|
|
- return isPlaying;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public void suppressVideoOut(boolean suppress)
|
|
|
+ public void timeChanged(MediaPlayer mediaPlayer, long newTime)
|
|
|
{
|
|
|
- suppressVideo = suppress;
|
|
|
- if(adapter !=null)
|
|
|
- {
|
|
|
- adapter.suppressVideoOut(suppress);
|
|
|
- }
|
|
|
+ position = (int) newTime/1000;
|
|
|
+ selectedUIPlugin.setPlaybackPositionInSeconds(position);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void mediaPlayerReady(MediaPlayer mediaPlayer)
|
|
|
+ {
|
|
|
+
|
|
|
}
|
|
|
|
|
|
|
|
@@ -562,8 +544,6 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
|
|
|
private interface InternalInterface
|
|
|
{
|
|
|
public void addTitle(String vlcpath);
|
|
|
- public int getLengthInSeconds();
|
|
|
- public int getPosition();
|
|
|
public void seek(int sekunde);
|
|
|
public void skipTitle();
|
|
|
public void play();
|
|
@@ -603,8 +583,8 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
|
|
|
f= new MediaPlayerFactory("--no-video-title-show",IZPLApi.getVerbosity()>2?"-vvv":"",suppressVideo?"--no-video":"",voutRequired?"-V":"",voutRequired?vlcVout:""
|
|
|
);
|
|
|
}
|
|
|
- mpaccess = f.newEmbeddedMediaPlayer();
|
|
|
- mpaccess.addMediaPlayerEventListener(parent);
|
|
|
+ mpaccess = f.mediaPlayers().newEmbeddedMediaPlayer();
|
|
|
+ mpaccess.events().addMediaPlayerEventListener(parent);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -623,7 +603,7 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
|
|
|
public void addTitle(String path)
|
|
|
{
|
|
|
String[] options = new String[0];
|
|
|
- mpaccess.stop();
|
|
|
+ mpaccess.controls().stop();
|
|
|
l.info("Next title:{}",path);
|
|
|
if(registeredVideoSurface&&requiresReload)
|
|
|
{
|
|
@@ -640,9 +620,9 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
|
|
|
mpaccess.release();
|
|
|
f.release();
|
|
|
f= new MediaPlayerFactory(options);
|
|
|
- mpaccess = f.newEmbeddedMediaPlayer();
|
|
|
- mpaccess.addMediaPlayerEventListener(parent);
|
|
|
- mpaccess.setVideoSurface(f.newVideoSurface(c));
|
|
|
+ mpaccess = f.mediaPlayers().newEmbeddedMediaPlayer();
|
|
|
+ mpaccess.events().addMediaPlayerEventListener(parent);
|
|
|
+ mpaccess.videoSurface().set(f.videoSurfaces().newVideoSurface(c));
|
|
|
requiresReload=false;
|
|
|
}
|
|
|
else
|
|
@@ -654,45 +634,35 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
|
|
|
mpaccess.release();
|
|
|
f.release();
|
|
|
f= new MediaPlayerFactory("--no-video-title-show",IZPLApi.getVerbosity()>2?"-vvv":"",suppressVideoInternal?"--no-video":"",voutRequired?"-V":"",voutRequired?vlcVout:"");
|
|
|
- mpaccess = f.newEmbeddedMediaPlayer();
|
|
|
- mpaccess.addMediaPlayerEventListener(parent);
|
|
|
+ mpaccess = f.mediaPlayers().newEmbeddedMediaPlayer();
|
|
|
+ mpaccess.events().addMediaPlayerEventListener(parent);
|
|
|
requiresReload=false;
|
|
|
}
|
|
|
}
|
|
|
- mpaccess.playMedia(path,options);
|
|
|
- }
|
|
|
- @Override
|
|
|
- public int getLengthInSeconds()
|
|
|
- {
|
|
|
- return (int) (Math.ceil(mpaccess.getLength()/1000f));
|
|
|
- }
|
|
|
- @Override
|
|
|
- public int getPosition()
|
|
|
- {
|
|
|
- return (int) (Math.ceil((mpaccess.getLength()/1000f)*mpaccess.getPosition()));
|
|
|
+ mpaccess.media().play(path,options);
|
|
|
}
|
|
|
@Override
|
|
|
public void seek(int sekunde)
|
|
|
{
|
|
|
- mpaccess.setPosition(((float)sekunde)/((float)getLengthInSeconds()));
|
|
|
+ mpaccess.controls().setPosition(((float)sekunde)/((float)getLengthInSeconds()));
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void skipTitle()
|
|
|
{
|
|
|
- parent.finished(true);//über bande spielen
|
|
|
+ parent.finished_internal(true);//über bande spielen
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void play()
|
|
|
{
|
|
|
- mpaccess.play();
|
|
|
+ mpaccess.controls().play();
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void pause()
|
|
|
{
|
|
|
- mpaccess.pause();
|
|
|
+ mpaccess.controls().pause();
|
|
|
}
|
|
|
|
|
|
private int videowidth=0;
|
|
@@ -721,12 +691,12 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
|
|
|
p.invalidate();
|
|
|
videowidth = newvideowidth;
|
|
|
videoheight = newvideoheight;
|
|
|
- mpaccess.setVideoSurface(f.newVideoSurface(c));
|
|
|
+ mpaccess.videoSurface().set(f.videoSurfaces().newVideoSurface(c));
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
requiresReload=true;
|
|
|
- mpaccess.setVideoSurface(null);
|
|
|
+ mpaccess.videoSurface().set(null);
|
|
|
registeredVideoSurface=false;
|
|
|
}
|
|
|
|
|
@@ -745,17 +715,7 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
|
|
|
{
|
|
|
|
|
|
}
|
|
|
-
|
|
|
- @Override
|
|
|
- public int getLengthInSeconds()
|
|
|
- {
|
|
|
- return 0;
|
|
|
- }
|
|
|
- @Override
|
|
|
- public int getPosition()
|
|
|
- {
|
|
|
- return 0;
|
|
|
- }
|
|
|
+
|
|
|
@Override
|
|
|
public void seek(int sekunde)
|
|
|
{
|