for (i=0; i<num_fe; ++i)
{
ePtr<eDVBFrontend> 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<eDVBAllocatedFrontend> &fe)
+RESULT eDVBResourceManager::allocateFrontend(ePtr<iDVBFrontendParameters> &feparm, ePtr<eDVBAllocatedFrontend> &fe)
{
- /* find first unused frontend. we ignore compatibility for now. */
+ ePtr<eDVBRegisteredFrontend> best;
+ int bestval = 0;
+
for (eSmartPtrList<eDVBRegisteredFrontend>::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;
}
if (i == m_demux.end())
return -1;
+ int n=0;
/* FIXME: hardware demux policy */
if (!(cap & iDVBChannel::capDecode))
- ++i;
+ ++i, ++n;
- for (; i != m_demux.end(); ++i)
+ for (; i != m_demux.end(); ++i, ++n)
if ((!i->m_inuse) && ((!fe) || (i->m_adapter == fe->m_adapter)))
{
+ if ((cap & iDVBChannel::capDecode) && n)
+ continue;
+
demux = new eDVBAllocatedDemux(i);
if (fe)
demux->get().setSourceFrontend(fe->m_frontend->getID());
else
demux->get().setSourcePVR(0);
- eDebug("demux found");
return 0;
}
eDebug("demux not found");
}
}
- /* 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<iDVBFrontendParameters> feparm;
+ if (m_list->getChannelFrontendData(channelid, feparm))
+ {
+ eDebug("channel not found!");
+ return -ENOENT;
+ }
+
+ /* allocate a frontend. */
ePtr<eDVBAllocatedFrontend> fe;
- if (allocateFrontend(channelid, fe))
+ if (allocateFrontend(feparm, fe))
return errNoFrontend;
// will be allocated on demand:
//
// if (allocateDemux(*fe, demux))
// return errNoDemux;
-
+
RESULT res;
ePtr<eDVBChannel> ch;
ch = new eDVBChannel(this, fe);
- ePtr<iDVBFrontend> myfe;
- if (!ch->getFrontend(myfe))
- myfe->setSEC(m_sec);
-
- res = ch->setChannel(channelid);
+ res = ch->setChannel(channelid, feparm);
if (res)
{
channel = 0;
RESULT eDVBResourceManager::allocateRawChannel(eUsePtr<iDVBChannel> &channel)
{
ePtr<eDVBAllocatedFrontend> fe;
-
- if (allocateFrontend(eDVBChannelID(), fe))
+
+#warning FIXME allocateRawChannel
+
+// if (allocateFrontend(eDVBChannelID(), fe))
return errNoFrontend;
// ePtr<eDVBAllocatedDemux> demux;
eDVBChannel *ch;
ch = new eDVBChannel(this, fe);
- ePtr<iDVBFrontend> myfe;
- if (!ch->getFrontend(myfe))
- myfe->setSEC(m_sec);
-
channel = ch;
return 0;
}
}
}
-RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid)
+RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid, ePtr<iDVBFrontendParameters> &feparm)
{
if (m_channel_id)
m_mgr->removeChannel(this);
if (!channelid)
return 0;
- ePtr<iDVBChannelList> 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<iDVBFrontendParameters> feparm;
- if (list->getChannelFrontendData(channelid, feparm))
- {
- eDebug("channel not found!");
- return -ENOENT;
- }
-
if (!m_frontend)
{
eDebug("no frontend to tune!");
RESULT eDVBChannel::getDemux(ePtr<iDVBDemux> &demux, int cap)
{
+ eDebug("get %d demux", cap);
ePtr<eDVBAllocatedDemux> &our_demux = (cap & capDecode) ? m_decoder_demux : m_demux;
if (!our_demux)
demux = 0;
if (m_mgr->allocateDemux(m_frontend ? (eDVBRegisteredFrontend*)*m_frontend : (eDVBRegisteredFrontend*)0, our_demux, cap))
- return 0;
+ return -1;
+
}
demux = *our_demux;
+ if (cap & capDecode)
+ {
+ our_demux = 0;
+ }
return 0;
}