/** \fn ChannelBase::GetInputByName(const QString &input) const * \brief Returns number of named input, returns -1 if not found. */ int ChannelBase::GetInputByName(const QString &input) const { InputMap::const_iterator it = m_inputs.begin(); for (; it != m_inputs.end(); ++it) { if ((*it)->name == input) return (int)it.key(); } return -1; }
/** \fn V4LChannel::InitializeInputs(void) * This enumerates the inputs, converts the format * string to something the hardware understands, and * if the parent pointer is valid retrieves the * channels from the database. */ bool V4LChannel::InitializeInputs(void) { // Get Inputs from DB if (!ChannelBase::InitializeInputs()) return false; // Get global TVFormat setting QString fmt = gCoreContext->GetSetting("TVFormat"); LOG(VB_CHANNEL, LOG_INFO, QString("Global TVFormat Setting '%1'").arg(fmt)); int videomode_v4l1 = format_to_mode(fmt.toUpper(), 1); int videomode_v4l2 = format_to_mode(fmt.toUpper(), 2); bool ok = false; InputNames v4l_inputs = CardUtil::ProbeV4LVideoInputs(videofd, ok); // Insert info from hardware uint valid_cnt = 0; InputMap::const_iterator it; for (it = m_inputs.begin(); it != m_inputs.end(); ++it) { InputNames::const_iterator v4l_it = v4l_inputs.begin(); for (; v4l_it != v4l_inputs.end(); ++v4l_it) { if (*v4l_it == (*it)->name) { (*it)->inputNumV4L = v4l_it.key(); (*it)->videoModeV4L1 = videomode_v4l1; (*it)->videoModeV4L2 = videomode_v4l2; valid_cnt++; } } } // print em for (it = m_inputs.begin(); it != m_inputs.end(); ++it) { LOG(VB_CHANNEL, LOG_INFO, LOC + QString("Input #%1: '%2' schan(%3) tun(%4) v4l1(%5) v4l2(%6)") .arg(it.key()).arg((*it)->name).arg((*it)->startChanNum) .arg((*it)->tuneToChannel) .arg(mode_to_format((*it)->videoModeV4L1,1)) .arg(mode_to_format((*it)->videoModeV4L2,2))); } return valid_cnt; }
/** \fn ChannelBase::StoreInputChannels(const InputMap&) * \brief Sets starting channel for the each input in the input map. * \param input Map from cardinputid to input params. */ void ChannelBase::StoreInputChannels(const InputMap &inputs) { MSqlQuery query(MSqlQuery::InitCon()); InputMap::const_iterator it = inputs.begin(); for (; it != inputs.end(); ++it) { if ((*it)->name.isEmpty() || (*it)->startChanNum.isEmpty()) continue; query.prepare( "UPDATE cardinput " "SET startchan = :STARTCHAN " "WHERE cardinputid = :CARDINPUTID"); query.bindValue(":STARTCHAN", (*it)->startChanNum); query.bindValue(":CARDINPUTID", it.key()); if (!query.exec() || !query.isActive()) MythDB::DBError("StoreInputChannels", query); } }
int ChannelBase::GetNextInputNum(void) const { // Exit early if inputs don't exist.. if (m_inputs.isEmpty()) return -1; // Find current input InputMap::const_iterator it; it = m_inputs.find(m_currentInputID); // If we can't find the current input, start at // the beginning and don't increment initially. bool skip_incr = false; if (it == m_inputs.end()) { it = m_inputs.begin(); skip_incr = true; } // Find the next _connected_ input. int i = 0; for (; i < 100; i++) { if (!skip_incr) { ++it; it = (it == m_inputs.end()) ? m_inputs.begin() : it; } skip_incr = false; if ((*it)->sourceid) break; } // if we found anything, including current cap channel return it return (i<100) ? (int)it.key() : -1; }
/** \fn ChannelBase::InitializeInputs(void) * \brief Fills in input map from DB */ bool ChannelBase::InitializeInputs(void) { ClearInputMap(); uint cardid = GetCardID(); 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, livetvorder " "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(); ChannelInfoList 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(), query.value(5).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 = GetStartInput(cardid); // In case that initial input 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(); }