libbluray | branch: master | hpi1 <[email protected]> | Fri Apr 25 14:38:33 2014 +0300| [08ecda4de8aace1e22ea6e2f609fcc373575a6a6] | committer: hpi1
Properly implement 148015edc1d46b73f3b6b9e9e6bfcf2e6af23eac fix deadlock when playlist player is started before stopping previous one > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=08ecda4de8aace1e22ea6e2f609fcc373575a6a6 --- .../bdj/java/org/videolan/BDJActionQueue.java | 4 +- .../java/org/videolan/media/content/BDHandler.java | 69 ++++++++++++++++---- .../org/videolan/media/content/PlayerManager.java | 5 +- .../videolan/media/content/playlist/Handler.java | 6 +- 4 files changed, 65 insertions(+), 19 deletions(-) diff --git a/src/libbluray/bdj/java/org/videolan/BDJActionQueue.java b/src/libbluray/bdj/java/org/videolan/BDJActionQueue.java index 185c1f7..d2155b5 100644 --- a/src/libbluray/bdj/java/org/videolan/BDJActionQueue.java +++ b/src/libbluray/bdj/java/org/videolan/BDJActionQueue.java @@ -20,7 +20,7 @@ package org.videolan; import java.util.LinkedList; -class BDJActionQueue implements Runnable { +public class BDJActionQueue implements Runnable { public BDJActionQueue(String name) { this(null, name); } @@ -38,7 +38,7 @@ class BDJActionQueue implements Runnable { thread.start(); } - protected void shutdown() { + public void shutdown() { synchronized (actions) { terminated = true; actions.addLast(null); diff --git a/src/libbluray/bdj/java/org/videolan/media/content/BDHandler.java b/src/libbluray/bdj/java/org/videolan/media/content/BDHandler.java index 9caab6d..a7c3364 100644 --- a/src/libbluray/bdj/java/org/videolan/media/content/BDHandler.java +++ b/src/libbluray/bdj/java/org/videolan/media/content/BDHandler.java @@ -58,6 +58,7 @@ import org.bluray.net.BDLocator; import org.videolan.BDJAction; import org.videolan.BDJActionManager; +import org.videolan.BDJActionQueue; import org.videolan.BDJListeners; import org.videolan.BDJXletContext; import org.videolan.Logger; @@ -66,6 +67,14 @@ public abstract class BDHandler implements Player, ServiceContentHandler { public BDHandler() { ownerContext = BDJXletContext.getCurrentContext(); + + PlayerAction action = new PlayerAction(this, PlayerAction.ACTION_INIT, null); + BDJActionManager.getInstance().putCommand(action); + action.waitEnd(); + } + + private void doInitAction() { + commandQueue = new BDJActionQueue("MediaPlayer"); PlayerManager.getInstance().registerPlayer(this); } @@ -196,8 +205,11 @@ public abstract class BDHandler implements Player, ServiceContentHandler { public void setMediaTime(Time now) { checkUnrealized(); + + if (isClosed) return; + PlayerAction action = new PlayerAction(this, PlayerAction.ACTION_SEEK_TIME, now); - BDJActionManager.getInstance().putCommand(action); + commandQueue.put(action); action.waitEnd(); } @@ -228,8 +240,9 @@ public abstract class BDHandler implements Player, ServiceContentHandler { public float setRate(float factor) { checkUnrealized(); + PlayerAction action = new PlayerAction(this, PlayerAction.ACTION_SET_RATE, new Float(factor)); - BDJActionManager.getInstance().putCommand(action); + commandQueue.put(action); action.waitEnd(); return rate; } @@ -243,13 +256,17 @@ public abstract class BDHandler implements Player, ServiceContentHandler { } public void realize() { + if (isClosed) return; + PlayerAction action = new PlayerAction(this, PlayerAction.ACTION_REALIZE, null); - BDJActionManager.getInstance().putCommand(action); + commandQueue.put(action); } public void prefetch() { + if (isClosed) return; + PlayerAction action = new PlayerAction(this, PlayerAction.ACTION_PREFETCH, null); - BDJActionManager.getInstance().putCommand(action); + commandQueue.put(action); } public void syncStart(Time at) { @@ -257,36 +274,58 @@ public abstract class BDHandler implements Player, ServiceContentHandler { if (state != Prefetched) throw new NotPrefetchedError("syncStart"); } + if (isClosed) return; + PlayerAction action = new PlayerAction(this, PlayerAction.ACTION_START, at); - BDJActionManager.getInstance().putCommand(action); + commandQueue.put(action); } public void start() { + if (isClosed) return; + PlayerAction action = new PlayerAction(this, PlayerAction.ACTION_START, null); - BDJActionManager.getInstance().putCommand(action); + commandQueue.put(action); } public void stop() { + if (isClosed) return; + PlayerAction action = new PlayerAction(this, PlayerAction.ACTION_STOP, null); - BDJActionManager.getInstance().putCommand(action); + commandQueue.put(action); action.waitEnd(); } public void deallocate() { + if (isClosed) return; + + if (state == Started) { + } PlayerAction action = new PlayerAction(this, PlayerAction.ACTION_DEALLOCATE, null); - BDJActionManager.getInstance().putCommand(action); + commandQueue.put(action); action.waitEnd(); + + PlayerManager.getInstance().releaseResource(this); } public void close() { + if (isClosed) return; + + stop(); + deallocate(); + PlayerAction action = new PlayerAction(this, PlayerAction.ACTION_CLOSE, null); - BDJActionManager.getInstance().putCommand(action); + commandQueue.put(action); action.waitEnd(); + + isClosed = true; + commandQueue.shutdown(); } protected void endOfMedia() { + if (isClosed) return; + PlayerAction action = new PlayerAction(this, PlayerAction.ACTION_END_OF_MEDIA, null); - BDJActionManager.getInstance().putCommand(action); + commandQueue.put(action); } protected void updateTime(int time) { @@ -444,7 +483,7 @@ public abstract class BDHandler implements Player, ServiceContentHandler { return true; } - protected boolean doDeallocateAction() { + private boolean doDeallocateAction() { ControllerErrorEvent error; switch (state) { case Realizing: @@ -464,7 +503,6 @@ public abstract class BDHandler implements Player, ServiceContentHandler { default: error = doDeallocate(); if (error == null) { - PlayerManager.getInstance().releaseResource(this); int previous = state; state = Realized; notifyListeners(new DeallocateEvent(this, previous, Realized, Realized, getMediaTime())); @@ -504,6 +542,9 @@ public abstract class BDHandler implements Player, ServiceContentHandler { protected void doAction() { switch (action) { + case ACTION_INIT: + player.doInitAction(); + break; case ACTION_REALIZE: player.doRealizeAction(); break; @@ -547,6 +588,7 @@ public abstract class BDHandler implements Player, ServiceContentHandler { public static final int ACTION_END_OF_MEDIA = 7; public static final int ACTION_SEEK_TIME = 8; public static final int ACTION_SET_RATE = 9; + public static final int ACTION_INIT = 10; } protected int state = Unrealized; @@ -559,6 +601,9 @@ public abstract class BDHandler implements Player, ServiceContentHandler { protected BDLocator locator = null; private BDJListeners listeners = new BDJListeners(); private BDJXletContext ownerContext; + boolean isClosed = false; + + protected BDJActionQueue commandQueue; public static final double TO_SECONDS = 1 / 90000.0d; public static final double FROM_SECONDS = 90000.0d; diff --git a/src/libbluray/bdj/java/org/videolan/media/content/PlayerManager.java b/src/libbluray/bdj/java/org/videolan/media/content/PlayerManager.java index 1af6f45..53e70e3 100644 --- a/src/libbluray/bdj/java/org/videolan/media/content/PlayerManager.java +++ b/src/libbluray/bdj/java/org/videolan/media/content/PlayerManager.java @@ -77,9 +77,8 @@ public class PlayerManager { if (player instanceof org.videolan.media.content.playlist.Handler) { synchronized (playlistPlayerLock) { if (playlistPlayer != null && player != playlistPlayer) { - //playlistPlayer.stop(); - //playlistPlayer.deallocate(); - playlistPlayer.doDeallocateAction(); + playlistPlayer.stop(); + playlistPlayer.deallocate(); } playlistPlayer = player; } diff --git a/src/libbluray/bdj/java/org/videolan/media/content/playlist/Handler.java b/src/libbluray/bdj/java/org/videolan/media/content/playlist/Handler.java index 136558e..41250a3 100644 --- a/src/libbluray/bdj/java/org/videolan/media/content/playlist/Handler.java +++ b/src/libbluray/bdj/java/org/videolan/media/content/playlist/Handler.java @@ -270,7 +270,8 @@ public class Handler extends BDHandler { throw new IllegalArgumentException(); PlaylistPlayerAction action = new PlaylistPlayerAction( this, PlaylistPlayerAction.ACTION_SEEK_MARK, mark); - BDJActionManager.getInstance().putCommand(action); + commandQueue.put(action); + action.waitEnd(); } protected void seekPlayItem(int item) throws IllegalArgumentException { @@ -278,7 +279,8 @@ public class Handler extends BDHandler { throw new IllegalArgumentException(); PlaylistPlayerAction action = new PlaylistPlayerAction( this, PlaylistPlayerAction.ACTION_SEEK_PLAYITEM, item); - BDJActionManager.getInstance().putCommand(action); + commandQueue.put(action); + action.waitEnd(); } private class PlaylistPlayerAction extends BDJAction { _______________________________________________ libbluray-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libbluray-devel
