vdr = VDR::getInstance();
initted = false;
lengthBytes = 0;
- lengthFrames = 0;
+ lengthPackets = 0;
streamPos = 0;
state = S_STOP;
if (initted) shutdown();
}
-int PlayerRadio::init(ULLONG tlengthBytes, ULONG tlengthFrames)
+int PlayerRadio::init(ULLONG tlengthBytes, ULONG tlengthPackets)
{
if (initted) return 0;
#ifndef WIN32
demuxer = new DemuxerVDR();
if (!demuxer) return 0;
- if (!demuxer->init(this, audio, NULL))
+ if (!demuxer->init(this, audio, NULL, 10, 40000))
{
logger->log("PlayerRadio", Log::ERR, "Demuxer failed to init");
shutdown();
audio->stop();
lengthBytes = tlengthBytes;
- lengthFrames = tlengthFrames;
+ lengthPackets = tlengthPackets;
logger->log("PlayerRadio", Log::DEBUG, "PlayerRadio has received length bytes of %llu", lengthBytes);
ULONG PlayerRadio::getCurrentSeconds()
{
if (startup) return 0;
- return 0;
+
+ long long currentPTS = demuxer->getAudioPTS();
+ currentPTS -= startPTS;
+ if (currentPTS < 0) currentPTS += 8589934592ULL;
+ ULONG ret = currentPTS / 90000;
+ return ret;
}
// ----------------------------------- Externally called events
{
lock();
logger->log("PlayerRadio", Log::DEBUG, "JUMP TO %i%%", percent);
- ULONG newFrame = percent * lengthFrames / 100;
- switchState(S_JUMP, newFrame);
+ ULONG newPacket = percent * lengthPackets / 100;
+ switchState(S_JUMP, newPacket);
unLock();
}
{
lock();
logger->log("PlayerRadio", Log::DEBUG, "SKIP FORWARD %i SECONDS", seconds);
- ULONG newFrame = getCurrentSeconds();
- if (newFrame == 0) { unLock(); return; } // Current pos from demuxer is not valid
-// newFrame += seconds * video->getFPS();
- if (newFrame > lengthFrames) { switchState(S_PLAY); unLock(); }
- else switchState(S_JUMP, newFrame);
+ ULONG currentSeconds = getCurrentSeconds();
+ ULONG currentPacket = demuxer->getPacketNum();
+
+ if (currentSeconds == 0) { unLock(); return; } // div by zero
+ if (currentPacket == 0) { unLock(); return; } // Current pos from demuxer is not valid
+
+ ULONG newPacket = demuxer->getPacketNum() / currentSeconds * (currentSeconds + seconds);
+ if (newPacket > lengthPackets) { switchState(S_PLAY); unLock(); }
+ else switchState(S_JUMP, newPacket);
unLock();
}
-void PlayerRadio::skipBackward(int seconds)
+void PlayerRadio::skipBackward(int seconds) // FIXME why are these signed?!
{
lock();
logger->log("PlayerRadio", Log::DEBUG, "SKIP BACKWARD %i SECONDS", seconds);
- long newFrame = getCurrentSeconds();
- if (newFrame == 0) { unLock(); return; } // Current pos from demuxer is not valid
-// newFrame -= seconds * video->getFPS();
- if (newFrame < 0) newFrame = 0;
- switchState(S_JUMP, newFrame);
+
+ ULONG currentSeconds = getCurrentSeconds();
+ ULONG currentPacket = demuxer->getPacketNum();
+
+ if (currentSeconds == 0) { unLock(); return; } // div by zero
+ if (currentPacket == 0) { unLock(); return; } // Current pos from demuxer is not valid
+
+ ULONG newPacket;
+ if ((UINT)seconds > currentSeconds)
+ newPacket = 0;
+ else
+ newPacket = demuxer->getPacketNum() / currentSeconds * (currentSeconds - seconds);
+
+ switchState(S_JUMP, newPacket);
unLock();
}
// ----------------------------------- Implementations called events
-void PlayerRadio::switchState(UCHAR toState, ULONG jumpFrame)
+void PlayerRadio::switchState(UCHAR toState, ULONG jumpPacket)
{
if (!initted) return;
}
case S_JUMP: // to S_JUMP
{
- restartAtFrame(jumpFrame);
+ restartAtPacket(jumpPacket);
return;
}
}
{
state = S_PLAY;
audio->unPause();
- restartAtFrame(jumpFrame);
+ restartAtPacket(jumpPacket);
return;
}
}
demuxer->reset();
if (isRecording)
{
- // FIXME use restartAtFrame here?
- if (currentFrameNumber > lengthFrames) currentFrameNumber = 0;
- demuxer->setFrameNum(currentFrameNumber);
+ // FIXME use restartAtPacket here?
+ if (currentPacketNumber > lengthPackets) currentPacketNumber = 0;
+ demuxer->setPacketNum(currentPacketNumber);
}
state = S_PLAY;
#endif
}
-void PlayerRadio::restartAtFrame(ULONG newFrame)
+void PlayerRadio::restartAtPacket(ULONG newPacket)
{
afeed.stop();
threadStop();
audio->reset();
demuxer->flush();
- currentFrameNumber = newFrame;
- demuxer->setFrameNum(newFrame);
+ currentPacketNumber = newPacket;
+ demuxer->setPacketNum(newPacket);
afeed.start();
threadStart();
audio->play();
UINT thisRead, writeLength, thisWrite, askFor;
time_t lastRescan = time(NULL);
- feedPosition = vdr->positionFromFrameNumber(currentFrameNumber);
+ feedPosition = vdr->positionFromFrameNumber(currentPacketNumber);
if (!vdr->isConnected()) { doConnectionLost(); return; }
- logger->log("PlayerRadio", Log::DEBUG, "startFeedPlay: wantedframe %i goto %llu", currentFrameNumber, feedPosition);
+ logger->log("PlayerRadio", Log::DEBUG, "startFeedPlay: wantedPacket %i goto %llu", currentPacketNumber, feedPosition);
while(1)
// If we havn't rescanned for a while..
if ((lastRescan + 60) < time(NULL))
{
- lengthBytes = vdr->rescanRecording(&lengthFrames);
+ lengthBytes = vdr->rescanRecording(&lengthPackets);
if (!vdr->isConnected()) { doConnectionLost(); return; }
logger->log("PlayerRadio", Log::DEBUG, "Rescanned and reset length: %llu", lengthBytes);
lastRescan = time(NULL);