Ticket #1133: 1133-v8.patch
File 1133-v8.patch, 33.1 KB (added by , 18 years ago) |
---|
-
libs/libmythtv/cardutil.h
70 70 71 71 static int GetCardID(const QString &videodevice, 72 72 QString hostname = QString::null); 73 static uint GetChildCardID(uint cardid); 74 static uint GetParentCardID(uint cardid); 73 75 74 76 static bool IsCardTypePresent(const QString &strType); 75 77 … … 81 83 static bool GetVideoDevice(uint cardid, QString& device, 82 84 QString& vbi); 83 85 static QString GetVideoDevice(uint cardid); 86 static QString GetVideoDevice(uint cardid, uint sourceid); 84 87 85 88 static QString GetDefaultInput(uint cardid); 86 89 static QString GetInputName(uint cardid, uint sourceid); … … 96 99 QString device, 97 100 QString cardtype, 98 101 QStringList &inputLabels, 99 vector<CardInput*> &cardInputs); 102 vector<CardInput*> &cardInputs, 103 int parentid = 0); 100 104 // DTV info 101 105 static bool GetTimeouts(uint cardid, 102 106 uint &signal_timeout, … … 119 123 private: 120 124 static QStringList probeV4LInputs(QString device); 121 125 static QStringList probeDVBInputs(QString device, int diseqctype = -1); 126 static QStringList probeChildInputs(QString device); 122 127 123 128 static QStringList fillDVBInputs(int dvb_diseqc_type); 124 129 static DiSEqCList fillDVBInputsDiSEqC(int dvb_diseqc_type); -
libs/libmythtv/videosource.h
262 262 DVBCardType *cardtype; 263 263 SignalTimeout *signal_timeout; 264 264 ChannelTimeout *channel_timeout; 265 TransButtonSetting *buttonAnalog; 265 266 }; 266 267 267 268 class CaptureCardGroup: public VerticalConfigurationGroup, … … 277 278 class CaptureCard: public ConfigurationWizard { 278 279 Q_OBJECT 279 280 public: 280 CaptureCard( );281 CaptureCard(bool use_card_group = true); 281 282 282 283 int getCardID(void) const { return id->intValue(); } 283 284 284 285 void loadByID(int id); 286 void setParentID(int id); 285 287 286 288 static void fillSelections(SelectSetting* setting); 289 static void fillSelections(SelectSetting* setting, bool no_children); 287 290 288 291 void load() { 289 292 ConfigurationWizard::load(); … … 291 294 292 295 public slots: 293 296 void DiSEqCPanel(); 297 void analogPanel(); 294 298 void recorderOptionsPanel(); 295 299 296 300 private: … … 306 310 }; 307 311 }; 308 312 313 class ParentID: public CCSetting 314 { 315 public: 316 ParentID(const CaptureCard &parent) : CCSetting(parent, "parentid") 317 { 318 setValue("0"); 319 setVisible(false); 320 } 321 }; 322 309 323 class Hostname: public HostnameSetting, public CCSetting { 310 324 public: 311 325 Hostname(const CaptureCard& parent): CCSetting(parent, "hostname") {}; … … 313 327 314 328 private: 315 329 ID *id; 330 ParentID *parentid; 316 331 }; 317 332 318 333 class CardInput; … … 414 429 }; 415 430 416 431 class CardID; 432 class ChildID; 417 433 class InputName; 418 434 class SourceID; 419 435 class DVBLNBChooser; … … 436 452 QString getSourceName(void) const; 437 453 438 454 void fillDiseqcSettingsInput(QString _pos, QString _port); 455 void SetChildCardID(uint); 439 456 440 457 virtual void save(); 441 458 virtual void save(QString /*destination*/) { save(); } … … 465 482 466 483 ID *id; 467 484 CardID *cardid; 485 ChildID *childid; 468 486 InputName *inputname; 469 487 SourceID *sourceid; 470 488 DVBLNBChooser *lnbsettings; -
libs/libmythtv/remoteencoder.h
2 2 #define REMOTEENCODER_H_ 3 3 4 4 #include <qstringlist.h> 5 #include < pthread.h>5 #include <qmutex.h> 6 6 #include <qmap.h> 7 7 8 8 class ProgramInfo; … … 72 72 int recordernum; 73 73 74 74 QSocketDevice *controlSock; 75 pthread_mutex_tlock;75 QMutex lock; 76 76 77 77 QString remotehost; 78 78 short remoteport; … … 81 81 82 82 bool backendError; 83 83 long long cachedFramesWritten; 84 uintcachedTimeout;84 QMap<QString,uint> cachedTimeout; 85 85 }; 86 86 87 87 #endif -
libs/libmythtv/cardutil.cpp
216 216 return QString::null; 217 217 } 218 218 219 QString CardUtil::GetVideoDevice(uint cardid, uint sourceid) 220 { 221 QString device = QString::null; 222 223 MSqlQuery query(MSqlQuery::InitCon()); 224 query.prepare("SELECT videodevice " 225 "FROM capturecard, cardinput " 226 "WHERE sourceid = :SOURCEID AND " 227 " cardinput.cardid = :CARDID AND " 228 " ( ( cardinput.childcardid != '0' AND " 229 " cardinput.childcardid = capturecard.cardid ) OR " 230 " ( cardinput.childcardid = '0' AND " 231 " cardinput.cardid = capturecard.cardid ) )"); 232 query.bindValue(":CARDID", cardid); 233 query.bindValue(":SOURCEID", sourceid); 234 235 if (!query.exec() || !query.isActive()) 236 MythContext::DBError("CardUtil::GetVideoDevice() 2", query); 237 else if (query.next()) 238 device = query.value(0).toString(); 239 240 return device; 241 } 242 219 243 /** \fn CardUtil::GetCardID(const QString&, QString) 220 244 * \brief Returns the cardid of the card that uses the specified 221 245 * videodevice, and optionally a non-local hostname. … … 244 268 return -1; 245 269 } 246 270 271 uint CardUtil::GetChildCardID(uint cardid) 272 { 273 // check if child card definition does exist 274 MSqlQuery query(MSqlQuery::InitCon()); 275 query.prepare( 276 "SELECT cardid " 277 "FROM capturecard " 278 "WHERE parentid = :CARDID"); 279 query.bindValue(":CARDID", cardid); 280 281 int ret = 0; 282 if (!query.exec() || !query.isActive()) 283 MythContext::DBError("CaptureCard::GetChildCardID()", query); 284 else if (query.next()) 285 ret = query.value(0).toInt(); 286 287 return ret; 288 } 289 290 uint CardUtil::GetParentCardID(uint cardid) 291 { 292 // check if child card definition does exists 293 MSqlQuery query(MSqlQuery::InitCon()); 294 query.prepare( 295 "SELECT parentid " 296 "FROM capturecard " 297 "WHERE cardid = :CARDID"); 298 query.bindValue(":CARDID", cardid); 299 300 int ret = 0; 301 if (!query.exec() || !query.isActive()) 302 MythContext::DBError("CaptureCard::GetParentCardID()", query); 303 else if (query.next()) 304 ret = query.value(0).toInt(); 305 306 return ret; 307 } 308 247 309 /** \fn CardUtil::GetVideoDevice(uint, QString&, QString&) 248 310 * \brief Returns the the video device associated with the card id 249 311 * \param nCardID card id to check … … 510 572 else 511 573 ret += probeV4LInputs(device); 512 574 575 ret += probeChildInputs(device); 576 513 577 return ret; 514 578 } 515 579 … … 567 631 return ret; 568 632 } 569 633 634 QStringList CardUtil::probeChildInputs(QString device) 635 { 636 QStringList ret; 637 638 int cardid = CardUtil::GetCardID(device); 639 if (cardid <= 0) 640 return ret; 641 642 MSqlQuery query(MSqlQuery::InitCon()); 643 query.prepare("SELECT videodevice, cardtype " 644 "FROM capturecard " 645 "WHERE parentid = :CARDID"); 646 query.bindValue(":CARDID", cardid); 647 648 if (!query.exec() || !query.isActive()) 649 return ret; 650 651 while (query.next()) 652 ret += probeInputs(query.value(0).toString(), 653 query.value(1).toString()); 654 655 return ret; 656 } 657 570 658 QValueList<DVBDiSEqCInput> 571 659 CardUtil::fillDVBInputsDiSEqC(int dvb_diseqc_type) 572 660 { … … 677 765 QString device, 678 766 QString cardtype, 679 767 QStringList &inputLabels, 680 vector<CardInput*> &cardInputs) 768 vector<CardInput*> &cardInputs, 769 int parentid) 681 770 { 682 int rcardid = cardid;771 int rcardid = (parentid) ? parentid : cardid; 683 772 QStringList inputs; 684 773 685 774 if (("FIREWIRE" == cardtype) || ("DBOX2" == cardtype)) … … 687 776 else if ("DVB" != cardtype) 688 777 inputs += probeV4LInputs(device); 689 778 690 QString dev_label = GetDeviceLabel(cardid, cardtype, device); 779 QString dev_label = (parentid) ? " -> " : ""; 780 dev_label += GetDeviceLabel(cardid, cardtype, device); 691 781 692 782 QStringList::iterator it = inputs.begin(); 693 783 for (; it != inputs.end(); ++it) 694 784 { 695 785 CardInput* cardinput = new CardInput(true); 696 786 cardinput->loadByInput(rcardid, (*it)); 787 cardinput->SetChildCardID((parentid) ? cardid : 0); 697 788 inputLabels.push_back( 698 789 dev_label + QString(" (%1) -> %2") 699 790 .arg(*it).arg(cardinput->getSourceName())); … … 711 802 CardInput* cardinput = new CardInput(true); 712 803 cardinput->loadByInput(rcardid, (*it).input); 713 804 cardinput->fillDiseqcSettingsInput((*it).position,(*it).port); 805 cardinput->SetChildCardID((parentid) ? cardid : 0); 714 806 inputLabels.push_back( 715 807 dev_label + QString(" (%1) -> %2") 716 808 .arg((*it).input).arg(cardinput->getSourceName())); 717 809 cardInputs.push_back(cardinput); 718 810 } 719 811 } 812 813 if (parentid) 814 return; 815 816 MSqlQuery query(MSqlQuery::InitCon()); 817 query.prepare("SELECT cardid, videodevice, cardtype " 818 "FROM capturecard " 819 "WHERE parentid = :CARDID"); 820 query.bindValue(":CARDID", cardid); 821 822 if (!query.exec() || !query.isActive()) 823 return; 824 825 while (query.next()) 826 { 827 GetCardInputs(query.value(0).toUInt(), 828 query.value(1).toString(), 829 query.value(2).toString(), 830 inputLabels, cardInputs, cardid); 831 } 720 832 } -
libs/libmythtv/videosource.cpp
1012 1012 TriggeredConfigurationGroup::triggerChanged(own); 1013 1013 } 1014 1014 1015 CaptureCard::CaptureCard( )1015 CaptureCard::CaptureCard(bool use_card_group) 1016 1016 { 1017 1017 // must be first 1018 1018 addChild(id = new ID()); 1019 addChild(new CaptureCardGroup(*this)); 1019 addChild(parentid = new ParentID(*this)); 1020 if (use_card_group) 1021 addChild(new CaptureCardGroup(*this)); 1020 1022 addChild(new Hostname(*this)); 1021 1023 } 1022 1024 1025 void CaptureCard::setParentID(int id) 1026 { 1027 parentid->setValue(QString::number(id)); 1028 } 1029 1023 1030 void CaptureCard::fillSelections(SelectSetting* setting) 1024 1031 { 1032 CaptureCard::fillSelections(setting, false); 1033 } 1034 1035 void CaptureCard::fillSelections(SelectSetting* setting, bool no_children) 1036 { 1025 1037 MSqlQuery query(MSqlQuery::InitCon()); 1026 query.prepare(1038 QString qstr = 1027 1039 "SELECT cardtype, videodevice, cardid, " 1028 1040 " firewire_port, firewire_node, " 1029 1041 " dbox2_port, dbox2_host, dbox2_httpport " 1030 1042 "FROM capturecard " 1031 "WHERE hostname = :HOSTNAME"); 1043 "WHERE hostname = :HOSTNAME"; 1044 if (no_children) 1045 qstr += " AND parentid='0'"; 1046 1047 query.prepare(qstr); 1032 1048 query.bindValue(":HOSTNAME", gContext->GetHostName()); 1033 1049 1034 1050 if (query.exec() && query.isActive() && query.size() > 0) … … 1117 1133 }; 1118 1134 }; 1119 1135 1136 class ChildID: public CISetting 1137 { 1138 public: 1139 ChildID(const CardInput &parent) : CISetting(parent, "childcardid") 1140 { 1141 setValue("0"); 1142 setVisible(false); 1143 } 1144 }; 1145 1120 1146 class InputDisplayName: public LineEditSetting, public CISetting 1121 1147 { 1122 1148 public: … … 1425 1451 1426 1452 addChild(group); 1427 1453 1454 childid = new ChildID(*this); 1455 addChild(childid); 1456 1428 1457 setName("CardInput"); 1429 1458 connect(scan, SIGNAL(pressed()), SLOT(channelScanner())); 1430 1459 connect(srcfetch, SIGNAL(pressed()), SLOT(sourceFetch())); … … 1437 1466 return sourceid->getSelectionLabel(); 1438 1467 } 1439 1468 1469 void CardInput::SetChildCardID(uint ccid) 1470 { 1471 childid->setValue(QString::number(ccid)); 1472 } 1473 1440 1474 void CardInput::channelScanner(void) 1441 1475 { 1442 1476 uint srcid = sourceid->getValue().toUInt(); … … 1595 1629 clearSelections(); 1596 1630 addSelection(QObject::tr("(New capture card)"), "0"); 1597 1631 addSelection(QObject::tr("(Delete all capture cards)"), "-1"); 1598 CaptureCard::fillSelections(this );1632 CaptureCard::fillSelections(this, true); 1599 1633 } 1600 1634 1601 1635 MythDialog* CaptureCardEditor::dialogWidget(MythMainWindow* parent, … … 1672 1706 { 1673 1707 MSqlQuery query(MSqlQuery::InitCon()); 1674 1708 1675 query.prepare("DELETE FROM capturecard WHERE cardid = :CARDID"); 1709 query.prepare("DELETE FROM capturecard " 1710 "WHERE cardid = :CARDID OR " 1711 " parentid = :CARDID"); 1676 1712 query.bindValue(":CARDID", getValue()); 1677 1713 if (!query.exec() || !query.isActive()) 1678 1714 MythContext::DBError("Deleting Capture Card", query); … … 1813 1849 query.prepare( 1814 1850 "SELECT cardid, videodevice, cardtype " 1815 1851 "FROM capturecard " 1816 "WHERE hostname = :HOSTNAME"); 1852 "WHERE hostname = :HOSTNAME AND " 1853 " parentid = '0'"); 1817 1854 query.bindValue(":HOSTNAME", gContext->GetHostName()); 1818 1855 1819 1856 if (!query.exec() || !query.isActive() || !query.size()) … … 1894 1931 cardname->setValue(name); 1895 1932 signal_timeout->setValue(500); 1896 1933 channel_timeout->setValue(3000); 1934 1935 if (name.left(6) == "pcHDTV") 1936 buttonAnalog->setVisible(true); 1937 1897 1938 break; 1898 1939 default: 1899 1940 fEnable = false; … … 1979 2020 TransButtonSetting *buttonDiSEqC = new TransButtonSetting(); 1980 2021 buttonDiSEqC->setLabel(tr("DiSEqC")); 1981 2022 2023 buttonAnalog = new TransButtonSetting(); 2024 buttonAnalog->setLabel(tr("Analog Options")); 2025 buttonAnalog->setVisible(false); 2026 1982 2027 TransButtonSetting *buttonRecOpt = new TransButtonSetting(); 1983 2028 buttonRecOpt->setLabel(tr("Recording Options")); 1984 2029 1985 2030 HorizontalConfigurationGroup *advcfg = 1986 2031 new HorizontalConfigurationGroup(false, false, true, true); 1987 2032 advcfg->addChild(buttonDiSEqC); 2033 advcfg->addChild(buttonAnalog); 1988 2034 advcfg->addChild(buttonRecOpt); 1989 2035 addChild(advcfg); 1990 2036 … … 2000 2046 this, SLOT( probeCard (const QString&))); 2001 2047 connect(buttonDiSEqC, SIGNAL(pressed()), 2002 2048 &parent, SLOT( DiSEqCPanel())); 2049 connect(buttonAnalog, SIGNAL(pressed()), 2050 &parent, SLOT( analogPanel())); 2003 2051 connect(buttonRecOpt, SIGNAL(pressed()), 2004 2052 &parent, SLOT( recorderOptionsPanel())); 2005 2053 connect(diseqctype, SIGNAL(valueChanged(const QString&)), … … 2018 2066 } 2019 2067 } 2020 2068 2069 void CaptureCard::analogPanel() 2070 { 2071 reload(); 2072 2073 uint cardid = getCardID(); 2074 uint child_cardid = CardUtil::GetChildCardID(cardid); 2075 QString devname = "Unknown"; 2076 QString dev = CardUtil::GetVideoDevice(cardid); 2077 if (!dev.isEmpty()) 2078 devname = QString("[ DVB : %1 ]").arg(devname); 2079 2080 CaptureCard *card = new CaptureCard(false); 2081 card->addChild(new V4LConfigurationGroup(*card)); 2082 if (child_cardid) 2083 card->loadByID(child_cardid); 2084 else 2085 card->setParentID(cardid); 2086 card->setLabel(tr("Analog Options for ") + devname); 2087 card->exec(); 2088 delete card; 2089 } 2090 2021 2091 void CaptureCard::recorderOptionsPanel() 2022 2092 { 2023 2093 reload(); -
libs/libmythtv/remoteencoder.cpp
13 13 RemoteEncoder::RemoteEncoder(int num, const QString &host, short port) 14 14 : recordernum(num), controlSock(NULL), remotehost(host), 15 15 remoteport(port), lastchannel(""), backendError(false), 16 cachedFramesWritten(0) , cachedTimeout(0)16 cachedFramesWritten(0) 17 17 { 18 pthread_mutex_init(&lock, NULL);19 18 } 20 19 21 20 RemoteEncoder::~RemoteEncoder() … … 44 43 45 44 void RemoteEncoder::SendReceiveStringList(QStringList &strlist) 46 45 { 46 QMutexLocker locker(&lock); 47 47 if (!controlSock) 48 48 return; 49 49 50 pthread_mutex_lock(&lock);51 52 50 backendError = false; 53 51 54 52 WriteStringList(controlSock, strlist); … … 58 56 "RemoteEncoder::SendReceiveStringList(): No response."); 59 57 backendError = true; 60 58 } 61 62 pthread_mutex_unlock(&lock);63 59 } 64 60 65 61 QSocketDevice *RemoteEncoder::openControlSocket(const QString &host, short port) … … 407 403 return retval; 408 404 } 409 405 410 uint RemoteEncoder::GetSignalLockTimeout(QString /*input*/)406 uint RemoteEncoder::GetSignalLockTimeout(QString input) 411 407 { 412 if (cachedTimeout) 413 return cachedTimeout; 408 QMutexLocker locker(&lock); 414 409 410 QMap<QString,uint>::const_iterator it = cachedTimeout.find(input); 411 if (it != cachedTimeout.end()) 412 return *it; 413 415 414 uint cardid = recordernum; 416 415 uint timeout = 0xffffffff; 417 416 MSqlQuery query(MSqlQuery::InitCon()); 418 query.prepare("SELECT channel_timeout, cardtype " 419 "FROM capturecard " 420 "WHERE cardid = :CARDID"); 417 query.prepare( 418 "SELECT channel_timeout, cardtype " 419 "FROM cardinput, capturecard " 420 "WHERE cardinput.inputname = :INNAME AND " 421 " cardinput.cardid = :CARDID AND " 422 " ( ( cardinput.childcardid = '0' AND " 423 " cardinput.cardid = capturecard.cardid) OR " 424 " ( cardinput.childcardid != '0' AND " 425 " cardinput.childcardid = capturecard.cardid) )"); 426 query.bindValue(":INNAME", input); 421 427 query.bindValue(":CARDID", cardid); 422 428 if (!query.exec() || !query.isActive()) 423 429 MythContext::DBError("Getting timeout", query); … … 430 436 QString("GetSignalLockTimeout(%1): Set lock timeout to %2 ms") 431 437 .arg(cardid).arg(timeout)); 432 438 */ 433 cachedTimeout = timeout;439 cachedTimeout[input] = timeout; 434 440 return timeout; 435 441 } 436 442 -
libs/libmythtv/scanwizardhelpers.h
204 204 public: 205 205 enum Type 206 206 { 207 Error_Open ,207 Error_Open = 0, 208 208 Error_Probe, 209 209 FullScan_Analog, 210 210 FullScan_ATSC, -
libs/libmythtv/scanwizard.cpp
307 307 { 308 308 uint signal_timeout = 1000; 309 309 uint channel_timeout = 40000; 310 int cardid = parent->captureCard(); 310 int ccardid = parent->captureCard(); 311 int pcardid = CardUtil::GetParentCardID(ccardid); 312 int cardid = (pcardid) ? pcardid : ccardid; 311 313 nScanType = parent->scanType(); 312 314 nVideoSource = parent->videoSource(); 313 315 tunerthread_running = false; … … 316 318 QString("type(%1) src(%2) cardid(%3)") 317 319 .arg(nScanType).arg(nVideoSource).arg(cardid)); 318 320 319 CardUtil::GetTimeouts(c ardid, signal_timeout, channel_timeout);321 CardUtil::GetTimeouts(ccardid, signal_timeout, channel_timeout); 320 322 321 323 if (nScanType == ScanTypeSetting::FullScan_Analog) 322 324 { … … 392 394 { 393 395 nMultiplexToTuneTo = parent->paneSingle->GetMultiplex(); 394 396 395 QString device = CardUtil::GetVideoDevice(cardid );397 QString device = CardUtil::GetVideoDevice(cardid, nVideoSource); 396 398 if (device.isEmpty()) 397 399 return; 398 400 399 401 QString cn, card_type; 400 int nCardType = CardUtil::GetCardType(c ardid, cn, card_type);402 int nCardType = CardUtil::GetCardType(ccardid, cn, card_type); 401 403 (void) nCardType; 402 404 #ifdef USING_DVB 403 405 if (CardUtil::IsDVB(cardid)) -
libs/libmythtv/dbcheck.cpp
10 10 #include "mythdbcon.h" 11 11 12 12 /// This is the DB schema version expected by the running MythTV instance. 13 const QString currentDatabaseVersion = "112 4";13 const QString currentDatabaseVersion = "1125"; 14 14 15 15 static bool UpdateDBVersionNumber(const QString &newnumber); 16 16 static bool performActualUpdate(const QString updates[], QString version, … … 2016 2016 return false; 2017 2017 } 2018 2018 2019 if (dbver == "1124") 2020 { 2021 const QString updates[] = { 2022 "ALTER TABLE capturecard ADD parentid int(10) NOT NULL DEFAULT 0;", 2023 "ALTER TABLE cardinput ADD childcardid int(10) NOT NULL DEFAULT 0;", 2024 "" 2025 }; 2026 if (!performActualUpdate(updates, "1125", dbver)) 2027 return false; 2028 } 2029 2019 2030 // Drop xvmc_buffer_settings table in 0.20 2020 2031 // Drop dvb_dmx_buf_size and dvb_pkt_buf_size columns of channel in 0.20 2021 2032 -
libs/libmythtv/tv_rec.cpp
2942 2942 return QString::null; 2943 2943 } 2944 2944 2945 /** \fn TVRec::SetInput(QString )2945 /** \fn TVRec::SetInput(QString, uint) 2946 2946 * \brief Changes to the specified input. 2947 2947 * 2948 2948 * You must call PauseRecorder(void) before calling this. … … 3272 3272 } 3273 3273 } 3274 3274 3275 /** \fn TVRec::TuningCheckForHWChange(const TuningRequest&,QString&,QString&) 3276 * \brief Returns cardid for device info row in capturecard if it changes. 3277 */ 3278 uint TVRec::TuningCheckForHWChange(const TuningRequest &request, 3279 QString &channum, 3280 QString &inputname) 3281 { 3282 if (!channel) 3283 return 0; 3284 3285 uint curCardID = 0, newCardID = 0; 3286 channum = request.channel; 3287 inputname = request.input; 3288 3289 if (request.program) 3290 request.program->GetChannel(channum, inputname); 3291 3292 if (!channum.isEmpty() && inputname.isEmpty()) 3293 channel->CheckChannel(channum, inputname); 3294 3295 if (!inputname.isEmpty()) 3296 { 3297 int current_input = channel->GetCurrentInputNum(); 3298 int new_input = channel->GetInputByName(inputname); 3299 curCardID = channel->GetInputCardID(current_input); 3300 newCardID = channel->GetInputCardID(new_input); 3301 VERBOSE(VB_IMPORTANT, LOC<<"HW Tuner: "<<curCardID<<"->"<<newCardID); 3302 } 3303 3304 if (curCardID != newCardID) 3305 { 3306 if (channum.isEmpty()) 3307 channum = GetStartChannel(newCardID, inputname); 3308 return newCardID; 3309 } 3310 3311 return 0; 3312 } 3313 3275 3314 /** \fn TVRec::TuningShutdowns(const TuningRequest&) 3276 3315 * \brief This shuts down anything that needs to be shut down 3277 3316 * before handling the passed in tuning request. 3278 3317 */ 3279 3318 void TVRec::TuningShutdowns(const TuningRequest &request) 3280 3319 { 3320 QString channum, inputname; 3321 uint newCardID = TuningCheckForHWChange(request, channum, inputname); 3322 3281 3323 #ifdef USING_DVB_EIT 3282 3324 if (!(request.flags & kFlagEITScan) && HasFlags(kFlagEITScannerRunning)) 3283 3325 { … … 3306 3348 3307 3349 // At this point any waits are canceled. 3308 3350 3309 if ( (request.flags & kFlagNoRec))3351 if (newCardID || (request.flags & kFlagNoRec)) 3310 3352 { 3311 3353 if (HasFlags(kFlagDummyRecorderRunning)) 3312 3354 { … … 3331 3373 CloseChannel(); 3332 3374 // At this point the channel is shut down 3333 3375 } 3376 3377 // handle HW change for digital/analog cards 3378 if (newCardID) 3379 { 3380 VERBOSE(VB_IMPORTANT, "Recreating channel..."); 3381 channel->Close(); 3382 delete channel; 3383 channel = NULL; 3334 3384 3385 GetDevices(newCardID, genOpt, dvbOpt, fwOpt, dboxOpt); 3386 genOpt.defaultinput = inputname; 3387 CreateChannel(channum); 3388 if (!(request.flags & kFlagNoRec)) 3389 channel->Open(); 3390 } 3391 3335 3392 if (ringBuffer && (request.flags & kFlagKillRingBuffer)) 3336 3393 { 3337 3394 VERBOSE(VB_RECORD, LOC + "Tearing down RingBuffer"); … … 3647 3704 SetFlags(kFlagRingBufferReady); 3648 3705 } 3649 3706 else 3650 ok = SwitchLiveTVRingBuffer(true, !had_dummyrec );3707 ok = SwitchLiveTVRingBuffer(true, !had_dummyrec && recorder); 3651 3708 if (!ok) 3652 3709 { 3653 3710 VERBOSE(VB_IMPORTANT, LOC_ERR + "Failed to create RingBuffer 2"); … … 3738 3795 if (GetV4LChannel()) 3739 3796 channel->SetFd(recorder->GetVideoFd()); 3740 3797 3741 SetFlags(kFlagRecorderRunning );3798 SetFlags(kFlagRecorderRunning | kFlagRingBufferReady); 3742 3799 3743 3800 if (!tvchain) 3744 3801 autoRunJobs = init_jobs(rec, profile, runJobOnHostOnly, -
libs/libmythtv/channelbase.h
25 25 InputBase() : 26 26 name(QString::null), startChanNum(QString::null), 27 27 tuneToChannel(QString::null), externalChanger(QString::null), 28 sourceid(0), 28 sourceid(0), cardid(0), 29 29 inputNumV4L(-1), 30 30 videoModeV4L1(0), videoModeV4L2(0) {} 31 31 32 32 InputBase(QString _name, QString _startChanNum, 33 33 QString _tuneToChannel, QString _externalChanger, 34 uint _sourceid ) :34 uint _sourceid, uint _cardid) : 35 35 name(_name), startChanNum(_startChanNum), 36 36 tuneToChannel(_tuneToChannel), externalChanger(_externalChanger), 37 sourceid(_sourceid), 37 sourceid(_sourceid), cardid(_cardid), 38 38 inputNumV4L(-1), 39 39 videoModeV4L1(0), videoModeV4L2(0) {} 40 40 … … 46 46 QString tuneToChannel; // for using a cable box & S-Video/Composite 47 47 QString externalChanger; // for using a cable box... 48 48 uint sourceid; // associated channel listings source 49 uint cardid; // input card id 49 50 int inputNumV4L; 50 51 int videoModeV4L1; 51 52 int videoModeV4L2; … … 95 96 { return inputs[GetNextInputNum()]->name; } 96 97 virtual QString GetNextInputStartChan(void) 97 98 { return inputs[GetNextInputNum()]->startChanNum; } 99 virtual uint GetInputCardID(int inputNum) const; 98 100 virtual QStringList GetConnectedInputs(void) const; 99 101 virtual QString GetOrdering(void) const 100 102 { return channelorder; } -
libs/libmythtv/tv_rec.h
277 277 bool TuningPMTCheck(void); 278 278 void TuningNewRecorder(void); 279 279 void TuningRestartRecorder(void); 280 uint TuningCheckForHWChange(const TuningRequest&, 281 QString &channum, 282 QString &inputname); 280 283 281 284 void HandleStateChange(void); 282 285 void ChangeState(TVState nextState); -
libs/libmythtv/scanwizardhelpers.cpp
218 218 clearSelections(); 219 219 220 220 MSqlQuery query(MSqlQuery::InitCon()); 221 222 QString thequery = QString( 221 query.prepare( 223 222 "SELECT DISTINCT cardtype, videodevice, capturecard.cardid " 224 223 "FROM capturecard, videosource, cardinput " 225 "WHERE videosource.sourceid = %1AND "224 "WHERE videosource.sourceid = :SOURCEID AND " 226 225 " cardinput.sourceid = videosource.sourceid AND " 227 " cardinput.cardid = capturecard.cardid AND " 228 " capturecard.cardtype in " CARDTYPES " AND " 229 " capturecard.hostname = '%2';") 230 .arg(nSourceID).arg(gContext->GetHostName()); 231 query.prepare(thequery); 226 " capturecard.cardtype in " CARDTYPES " AND " 227 " capturecard.hostname = :HOSTNAME AND " 228 " ( ( cardinput.childcardid != '0' AND " 229 " cardinput.childcardid = capturecard.cardid ) OR " 230 " ( cardinput.childcardid = '0' AND " 231 " cardinput.cardid = capturecard.cardid ) " 232 " )"); 233 query.bindValue(":SOURCEID", nSourceID); 234 query.bindValue(":HOSTNAME", gContext->GetHostName()); 232 235 233 if ( query.exec() && query.isActive() && query.size() > 0)236 if (!query.exec() || !query.isActive()) 234 237 { 235 while (query.next()) 236 addSelection("[ " + query.value(0).toString() + " : " + 237 query.value(1).toString() + " ]", 238 query.value(2).toString()); 238 MythContext::DBError("CaptureCardSetting::refresh()", query); 239 return; 239 240 } 241 242 while (query.next()) 243 { 244 addSelection("[ " + query.value(0).toString() + " : " + 245 query.value(1).toString() + " ]", 246 query.value(2).toString()); 247 } 240 248 } 241 249 242 250 void CaptureCardSetting::sourceID(const QString& str) -
libs/libmythtv/channelbase.cpp
169 169 return ok; 170 170 } 171 171 172 uint ChannelBase::GetInputCardID(int inputNum) const 173 { 174 InputMap::const_iterator it = inputs.find(inputNum); 175 if (it != inputs.end()) 176 return (*it)->cardid; 177 return 0; 178 } 179 172 180 bool ChannelBase::ChangeExternalChannel(const QString &channum) 173 181 { 174 182 InputMap::const_iterator it = inputs.find(currentInputID); … … 387 395 if (GetDevice().isEmpty()) 388 396 return -1; 389 397 390 return CardUtil::GetCardID(GetDevice()); 398 int tmpcardid = CardUtil::GetCardID(GetDevice()); 399 if (tmpcardid > 0) 400 { 401 uint pcardid = CardUtil::GetParentCardID(tmpcardid); 402 tmpcardid = (pcardid) ? pcardid : tmpcardid; 403 } 404 return tmpcardid; 391 405 } 392 406 393 407 /** \fn DVBChannel::InitializeInputs(void) … … 410 424 "SELECT cardinputid, " 411 425 " inputname, startchan, " 412 426 " tunechan, externalcommand, " 413 " sourceid "427 " sourceid, childcardid " 414 428 "FROM cardinput " 415 429 "WHERE cardid = :CARDID"); 416 430 query.bindValue(":CARDID", cardid); … … 431 445 432 446 while (query.next()) 433 447 { 448 // If there is a childcardid use it instead of cardid 449 uint inputcardid = query.value(6).toUInt(); 450 inputcardid = (inputcardid) ? inputcardid : cardid; 451 434 452 inputs[query.value(0).toUInt()] = new InputBase( 435 453 query.value(1).toString(), query.value(2).toString(), 436 454 query.value(3).toString(), query.value(4).toString(), 437 query.value(5).toUInt() );455 query.value(5).toUInt(), inputcardid); 438 456 } 439 457 440 458 // Set initial input to first connected input … … 446 464 for (it = inputs.begin(); it != inputs.end(); ++it) 447 465 { 448 466 VERBOSE(VB_CHANNEL, LOC + QString("Input #%1: '%2' schan(%3) " 449 "sourceid(%4) ")467 "sourceid(%4) ccid(%5)") 450 468 .arg(it.key()).arg((*it)->name).arg((*it)->startChanNum) 451 .arg((*it)->sourceid) );469 .arg((*it)->sourceid).arg((*it)->cardid)); 452 470 } 453 471 VERBOSE(VB_CHANNEL, LOC + QString("Current Input #%1: '%2'") 454 472 .arg(GetCurrentInputNum()).arg(GetCurrentInput())); -
libs/libmythtv/analogscan.cpp
81 81 struct CHANLIST *flist = NULL; 82 82 uint count = 0; 83 83 84 QString device = CardUtil::GetVideoDevice(cardid );84 QString device = CardUtil::GetVideoDevice(cardid, sourceid); 85 85 QString input = CardUtil::GetInputName(cardid, sourceid); 86 86 if (device.isEmpty() || input.isEmpty()) 87 87 goto do_scan_end; -
programs/mythfrontend/statusbox.cpp
739 739 MSqlQuery query(MSqlQuery::InitCon()); 740 740 query.prepare( 741 741 "SELECT cardid, cardtype, videodevice " 742 "FROM capturecard "); 742 "FROM capturecard " 743 "WHERE parentid='0'"); 744 743 745 if (!query.exec() || !query.isActive()) 744 746 { 745 747 MythContext::DBError("StatusBox::doTunerStatus()", query); -
programs/mythbackend/main.cpp
108 108 } 109 109 } 110 110 111 query.exec("SELECT cardid,hostname FROM capturecard ORDER BY cardid;"); 111 query.exec("SELECT cardid, hostname " 112 "FROM capturecard " 113 "WHERE parentid = '0' " 114 "ORDER BY cardid"); 112 115 113 116 if (query.isActive() && query.size()) 114 117 {