break;
case ID_STOP:
if (getTimeOffset() != 0) {
- setPaused(true);
setPos(0);
+ setPaused(true);
}
tb.checkButton(ID_STOP, true);
tb.checkButton(ID_PLAY, false);
}
void RfbPlayer::rewind() {
+ bool paused = isPaused();
blankBuffer();
newSession(fileName);
skipHandshaking();
+ setSpeed(playbackSpeed);
+ setPaused(paused);
+}
+
+void RfbPlayer::processMsg() {
+ static long update_time = GetTickCount();
+ try {
+ if ((!isSeeking()) && ((GetTickCount() - update_time) > 250)) {
+ // Update pos in the toolbar 4 times in 1 second
+ updatePos();
+ update_time = GetTickCount();
+ }
+ RfbProto::processMsg();
+ } catch (rdr::Exception e) {
+ if (strcmp(e.str(), "[End Of File]") == 0) {
+ rewind();
+ setPaused(true);
+ tb.checkButton(ID_STOP, true);
+ tb.checkButton(ID_PAUSE, false);
+ tb.checkButton(ID_PLAY, false);
+ return;
+ }
+ // It's a special exception to perform backward seeking.
+ // We only rewind the stream and seek the offset
+ if (strcmp(e.str(), "[REWIND]") == 0) {
+ long initTime = getSeekOffset();
+ rewind();
+ setPos(initTime);
+ } else {
+ MessageBox(getMainHandle(), e.str(), e.type(), MB_OK | MB_ICONERROR);
+ return;
+ }
+ }
}
void RfbPlayer::serverInit() {
void RfbPlayer::setSpeed(double speed) {
serverInitTime = serverInitTime * getSpeed() / speed;
is->setSpeed(speed);
+ playbackSpeed = speed;
}
double RfbPlayer::getSpeed() {
// -=- RfbProto interface overrides
+ virtual void processMsg();
virtual void serverInit();
virtual void frameBufferUpdateEnd();
virtual void setColourMapEntries(int first, int count, U16* rgbs);