ChannelGroupConfig::ChannelGroupConfig(QString _name) : name(_name) { VerticalConfigurationGroup *cgroup; HorizontalConfigurationGroup *columns; DBChanList chanlist = ChannelUtil::GetChannels(0, true, "channum, callsign"); ChannelUtil::SortChannels(chanlist, "channum", true); DBChanList::iterator it = chanlist.begin(); int i,j = 0; int p = 1; int pages = (int)((float)chanlist.size() / 8.0 / 3.0 + 0.5); do { columns = new HorizontalConfigurationGroup(false,false,false,false); columns->setLabel(getName() + " " + QObject::tr("Channel Group - Page ") + QString("%1").arg(p) + QObject::tr("of") + QString("%1").arg(pages)); for (j = 0; ((j < 3) && (it < chanlist.end())); ++j) { cgroup = new VerticalConfigurationGroup(false,false,false,false); for (i = 0; ((i < 8) && (it < chanlist.end())); ++i) { cgroup->addChild(new ChannelCheckBox(*this, it->chanid, it->channum, it->name, _name)); ++it; } columns->addChild(cgroup); } ++p; addChild(columns); } while (it < chanlist.end()); }
/** \fn ChannelBase::InitializeInputs(void) * \brief Fills in input map from DB */ bool ChannelBase::InitializeInputs(void) { ClearInputMap(); uint cardid = max(GetCardID(), 0); if (!cardid) { LOG(VB_GENERAL, LOG_ERR, "InitializeInputs(): Programmer error, cardid invalid."); return false; } MSqlQuery query(MSqlQuery::InitCon()); query.prepare( "SELECT cardinputid, " " inputname, startchan, " " tunechan, externalcommand, " " sourceid " "FROM cardinput " "WHERE cardid = :CARDID"); query.bindValue(":CARDID", cardid); if (!query.exec() || !query.isActive()) { MythDB::DBError("InitializeInputs", query); return false; } else if (!query.size()) { LOG(VB_GENERAL, LOG_ERR, "InitializeInputs(): " "\n\t\t\tCould not get inputs for the capturecard." "\n\t\t\tPerhaps you have forgotten to bind video" "\n\t\t\tsources to your card's inputs?"); return false; } m_allchannels.clear(); QString order = gCoreContext->GetSetting("ChannelOrdering", "channum"); while (query.next()) { uint sourceid = query.value(5).toUInt(); DBChanList channels = ChannelUtil::GetChannels(sourceid, false); ChannelUtil::SortChannels(channels, order); m_inputs[query.value(0).toUInt()] = new ChannelInputInfo( query.value(1).toString(), query.value(2).toString(), query.value(3).toString(), query.value(4).toString(), sourceid, cardid, query.value(0).toUInt(), 0, channels); if (!IsExternalChannelChangeSupported() && !m_inputs[query.value(0).toUInt()]->externalChanger.isEmpty()) { LOG(VB_GENERAL, LOG_WARNING, LOC + "External Channel changer is " "set, but this device does not support it."); m_inputs[query.value(0).toUInt()]->externalChanger.clear(); } m_allchannels.insert(m_allchannels.end(), channels.begin(), channels.end()); } ChannelUtil::SortChannels(m_allchannels, order, true); m_currentInputID = GetDefaultInput(cardid); // In case that defaultinput is not set if (m_currentInputID == -1) m_currentInputID = GetNextInputNum(); // print em InputMap::const_iterator it; for (it = m_inputs.begin(); it != m_inputs.end(); ++it) { LOG(VB_CHANNEL, LOG_INFO, LOC + QString("Input #%1: '%2' schan(%3) sourceid(%4) ccid(%5)") .arg(it.key()).arg((*it)->name).arg((*it)->startChanNum) .arg((*it)->sourceid).arg((*it)->cardid)); } LOG(VB_CHANNEL, LOG_INFO, LOC + QString("Current Input #%1: '%2'") .arg(GetCurrentInputNum()).arg(GetCurrentInput())); return m_inputs.size(); }
bool ChannelBase::Init(QString &inputname, QString &startchannel, bool setchan) { bool ok; if (!setchan) ok = inputname.isEmpty() ? false : IsTunable(inputname, startchannel); else if (inputname.isEmpty()) ok = SetChannelByString(startchannel); else ok = SwitchToInput(inputname, startchannel); if (ok) return true; // try to find a valid channel if given start channel fails. QString msg1 = QString("Setting start channel '%1' failed, ") .arg(startchannel); QString msg2 = "and we failed to find any suitible channels on any input."; bool msg_error = true; QStringList inputs = GetConnectedInputs(); // Note we use qFind rather than std::find() for ulibc compat (#4507) QStringList::const_iterator start = qFind(inputs.begin(), inputs.end(), inputname); start = (start == inputs.end()) ? inputs.begin() : start; if (start != inputs.end()) { LOG(VB_CHANNEL, LOG_INFO, LOC + QString("Looking for startchannel '%1' on input '%2'") .arg(startchannel).arg(*start)); } // Attempt to find an input for the requested startchannel QStringList::const_iterator it = start; while (it != inputs.end()) { DBChanList channels = GetChannels(*it); DBChanList::const_iterator cit = channels.begin(); for (; cit != channels.end(); ++cit) { if ((*cit).channum == startchannel && IsTunable(*it, startchannel)) { inputname = *it; LOG(VB_CHANNEL, LOG_INFO, LOC + QString("Found startchannel '%1' on input '%2'") .arg(startchannel).arg(inputname)); return true; } } ++it; it = (it == inputs.end()) ? inputs.begin() : it; if (it == start) break; } it = start; while (it != inputs.end() && !ok) { uint mplexid_restriction = 0; DBChanList channels = GetChannels(*it); if (channels.size() && IsInputAvailable(GetInputByName(*it), mplexid_restriction)) { uint chanid = ChannelUtil::GetNextChannel( channels, channels[0].chanid, mplexid_restriction, CHANNEL_DIRECTION_UP); DBChanList::const_iterator cit = find(channels.begin(), channels.end(), chanid); if (chanid && cit != channels.end()) { if (!setchan) { ok = IsTunable(*it, (mplexid_restriction) ? (*cit).channum : startchannel); } else ok = SwitchToInput(*it, (*cit).channum); if (ok) { inputname = *it; if (mplexid_restriction) { startchannel = (*cit).channum; startchannel.detach(); } msg2 = QString("selected to '%1' on input '%2' instead.") .arg(startchannel).arg(inputname); msg_error = false; } } } ++it; it = (it == inputs.end()) ? inputs.begin() : it; if (it == start) break; } LOG(VB_GENERAL, ((msg_error) ? LOG_ERR : LOG_WARNING), LOC + msg1 + "\n\t\t\t" + msg2); return ok; }