Skip to content

Commit c473444

Browse files
AbuBaniazWXbet
andauthored
Fix Last Scanned bouquet m_new_servicerefs synchronization (#4303)
The m_new_servicerefs vector (used to preserve scan order in the Last Scanned bouquet) was getting out of sync with m_new_services in several ways: 1. In channelDone(): m_new_servicerefs.push_back() was called BEFORE checking if the insert succeeded. If the service already existed (from SDT), it would create a duplicate entry with wrong serviceType. 2. In processSDT()/processVCT(): When replacing a PMT entry with different serviceType, m_new_servicerefs was not updated. 3. In processSDT()/processVCT(): New services (not replacing existing) were not added to m_new_servicerefs at all. This caused the serviceRefs in the Last Scanned bouquet to not match what's in lamedb, causing setCurrentSelection() to fail and fall back to the first channel. Fix: - channelDone(): Only add to m_new_servicerefs after successful insert - processSDT()/processVCT(): Update m_new_servicerefs when replacing an existing entry (update serviceRef in place) - processSDT()/processVCT(): Add new services to m_new_servicerefs - Send evtNewService for all successful inserts (not just !found_existing) so the scan UI shows all services correctly Co-authored-by: WXbet <57314510+WXbet@users.noreply.github.com>
1 parent 32066f5 commit c473444

File tree

1 file changed

+37
-3
lines changed

1 file changed

+37
-3
lines changed

lib/dvb/scan.cpp

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1241,11 +1241,11 @@ void eDVBScan::channelDone()
12411241

12421242
if (!(m_flags & scanOnlyFree) || !m_pmt_in_progress->second.scrambled) {
12431243
SCAN_eDebug("[eDVBScan] add not scrambled!");
1244-
m_new_servicerefs.push_back(ref);
12451244
std::pair<std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator, bool> i =
12461245
m_new_services.insert(std::pair<eServiceReferenceDVB, ePtr<eDVBService> >(ref, service));
12471246
if (i.second)
12481247
{
1248+
m_new_servicerefs.push_back(ref);
12491249
m_last_service = i.first;
12501250
m_event(evtNewService);
12511251
}
@@ -1794,6 +1794,21 @@ RESULT eDVBScan::processSDT(eDVBNamespace dvbnamespace, const ServiceDescription
17941794

17951795
/* Remove old entry with wrong serviceType */
17961796
m_new_services.erase(sit);
1797+
1798+
/* Update m_new_servicerefs: replace old serviceRef with correct SDT serviceType */
1799+
for (std::vector<eServiceReferenceDVB>::iterator srit = m_new_servicerefs.begin();
1800+
srit != m_new_servicerefs.end(); ++srit)
1801+
{
1802+
if (srit->getServiceID() == ref.getServiceID() &&
1803+
srit->getDVBNamespace() == ref.getDVBNamespace() &&
1804+
srit->getTransportStreamID() == ref.getTransportStreamID() &&
1805+
srit->getOriginalNetworkID() == ref.getOriginalNetworkID())
1806+
{
1807+
*srit = ref; /* Update with correct serviceType */
1808+
break;
1809+
}
1810+
}
1811+
17971812
found_existing = true;
17981813
SCAN_eDebug("[eDVBScan] SID %04x: replacing PMT entry (type %d) with SDT entry (type %d)",
17991814
ref.getServiceID().get(), sit->first.getServiceType(), ref.getServiceType());
@@ -1805,8 +1820,10 @@ RESULT eDVBScan::processSDT(eDVBNamespace dvbnamespace, const ServiceDescription
18051820
std::pair<std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator, bool> i =
18061821
m_new_services.insert(std::pair<eServiceReferenceDVB, ePtr<eDVBService> >(ref, service));
18071822

1808-
if (i.second && !found_existing)
1823+
if (i.second)
18091824
{
1825+
if (!found_existing)
1826+
m_new_servicerefs.push_back(ref);
18101827
m_last_service = i.first;
18111828
m_event(evtNewService);
18121829
}
@@ -1954,6 +1971,21 @@ RESULT eDVBScan::processVCT(eDVBNamespace dvbnamespace, const VirtualChannelTabl
19541971

19551972
/* Remove old entry with wrong serviceType */
19561973
m_new_services.erase(sit);
1974+
1975+
/* Update m_new_servicerefs: replace old serviceRef with correct VCT serviceType */
1976+
for (std::vector<eServiceReferenceDVB>::iterator srit = m_new_servicerefs.begin();
1977+
srit != m_new_servicerefs.end(); ++srit)
1978+
{
1979+
if (srit->getServiceID() == ref.getServiceID() &&
1980+
srit->getDVBNamespace() == ref.getDVBNamespace() &&
1981+
srit->getTransportStreamID() == ref.getTransportStreamID() &&
1982+
srit->getOriginalNetworkID() == ref.getOriginalNetworkID())
1983+
{
1984+
*srit = ref; /* Update with correct serviceType */
1985+
break;
1986+
}
1987+
}
1988+
19571989
found_existing = true;
19581990
SCAN_eDebug("[eDVBScan] SID %04x: replacing PMT entry (type %d) with VCT entry (type %d)",
19591991
ref.getServiceID().get(), sit->first.getServiceType(), ref.getServiceType());
@@ -1965,8 +1997,10 @@ RESULT eDVBScan::processVCT(eDVBNamespace dvbnamespace, const VirtualChannelTabl
19651997
std::pair<std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator, bool> i =
19661998
m_new_services.insert(std::pair<eServiceReferenceDVB, ePtr<eDVBService> >(ref, service));
19671999

1968-
if (i.second && !found_existing)
2000+
if (i.second)
19692001
{
2002+
if (!found_existing)
2003+
m_new_servicerefs.push_back(ref);
19702004
m_last_service = i.first;
19712005
m_event(evtNewService);
19722006
}

0 commit comments

Comments
 (0)