vdr = VDR::getInstance();
initted = false;
lengthBytes = 0;
- lengthPackets = 0;
- streamPos = 0;
+ lengthFrames = 0;
+ currentFrameNumber = 0;
state = S_STOP;
startPTS = 0;
if (initted) shutdown();
}
-int PlayerRadio::init(ULLONG tlengthBytes, ULONG tlengthPackets, bool isPesRecording)
+int PlayerRadio::init(ULLONG tlengthBytes, ULONG tlengthFrames, bool isPesRecording)
{
if (initted) return 0;
#ifndef WIN32
audio->stop();
lengthBytes = tlengthBytes;
- lengthPackets = tlengthPackets;
+ lengthFrames = tlengthFrames;
logger->log("PlayerRadio", Log::DEBUG, "PlayerRadio has received length bytes of %llu", lengthBytes);
}
-void PlayerRadio::setStartBytes(ULLONG startBytes)
+void PlayerRadio::setCurrentFrameNumber(ULONG num)
{
- streamPos = startBytes;
+ currentFrameNumber = num;
}
ULONG PlayerRadio::getLengthSeconds()
{
lock();
logger->log("PlayerRadio", Log::DEBUG, "JUMP TO %i%%", percent);
- ULONG newPacket = (ULONG)(percent * lengthPackets / 100);
- switchState(S_JUMP, newPacket);
+ ULONG newFrame = (ULONG)(percent * lengthFrames / 100);
+ switchState(S_JUMP, newFrame);
unLock();
}
lock();
logger->log("PlayerRadio", Log::DEBUG, "SKIP FORWARD %i SECONDS", seconds);
ULONG currentSeconds = getCurrentSeconds();
- ULONG currentPacket = demuxer->getPacketNum();
+ ULONG currentFrame = demuxer->getPacketNum();
if (currentSeconds == 0) { unLock(); return; } // div by zero
- if (currentPacket == 0) { unLock(); return; } // Current pos from demuxer is not valid
+ if (currentFrame == 0) { unLock(); return; } // Current pos from demuxer is not valid
- ULONG newPacket = currentPacket + (currentPacket * seconds / currentSeconds);
- if (newPacket > lengthPackets) { switchState(S_PLAY); unLock(); }
- else switchState(S_JUMP, newPacket);
+ ULONG newFrame = currentFrame + (currentFrame * seconds / currentSeconds);
+ if (newFrame > lengthFrames) { switchState(S_PLAY); unLock(); }
+ else switchState(S_JUMP, newFrame);
unLock();
}
logger->log("PlayerRadio", Log::DEBUG, "SKIP BACKWARD %i SECONDS", seconds);
ULONG currentSeconds = getCurrentSeconds();
- ULONG currentPacket = demuxer->getPacketNum();
+ ULONG currentFrame = demuxer->getPacketNum();
if (currentSeconds == 0) { unLock(); return; } // div by zero
- if (currentPacket == 0) { unLock(); return; } // Current pos from demuxer is not valid
+ if (currentFrame == 0) { unLock(); return; } // Current pos from demuxer is not valid
- ULONG newPacket;
+ ULONG newFrame;
if ((UINT)seconds > currentSeconds)
- newPacket = 0;
+ newFrame = 0;
else
- newPacket = currentPacket - (currentPacket * seconds / currentSeconds);
+ newFrame = currentFrame - (currentFrame * seconds / currentSeconds);
- switchState(S_JUMP, newPacket);
+ switchState(S_JUMP, newFrame);
unLock();
}
// ----------------------------------- Implementations called events
-void PlayerRadio::switchState(UCHAR toState, ULONG jumpPacket)
+void PlayerRadio::switchState(UCHAR toState, ULONG jumpToFrame)
{
if (!initted) return;
}
case S_JUMP: // to S_JUMP
{
- restartAtPacket(jumpPacket);
+ restartAtFrame(jumpToFrame);
return;
}
}
{
state = S_PLAY;
audio->unPause();
- restartAtPacket(jumpPacket);
+ restartAtFrame(jumpToFrame);
return;
}
}
startup = true;
audio->reset();
- audio->setStreamType(Audio::MPEG2_PES);
+ audio->setStreamType(Audio::MPEG2_PES);
audio->systemMuteOff();
demuxer->reset();
- // FIXME use restartAtPacket here?
- if (currentPacketNumber > lengthPackets) currentPacketNumber = 0;
- demuxer->setPacketNum(currentPacketNumber);
+ // FIXME use restartAtFrame here?
+ if (currentFrameNumber > lengthFrames) currentFrameNumber = 0;
+ demuxer->setPacketNum(currentFrameNumber);
state = S_PLAY;
threadStart();
logger->log("PlayerRadio", Log::DEBUG, "Immediate play");
#endif
}
-void PlayerRadio::restartAtPacket(ULONG newPacket)
+void PlayerRadio::restartAtFrame(ULONG newFrame)
{
afeed.stop();
threadStop();
audio->reset();
- audio->setStreamType(Audio::MPEG2_PES);
+ audio->setStreamType(Audio::MPEG2_PES);
demuxer->flush();
- currentPacketNumber = newPacket;
- demuxer->setPacketNum(newPacket);
+ currentFrameNumber = newFrame;
+ demuxer->setPacketNum(newFrame);
afeed.start();
threadStart();
audio->play();
UINT thisRead, writeLength, thisWrite, askFor;
time_t lastRescan = time(NULL);
- feedPosition = vdr->positionFromFrameNumber(currentPacketNumber);
+ feedPosition = vdr->positionFromFrameNumber(currentFrameNumber);
if (!vdr->isConnected()) { doConnectionLost(); return; }
- logger->log("PlayerRadio", Log::DEBUG, "startFeedPlay: wantedPacket %i goto %llu", currentPacketNumber, feedPosition);
+ logger->log("PlayerRadio", Log::DEBUG, "startFeedPlay: wantedFrame %i goto %llu", currentFrameNumber, feedPosition);
while(1)
// If we havn't rescanned for a while..
if ((lastRescan + 60) < time(NULL))
{
- lengthBytes = vdr->rescanRecording(&lengthPackets);
+ lengthBytes = vdr->rescanRecording(&lengthFrames);
if (!vdr->isConnected()) { doConnectionLost(); return; }
logger->log("PlayerRadio", Log::DEBUG, "Rescanned and reset length: %llu", lengthBytes);
lastRescan = time(NULL);
class VDR;
class MessageQueue;
+/*
+ * Frames...
+ *
+ * VDR tells me there are around 8.3 "frames" per second in radio recordings.
+ * I don't know where this comes from but things seem to work.
+ */
+
class PlayerRadio : public Thread_TYPE, public Callback
{
public:
PlayerRadio(MessageQueue* messageQueue, void* messageReceiver);
virtual ~PlayerRadio();
- int init(ULLONG lengthBytes, ULONG lengthPackets, bool IsPesRecording);
+ int init(ULLONG lengthBytes, ULONG lengthFrames, bool IsPesRecording);
int shutdown();
- void setStartBytes(ULLONG startBytes);
+ void setCurrentFrameNumber(ULONG num);
void play();
void stop();
void threadPostStopCleanup();
private:
- void switchState(UCHAR newState, ULONG jumpPacket=0);
+ void switchState(UCHAR newState, ULONG jumpToFrame=0);
void threadFeedPlay();
void threadFeedScan();
void doConnectionLost();
- void restartAtPacket(ULONG newPacket);
+ void restartAtFrame(ULONG newFrame);
bool setLengthSeconds();
MessageQueue* messageQueue;
void unLock();
ULLONG lengthBytes;
- ULLONG streamPos;
- ULONG lengthPackets;
- ULONG currentPacketNumber;
+ ULONG lengthFrames;
+ ULONG currentFrameNumber;
UINT blockSize;
UINT startupBlockSize;
UCHAR* threadBuffer;