#include "Application.h"
#include "threads/SingleLock.h"
#include "settings/AdvancedSettings.h"
-#include "settings/Setting.h"
+#include "settings/lib/Setting.h"
#include "settings/Settings.h"
#include "dialogs/GUIDialogExtendedProgressBar.h"
#include "dialogs/GUIDialogProgress.h"
m_iNextEpgId = 0;
m_bPreventUpdates = false;
m_updateEvent.Reset();
+ m_bStarted = false;
m_bLoaded = false;
m_bHasPendingUpdates = false;
}
Clear(false);
}
+bool CEpgContainer::IsStarted(void) const
+{
+ CSingleLock lock(m_critSection);
+ return m_bStarted;
+}
+
unsigned int CEpgContainer::NextEpgId(void)
{
CSingleLock lock(m_critSection);
}
m_epgs.clear();
m_iNextEpgUpdate = 0;
+ m_bStarted = false;
m_bIsInitialising = true;
m_iNextEpgId = 0;
}
{
Stop();
- CSingleLock lock(m_critSection);
+ {
+ CSingleLock lock(m_critSection);
- if (!m_database.IsOpen())
- m_database.Open();
+ if (!m_database.IsOpen())
+ m_database.Open();
- m_bIsInitialising = true;
- m_bStop = false;
- LoadSettings();
+ m_bIsInitialising = true;
+ m_bStop = false;
+ LoadSettings();
- m_iNextEpgUpdate = 0;
- m_iNextEpgActiveTagCheck = 0;
+ m_iNextEpgUpdate = 0;
+ m_iNextEpgActiveTagCheck = 0;
+ }
LoadFromDB();
- CheckPlayingEvents();
- Create();
- SetPriority(-1);
- CLog::Log(LOGNOTICE, "%s - EPG thread started", __FUNCTION__);
+ CSingleLock lock(m_critSection);
+ if (!m_bStop)
+ {
+ CheckPlayingEvents();
+
+ Create();
+ SetPriority(-1);
+
+ m_bStarted = true;
+
+ CLog::Log(LOGNOTICE, "%s - EPG thread started", __FUNCTION__);
+ }
}
bool CEpgContainer::Stop(void)
if (m_database.IsOpen())
m_database.Close();
+ CSingleLock lock(m_critSection);
+ m_bStarted = false;
+
return true;
}
void CEpgContainer::LoadFromDB(void)
{
+ CSingleLock lock(m_critSection);
+
if (m_bLoaded || m_bIgnoreDbForClient)
return;
for (map<unsigned int, CEpg *>::iterator it = m_epgs.begin(); it != m_epgs.end(); it++)
{
+ if (m_bStop)
+ break;
UpdateProgressDialog(++iCounter, m_epgs.size(), it->second->Name());
+ lock.Leave();
it->second->Load();
+ lock.Enter();
}
CloseProgressDialog();
}
- CSingleLock lock(m_critSection);
m_bLoaded = bLoaded;
}
bool bUpdateEpg(true);
bool bHasPendingUpdates(false);
- if (!CPVRManager::Get().WaitUntilInitialised())
- {
- CLog::Log(LOGDEBUG, "EPG - %s - pvr manager failed to load - exiting", __FUNCTION__);
- return;
- }
-
while (!m_bStop && !g_application.m_bStop)
{
CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(iNow);
}
/* update the EPG */
- if (!InterruptUpdate() && bUpdateEpg && UpdateEPG())
+ if (!InterruptUpdate() && bUpdateEpg && g_PVRManager.EpgsCreated() && UpdateEPG())
m_bIsInitialising = false;
/* clean up old entries */
return NULL;
WaitForUpdateFinish(true);
- CSingleLock lock(m_critSection);
LoadFromDB();
CEpg *epg(NULL);
{
channel->SetEpgID(NextEpgId());
epg = new CEpg(channel, false);
+
+ CSingleLock lock(m_critSection);
m_epgs.insert(make_pair((unsigned int)epg->EpgID(), epg));
SetChanged();
epg->RegisterObserver(this);
epg->SetChannel(channel);
- m_bPreventUpdates = false;
- CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(m_iNextEpgUpdate);
+ {
+ CSingleLock lock(m_critSection);
+ m_bPreventUpdates = false;
+ CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(m_iNextEpgUpdate);
+ }
NotifyObservers(ObservableMessageEpgContainer);
bool bReturn(false);
CSingleLock lock(m_critSection);
bReturn = g_application.m_bStop || m_bStop || m_bPreventUpdates;
- lock.Leave();
return bReturn ||
(CSettings::Get().GetBool("epg.preventupdateswhileplayingtv") &&
- g_PVRManager.IsStarted() &&
- g_PVRManager.IsPlaying());
+ g_application.m_pPlayer && g_application.m_pPlayer->IsPlaying());
}
void CEpgContainer::WaitForUpdateFinish(bool bInterrupt /* = true */)
{
bool bReturn(false);
time_t iNow;
- CSingleLock lock(m_critSection);
+ bool bFoundChanges(false);
- CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(iNow);
- if (iNow >= m_iNextEpgActiveTagCheck)
{
- bool bFoundChanges(false);
CSingleLock lock(m_critSection);
-
- for (map<unsigned int, CEpg *>::iterator it = m_epgs.begin(); it != m_epgs.end(); it++)
- bFoundChanges = it->second->CheckPlayingEvent() || bFoundChanges;
- CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(m_iNextEpgActiveTagCheck);
- m_iNextEpgActiveTagCheck += g_advancedSettings.m_iEpgActiveTagCheckInterval;
-
- if (bFoundChanges)
+ CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(iNow);
+ if (iNow >= m_iNextEpgActiveTagCheck)
{
- SetChanged();
- NotifyObservers(ObservableMessageEpgActiveItem);
- }
+ for (map<unsigned int, CEpg *>::iterator it = m_epgs.begin(); it != m_epgs.end(); it++)
+ bFoundChanges = it->second->CheckPlayingEvent() || bFoundChanges;
+ CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(m_iNextEpgActiveTagCheck);
+ m_iNextEpgActiveTagCheck += g_advancedSettings.m_iEpgActiveTagCheckInterval;
- /* pvr tags always start on the full minute */
- if (g_PVRManager.IsStarted())
- m_iNextEpgActiveTagCheck -= m_iNextEpgActiveTagCheck % 60;
+ /* pvr tags always start on the full minute */
+ if (g_PVRManager.IsStarted())
+ m_iNextEpgActiveTagCheck -= m_iNextEpgActiveTagCheck % 60;
- bReturn = true;
+ bReturn = true;
+ }
}
+ if (bFoundChanges)
+ {
+ SetChanged();
+ NotifyObservers(ObservableMessageEpgActiveItem);
+ }
return bReturn;
}