Implemented new "Autoplay" parameter to start the player in the
playback mode. Positioning during playback is now allowed. The desktop
contents is now being updated correctly on startup and after
positioning in the paused mode. Also a number of minor cleanups.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2520 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/java/src/com/tightvnc/rfbplayer/FbsInputStream.java b/java/src/com/tightvnc/rfbplayer/FbsInputStream.java
index 7baa145..4057aca 100644
--- a/java/src/com/tightvnc/rfbplayer/FbsInputStream.java
+++ b/java/src/com/tightvnc/rfbplayer/FbsInputStream.java
@@ -22,6 +22,7 @@
//
import java.io.*;
+import java.util.*;
class FbsInputStream extends InputStream {
@@ -36,6 +37,8 @@
protected int bufferSize;
protected int bufferPos;
+ protected Observer obs;
+
//
// Constructors.
//
@@ -108,6 +111,8 @@
buffer = null;
bufferSize = 0;
bufferPos = 0;
+
+ obs = null;
}
//
@@ -116,21 +121,21 @@
public synchronized long getTimeOffset()
{
- return (long)(timeOffset * playbackSpeed);
+ long off = Math.max(seekOffset, timeOffset);
+ return (long)(off * playbackSpeed);
}
public synchronized void setTimeOffset(long pos)
{
- // FIXME: Seeking works only in paused mode.
- paused = true;
seekOffset = (long)(pos / playbackSpeed);
notify();
}
public synchronized void setSpeed(double newSpeed)
{
- timeOffset = (long)(timeOffset * playbackSpeed / newSpeed);
- startTime = System.currentTimeMillis() - timeOffset;
+ long newOffset = (long)(timeOffset * playbackSpeed / newSpeed);
+ startTime += timeOffset - newOffset;
+ timeOffset = newOffset;
if (isSeeking()) {
seekOffset = (long)(seekOffset * playbackSpeed / newSpeed);
}
@@ -155,6 +160,11 @@
notify();
}
+ public void addObserver(Observer target)
+ {
+ obs = target;
+ }
+
//
// Methods for internal use.
//
@@ -181,9 +191,11 @@
if (seekOffset >= 0) {
if (timeOffset >= seekOffset) {
+ startTime = System.currentTimeMillis() - seekOffset;
seekOffset = -1;
+ } else {
+ return true;
}
- return true;
}
while (true) {
@@ -210,6 +222,9 @@
while (paused && !isSeeking()) {
synchronized(this) {
try {
+ // Note: we call Observer.update(Observable,Object) method
+ // directly instead of maintaining an Observable object.
+ obs.update(null, null);
wait();
} catch (InterruptedException e) {
}