// ----------------------------------- Called from outside, one offs or info funcs
-Player::Player(MessageQueue* tmessageQueue, void* tmessageReceiver, bool tIsRecording, bool tIsRadio)
+Player::Player(MessageQueue* tmessageQueue, void* tmessageReceiver, bool tIsRecording)
: vfeed(this), afeed(this)
{
messageQueue = tmessageQueue;
videoStartup = false;
preBuffering = false;
isRecording = tIsRecording;
- isRadio = tIsRadio;
threadBuffer = NULL;
- if (isRadio)
- {
- blockSize = 10000;
- startupBlockSize = 20000;
- preBufferSize = 20000;
- video->turnVideoOff();
- }
- else
- {
- blockSize = 100000;
- startupBlockSize = 250000;
- preBufferSize = 500000;
- video->turnVideoOn();
- }
+ blockSize = 100000;
+ startupBlockSize = 250000;
+ preBufferSize = 500000;
+ video->turnVideoOn();
}
Player::~Player()
if (currentFrameNumber > lengthFrames) currentFrameNumber = 0;
demuxer->setFrameNum(currentFrameNumber);
}
- if (!isRadio) demuxer->seek();
+ demuxer->seek();
videoStartup = true;
state = S_PLAY;
video->reset();
audio->reset();
demuxer->flush();
- if (!isRadio) demuxer->seek();
+ demuxer->seek();
currentFrameNumber = newFrame;
demuxer->setFrameNum(newFrame);
videoStartup = true;
state = S_PLAY;
audio->reset();
demuxer->flush();
- if (!isRadio) demuxer->seek();
+ demuxer->seek();
demuxer->setFrameNum(currentFrameNumber);
videoStartup = true;
afeed.start();
class Player : public Thread_TYPE, public Callback
{
public:
- Player(MessageQueue* messageQueue, void* messageReceiver, bool isRecording, bool isRadio);
+ Player(MessageQueue* messageQueue, void* messageReceiver, bool isRecording);
virtual ~Player();
int init();
bool startup;
bool videoStartup;
bool isRecording;
- bool isRadio;
bool preBuffering;
#ifndef WIN32
logger->log("PlayerRadio", Log::DEBUG, "PlayerRadio has received length bytes of %llu", lengthBytes);
UINT thisRead = 0;
- ULLONG endPTS = 0;
int success;
- threadBuffer = vdr->getBlock(0, 10000, &thisRead);
- if (!threadBuffer)
+ if (isRecording)
{
- logger->log("PlayerRadio", Log::ERR, "Failed to get start block");
- shutdown();
- return 0;
- }
+ UCHAR* buffer = vdr->getBlock(0, 10000, &thisRead);
+ if (!buffer)
+ {
+ logger->log("PlayerRadio", Log::ERR, "Failed to get start block");
+ shutdown();
+ return 0;
+ }
- success = demuxer->findPTS(threadBuffer, thisRead, &startPTS);
- if (!success)
- {
- logger->log("PlayerRadio", Log::ERR, "Failed to get start PTS");
- shutdown();
- return 0;
+ success = demuxer->findPTS(buffer, thisRead, &startPTS);
+ if (!success)
+ {
+ logger->log("PlayerRadio", Log::ERR, "Failed to get start PTS");
+ free(buffer);
+ shutdown();
+ return 0;
+ }
+
+ free(buffer);
+
+ if (!setLengthSeconds())
+ {
+ logger->log("PlayerRadio", Log::ERR, "Failed to setLengthSeconds");
+ shutdown();
+ return 0;
+ }
}
- threadBuffer = vdr->getBlock(tlengthBytes - 10000, 10000, &thisRead);
- if (!threadBuffer)
+ initted = true;
+ return 1;
+}
+
+bool PlayerRadio::setLengthSeconds()
+{
+ int success;
+ ULLONG endPTS = 0;
+ UINT thisRead = 0;
+ UCHAR* buffer = vdr->getBlock(lengthBytes - 10000, 10000, &thisRead);
+ if (!buffer)
{
logger->log("PlayerRadio", Log::ERR, "Failed to get end block");
- shutdown();
- return 0;
+ return false;
}
- success = demuxer->findPTS(threadBuffer, thisRead, &endPTS);
+ success = demuxer->findPTS(buffer, thisRead, &endPTS);
if (!success)
{
logger->log("PlayerRadio", Log::ERR, "Failed to get end PTS");
- shutdown();
- return 0;
+ free(buffer);
+ return false;
}
- logger->log("PlayerRadio", Log::DEBUG, "Start: %llu, End: %llu", startPTS, endPTS);
-
if (startPTS < endPTS)
{
lengthSeconds = (endPTS - startPTS) / 90000;
lengthSeconds = (startPTS - endPTS) / 90000;
}
- initted = true;
- return 1;
+ return true;
}
int PlayerRadio::shutdown()
if (!vdr->isConnected()) { doConnectionLost(); return; }
logger->log("PlayerRadio", Log::DEBUG, "Rescanned and reset length: %llu", lengthBytes);
lastRescan = time(NULL);
+
+ if (!setLengthSeconds())
+ {
+ logger->log("PlayerRadio", Log::ERR, "Failed to setLengthSeconds in thread");
+ return;
+ }
}
if (feedPosition >= lengthBytes) break; // finished playback
void doConnectionLost();
void restartAtPacket(ULONG newPacket);
+ bool setLengthSeconds();
MessageQueue* messageQueue;
void* messageReceiver;
unavailableView = NULL;
streamType = tstreamType;
videoMode = video->getMode();
- if (streamType == VDR::RADIO) player = new Player(Command::getInstance(), this, false, true);
- else player = new Player(Command::getInstance(), this, false, false);
- player->init();
+ if (streamType == VDR::RADIO)
+ {
+ (PlayerRadio*)player = new PlayerRadio(Command::getInstance(), this, false);
+ ((PlayerRadio*)player)->init(0, 0);
+ }
+ else
+ {
+ (Player*)player = new Player(Command::getInstance(), this, false);
+ ((Player*)player)->init();
+ }
+
create(video->getScreenWidth(), video->getScreenHeight());
Colour transparent(0, 0, 0, 0);
setBackgroundColour(transparent);
VVideoLive::~VVideoLive()
{
- delete player;
+ if (streamType == VDR::RADIO)
+ {
+ delete (PlayerRadio*)player;
+ }
+ else
+ {
+ delete (Player*)player;
+ }
+
instance = NULL;
video->setDefaultAspect();
}
#ifdef DEV
case Remote::YELLOW:
{
- player->test1();
break;
}
case Remote::BLUE:
{
- player->test2();
break;
}
#endif
else
{
if (!noShowVLB) doBanner(false);
- player->play();
+
+ if (streamType == VDR::RADIO)
+ {
+ ((PlayerRadio*)player)->play();
+ }
+ else
+ {
+ ((Player*)player)->play();
+ }
}
}
if (unavailable) return;
if (!noRemoveVLB && VLiveBanner::getInstance()) viewman->removeView(VLiveBanner::getInstance()); // if live banner is present, remove it. won't cause damage if its not present
- player->stop();
+ if (streamType == VDR::RADIO)
+ {
+ ((PlayerRadio*)player)->stop();
+ }
+ else
+ {
+ ((Player*)player)->stop();
+ }
+
Log::getInstance()->log("VVideoLive", Log::DEBUG, "Delay starts here due to time taken by plugin to stop");
vdr->stopStreaming();
if (!vdr->isConnected()) { Command::getInstance()->connectionLost(); return; }
#include "view.h"
#include "player.h"
+#include "playerradio.h"
#include "vdr.h"
#include "channel.h"
#include "vlivebanner.h"
ViewMan* viewman;
VDR* vdr;
Video* video;
- Player* player;
+ void* player; // HA HA FIXME
ChannelList* chanList;
VChannelList* vchannelList;
UINT currentChannel; // index in list
timers = Timers::getInstance();
vas = NULL;
- player = new Player(Command::getInstance(), this, true, false);
+ player = new Player(Command::getInstance(), this, true);
player->init();
videoMode = video->getMode();