summaryrefslogtreecommitdiff
path: root/softhddevice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'softhddevice.cpp')
-rw-r--r--softhddevice.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/softhddevice.cpp b/softhddevice.cpp
index 06fe3aa..a46006a 100644
--- a/softhddevice.cpp
+++ b/softhddevice.cpp
@@ -1505,6 +1505,7 @@ void cSoftReceiver::Receive(uchar * data, int size)
//////////////////////////////////////////////////////////////////////////////
static cSoftReceiver *PipReceiver; ///< PIP receiver
+static const cChannel *PipChannel; ///< current PIP channel
/**
** Prepare new PIP.
@@ -1530,6 +1531,7 @@ static void NewPip(void)
device->AttachReceiver(receiver);
fprintf(stderr, "pip: attached\n");
PipReceiver = receiver;
+ PipChannel = channel;
}
}
@@ -1539,9 +1541,72 @@ static void NewPip(void)
static void DelPip(void)
{
fprintf(stderr, "pip: stopped\n");
+
delete PipReceiver;
PipReceiver = NULL;
+ PipChannel = NULL;
+}
+
+/**
+** Switch PIP to next available channel.
+**
+** @param direction direction of channel switch
+*/
+static void PipNextAvailableChannel(int direction)
+{
+ const cChannel *channel;
+
+ channel = PipChannel;
+ while (channel) {
+ channel = direction > 0 ? Channels.Next(channel)
+ : Channels.Prev(channel);
+ if (!channel && Setup.ChannelsWrap) {
+ channel = direction > 0 ? Channels.First() : Channels.Last();
+ }
+ if (channel && !channel->GroupSep()
+ && cDevice::GetDevice(channel, 1, false, true)) {
+ cDevice *device;
+ cSoftReceiver *receiver;
+
+ DelPip();
+
+ if ((device = cDevice::GetDevice(channel, 1, false))) {
+ fprintf(stderr, "pip: %p %p\n", channel, device);
+
+ delete PipReceiver;
+
+ PipReceiver = NULL;
+
+ device->SwitchChannel(channel, false);
+ receiver = new cSoftReceiver(channel);
+ device->AttachReceiver(receiver);
+ fprintf(stderr, "pip: attached\n");
+ PipReceiver = receiver;
+ PipChannel = channel;
+ }
+ return;
+ }
+ }
+}
+
+/**
+** Swap PIP channels.
+*/
+static void SwapPipChannels(void)
+{
+ const cChannel *channel;
+
+ fprintf(stderr, "pip: switch channel\n");
+
+ channel = PipChannel;
+
+ DelPip();
+ NewPip();
+
+ if (channel) {
+ Channels.SwitchTo(channel->Number());
+ }
}
/**
@@ -1824,6 +1889,15 @@ eOSState cSoftHdMenu::ProcessKey(eKeys key)
case osUser2:
NewPip();
return osEnd;
+ case osUser4:
+ PipNextAvailableChannel(-1);
+ return osEnd;
+ case osUser5:
+ PipNextAvailableChannel(1);
+ return osEnd;
+ case osUser6:
+ SwapPipChannels();
+ return osEnd;
case osUser7:
SwapPipPosition();
return osEnd;