diff options
author | Dimitris Kazakos <nemphys@gmail.com> | 2012-12-25 12:22:24 +0200 |
---|---|---|
committer | Dimitris Kazakos <nemphys@gmail.com> | 2012-12-29 16:12:20 +0200 |
commit | a7bf7b3f29dd05682d714a557a807b1db3f55cef (patch) | |
tree | 9a5bed859f7a4e890bd3addfe444d5c7dad40719 | |
parent | b8a867f6f5e7e77a5e6d3fa5099d9f06fe10aa09 (diff) |
[pvr] optimize channel groups loading/manipulation by avoiding unnecessary sorting and renumbering calls
-rw-r--r-- | xbmc/addons/AddonCallbacksPVR.cpp | 2 | ||||
-rw-r--r-- | xbmc/pvr/channels/PVRChannelGroup.cpp | 48 | ||||
-rw-r--r-- | xbmc/pvr/channels/PVRChannelGroup.h | 16 | ||||
-rw-r--r-- | xbmc/pvr/channels/PVRChannelGroupInternal.cpp | 16 | ||||
-rw-r--r-- | xbmc/pvr/channels/PVRChannelGroupInternal.h | 5 | ||||
-rw-r--r-- | xbmc/pvr/channels/PVRChannelGroups.cpp | 1 |
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"); |