X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/fc8d7d9463a9305b68da5b439c2a41061cb962bb..f7e8568b71f16d286223255149f59217376ac345:/lib/dvb/dvb.cpp diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index b08e524c..5ede1e38 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -197,20 +197,39 @@ void eDVBResourceManager::addAdapter(iDVBAdapter *adapter) for (i=0; i frontend; + if (!adapter->getFrontend(frontend, i)) + { + frontend->setSEC(m_sec); m_frontend.push_back(new eDVBRegisteredFrontend(frontend, adapter)); + } } } -RESULT eDVBResourceManager::allocateFrontend(const eDVBChannelID &chid, ePtr &fe) +RESULT eDVBResourceManager::allocateFrontend(ePtr &feparm, ePtr &fe) { - /* find first unused frontend. we ignore compatibility for now. */ + ePtr best; + int bestval = 0; + for (eSmartPtrList::iterator i(m_frontend.begin()); i != m_frontend.end(); ++i) if (!i->m_inuse) { - fe = new eDVBAllocatedFrontend(i); - return 0; + int c = i->m_frontend->isCompatibleWith(feparm); + if (c > bestval) + { + c = bestval; + best = i; + } } + + if (best) + { + fe = new eDVBAllocatedFrontend(best); + return 0; + } + + fe = 0; + return -1; } @@ -241,7 +260,6 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtrget().setSourceFrontend(fe->m_frontend->getID()); else demux->get().setSourcePVR(0); - eDebug("demux (%d) found (fe id: %d)", n, fe->m_frontend->getID()); return 0; } eDebug("demux not found"); @@ -280,13 +298,26 @@ RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, eUse } } - /* no currently available channel is tuned to this channelid. create a new one, if possible. */ - - /* allocate a frontend. */ + /* no currently available channel is tuned to this channelid. create a new one, if possible. */ + + if (!m_list) + { + eDebug("no channel list set!"); + return -ENOENT; + } + + ePtr feparm; + if (m_list->getChannelFrontendData(channelid, feparm)) + { + eDebug("channel not found!"); + return -ENOENT; + } + + /* allocate a frontend. */ ePtr fe; - if (allocateFrontend(channelid, fe)) + if (allocateFrontend(feparm, fe)) return errNoFrontend; // will be allocated on demand: @@ -294,16 +325,12 @@ RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, eUse // // if (allocateDemux(*fe, demux)) // return errNoDemux; - + RESULT res; ePtr ch; ch = new eDVBChannel(this, fe); - ePtr myfe; - if (!ch->getFrontend(myfe)) - myfe->setSEC(m_sec); - - res = ch->setChannel(channelid); + res = ch->setChannel(channelid, feparm); if (res) { channel = 0; @@ -317,8 +344,10 @@ RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, eUse RESULT eDVBResourceManager::allocateRawChannel(eUsePtr &channel) { ePtr fe; - - if (allocateFrontend(eDVBChannelID(), fe)) + +#warning FIXME allocateRawChannel + +// if (allocateFrontend(eDVBChannelID(), fe)) return errNoFrontend; // ePtr demux; @@ -329,10 +358,6 @@ RESULT eDVBResourceManager::allocateRawChannel(eUsePtr &channel) eDVBChannel *ch; ch = new eDVBChannel(this, fe); - ePtr myfe; - if (!ch->getFrontend(myfe)) - myfe->setSEC(m_sec); - channel = ch; return 0; } @@ -355,7 +380,7 @@ RESULT eDVBResourceManager::allocatePVRChannel(eUsePtr &channel) RESULT eDVBResourceManager::addChannel(const eDVBChannelID &chid, eDVBChannel *ch) { m_active_channels.push_back(active_channel(chid, ch)); -// /* emit */ m_channelAdded(ch); + /* emit */ m_channelAdded(ch); return 0; } @@ -460,7 +485,7 @@ void eDVBChannel::ReleaseUse() } } -RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid) +RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid, ePtr &feparm) { if (m_channel_id) m_mgr->removeChannel(this); @@ -468,24 +493,6 @@ RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid) if (!channelid) return 0; - ePtr list; - - if (m_mgr->getChannelList(list)) - { - eDebug("no channel list set!"); - return -ENOENT; - } - - eDebug("tuning to chid: ns: %08x tsid %04x onid %04x", - channelid.dvbnamespace.get(), channelid.transport_stream_id.get(), channelid.original_network_id.get()); - - ePtr feparm; - if (list->getChannelFrontendData(channelid, feparm)) - { - eDebug("channel not found!"); - return -ENOENT; - } - if (!m_frontend) { eDebug("no frontend to tune!");