29 |
29 |
import org.txm.rcp.swt.GLComposite;
|
30 |
30 |
import org.txm.utils.logger.Log;
|
31 |
31 |
|
|
32 |
import javafx.application.Platform;
|
32 |
33 |
import javafx.beans.InvalidationListener;
|
33 |
34 |
import javafx.beans.Observable;
|
34 |
35 |
import javafx.embed.swt.FXCanvas;
|
... | ... | |
46 |
47 |
|
47 |
48 |
protected static final String NOMEDIA = ""; //$NON-NLS-1$
|
48 |
49 |
|
49 |
|
private MediaPlayer vlcPlayer;
|
|
50 |
private MediaPlayer jfxPlayer;
|
50 |
51 |
|
51 |
52 |
private GLComposite videoComposite;
|
52 |
53 |
|
... | ... | |
88 |
89 |
long time, mins, secs;
|
89 |
90 |
|
90 |
91 |
public MediaPlayer getEmbeddedMediaPlayer() {
|
91 |
|
return vlcPlayer;
|
|
92 |
return jfxPlayer;
|
92 |
93 |
}
|
93 |
94 |
|
94 |
95 |
Semaphore s = new Semaphore(1);
|
... | ... | |
116 |
117 |
GridData gdata = new GridData(SWT.FILL, SWT.FILL, true, true);
|
117 |
118 |
gdata.horizontalSpan = 11;
|
118 |
119 |
videoComposite.setLayoutData(gdata);
|
119 |
|
vlcPlayer = null;
|
|
120 |
jfxPlayer = null;
|
120 |
121 |
|
121 |
122 |
videoComposite.addDisposeListener(new DisposeListener() {
|
122 |
123 |
|
123 |
124 |
@Override
|
124 |
125 |
public void widgetDisposed(DisposeEvent e) {
|
125 |
|
if (vlcPlayer != null) {
|
126 |
|
vlcPlayer.dispose();
|
127 |
|
vlcPlayer = null;
|
|
126 |
if (jfxPlayer != null) {
|
|
127 |
jfxPlayer.dispose();
|
|
128 |
jfxPlayer = null;
|
128 |
129 |
fxCanvas.setScene(null);
|
129 |
130 |
}
|
130 |
131 |
}
|
... | ... | |
138 |
139 |
|
139 |
140 |
@Override
|
140 |
141 |
public void mouseUp(MouseEvent e) {
|
141 |
|
if (vlcPlayer != null) {
|
142 |
|
if (vlcPlayer.getStatus().equals(Status.PAUSED)) {
|
|
142 |
if (jfxPlayer != null) {
|
|
143 |
if (jfxPlayer.getStatus().equals(Status.PAUSED)) {
|
143 |
144 |
resume();
|
144 |
145 |
}
|
145 |
|
else if (vlcPlayer.getStatus().equals(Status.PLAYING)) {
|
|
146 |
else if (jfxPlayer.getStatus().equals(Status.PLAYING)) {
|
146 |
147 |
pause();
|
147 |
148 |
}
|
148 |
149 |
}
|
... | ... | |
177 |
178 |
selectMedia();
|
178 |
179 |
playButton.setText(MessagesMP.pause);
|
179 |
180 |
}
|
180 |
|
else if (vlcPlayer != null && vlcPlayer.getStatus().equals(Status.PLAYING)) {
|
|
181 |
else if (jfxPlayer != null && jfxPlayer.getStatus().equals(Status.PLAYING)) {
|
181 |
182 |
pause();
|
182 |
183 |
}
|
183 |
|
else if (vlcPlayer != null && hasEnded) {
|
184 |
|
if (vlcPlayer == null) return;
|
|
184 |
else if (jfxPlayer != null && hasEnded) {
|
|
185 |
if (jfxPlayer == null) return;
|
185 |
186 |
replay();
|
186 |
187 |
}
|
187 |
188 |
else {
|
... | ... | |
213 |
214 |
|
214 |
215 |
@Override
|
215 |
216 |
public void widgetSelected(SelectionEvent e) {
|
216 |
|
if (vlcPlayer != null) {
|
|
217 |
if (jfxPlayer != null) {
|
217 |
218 |
userStopped = true;
|
218 |
|
vlcPlayer.stop();
|
|
219 |
jfxPlayer.stop();
|
219 |
220 |
}
|
220 |
221 |
}
|
221 |
222 |
|
... | ... | |
238 |
239 |
case UPPER:
|
239 |
240 |
end = timeRange.getUpperValue();
|
240 |
241 |
|
241 |
|
vlcPlayer.setStopTime(Duration.seconds(end));
|
|
242 |
jfxPlayer.setStopTime(Duration.seconds(end));
|
242 |
243 |
if (end < time) {
|
243 |
244 |
// System.out.println("Upper changed: fix time");
|
244 |
245 |
time = end;
|
245 |
|
vlcPlayer.seek(Duration.seconds(time));
|
|
246 |
jfxPlayer.seek(Duration.seconds(time));
|
246 |
247 |
}
|
247 |
248 |
break;
|
248 |
249 |
case LOWER:
|
249 |
250 |
start = timeRange.getLowerValue();
|
250 |
|
vlcPlayer.setStartTime(Duration.seconds(start));
|
|
251 |
jfxPlayer.setStartTime(Duration.seconds(start));
|
251 |
252 |
if (start > time) {
|
252 |
253 |
// System.out.println("Lower changed: fix time");
|
253 |
254 |
time = start;
|
254 |
|
vlcPlayer.seek(Duration.seconds(time));
|
|
255 |
jfxPlayer.seek(Duration.seconds(time));
|
255 |
256 |
}
|
256 |
257 |
break;
|
257 |
258 |
case MIDDLE:
|
... | ... | |
259 |
260 |
time = timeRange.getMiddleValue();
|
260 |
261 |
// System.out.println("Middle changed: fix time: " + time);
|
261 |
262 |
|
262 |
|
vlcPlayer.seek(Duration.seconds(time));
|
|
263 |
jfxPlayer.seek(Duration.seconds(time));
|
263 |
264 |
|
264 |
265 |
break;
|
265 |
266 |
default:
|
... | ... | |
304 |
305 |
@Override
|
305 |
306 |
public void widgetSelected(SelectionEvent e) {
|
306 |
307 |
float rate = rateField.getSelection() / 100.0f;
|
307 |
|
vlcPlayer.setRate(rate);
|
|
308 |
jfxPlayer.setRate(rate);
|
308 |
309 |
rateValueLabel.setText("" + rateField.getSelection() + "%");
|
309 |
310 |
}
|
310 |
311 |
|
... | ... | |
330 |
331 |
|
331 |
332 |
@Override
|
332 |
333 |
public void widgetSelected(SelectionEvent e) {
|
333 |
|
vlcPlayer.setVolume(volumeField.getSelection());
|
|
334 |
jfxPlayer.setVolume(volumeField.getSelection());
|
334 |
335 |
volume = volumeField.getSelection();
|
335 |
336 |
volumeValueLabel.setText("" + volume + "%");
|
336 |
337 |
}
|
... | ... | |
416 |
417 |
}
|
417 |
418 |
|
418 |
419 |
protected void resume() {
|
419 |
|
if (vlcPlayer != null) {
|
420 |
|
vlcPlayer.play();
|
|
420 |
if (jfxPlayer != null) {
|
|
421 |
jfxPlayer.play();
|
421 |
422 |
playButton.setText(MessagesMP.pause);
|
422 |
423 |
}
|
423 |
424 |
}
|
424 |
425 |
|
425 |
426 |
protected void pause() {
|
426 |
|
if (vlcPlayer != null) {
|
427 |
|
vlcPlayer.pause();
|
|
427 |
if (jfxPlayer != null) {
|
|
428 |
jfxPlayer.pause();
|
428 |
429 |
playButton.setText(MessagesMP.resume);
|
429 |
430 |
}
|
430 |
431 |
}
|
... | ... | |
438 |
439 |
|
439 |
440 |
protected void replay() {
|
440 |
441 |
if (currentlyPlayed.length() > 0) {
|
441 |
|
vlcPlayer.seek(Duration.seconds(start));
|
|
442 |
jfxPlayer.seek(Duration.seconds(start));
|
442 |
443 |
playButton.setText(MessagesMP.pause);
|
443 |
444 |
}
|
444 |
445 |
}
|
... | ... | |
576 |
577 |
}
|
577 |
578 |
});
|
578 |
579 |
media = new Media(mrl);
|
579 |
|
if (vlcPlayer != null) {
|
|
580 |
if (jfxPlayer != null) {
|
580 |
581 |
try {
|
581 |
|
vlcPlayer.stop();
|
|
582 |
jfxPlayer.stop();
|
582 |
583 |
}
|
583 |
584 |
catch (Exception e) {
|
584 |
585 |
|
585 |
586 |
}
|
586 |
587 |
}
|
587 |
|
vlcPlayer = new MediaPlayer(media);
|
588 |
588 |
|
589 |
|
if (vlcPlayer.getError() == null) {
|
590 |
|
vlcPlayer.setOnError(new Runnable() {
|
|
589 |
Platform.setImplicitExit(false); // This is important to avoid Thread exception when re-opening a player
|
|
590 |
jfxPlayer = new MediaPlayer(media);
|
|
591 |
|
|
592 |
if (jfxPlayer.getError() == null) {
|
|
593 |
jfxPlayer.setOnError(new Runnable() {
|
591 |
594 |
|
592 |
595 |
@Override
|
593 |
596 |
public void run() {
|
594 |
597 |
System.out.println("JFX Player Error:");
|
595 |
|
vlcPlayer.getError().printStackTrace();
|
|
598 |
jfxPlayer.getError().printStackTrace();
|
596 |
599 |
}
|
597 |
600 |
});
|
598 |
601 |
}
|
... | ... | |
601 |
604 |
}
|
602 |
605 |
|
603 |
606 |
initializePlayerListeners();
|
604 |
|
vlcPlayer.setAutoPlay(false);
|
|
607 |
jfxPlayer.setAutoPlay(false);
|
605 |
608 |
|
606 |
|
view = new MediaView(vlcPlayer);
|
|
609 |
view = new MediaView(jfxPlayer);
|
607 |
610 |
|
608 |
611 |
group = new Group(view);
|
609 |
612 |
|
... | ... | |
619 |
622 |
return false;
|
620 |
623 |
}
|
621 |
624 |
|
622 |
|
vlcPlayer.setOnReady(new Runnable() {
|
|
625 |
jfxPlayer.setOnReady(new Runnable() {
|
623 |
626 |
|
624 |
627 |
@Override
|
625 |
628 |
public void run() {
|
626 |
629 |
|
627 |
630 |
timeRange.setMinimum(0);
|
628 |
|
Duration d = vlcPlayer.getMedia().getDuration();
|
|
631 |
Duration d = jfxPlayer.getMedia().getDuration();
|
629 |
632 |
if (d.toSeconds() > 0) {
|
630 |
633 |
timeRange.setMaximum((int) d.toSeconds());
|
631 |
634 |
}
|
632 |
635 |
timeRange.setLowerValue(start);
|
633 |
636 |
timeRange.setMiddleValue(start);
|
634 |
637 |
|
635 |
|
vlcPlayer.setVolume(volume);
|
|
638 |
jfxPlayer.setVolume(volume);
|
636 |
639 |
|
637 |
|
vlcPlayer.setStartTime(Duration.seconds(start));
|
638 |
|
vlcPlayer.seek(Duration.seconds(start));
|
|
640 |
jfxPlayer.setStartTime(Duration.seconds(start));
|
|
641 |
jfxPlayer.seek(Duration.seconds(start));
|
639 |
642 |
if (end > start) {
|
640 |
643 |
timeRange.setUpperValue(end);
|
641 |
|
vlcPlayer.setStopTime(Duration.seconds(end));
|
|
644 |
jfxPlayer.setStopTime(Duration.seconds(end));
|
642 |
645 |
}
|
643 |
646 |
else if (d.toSeconds() > 0) {
|
644 |
|
timeRange.setUpperValue((int) vlcPlayer.getMedia().getDuration().toSeconds());
|
|
647 |
timeRange.setUpperValue((int) jfxPlayer.getMedia().getDuration().toSeconds());
|
645 |
648 |
}
|
646 |
649 |
Log.info("Playing media...");
|
647 |
650 |
|
648 |
|
vlcPlayer.play();
|
|
651 |
jfxPlayer.play();
|
649 |
652 |
resizeView();
|
650 |
653 |
|
651 |
654 |
// if (new File(mrl + ".srt").exists()) { //$NON-NLS-1$
|
... | ... | |
667 |
670 |
|
668 |
671 |
private void initializePlayerListeners() {
|
669 |
672 |
|
670 |
|
vlcPlayer.currentTimeProperty().addListener(new InvalidationListener() {
|
|
673 |
jfxPlayer.currentTimeProperty().addListener(new InvalidationListener() {
|
671 |
674 |
|
672 |
675 |
@Override
|
673 |
676 |
public void invalidated(Observable ov) {
|
674 |
677 |
if (videoComposite.isDisposed()) return;
|
675 |
|
if (vlcPlayer == null) return;
|
|
678 |
if (jfxPlayer == null) return;
|
676 |
679 |
|
677 |
|
Duration currentTime = vlcPlayer.getCurrentTime();
|
|
680 |
Duration currentTime = jfxPlayer.getCurrentTime();
|
678 |
681 |
time = (int) currentTime.toSeconds();
|
679 |
682 |
if (previous == time) {
|
680 |
683 |
return;
|
... | ... | |
711 |
714 |
public void setRepeat(boolean repeat) {
|
712 |
715 |
this.repeat = repeat;
|
713 |
716 |
if (this.repeat) {
|
714 |
|
vlcPlayer.setCycleCount(Integer.MAX_VALUE);
|
|
717 |
jfxPlayer.setCycleCount(Integer.MAX_VALUE);
|
715 |
718 |
}
|
716 |
719 |
else {
|
717 |
|
vlcPlayer.setCycleCount(0);
|
|
720 |
jfxPlayer.setCycleCount(0);
|
718 |
721 |
}
|
719 |
722 |
if (!repeatButton.isDisposed()) {
|
720 |
723 |
repeatButton.setSelection(repeat);
|
... | ... | |
723 |
726 |
|
724 |
727 |
@Override
|
725 |
728 |
public void stop() {
|
726 |
|
if (vlcPlayer == null) return; // nothing to do
|
|
729 |
if (jfxPlayer == null) return; // nothing to do
|
727 |
730 |
userStopped = true;
|
728 |
|
vlcPlayer.stop();
|
|
731 |
jfxPlayer.stop();
|
729 |
732 |
|
730 |
|
vlcPlayer.dispose();
|
731 |
|
vlcPlayer = null;
|
|
733 |
jfxPlayer.dispose();
|
|
734 |
jfxPlayer = null;
|
732 |
735 |
fxCanvas.setScene(null);
|
733 |
736 |
|
734 |
737 |
currentlyPlayed = NOMEDIA;
|
... | ... | |
739 |
742 |
|
740 |
743 |
@Override
|
741 |
744 |
public boolean isMediaLoaded() {
|
742 |
|
return vlcPlayer != null && vlcPlayer.getStatus().equals(Status.READY);
|
|
745 |
return jfxPlayer != null && jfxPlayer.getStatus().equals(Status.READY);
|
743 |
746 |
}
|
744 |
747 |
}
|