Ticket #5061: multiple-dvb-frontends-trunk.patch

File multiple-dvb-frontends-trunk.patch, 28.8 KB (added by Paul Kendall <paul@…>, 16 years ago)

Patch for multiple DVB frontends for trunk

  • libs/libmythtv/dvbrecorder.cpp

     
    9494
    9595DVBRecorder::DVBRecorder(TVRec *rec, DVBChannel* advbchannel)
    9696    : DTVRecorder(rec),
    97       // Options set in SetOption()
    98       _card_number_option(0),
    9997      // DVB stuff
    10098      dvbchannel(advbchannel),
    10199      _stream_handler(NULL),
     
    145143    }
    146144}
    147145
    148 void DVBRecorder::SetOption(const QString &name, int value)
     146void DVBRecorder::SetOption(const QString &name, const QString &value)
    149147{
    150148    if (name == "cardnum")
    151149    {
    152150        _card_number_option = value;
    153         videodevice = QString::number(value);
     151        videodevice = value;
    154152    }
    155153    else
    156154        DTVRecorder::SetOption(name, value);
     
    160158                                        const QString &videodev,
    161159                                        const QString&, const QString&)
    162160{
    163     SetOption("cardnum", videodev.toInt());
     161    SetOption("cardnum", videodev);
    164162    DTVRecorder::SetOption("tvformat", gContext->GetSetting("TVFormat"));
    165163    SetStrOption(profile,  "recordingtype");
    166164}
     
    318316        return true;
    319317    }
    320318
    321     if (_card_number_option < 0)
     319    if (_card_number_option.isEmpty())
    322320        return false;
    323321
    324322    bzero(_stream_id,  sizeof(_stream_id));
  • libs/libmythtv/cardutil.h

     
    221221    static bool         IsDVB(uint cardid)
    222222        { return "DVB" == GetRawCardType(cardid); }
    223223    static bool         IsDVBCardType(const QString card_type);
    224     static QString      ProbeDVBFrontendName(uint device);
    225     static QString      ProbeDVBType(uint device);
    226     static bool         HasDVBCRCBug(uint device);
    227     static uint         GetMinSignalMonitoringDelay(uint device);
    228     static QString      GetDeviceName(dvb_dev_type_t, uint cardnum);
     224    static QString      ProbeDVBFrontendName(const QString &device);
     225    static QString      ProbeDVBType(const QString &device);
     226    static bool         HasDVBCRCBug(const QString &device);
     227    static uint         GetMinSignalMonitoringDelay(const QString &device);
     228    static QString      GetDeviceName(dvb_dev_type_t, const QString &device);
    229229    static InputNames   GetConfiguredDVBInputs(uint cardid);
    230230
    231231    // V4L info
  • libs/libmythtv/dvbrecorder.h

     
    4949    DVBRecorder(TVRec *rec, DVBChannel* dvbchannel);
    5050   ~DVBRecorder();
    5151
    52     void SetOption(const QString &name, int value);
     52    void SetOption(const QString &name, const QString &value);
    5353
    5454    void SetOptionsFromProfile(RecordingProfile *profile,
    5555                               const QString &videodev,
     
    108108
    109109  private:
    110110    // Options set in SetOption()
    111     int             _card_number_option;
     111    QString          _card_number_option;
    112112
    113113    // DVB stuff
    114114    DVBChannel       *dvbchannel;
  • libs/libmythtv/scanwizardscanner.cpp

     
    402402
    403403            ok = !device.isEmpty();
    404404            if (ok)
    405                 sub_type = CardUtil::ProbeDVBType(device.toUInt()).upper();
     405                sub_type = CardUtil::ProbeDVBType(device).upper();
    406406        }
    407407
    408408        if (ok)
     
    488488
    489489    if ("DVB" == card_type)
    490490    {
    491         QString sub_type = CardUtil::ProbeDVBType(device.toUInt()).upper();
     491        QString sub_type = CardUtil::ProbeDVBType(device).upper();
    492492        bool need_nit = (("QAM"  == sub_type) ||
    493493                         ("QPSK" == sub_type) ||
    494494                         ("OFDM" == sub_type));
     
    508508
    509509#ifdef USING_DVB
    510510    if ("DVB" == card_type)
    511         channel = new DVBChannel(device.toInt());
     511        channel = new DVBChannel(device);
    512512#endif
    513513
    514514#ifdef USING_V4L
  • libs/libmythtv/dvbstreamhandler.h

     
    3434        _pid(pid),                       filter_fd(-1),
    3535        streamType(stream_type),         pesType(pes_type) {;}
    3636
    37     bool Open(uint dvb_dev_num, bool use_section_reader);
    38     bool Close(uint dvb_dev_num);
     37    bool Open(const QString &dvb_dev, bool use_section_reader);
     38    bool Close(const QString &dvb_dev);
    3939    bool IsOpen(void) const { return filter_fd >= 0; }
    4040
    4141    uint        _pid;
     
    5050    friend void *run_dvb_stream_handler_thunk(void *param);
    5151
    5252  public:
    53     static DVBStreamHandler *Get(uint dvb_device_number);
     53    static DVBStreamHandler *Get(const QString &dvb_device);
    5454    static void Return(DVBStreamHandler * & ref);
    5555
    5656    void AddListener(MPEGStreamData *data,
     
    7171    virtual void ReaderPaused(int fd) { (void) fd; }
    7272
    7373  private:
    74     DVBStreamHandler(uint);
     74    DVBStreamHandler(const QString &);
    7575    ~DVBStreamHandler();
    7676
    7777    void Start(void);
     
    9494    bool SupportsTSMonitoring(void);
    9595
    9696  private:
    97     uint              _dvb_dev_num;
     97    QString           _dvb_dev;
    9898    QString           _dvr_dev_path;
    9999    bool              _allow_section_reader;
    100100    bool              _needs_buffering;
     
    119119    vector<MPEGStreamData*> _stream_data_list;
    120120
    121121    // for caching TS monitoring supported value.
    122     static QMutex          _rec_supports_ts_monitoring_lock;
    123     static QMap<uint,bool> _rec_supports_ts_monitoring;
     122    static QMutex             _rec_supports_ts_monitoring_lock;
     123    static QMap<QString,bool> _rec_supports_ts_monitoring;
    124124
    125125    // for implementing Get & Return
    126     static QMutex                       _handlers_lock;
    127     static QMap<uint,DVBStreamHandler*> _handlers;
    128     static QMap<uint,uint>              _handlers_refcnt;
     126    static QMutex                          _handlers_lock;
     127    static QMap<QString,DVBStreamHandler*> _handlers;
     128    static QMap<QString,uint>              _handlers_refcnt;
    129129};
    130130
    131131#endif // _DVBSTREAMHANDLER_H_
  • libs/libmythtv/dvbchannel.h

     
    2828class DVBChannel : public DTVChannel
    2929{
    3030  public:
    31     DVBChannel(int cardnum, TVRec *parent = NULL);
     31    DVBChannel(const QString &device, TVRec *parent = NULL);
    3232    ~DVBChannel();
    3333
    3434    bool Open(void) { return Open(this); }
     
    4747    int  GetFd(void)                    const { return fd_frontend; }
    4848    bool IsTuningParamsProbeSupported(void) const;
    4949
    50     QString GetDevice(void) const { return QString::number(GetCardNum()); }
     50    QString GetDevice(void)             const { return device; }
    5151    /// Returns DVB device number, used to construct filenames for DVB devices
    52     int     GetCardNum(void)            const { return cardnum; };
     52    QString GetCardNum(void)            const { return device; };
    5353    /// Returns frontend name as reported by driver
    5454    QString GetFrontendName(void)       const;
    5555    DTVTunerType GetCardType(void)      const { return card_type; }
     
    139139
    140140    // Other State
    141141    int               fd_frontend; ///< File descriptor for tuning hardware
    142     int               cardnum;     ///< DVB Card number
     142    QString           device;      ///< DVB Device
    143143    bool              has_crc_bug; ///< true iff our driver munges PMT
    144144    int               nextInputID; ///< Signal an input change
    145145};
  • libs/libmythtv/dvbcam.h

     
    1717class DVBCam
    1818{
    1919  public:
    20     DVBCam(int cardnum);
     20    DVBCam(const QString &device);
    2121    ~DVBCam();
    2222
    2323    bool Start();
     
    3434
    3535    void SendPMT(const ProgramMapTable &pmt, uint cplm);
    3636
    37     int             cardnum;
     37    QString         device;
    3838    int             numslots;
    3939    cCiHandler     *ciHandler;
    4040
  • libs/libmythtv/dvbchannel.cpp

     
    5555static DTVMultiplex dvbparams_to_dtvmultiplex(
    5656    DTVTunerType, const dvb_fe_params&);
    5757
    58 #define LOC QString("DVBChan(%1:%2): ").arg(GetCardID()).arg(cardnum)
     58#define LOC QString("DVBChan(%1:%2): ").arg(GetCardID()).arg(device)
    5959#define LOC_WARN QString("DVBChan(%1:%2) Warning: ") \
    60                  .arg(GetCardID()).arg(cardnum)
    61 #define LOC_ERR QString("DVBChan(%1:%2) Error: ").arg(GetCardID()).arg(cardnum)
     60                 .arg(GetCardID()).arg(device)
     61#define LOC_ERR QString("DVBChan(%1:%2) Error: ").arg(GetCardID()).arg(device)
    6262
    6363/** \class DVBChannel
    6464 *  \brief Provides interface to the tuning hardware when using DVB drivers
    6565 *
    6666 *  \bug Only supports single input cards.
    6767 */
    68 DVBChannel::DVBChannel(int aCardNum, TVRec *parent)
     68DVBChannel::DVBChannel(const QString &aDevice, TVRec *parent)
    6969    : DTVChannel(parent),           master(NULL),
    7070      // Helper classes
    7171      diseqc_tree(NULL),            dvbcam(NULL),
     
    7777      tuning_delay(0),              sigmon_delay(25),
    7878      first_tune(true),
    7979      // Misc
    80       fd_frontend(-1),              cardnum(aCardNum),
     80      fd_frontend(-1),              device(aDevice),
    8181      has_crc_bug(false)
    8282{
    83     QString devname = CardUtil::GetDeviceName(DVB_DEV_FRONTEND, cardnum);
     83    QString devname = CardUtil::GetDeviceName(DVB_DEV_FRONTEND, device);
    8484    master = dynamic_cast<DVBChannel*>(GetMaster(devname));
    8585    master = (master == this) ? NULL : master;
    8686
    8787    if (!master)
    8888    {
    89         dvbcam = new DVBCam(cardnum);
    90         has_crc_bug = CardUtil::HasDVBCRCBug(aCardNum);
     89        dvbcam = new DVBCam(device);
     90        has_crc_bug = CardUtil::HasDVBCRCBug(device);
    9191    }
    9292    else
    9393    {
     
    9595        has_crc_bug  = master->has_crc_bug;
    9696    }
    9797
    98     sigmon_delay = CardUtil::GetMinSignalMonitoringDelay(aCardNum);
     98    sigmon_delay = CardUtil::GetMinSignalMonitoringDelay(device);
    9999}
    100100
    101101DVBChannel::~DVBChannel()
     
    187187        return true;
    188188    }
    189189
    190     QString devname = CardUtil::GetDeviceName(DVB_DEV_FRONTEND, cardnum);
     190    QString devname = CardUtil::GetDeviceName(DVB_DEV_FRONTEND, device);
    191191    fd_frontend = open(devname.ascii(), O_RDWR | O_NONBLOCK);
    192192
    193193    if (fd_frontend < 0)
     
    262262    symbol_rate_maximum = info.symbol_rate_max;
    263263
    264264    VERBOSE(VB_RECORD, LOC + QString("Using DVB card %1, with frontend '%2'.")
    265             .arg(cardnum).arg(frontend_name));
     265            .arg(device).arg(frontend_name));
    266266
    267267    // Turn on the power to the LNB
    268268    if (card_type == DTVTunerType::kTunerTypeQPSK ||
  • libs/libmythtv/cardutil.cpp

     
    168168
    169169    if (rawtype.upper() == "DVB")
    170170    {
    171         QDir dir("/dev/dvb", "adapter*", QDir::Name, QDir::All);
     171        QDir dir("/dev/dvb", "adapter*", QDir::Name, QDir::Dirs);
    172172        const QFileInfoList il = dir.entryInfoList();
    173173        if (il.isEmpty())
    174174            return devs;
    175175       
    176         vector<uint> list;
    177         QMap<uint,bool> dups;
    178176        QFileInfoList::const_iterator it = il.begin();
    179177
    180178        for (; it != il.end(); ++it)
    181179        {
    182             if (it->fileName().left(7).lower() != "adapter")
     180            QDir subdir(it->filePath(), "frontend*", QDir::Name, QDir::Files | QDir::System);
     181            const QFileInfoList subil = subdir.entryInfoList();
     182            if (subil.isEmpty())
    183183                continue;
    184184
    185             bool ok;
    186             uint num = it->fileName().mid(7).toUInt(&ok);
    187             if (!ok || dups[num])
    188                 continue;
    189 
    190             list.push_back(num);
    191             dups[num] = true;
     185            QFileInfoList::const_iterator subit = subil.begin();
     186            for (; subit != subil.end(); ++subit)
     187                devs.push_back(subit->filePath());
    192188        }
    193 
    194         stable_sort(list.begin(), list.end());
    195 
    196         for (uint i = 0; i < list.size(); i++)
    197             devs.push_back(QString::number(list[i]));
    198189    }
    199190    else
    200191    {
     
    205196    return devs;
    206197}
    207198
    208 QString CardUtil::ProbeDVBType(uint device)
     199QString CardUtil::ProbeDVBType(const QString &device)
    209200{
    210201    QString ret = "ERROR_UNKNOWN";
    211202    (void) device;
     
    236227    return ret;
    237228}
    238229
    239 /** \fn CardUtil::ProbeDVBFrontendName(uint)
     230/** \fn CardUtil::ProbeDVBFrontendName(const QString &)
    240231 *  \brief Returns the card type from the video device
    241232 */
    242 QString CardUtil::ProbeDVBFrontendName(uint device)
     233QString CardUtil::ProbeDVBFrontendName(const QString &device)
    243234{
    244235    QString ret = "ERROR_UNKNOWN";
    245236    (void) device;
     
    266257    return ret;
    267258}
    268259
    269 /** \fn CardUtil::HasDVBCRCBug(uint)
     260/** \fn CardUtil::HasDVBCRCBug(const QString &)
    270261 *  \brief Returns true if and only if the device munges
    271262 *         PAT/PMT tables, and then doesn't fix the CRC.
    272263 *
     
    283274 *  \param device Open DVB frontend device file descriptor to be checked
    284275 *  \return true iff the device munges tables, so that they fail a CRC check.
    285276 */
    286 bool CardUtil::HasDVBCRCBug(uint device)
     277bool CardUtil::HasDVBCRCBug(const QString &device)
    287278{
    288279    QString name = ProbeDVBFrontendName(device);
    289280    return ((name == "VLSI VES1x93 DVB-S")      || // munges PMT
    290281            (name == "ST STV0299 DVB-S"));         // munges PAT
    291282}
    292283
    293 uint CardUtil::GetMinSignalMonitoringDelay(uint device)
     284uint CardUtil::GetMinSignalMonitoringDelay(const QString &device)
    294285{
    295286    QString name = ProbeDVBFrontendName(device);
    296287    if (name.find("DVB-S") >= 0)
     
    311302    if (device.isEmpty())
    312303        return "ERROR_OPEN";
    313304
    314     return ProbeDVBType(device.toUInt());
     305    return ProbeDVBType(device);
    315306}
    316307
    317308/** \fn CardUtil::IsDVBCardType(const QString)
     
    17341725}
    17351726
    17361727
    1737 QString CardUtil::GetDeviceName(dvb_dev_type_t type, uint cardnum)
     1728QString CardUtil::GetDeviceName(dvb_dev_type_t type, const QString &device)
    17381729{
     1730    QString devname = QString(device);
     1731    bool ok;
     1732    uint devnum = devname.toUInt(&ok);
     1733    if (ok)
     1734        devname = QString("/dev/dvb/adapter%1/frontend0").arg(devnum);
     1735
    17391736    if (DVB_DEV_FRONTEND == type)
    1740         return QString("/dev/dvb/adapter%1/frontend0").arg(cardnum);
     1737        return devname;
    17411738    else if (DVB_DEV_DVR == type)
    1742         return QString("/dev/dvb/adapter%1/dvr0").arg(cardnum);
     1739        return devname.replace(devname.find("frontend"), 8, "dvr");
    17431740    else if (DVB_DEV_DEMUX == type)
    1744         return QString("/dev/dvb/adapter%1/demux0").arg(cardnum);
     1741        return devname.replace(devname.find("frontend"), 8, "demux");
    17451742    else if (DVB_DEV_CA == type)
    1746         return QString("/dev/dvb/adapter%1/ca0").arg(cardnum);
     1743        return devname.replace(devname.find("frontend"), 8, "ca");
    17471744    else if (DVB_DEV_AUDIO == type)
    1748         return QString("/dev/dvb/adapter%1/audio0").arg(cardnum);
     1745        return devname.replace(devname.find("frontend"), 8, "audio");
    17491746    else if (DVB_DEV_VIDEO == type)
    1750         return QString("/dev/dvb/adapter%1/video0").arg(cardnum);
     1747        return devname.replace(devname.find("frontend"), 8, "video");
    17511748
    17521749    return "";
    17531750}
  • libs/libmythtv/videosource.cpp

     
    942942                        "should change to the name and type of your card. "
    943943                        "If the card cannot be opened, an error message "
    944944                        "will be displayed."));
    945         fillSelections(-1);
     945        fillSelections(QString());
    946946    };
    947947
    948948    /// \brief Adds all available cards to list
    949949    /// If current is >= 0 it will be considered available even
    950950    /// if no device exists for it in /dev/dvb/adapter*
    951     void fillSelections(int current)
     951    void fillSelections(const QString current)
    952952    {
    953953        clearSelections();
    954954
    955955        // Get devices from filesystem
    956956        vector<QString> sdevs = CardUtil::ProbeVideoDevices("DVB");
    957         vector<uint>    devs;
    958         for (uint i = 0; i < sdevs.size(); i++)
    959             devs.push_back(sdevs[i].toUInt());
    960957
    961958        // Add current if needed
    962         if ((current >= 0) &&
    963             (find(devs.begin(), devs.end(), (uint)current) == devs.end()))
     959        if (!current.isEmpty() && (find(sdevs.begin(), sdevs.end(), current) == sdevs.end()))
    964960        {
    965             devs.push_back(current);
    966             stable_sort(devs.begin(), devs.end());
     961            stable_sort(sdevs.begin(), sdevs.end());
    967962        }
    968963
    969964        vector<QString> db = CardUtil::GetVideoDevices("DVB");
    970965
    971         QMap<uint,bool> in_use;
    972         QString sel = (current >= 0) ? QString::number(current) : "";
    973         for (uint i = 0; i < devs.size(); i++)
     966        QMap<QString,bool> in_use;
     967        QString sel = current;
     968        for (uint i = 0; i < sdevs.size(); i++)
    974969        {
    975             const QString dev = QString::number(devs[i]);
    976             in_use[devs[i]] = find(db.begin(), db.end(), dev) != db.end();
    977             if (sel.isEmpty() && !in_use[devs[i]])
     970            const QString dev = sdevs[i];
     971            in_use[sdevs[i]] = find(db.begin(), db.end(), dev) != db.end();
     972            if (sel.isEmpty() && !in_use[sdevs[i]])
    978973                sel = dev;
    979974        }
    980975
    981         if (sel.isEmpty() && devs.size())
    982             sel = devs[0];
     976        if (sel.isEmpty() && sdevs.size())
     977            sel = sdevs[0];
    983978 
    984979        QString usestr = QString(" -- ");
    985980        usestr += QObject::tr("Warning: already in use");
    986981
    987         for (uint i = 0; i < devs.size(); i++)
     982        for (uint i = 0; i < sdevs.size(); i++)
    988983        {
    989             const QString dev = QString::number(devs[i]);
    990             QString desc = dev + (in_use[devs[i]] ? usestr : "");
    991             desc = ((uint)current == devs[i]) ? dev : desc;
     984            const QString dev = sdevs[i];
     985            QString desc = dev + (in_use[sdevs[i]] ? usestr : "");
     986            desc = (current == sdevs[i]) ? dev : desc;
    992987            addSelection(desc, dev, dev == sel);
    993988        }
    994989    }
     
    996991    virtual void load(void)
    997992    {
    998993        clearSelections();
    999         addSelection("-1");
     994        addSelection(QString());
    1000995
    1001996        CaptureCardDBStorage::load();
    1002997
    1003         bool ok;
    1004         int intval = getValue().toInt(&ok);
    1005         intval = (ok) ? intval : -1;
    1006 
    1007         fillSelections(intval);
     998        QString dev = CardUtil::GetDeviceName(DVB_DEV_FRONTEND, getValue());
     999        fillSelections(dev);
    10081000    }
    10091001};
    10101002
     
    27322724    (void) videodevice;
    27332725
    27342726#ifdef USING_DVB
    2735     uint dvbdev = videodevice.toUInt();
    2736     QString frontend_name = CardUtil::ProbeDVBFrontendName(dvbdev);
    2737     QString subtype       = CardUtil::ProbeDVBType(dvbdev);
     2727    QString frontend_name = CardUtil::ProbeDVBFrontendName(videodevice);
     2728    QString subtype       = CardUtil::ProbeDVBType(videodevice);
    27382729
    2739     QString err_open  = tr("Could not open card #%1").arg(dvbdev);
    2740     QString err_other = tr("Could not get card info for card #%1").arg(dvbdev);
     2730    QString err_open  = tr("Could not open card %1").arg(videodevice);
     2731    QString err_other = tr("Could not get card info for card %1").arg(videodevice);
    27412732
    27422733    switch (CardUtil::toCardType(subtype))
    27432734    {
  • libs/libmythtv/dvbcam.cpp

     
    5858#include "dvbchannel.h"
    5959#include "dvbrecorder.h"
    6060
    61 #define LOC_ERR QString("DVB#%1 CA Error: ").arg(cardnum)
    62 #define LOC QString("DVB#%1 CA: ").arg(cardnum)
     61#define LOC_ERR QString("DVB#%1 CA Error: ").arg(device)
     62#define LOC QString("DVB#%1 CA: ").arg(device)
    6363
    64 DVBCam::DVBCam(int cardNum)
    65     : cardnum(cardNum),       numslots(0),
     64DVBCam::DVBCam(const QString &aDevice)
     65    : device(aDevice),        numslots(0),
    6666      ciHandler(NULL),
    6767      exitCiThread(false),    ciThreadRunning(false),
    6868      have_pmt(false),        pmt_sent(false),
    6969      pmt_updated(false),     pmt_added(false)
    7070{
    71     QString dvbdev = CardUtil::GetDeviceName(DVB_DEV_CA, cardnum);
     71    QString dvbdev = CardUtil::GetDeviceName(DVB_DEV_CA, device);
    7272    int cafd = open(dvbdev.ascii(), O_RDWR);
    7373    if (cafd >= 0)
    7474    {
     
    9595    pmt_updated  = false;
    9696    pmt_added    = false;
    9797
    98     QString dvbdev = CardUtil::GetDeviceName(DVB_DEV_CA, cardnum);
     98    QString dvbdev = CardUtil::GetDeviceName(DVB_DEV_CA, device);
    9999    ciHandler = cCiHandler::CreateCiHandler(dvbdev.ascii());
    100100    if (!ciHandler)
    101101    {
  • libs/libmythtv/dvbstreamhandler.cpp

     
    2222#include "dvbtypes.h" // for pid filtering
    2323#include "diseqc.h" // for rotor retune
    2424
    25 #define LOC      QString("DVBSH(%1): ").arg(_dvb_dev_num)
    26 #define LOC_WARN QString("DVBSH(%1) Warning: ").arg(_dvb_dev_num)
    27 #define LOC_ERR  QString("DVBSH(%1) Error: ").arg(_dvb_dev_num)
     25#define LOC      QString("DVBSH(%1): ").arg(_dvb_dev)
     26#define LOC_WARN QString("DVBSH(%1) Warning: ").arg(_dvb_dev)
     27#define LOC_ERR  QString("DVBSH(%1) Error: ").arg(_dvb_dev)
    2828
    29 QMap<uint,bool> DVBStreamHandler::_rec_supports_ts_monitoring;
    30 QMutex          DVBStreamHandler::_rec_supports_ts_monitoring_lock;
     29QMap<QString,bool> DVBStreamHandler::_rec_supports_ts_monitoring;
     30QMutex             DVBStreamHandler::_rec_supports_ts_monitoring_lock;
    3131
    32 QMap<uint,DVBStreamHandler*> DVBStreamHandler::_handlers;
    33 QMap<uint,uint>              DVBStreamHandler::_handlers_refcnt;
    34 QMutex                       DVBStreamHandler::_handlers_lock;
     32QMap<QString,DVBStreamHandler*> DVBStreamHandler::_handlers;
     33QMap<QString,uint>              DVBStreamHandler::_handlers_refcnt;
     34QMutex                          DVBStreamHandler::_handlers_lock;
    3535
    36 DVBStreamHandler *DVBStreamHandler::Get(uint dvb_device_number)
     36DVBStreamHandler *DVBStreamHandler::Get(const QString &dvb_device)
    3737{
    3838    QMutexLocker locker(&_handlers_lock);
    3939
    40     QMap<uint,DVBStreamHandler*>::iterator it =
    41         _handlers.find(dvb_device_number);
     40    QMap<QString,DVBStreamHandler*>::iterator it =
     41        _handlers.find(dvb_device);
    4242
    4343    if (it == _handlers.end())
    4444    {
    45         _handlers[dvb_device_number] = new DVBStreamHandler(dvb_device_number);
    46         _handlers_refcnt[dvb_device_number] = 1;
     45        _handlers[dvb_device] = new DVBStreamHandler(dvb_device);
     46        _handlers_refcnt[dvb_device] = 1;
    4747    }
    4848    else
    4949    {
    50         _handlers_refcnt[dvb_device_number]++;
     50        _handlers_refcnt[dvb_device]++;
    5151    }
    5252
    53     return _handlers[dvb_device_number];
     53    return _handlers[dvb_device];
    5454}
    5555
    5656void DVBStreamHandler::Return(DVBStreamHandler * & ref)
    5757{
    5858    QMutexLocker locker(&_handlers_lock);
    5959
    60     uint dvb_dev_num = ref->_dvb_dev_num;
     60    QString dvb_dev = ref->_dvb_dev;
    6161
    62     QMap<uint,uint>::iterator rit = _handlers_refcnt.find(dvb_dev_num);
     62    QMap<QString,uint>::iterator rit = _handlers_refcnt.find(dvb_dev);
    6363    if (rit == _handlers_refcnt.end())
    6464        return;
    6565
     
    6969        return;
    7070    }
    7171
    72     QMap<uint,DVBStreamHandler*>::iterator it = _handlers.find(dvb_dev_num);
     72    QMap<QString,DVBStreamHandler*>::iterator it = _handlers.find(dvb_dev);
    7373    if ((it != _handlers.end()) && (*it == ref))
    7474    {
    7575        ref = NULL;
     
    8080    _handlers_refcnt.erase(rit);
    8181}
    8282
    83 DVBStreamHandler::DVBStreamHandler(uint dvb_device_number) :
    84     _dvb_dev_num(dvb_device_number),
    85     _dvr_dev_path(CardUtil::GetDeviceName(DVB_DEV_DVR, _dvb_dev_num)),
     83DVBStreamHandler::DVBStreamHandler(const QString &dvb_device) :
     84    _dvb_dev(dvb_device),
     85    _dvr_dev_path(CardUtil::GetDeviceName(DVB_DEV_DVR, _dvb_dev)),
    8686    _allow_section_reader(false),
    8787    _needs_buffering(false),
    8888    _allow_retune(false),
     
    259259    bool _error = false;
    260260    if (_device_read_buffer)
    261261    {
    262         bool ok = _device_read_buffer->Setup(
    263             QString::number(_dvb_dev_num), dvr_fd);
     262        bool ok = _device_read_buffer->Setup(_dvb_dev, dvr_fd);
    264263
    265264        if (!ok)
    266265        {
     
    501500            if (closed == priority_queue[i].end())
    502501                break; // something is broken
    503502
    504             if (_pid_info[*closed]->Open(_dvb_dev_num, _using_section_reader))
     503            if (_pid_info[*closed]->Open(_dvb_dev, _using_section_reader))
    505504            {
    506505                _open_pid_filters++;
    507506                priority_open_cnt[i]++;
     
    523522                    if (!info->IsOpen())
    524523                        continue;
    525524
    526                     if (info->Close(_dvb_dev_num))
     525                    if (info->Close(_dvb_dev))
    527526                        freed = true;
    528527
    529528                    _open_pid_filters--;
     
    535534            {
    536535                // if we can open a filter, just do it
    537536                if (_pid_info[*closed]->Open(
    538                         _dvb_dev_num, _using_section_reader))
     537                        _dvb_dev, _using_section_reader))
    539538                {
    540539                    _open_pid_filters++;
    541540                    priority_open_cnt[i]++;
     
    552551                break; // nothing to close..
    553552
    554553            // close "open"
    555             bool ok = _pid_info[*open]->Close(_dvb_dev_num);
     554            bool ok = _pid_info[*open]->Close(_dvb_dev);
    556555            _open_pid_filters--;
    557556            priority_open_cnt[i]--;
    558557
    559558            // open "closed"
    560559            if (ok && _pid_info[*closed]->
    561                 Open(_dvb_dev_num, _using_section_reader))
     560                Open(_dvb_dev, _using_section_reader))
    562561            {
    563562                _open_pid_filters++;
    564563                priority_open_cnt[i]++;
     
    588587    bool ok = true;
    589588    if (tmp->IsOpen())
    590589    {
    591         ok = tmp->Close(_dvb_dev_num);
     590        ok = tmp->Close(_dvb_dev);
    592591        _open_pid_filters--;
    593592
    594593        CycleFiltersByPriority();
     
    769768
    770769    {
    771770        QMutexLocker locker(&_rec_supports_ts_monitoring_lock);
    772         QMap<uint,bool>::const_iterator it;
    773         it = _rec_supports_ts_monitoring.find(_dvb_dev_num);
     771        QMap<QString,bool>::const_iterator it;
     772        it = _rec_supports_ts_monitoring.find(_dvb_dev);
    774773        if (it != _rec_supports_ts_monitoring.end())
    775774            return *it;
    776775    }
     
    779778    if (dvr_fd < 0)
    780779    {
    781780        QMutexLocker locker(&_rec_supports_ts_monitoring_lock);
    782         _rec_supports_ts_monitoring[_dvb_dev_num] = false;
     781        _rec_supports_ts_monitoring[_dvb_dev] = false;
    783782        return false;
    784783    }
    785784
     
    793792    close(dvr_fd);
    794793
    795794    QMutexLocker locker(&_rec_supports_ts_monitoring_lock);
    796     _rec_supports_ts_monitoring[_dvb_dev_num] = supports_ts;
     795    _rec_supports_ts_monitoring[_dvb_dev] = supports_ts;
    797796
    798797    return supports_ts;
    799798}
     
    802801#undef LOC_WARN
    803802#undef LOC_ERR
    804803
    805 #define LOC      QString("PIDInfo(%1): ").arg(dvb_dev_num)
    806 #define LOC_WARN QString("PIDInfo(%1) Warning: ").arg(dvb_dev_num)
    807 #define LOC_ERR  QString("PIDInfo(%1) Error: ").arg(dvb_dev_num)
     804#define LOC      QString("PIDInfo(%1): ").arg(dvb_dev)
     805#define LOC_WARN QString("PIDInfo(%1) Warning: ").arg(dvb_dev)
     806#define LOC_ERR  QString("PIDInfo(%1) Error: ").arg(dvb_dev)
    808807
    809 bool PIDInfo::Open(uint dvb_dev_num, bool use_section_reader)
     808bool PIDInfo::Open(const QString &dvb_dev, bool use_section_reader)
    810809{
    811810    if (filter_fd >= 0)
    812811    {
     
    814813        filter_fd = -1;
    815814    }
    816815
    817     QString demux_fn = CardUtil::GetDeviceName(DVB_DEV_DEMUX, dvb_dev_num);
     816    QString demux_fn = CardUtil::GetDeviceName(DVB_DEV_DEMUX, dvb_dev);
    818817
    819818    VERBOSE(VB_RECORD, LOC + QString("Opening filter for pid 0x%1")
    820819            .arg(_pid, 0, 16));
     
    909908    return true;
    910909}
    911910
    912 bool PIDInfo::Close(uint dvb_dev_num)
     911bool PIDInfo::Close(const QString &dvb_dev)
    913912{
    914913    VERBOSE(VB_RECORD, LOC +
    915914            QString("Closing filter for pid 0x%1").arg(_pid, 0, 16));
  • libs/libmythtv/tv_rec.cpp

     
    142142    if (genOpt.cardtype == "DVB")
    143143    {
    144144#ifdef USING_DVB
    145         channel = new DVBChannel(genOpt.videodev.toInt(), this);
     145        channel = new DVBChannel(genOpt.videodev, this);
    146146        if (!channel->Open())
    147147            return false;
    148148        GetDVBChannel()->SetSlowTuning(dvbOpt.dvb_tuning_delay);