33#if QT_VERSION >= QT_VERSION_CHECK(6,5,0)
34#include <QtSystemDetection>
37#include "libmythbase/mythconfig.h"
58#define LOC QString("ChScan: ")
95 m_vboxScanner->
Stop();
97 m_vboxScanner =
nullptr;
102 if (m_externRecScanner)
104 m_externRecScanner->Stop();
105 delete m_externRecScanner;
106 m_externRecScanner =
nullptr;
120 const QString &inputname,
122 bool do_ignore_signal_timeout,
124 bool do_test_decryption,
127 bool do_complete_only,
128 bool do_full_channel_search,
129 bool do_remove_duplicates,
134 const QMap<QString,QString> &startChan,
135 const QString &freq_std,
138 const QString &tbl_start,
139 const QString &tbl_end)
151 sourceid, do_ignore_signal_timeout, do_test_decryption);
153 LOG(VB_CHANSCAN, LOG_INFO,
LOC +
"Scan()");
157 LOG(VB_CHANSCAN, LOG_ERR,
LOC +
"Scan(): scanner does not exist...");
173 LOG(VB_CHANSCAN, LOG_INFO,
LOC + QString(
"ScanTransports(%1, %2, %3)")
174 .arg(freq_std, mod, tbl));
178 if ((mod.startsWith(
"qam", Qt::CaseInsensitive)) &&
188 sourceid, freq_std, mod, tbl, tbl_start, tbl_end);
197 LOG(VB_CHANSCAN, LOG_INFO,
LOC +
"ScanTransports()");
204 LOG(VB_CHANSCAN, LOG_INFO,
LOC + QString(
"ScanExistingTransports of source %1")
222 LOG(VB_CHANSCAN, LOG_INFO,
LOC +
223 QString(
"ScanForChannels for source %1").arg(sourceid));
226 QString sub_type = card_type;
227 if (card_type ==
"DVB")
231 ok = !device.isEmpty();
255 LOG(VB_CHANSCAN, LOG_INFO,
LOC +
"IPTVImportMPTS: no channels");
259 LOG(VB_CHANSCAN, LOG_INFO,
LOC +
260 QString(
"ScanIPTVChannels(%1) IPTV MPTS").arg(sourceid));
267 InformUser(tr(
"Error scanning MPTS in IPTV"));
274 LOG(VB_CHANSCAN, LOG_INFO,
LOC +
275 QString(
"ScanTransport(%1)").arg(mplexid));
281 QString sistandard =
"mpeg";
282 LOG(VB_CHANSCAN, LOG_INFO,
LOC +
283 "ScanCurrentTransport(" + sistandard +
")");
288 LOG(VB_CHANSCAN, LOG_INFO,
LOC +
289 "Importing channels from External Recorder");
295 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Failed to handle tune complete.");
297 "Failed to handle tune complete."));
347 msg = tr(
"Failed to parse '%1'").arg(
file);
349 msg = tr(
"Programmer Error : incorrect card type");
351 msg = tr(
"Failed to open '%1'").arg(
file);
360 [[maybe_unused]]
const QString &inputname,
384 [[maybe_unused]]
const QString &inputname,
386 [[maybe_unused]]
bool ftaOnly,
399 m_vboxScanner->Scan();
408 [[maybe_unused]]
const QString &inputname,
424 m_externRecScanner->Scan();
433 [[maybe_unused]]
const QString &inputname,
447 m_hdhrScanner->Scan();
458 const QString &inputname,
460 [[maybe_unused]]
bool do_ignore_signal_timeout,
461 bool do_test_decryption)
463 bool monitor_snr =
false;
464 std::chrono::milliseconds signal_timeout = 1s;
465 std::chrono::milliseconds channel_timeout = 40s;
469 if (device.isEmpty())
471 LOG(VB_GENERAL, LOG_ERR,
LOC +
"No Device");
472 InformUser(tr(
"Programmer Error: No Device"));
482 if (
"DVB" == card_type)
485 bool need_nit = ((
"QAM" == sub_type) ||
486 (
"QPSK" == sub_type) ||
487 (
"OFDM" == sub_type) ||
488 (
"DVB_T2" == sub_type));
494 signal_timeout = (do_ignore_signal_timeout) ?
495 channel_timeout * 10 : signal_timeout;
499 signal_timeout = std::max(signal_timeout, 1000ms);
504 channel_timeout = std::max(channel_timeout,
static_cast<int>(need_nit) * 7 * 1000ms);
511 if ((
"V4L" == card_type) || (
"MPEG" == card_type))
516 if (
"HDHOMERUN" == card_type)
524 if (
"SATIP" == card_type)
531 if (
"ASI" == card_type)
538 if (
"FREEBOX" == card_type)
545 if (
"VBOX" == card_type)
552 if (
"EXTERNAL" == card_type)
560 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Channel not created");
561 InformUser(tr(
"Programmer Error: Channel not created"));
571 LOG(VB_GENERAL, LOG_ERR,
LOC +
"Channel could not be opened");
572 InformUser(tr(
"Channel could not be opened."));
579 sourceid, signal_timeout, channel_timeout,
580 inputname, do_test_decryption);
623 bool using_rotor =
false;
634 bool monitor_lock = mon !=
nullptr;
635 bool monitor_strength = mon !=
nullptr;
636 MonitorProgress(monitor_lock, monitor_strength, monitor_snr, using_rotor);
static QString GetRawInputType(uint inputid)
static QString ProbeDVBType(const QString &device)
INPUT_TYPES
all the different inputs
static QString GetVideoDevice(uint inputid)
static bool GetTimeouts(uint inputid, std::chrono::milliseconds &signal_timeout, std::chrono::milliseconds &channel_timeout)
virtual bool Open(void)=0
Opens the channel changing hardware for use.
void SetInputID(uint _inputid)
Scanning class for cards that support a SignalMonitor class.
bool ScanTransportsStartingOn(int sourceid, const QMap< QString, QString > &startChan)
Generates a list of frequencies to scan and adds it to the scanTransport list, and then sets the scan...
bool ScanForChannels(uint sourceid, const QString &std, const QString &cardtype, const DTVChannelList &channels)
bool ScanTransport(uint mplexid, bool follow_nit)
void SetAnalog(bool is_analog)
DVBSignalMonitor * GetDVBSignalMonitor(void)
void SetSignalTimeout(std::chrono::milliseconds val)
SignalMonitor * GetSignalMonitor(void)
bool ScanTransports(int SourceID, const QString &std, const QString &mod, const QString &country, const QString &table_start=QString(), const QString &table_end=QString())
Generates a list of frequencies to scan and adds it to the scanTransport list, and then sets the scan...
std::chrono::milliseconds GetSignalTimeout(void) const
bool ScanExistingTransports(uint sourceid, bool follow_nit)
If we are not already scanning a frequency table, this creates a new frequency table from database an...
bool ScanCurrentTransport(const QString &sistandard)
void StartScanner(void)
Starts the ChannelScanSM event loop.
bool ScanIPTVChannels(uint sourceid, const fbox_chan_map_t &iptv_channels)
void SetScanDTVTunerType(DTVTunerType t)
bool m_completeOnly
Only complete channels desired post scan?
virtual DTVConfParser::return_t ImportDVBUtils(uint sourceid, CardUtil::INPUT_TYPES cardtype, const QString &file)
virtual ~ChannelScanner()
IPTVChannelFetcher * m_iptvScanner
ChannelScanSM * m_sigmonScanner
virtual bool ImportHDHR(uint cardid, const QString &inputname, uint sourceid, ServiceRequirements serviceType)
virtual void Teardown(void)
virtual void PreScanCommon(int scantype, uint cardid, const QString &inputname, uint sourceid, bool do_ignore_signal_timeout, bool do_test_decryption)
virtual bool ImportM3U(uint cardid, const QString &inputname, uint sourceid, bool is_mpts)
bool m_fullSearch
Extended search for old channels post scan?
bool m_channelNumbersOnly
Only channels with logical channel numbers desired post scan?
fbox_chan_map_t m_iptvChannels
bool m_freeToAirOnly
Only fta channels desired post scan?
bool m_removeDuplicates
Remove duplicate transports and channels?
DTVChannelList m_channels
imported channels
virtual void MonitorProgress(bool, bool, bool, bool)
virtual bool ImportVBox(uint cardid, const QString &inputname, uint sourceid, bool ftaOnly, ServiceRequirements serviceType)
ScanMonitor * m_scanMonitor
bool m_addFullTS
Add MPTS "full transport stream" channels.
ServiceRequirements m_serviceRequirements
Services desired post scan.
virtual void InformUser(const QString &)=0
virtual bool ImportExternRecorder(uint cardid, const QString &inputname, uint sourceid)
void Scan(int scantype, uint cardid, const QString &inputname, uint sourceid, bool do_ignore_signal_timeout, bool do_follow_nit, bool do_test_decryption, bool do_fta_only, bool do_lcn_only, bool do_complete_only, bool do_full_channel_search, bool do_remove_duplicates, bool do_add_full_ts, ServiceRequirements service_requirements, uint mplexid, const QMap< QString, QString > &startChan, const QString &freq_std, const QString &mod, const QString &tbl, const QString &tbl_start=QString(), const QString &tbl_end=QString())
Parses dvb-utils channel scanner output files.
static const int kTunerTypeDVBS2
static const int kTunerTypeDVBT
static const int kTunerTypeDVBC
static const int kTunerTypeDVBS1
static const int kTunerTypeDVBT2
static const int kTunerTypeATSC
Provides interface to the tuning hardware when using DVB drivers.
void Stop(void)
Stops the scanning thread running.
fbox_chan_map_t GetChannels(void)
void Scan(void)
Scans the given frequency list.
void ScanPercentComplete(int pct)
virtual void deleteLater(void)
void ScanUpdateStatusText(const QString &status)
@ CurrentTransportScan
Scans the transport when there is no tuner (for ASI)
Signal monitoring base class.
void AddListener(SignalMonitorListener *listener)
static const uint64_t kDVBSigMon_WaitForPos
Wait for rotor to complete turning the antenna.
bool HasFlags(uint64_t _flags) const
Implements tuning for TV cards using the V4L driver API, both versions 1 and 2.
#define LOG(_MASK_, _LEVEL_, _QSTRING_)