player = new Player(NULL);
player->init();
vdr = VDR::getInstance();
+ viewman = ViewMan::getInstance();
chanList = tchanList;
- currentChannel = 0;
+ currentChannel = NULL;
+ unavailable = 0;
+ unavailableView = NULL;
Video* video = Video::getInstance();
setDimensions(video->getScreenHeight(), video->getScreenWidth());
{
case Remote::PLAY:
{
- player->play(); // do resync
+ if (!unavailable) player->play(); // do resync
return 2;
}
case Remote::BACK:
case Remote::MENU:
{
- player->stop();
- vdr->stopStreaming();
+ if (unavailable) showUnavailable(0);
+ else stop();
return 4;
}
case Remote::DF_UP:
case Remote::UP:
{
- player->stop();
- vdr->stopStreaming();
+ if (unavailable) showUnavailable(0);
+ else stop();
upChannel();
- doBanner();
- vdr->streamChannel(currentChannel);
- player->play();
+ play();
return 2;
}
case Remote::DF_DOWN:
case Remote::DOWN:
{
- player->stop();
- vdr->stopStreaming();
+ if (unavailable) showUnavailable(0);
+ else stop();
downChannel();
- doBanner();
- vdr->streamChannel(currentChannel);
- player->play();
+ play();
return 2;
}
case Remote::OK:
{
- doBanner();
+ if (!unavailable) doBanner();
return 2;
}
case Remote::ZERO ... Remote::NINE:
{
VChannelSelect* v = new VChannelSelect(this, command);
- ViewMan::getInstance()->addNoLock(v);
+ viewman->addNoLock(v);
// ViewMan::getInstance()->timedDelete(v, 4, 0);
v->draw();
v->show();
if (m->message == Message::CHANNEL_CHANGE)
{
// check channel number is valid
- Channel* channel;
- for(chanList->reset(); (channel = (Channel*)chanList->getCurrent()); chanList->next())
- {
- if (channel->number == m->parameter)
- {
- player->stop();
- vdr->stopStreaming();
- setChannel(channel->number);
- }
- }
+ currentChannel = channelFromNumber(m->parameter);
+ if (!currentChannel) return; // this should never happen
+ if (unavailable) showUnavailable(0);
+ else stop();
+ play();
}
}
void VVideoLive::doBanner()
{
- VLiveBanner* v = new VLiveBanner();
- ViewMan::getInstance()->addNoLock(v);
- ViewMan::getInstance()->timedDelete(v, 4, 0);
- v->draw();
- v->show();
+ VLiveBanner* v = new VLiveBanner(currentChannel);
+ viewman->timedDelete(v, 4, 0);
+
+ Message* m = new Message();
+ m->from = this;
+ m->to = viewman;
+ m->message = Message::ADD_VIEW;
+ m->parameter = (ULONG)v;
+
+ viewman->postMessage(m);
+}
+
+void VVideoLive::showUnavailable(int active)
+{
+ if (active == unavailable) return;
+
+ if (active)
+ {
+ unavailable = 1;
+
+ unavailableView = new VInfo();
+ unavailableView->setDimensions(200, 400);
+ if (Video::getInstance()->getFormat() == Video::PAL)
+ {
+ unavailableView->setScreenPos(170, 200);
+ }
+ else
+ {
+ unavailableView->setScreenPos(160, 150);
+ }
+ unavailableView->setTitleText(currentChannel->name);
+ unavailableView->setMainText("\n Channel unavailable");
+ unavailableView->setDropThrough();
+
+ Message* m = new Message();
+ m->from = this;
+ m->to = viewman;
+ m->message = Message::ADD_VIEW;
+ m->parameter = (ULONG)unavailableView;
+
+ viewman->postMessage(m);
+ }
+ else
+ {
+ unavailable = 0;
+ ViewMan::getInstance()->removeView(unavailableView, 1);
+ unavailableView = NULL;
+ }
}
void VVideoLive::setChannel(int number)
{
- currentChannel = number;
-// doBanner();
- vdr->streamChannel(currentChannel);
- player->play();
+ currentChannel = channelFromNumber(number);
+ if (!currentChannel) return; // should never happen
+ play();
+}
+
+void VVideoLive::play()
+{
+ showUnavailable(0);
+
+ int available = vdr->streamChannel(currentChannel->number);
+
+ if (!available)
+ {
+ showUnavailable(1);
+ }
+ else
+ {
+ doBanner();
+ player->play();
+ }
+}
+
+void VVideoLive::stop()
+{
+ if (unavailable) return;
+ player->stop();
+ vdr->stopStreaming();
}
void VVideoLive::upChannel()
Channel* channel;
for(chanList->reset(); (channel = (Channel*)chanList->getCurrent()); chanList->next())
{
- if (channel->number == currentChannel)
+ if (channel == currentChannel)
{
chanList->next();
channel = (Channel*)chanList->getCurrent();
if (!channel) return;
- currentChannel = channel->number;
+ currentChannel = channel;
}
}
}
Channel* prevChannel = NULL;
for(chanList->reset(); (channel = (Channel*)chanList->getCurrent()); chanList->next())
{
- if (channel->number == currentChannel)
+ if (channel == currentChannel)
{
if (!prevChannel) return;
- currentChannel = prevChannel->number;
+ currentChannel = prevChannel;
}
prevChannel = channel;
}
}
+
+Channel* VVideoLive::channelFromNumber(int number)
+{
+ Channel* channel;
+ for(chanList->reset(); (channel = (Channel*)chanList->getCurrent()); chanList->next())
+ {
+ if (channel->number == (UINT)number) return channel;
+ }
+ return NULL;
+}
+