CPVRRecordingPtr CPVRRecordings::GetRecordingForEpgTag(const EPG::CEpgInfoTagPtr &epgTag) const { CSingleLock lock(m_critSection); for (const auto recording : m_recordings) { if (recording.second->IsDeleted()) continue; unsigned int iEpgEvent = recording.second->BroadcastUid(); if (iEpgEvent != EPG_TAG_INVALID_UID) { if (iEpgEvent == epgTag->UniqueBroadcastID()) { // uid matches. perfect. return recording.second; } } else { // uid is optional, so check other relevant data. // note: don't use recording.second->Channel() for comparing channels here as this can lead // to deadlocks. compare client ids and channel ids instead, this has the same effect. if (epgTag->ChannelTag() && recording.second->ClientID() == epgTag->ChannelTag()->ClientID() && recording.second->ChannelUid() == epgTag->ChannelTag()->UniqueID() && recording.second->RecordingTimeAsUTC() <= epgTag->StartAsUTC() && (recording.second->RecordingTimeAsUTC() + recording.second->m_duration) >= epgTag->EndAsUTC()) return recording.second; } } return CPVRRecordingPtr(); }
CPVRChannelPtr CPVRRecording::Channel(void) const { if (m_iEpgEventId) { EPG::CEpgInfoTagPtr epgTag = EPG::CEpgContainer::GetInstance().GetTagById(m_iEpgEventId); if (epgTag) return epgTag->ChannelTag(); } return CPVRChannelPtr(); }