diff options
author | Christian Wieninger <winni@debian.(none)> | 2007-11-11 15:40:28 +0100 |
---|---|---|
committer | Christian Wieninger <winni@debian.(none)> | 2007-11-11 15:40:28 +0100 |
commit | 8d4f8607dc1558ce73eb4c376bdbf78ddb65da83 (patch) | |
tree | d0c5dde81a36ab2e8a2edc7c1e6922556518b312 /switchtimer_thread.c | |
download | vdr-plugin-epgsearch-8d4f8607dc1558ce73eb4c376bdbf78ddb65da83.tar.gz vdr-plugin-epgsearch-8d4f8607dc1558ce73eb4c376bdbf78ddb65da83.tar.bz2 |
Initial commit
Diffstat (limited to 'switchtimer_thread.c')
-rw-r--r-- | switchtimer_thread.c | 130 |
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; +} + |