summaryrefslogtreecommitdiff
path: root/switchtimer_thread.c
diff options
context:
space:
mode:
authorChristian Wieninger <winni@debian.(none)>2007-11-11 15:40:28 +0100
committerChristian Wieninger <winni@debian.(none)>2007-11-11 15:40:28 +0100
commit8d4f8607dc1558ce73eb4c376bdbf78ddb65da83 (patch)
treed0c5dde81a36ab2e8a2edc7c1e6922556518b312 /switchtimer_thread.c
downloadvdr-plugin-epgsearch-8d4f8607dc1558ce73eb4c376bdbf78ddb65da83.tar.gz
vdr-plugin-epgsearch-8d4f8607dc1558ce73eb4c376bdbf78ddb65da83.tar.bz2
Initial commit
Diffstat (limited to 'switchtimer_thread.c')
-rw-r--r--switchtimer_thread.c130
1 files changed, 130 insertions, 0 deletions
diff --git a/switchtimer_thread.c b/switchtimer_thread.c
new file mode 100644
index 0000000..179af83
--- /dev/null
+++ b/switchtimer_thread.c
@@ -0,0 +1,130 @@
+/*
+Copyright (C) 2004-2007 Christian Wieninger
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+
+The author can be reached at cwieninger@gmx.de
+
+The project's page is at http://winni.vdr-developer.org/epgsearch
+*/
+
+#include "switchtimer_thread.h"
+#include "epgsearchcfg.h"
+#include "epgsearchtools.h"
+#include <vdr/tools.h>
+#include <vdr/plugin.h>
+
+#define MSG_DELAY 5
+#define SWITCHTIMER_WAIT 20
+
+cSwitchTimerThread *cSwitchTimerThread::m_Instance = NULL;
+
+cSwitchTimerThread::cSwitchTimerThread(void)
+ : cThread("EPGSearch: switchtimer")
+{
+ m_Active = false;
+ m_lastUpdate = time(NULL);
+}
+
+cSwitchTimerThread::~cSwitchTimerThread() {
+ if (m_Active)
+ Stop();
+}
+
+void cSwitchTimerThread::Init(void) {
+ if (m_Instance == NULL && SwitchTimers.Count() > 0) {
+ m_Instance = new cSwitchTimerThread;
+ m_Instance->Start();
+ }
+}
+
+void cSwitchTimerThread::Exit(void) {
+ if (m_Instance != NULL) {
+ m_Instance->Stop();
+ DELETENULL(m_Instance);
+ }
+}
+
+void cSwitchTimerThread::Stop(void) {
+ m_Active = false;
+ Cancel(6);
+}
+
+void cSwitchTimerThread::Action(void)
+{
+ m_Active = true;
+
+ // let VDR do its startup
+ for(int wait = 0; wait < SWITCHTIMER_WAIT && m_Active; wait++)
+ sleepSec(1);
+
+ time_t nextUpdate = time(NULL);
+ while (m_Active)
+ {
+ time_t now = time(NULL);
+ if (now >= nextUpdate)
+ {
+ LogFile.Log(3,"locking switch timers");
+ cMutexLock SwitchTimersLock(&SwitchTimers);
+ LogFile.Log(3,"switch timer check started");
+ cSwitchTimer* switchTimer = SwitchTimers.First();
+ while (switchTimer)
+ {
+ const cEvent* event = switchTimer->event;
+ if (event && event->StartTime() - now < switchTimer->switchMinsBefore*60 + MSG_DELAY + 1)
+ {
+ cChannel *channel = Channels.GetByChannelID(event->ChannelID(), true, true);
+ bool doswitch = (switchTimer->announceOnly == 0);
+ SwitchTimers.Del(switchTimer);
+ if (channel && (event->EndTime() >= now))
+ {
+ // announce and switch
+ if (doswitch)
+ {
+ LogFile.Log(1,"switching to channel %d", channel->Number());
+ char* cmd = NULL;
+ asprintf(&cmd, "CHAN %d", channel->Number());
+ SendViaSVDRP(cmd);
+ free(cmd);
+
+ if (switchTimer->unmute && cDevice::PrimaryDevice()->IsMute())
+ cDevice::PrimaryDevice()->ToggleMute();
+ }
+ char* Message = NULL;
+ asprintf(&Message, "%s: %s - %s", event->Title(), CHANNELNAME(channel), GETTIMESTRING(event));
+ SendMsg(Message);
+ free(Message);
+ sleepSec(MSG_DELAY);
+ }
+ SwitchTimers.Save();
+ break;
+ }
+ switchTimer = SwitchTimers.Next(switchTimer);
+ }
+ LogFile.Log(3,"switch timer check finished");
+ sleepSec(MSG_DELAY);
+ m_lastUpdate = time(NULL);
+ nextUpdate = long(m_lastUpdate/60)*60+ 60 - MSG_DELAY ; // check at each full minute minus 5sec
+ if (SwitchTimers.Count() == 0)
+ m_Active = false;
+ }
+ while (m_Active && time(NULL)%MSG_DELAY != 0) // sync heart beat to MSG_DELAY
+ sleepSec(1);
+ sleepSec(1);
+ };
+ m_Instance = NULL;
+}
+