aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitris Kazakos <nemphys@gmail.com>2012-12-25 12:22:24 +0200
committerDimitris Kazakos <nemphys@gmail.com>2012-12-29 16:12:20 +0200
commita7bf7b3f29dd05682d714a557a807b1db3f55cef (patch)
tree9a5bed859f7a4e890bd3addfe444d5c7dad40719
parentb8a867f6f5e7e77a5e6d3fa5099d9f06fe10aa09 (diff)
[pvr] optimize channel groups loading/manipulation by avoiding unnecessary sorting and renumbering calls
-rw-r--r--xbmc/addons/AddonCallbacksPVR.cpp2
-rw-r--r--xbmc/pvr/channels/PVRChannelGroup.cpp48
-rw-r--r--xbmc/pvr/channels/PVRChannelGroup.h16
-rw-r--r--xbmc/pvr/channels/PVRChannelGroupInternal.cpp16
-rw-r--r--xbmc/pvr/channels/PVRChannelGroupInternal.h5
-rw-r--r--xbmc/pvr/channels/PVRChannelGroups.cpp1
6 files changed, 67 insertions, 21 deletions
diff --git a/xbmc/addons/AddonCallbacksPVR.cpp b/xbmc/addons/AddonCallbacksPVR.cpp
index b410035fc6..d2c5840319 100644
--- a/xbmc/addons/AddonCallbacksPVR.cpp
+++ b/xbmc/addons/AddonCallbacksPVR.cpp
@@ -130,7 +130,7 @@ void CAddonCallbacksPVR::PVRTransferChannelGroupMember(void *addonData, const AD
else if (group->IsRadio() == channel->IsRadio())
{
/* transfer this entry to the group */
- group->AddToGroup(*channel, member->iChannelNumber, false);
+ group->AddToGroup(*channel, member->iChannelNumber);
}
}
diff --git a/xbmc/pvr/channels/PVRChannelGroup.cpp b/xbmc/pvr/channels/PVRChannelGroup.cpp
index 391766b513..0e6bdc3229 100644
--- a/xbmc/pvr/channels/PVRChannelGroup.cpp
+++ b/xbmc/pvr/channels/PVRChannelGroup.cpp
@@ -49,7 +49,8 @@ CPVRChannelGroup::CPVRChannelGroup(void) :
m_iGroupId(-1),
m_bLoaded(false),
m_bChanged(false),
- m_bUsingBackendChannelOrder(false)
+ m_bUsingBackendChannelOrder(false),
+ m_bPreventSortAndRenumber(false)
{
}
@@ -60,7 +61,8 @@ CPVRChannelGroup::CPVRChannelGroup(bool bRadio, unsigned int iGroupId, const CSt
m_strGroupName(strGroupName),
m_bLoaded(false),
m_bChanged(false),
- m_bUsingBackendChannelOrder(false)
+ m_bUsingBackendChannelOrder(false),
+ m_bPreventSortAndRenumber(false)
{
}
@@ -71,7 +73,8 @@ CPVRChannelGroup::CPVRChannelGroup(const PVR_CHANNEL_GROUP &group) :
m_strGroupName(group.strGroupName),
m_bLoaded(false),
m_bChanged(false),
- m_bUsingBackendChannelOrder(false)
+ m_bUsingBackendChannelOrder(false),
+ m_bPreventSortAndRenumber(false)
{
}
@@ -154,6 +157,7 @@ bool CPVRChannelGroup::Update(void)
return true;
CPVRChannelGroup PVRChannels_tmp(m_bRadio, m_iGroupId, m_strGroupName);
+ PVRChannels_tmp.SetPreventSortAndRenumber();
PVRChannels_tmp.LoadFromClients();
return UpdateGroupEntries(PVRChannels_tmp);
@@ -301,6 +305,9 @@ struct sortByChannelNumber
bool CPVRChannelGroup::SortAndRenumber(void)
{
+ if (PreventSortAndRenumber())
+ return true;
+
CSingleLock lock(m_critSection);
if (m_bUsingBackendChannelOrder)
SortByClientChannelNumber();
@@ -315,13 +322,15 @@ bool CPVRChannelGroup::SortAndRenumber(void)
void CPVRChannelGroup::SortByClientChannelNumber(void)
{
CSingleLock lock(m_critSection);
- sort(m_members.begin(), m_members.end(), sortByClientChannelNumber());
+ if (!PreventSortAndRenumber())
+ sort(m_members.begin(), m_members.end(), sortByClientChannelNumber());
}
void CPVRChannelGroup::SortByChannelNumber(void)
{
CSingleLock lock(m_critSection);
- sort(m_members.begin(), m_members.end(), sortByChannelNumber());
+ if (!PreventSortAndRenumber())
+ sort(m_members.begin(), m_members.end(), sortByChannelNumber());
}
/********** getters **********/
@@ -585,8 +594,11 @@ bool CPVRChannelGroup::LoadFromClients(void)
bool CPVRChannelGroup::AddAndUpdateChannels(const CPVRChannelGroup &channels, bool bUseBackendChannelNumbers)
{
bool bReturn(false);
+ bool bPreventSortAndRenumber(PreventSortAndRenumber());
CSingleLock lock(m_critSection);
+ SetPreventSortAndRenumber();
+
/* go through the channel list and check for new channels.
channels will only by updated in CPVRChannelGroupInternal to prevent dupe updates */
for (unsigned int iChannelPtr = 0; iChannelPtr < channels.m_members.size(); iChannelPtr++)
@@ -604,7 +616,7 @@ bool CPVRChannelGroup::AddAndUpdateChannels(const CPVRChannelGroup &channels, bo
if (!IsGroupMember(*existingChannel))
{
int iChannelNumber = bUseBackendChannelNumbers ? member.channel->ClientChannelNumber() : 0;
- AddToGroup(*existingChannel, iChannelNumber, false);
+ AddToGroup(*existingChannel, iChannelNumber);
bReturn = true;
CLog::Log(LOGINFO,"PVRChannelGroup - %s - added %s channel '%s' at position %d in group '%s'",
@@ -612,6 +624,9 @@ bool CPVRChannelGroup::AddAndUpdateChannels(const CPVRChannelGroup &channels, bo
}
}
+ SetPreventSortAndRenumber(bPreventSortAndRenumber);
+ SortAndRenumber();
+
return bReturn;
}
@@ -753,7 +768,7 @@ bool CPVRChannelGroup::RemoveFromGroup(const CPVRChannel &channel)
return bReturn;
}
-bool CPVRChannelGroup::AddToGroup(CPVRChannel &channel, int iChannelNumber /* = 0 */, bool bSortAndRenumber /* = true */)
+bool CPVRChannelGroup::AddToGroup(CPVRChannel &channel, int iChannelNumber /* = 0 */)
{
CSingleLock lock(m_critSection);
@@ -774,8 +789,7 @@ bool CPVRChannelGroup::AddToGroup(CPVRChannel &channel, int iChannelNumber /* =
m_members.push_back(newMember);
m_bChanged = true;
- if (bSortAndRenumber)
- SortAndRenumber();
+ SortAndRenumber();
// TODO notify observers
bReturn = true;
@@ -871,6 +885,10 @@ bool CPVRChannelGroup::Renumber(void)
bool bReturn(false);
unsigned int iChannelNumber(0);
bool bUseBackendChannelNumbers(g_guiSettings.GetBool("pvrmanager.usebackendchannelnumbers") && g_PVRClients->EnabledClientAmount() == 1);
+
+ if (PreventSortAndRenumber())
+ return true;
+
CSingleLock lock(m_critSection);
for (unsigned int iChannelPtr = 0; iChannelPtr < m_members.size(); iChannelPtr++)
@@ -1118,6 +1136,18 @@ CStdString CPVRChannelGroup::GroupName(void) const
return strReturn;
}
+bool CPVRChannelGroup::PreventSortAndRenumber(void) const
+{
+ CSingleLock lock(m_critSection);
+ return m_bPreventSortAndRenumber;
+}
+
+void CPVRChannelGroup::SetPreventSortAndRenumber(bool bPreventSortAndRenumber /* = true */)
+{
+ CSingleLock lock(m_critSection);
+ m_bPreventSortAndRenumber = bPreventSortAndRenumber;
+}
+
bool CPVRChannelGroup::UpdateChannel(const CFileItem &item, bool bHidden, bool bVirtual, bool bEPGEnabled, bool bParentalLocked, int iEPGSource, int iChannelNumber, const CStdString &strChannelName, const CStdString &strIconPath, const CStdString &strStreamURL)
{
if (!item.HasPVRChannelInfoTag())
diff --git a/xbmc/pvr/channels/PVRChannelGroup.h b/xbmc/pvr/channels/PVRChannelGroup.h
index 9bb323b180..243dd43500 100644
--- a/xbmc/pvr/channels/PVRChannelGroup.h
+++ b/xbmc/pvr/channels/PVRChannelGroup.h
@@ -135,10 +135,9 @@ namespace PVR
* @brief Add a channel to this container.
* @param channel The channel to add.
* @param iChannelNumber The channel number of the channel number to add. Use -1 to add it at the end.
- * @param bSortAndRenumber Set to false to keep the channel list unsorted after adding a new channel.
* @return True if the channel was added, false otherwise.
*/
- virtual bool AddToGroup(CPVRChannel &channel, int iChannelNumber = 0, bool bSortAndRenumber = true);
+ virtual bool AddToGroup(CPVRChannel &channel, int iChannelNumber = 0);
/*!
* @brief Change the name of this group.
@@ -181,6 +180,12 @@ namespace PVR
bool IsRadio(void) const { return m_bRadio; }
/*!
+ * @brief True if sorting should be prevented when adding/updating channels to the group.
+ * @return True if sorting should be prevented when adding/updating channels to the group.
+ */
+ bool PreventSortAndRenumber(void) const;
+
+ /*!
* @brief The database ID of this group.
* @return The database ID of this group.
*/
@@ -204,6 +209,12 @@ namespace PVR
int GroupType(void) const;
/*!
+ * @brief Set if sorting and renumbering should happen after adding/updating channels to group.
+ * @param bPreventSortAndRenumber The new sorting and renumbering prevention value for this group.
+ */
+ void SetPreventSortAndRenumber(bool bPreventSortAndRenumber = true);
+
+ /*!
* @brief The name of this group.
* @return The name of this group.
*/
@@ -473,6 +484,7 @@ namespace PVR
bool m_bUsingBackendChannelOrder; /*!< true to use the channel order from backends, false otherwise */
bool m_bUsingBackendChannelNumbers; /*!< true to use the channel numbers from 1 backend, false otherwise */
bool m_bSelectedGroup; /*!< true when this is the selected group, false otherwise */
+ bool m_bPreventSortAndRenumber; /*!< true when sorting and renumbering should not be done after adding/updating channels to the group */
std::vector<PVRChannelGroupMember> m_members;
CCriticalSection m_critSection;
};
diff --git a/xbmc/pvr/channels/PVRChannelGroupInternal.cpp b/xbmc/pvr/channels/PVRChannelGroupInternal.cpp
index 4bbce1873e..e6508941b1 100644
--- a/xbmc/pvr/channels/PVRChannelGroupInternal.cpp
+++ b/xbmc/pvr/channels/PVRChannelGroupInternal.cpp
@@ -107,19 +107,20 @@ void CPVRChannelGroupInternal::UpdateFromClient(const CPVRChannel &channel, unsi
}
}
-bool CPVRChannelGroupInternal::InsertInGroup(CPVRChannel &channel, int iChannelNumber /* = 0 */, bool bSortAndRenumber /* = true */)
+bool CPVRChannelGroupInternal::InsertInGroup(CPVRChannel &channel, int iChannelNumber /* = 0 */)
{
CSingleLock lock(m_critSection);
- return CPVRChannelGroup::AddToGroup(channel, iChannelNumber, bSortAndRenumber);
+ return CPVRChannelGroup::AddToGroup(channel, iChannelNumber);
}
bool CPVRChannelGroupInternal::Update(void)
{
CPVRChannelGroupInternal PVRChannels_tmp(m_bRadio);
+ PVRChannels_tmp.SetPreventSortAndRenumber();
return PVRChannels_tmp.LoadFromClients() && UpdateGroupEntries(PVRChannels_tmp);
}
-bool CPVRChannelGroupInternal::AddToGroup(CPVRChannel &channel, int iChannelNumber /* = 0 */, bool bSortAndRenumber /* = true */)
+bool CPVRChannelGroupInternal::AddToGroup(CPVRChannel &channel, int iChannelNumber /* = 0 */)
{
CSingleLock lock(m_critSection);
@@ -136,8 +137,7 @@ bool CPVRChannelGroupInternal::AddToGroup(CPVRChannel &channel, int iChannelNumb
realChannel->SetHidden(false);
m_iHiddenChannels--;
- if (bSortAndRenumber)
- Renumber();
+ SortAndRenumber();
}
/* move this channel and persist */
@@ -290,6 +290,8 @@ bool CPVRChannelGroupInternal::UpdateChannel(const CPVRChannel &channel)
bool CPVRChannelGroupInternal::AddAndUpdateChannels(const CPVRChannelGroup &channels, bool bUseBackendChannelNumbers)
{
bool bReturn(false);
+ SetPreventSortAndRenumber();
+
CSingleLock lock(m_critSection);
/* go through the channel list and check for updated or new channels */
@@ -319,6 +321,10 @@ bool CPVRChannelGroupInternal::AddAndUpdateChannels(const CPVRChannelGroup &chan
}
}
+ SetPreventSortAndRenumber(false);
+ if (m_bChanged)
+ SortAndRenumber();
+
return bReturn;
}
diff --git a/xbmc/pvr/channels/PVRChannelGroupInternal.h b/xbmc/pvr/channels/PVRChannelGroupInternal.h
index ddb328ce79..33606c694f 100644
--- a/xbmc/pvr/channels/PVRChannelGroupInternal.h
+++ b/xbmc/pvr/channels/PVRChannelGroupInternal.h
@@ -61,9 +61,8 @@ namespace PVR
/*!
* @brief Add a channel to this internal group.
* @param iChannelNumber The channel number to use for this channel or 0 to add it to the back.
- * @param bSortAndRenumber Set to false to not to sort the group after adding a channel
*/
- bool InsertInGroup(CPVRChannel &channel, int iChannelNumber = 0, bool bSortAndRenumber = true);
+ bool InsertInGroup(CPVRChannel &channel, int iChannelNumber = 0);
/*!
* @brief Callback for add-ons to update a channel.
@@ -80,7 +79,7 @@ namespace PVR
/*!
* @see CPVRChannelGroup::AddToGroup
*/
- bool AddToGroup(CPVRChannel &channel, int iChannelNumber = 0, bool bSortAndRenumber = true);
+ bool AddToGroup(CPVRChannel &channel, int iChannelNumber = 0);
/*!
* @see CPVRChannelGroup::RemoveFromGroup
diff --git a/xbmc/pvr/channels/PVRChannelGroups.cpp b/xbmc/pvr/channels/PVRChannelGroups.cpp
index e6e4c4e66b..4350f20fe7 100644
--- a/xbmc/pvr/channels/PVRChannelGroups.cpp
+++ b/xbmc/pvr/channels/PVRChannelGroups.cpp
@@ -294,7 +294,6 @@ bool CPVRChannelGroups::Load(void)
// set the internal group as selected at startup
internalChannels->SetSelectedGroup(true);
- internalChannels->Renumber();
m_selectedGroup = internalChannels;
CLog::Log(LOGDEBUG, "PVR - %s - %d %s channel groups loaded", __FUNCTION__, (int) m_groups.size(), m_bRadio ? "radio" : "TV");