{
if (instance == this)
instance = 0;
-
}
void eDVBResourceManager::addAdapter(iDVBAdapter *adapter)
// return errNoDemux;
RESULT res;
- eDVBChannel *ch;
+ ePtr<eDVBChannel> ch;
ch = new eDVBChannel(this, fe);
ePtr<iDVBFrontend> myfe;
RESULT eDVBResourceManager::addChannel(const eDVBChannelID &chid, eDVBChannel *ch)
{
- eDebug("add channel %p", ch);
m_active_channels.push_back(active_channel(chid, ch));
/* emit */ m_channelAdded(ch);
return 0;
void eDVBChannel::frontendStateChanged(iDVBFrontend*fe)
{
- eDebug("fe state changed!");
int state, ourstate = 0;
/* if we are already in shutdown, don't change state. */
{
eDebug("OURSTATE: tuning");
ourstate = state_tuning;
- } else if (state == iDVBFrontend::stateFailed)
+ } else if (state == iDVBFrontend::stateLostLock)
{
- eDebug("OURSTATE: failed/unavailable");
+ eDebug("OURSTATE: lost lock");
ourstate = state_unavailable;
+ } else if (state == iDVBFrontend::stateFailed)
+ {
+ eDebug("OURSTATE: failed");
+ ourstate = state_failed;
} else
eFatal("state unknown");
eDebug("channel not found!");
return -ENOENT;
}
- eDebug("allocateChannel: channel found..");
if (!m_frontend)
{
if (m_tuning)
state = stateTuning;
else
- state = stateFailed;
+ {
+ state = stateLostLock;
+
+ if (m_state != stateLostLock)
+ eDebug("FIXME: we lost lock, so we might have to retune.");
+ }
}
if (m_state != state)
{
m_state = state;
m_stateChanged(this);
}
+ m_tuning = 0;
} else
m_tuning = 0;
}
m_sec_sequence.clear();
- eDebug("eDVBFrontend::tune. type: %d", m_type);
-
switch (m_type)
{
case feSatellite:
stateIdle = 0,
stateTuning = 1,
stateFailed = 2,
- stateLock = 3
+ stateLock = 3,
+ stateLostLock = 4,
};
virtual RESULT getState(int &state)=0;
enum {
{
state_idle, /* not yet tuned */
state_tuning, /* currently tuning (first time) */
+ state_failed, /* tuning failed. */
state_unavailable, /* currently unavailable, will be back without further interaction */
state_ok, /* ok */
state_release /* channel is being shut down. */
if ( m_service && !m_service->cacheEmpty() )
serviceEvent(eventNewProgramInfo);
}
+ } else if ((m_last_channel_state != iDVBChannel::state_failed) &&
+ (state == iDVBChannel::state_failed))
+ {
+ eDebug("tune failed.");
+ serviceEvent(eventTuneFailed);
}
}
eDVBChannelID chid;
ref.getChannelID(chid);
res = m_resourceManager->allocateChannel(chid, m_channel);
+ eDebug("allocate Channel: res %d", res);
} else
{
eDVBMetaParser parser;
m_channelStateChanged_connection);
m_last_channel_state = -1;
channelStateChanged(m_channel);
+ } else
+ {
+ serviceEvent(eventTuneFailed);
+ return res;
}
if (m_pvr_channel)
enum
{
eventNoResources, // a requested resource couldn't be allocated
+ eventTuneFailed, // tune failed
eventNoPAT, // no pat could be received (timeout)
eventNoPATEntry, // no pat entry for the corresponding SID could be found
eventNoPMT, // no pmt could be received (timeout)
{
startFilter();
m_channel_state = state;
- } else if (state == iDVBChannel::state_unavailable)
+ } else if (state == iDVBChannel::state_failed)
{
m_ch_unavailable.push_back(m_ch_current);
nextChannel();
}
+ /* unavailable will timeout, anyway. */
}
RESULT eDVBScan::nextChannel()
evStart,
evEnd,
+ evTuneFailed,
// when iServiceInformation is implemented:
evUpdatedEventInfo
};
// eventNoEvent
break;
}
+ case eDVBServicePMTHandler::eventTuneFailed:
+ {
+ eDebug("DVB service failed to tune");
+ m_event((iPlayableService*)this, evTuneFailed);
+ break;
+ }
case eDVBServicePMTHandler::eventNewProgramInfo:
{
int vpid = -1, apid = -1, pcrpid = -1;
int r;
eDebug("starting DVB service");
r = m_service_handler.tune((eServiceReferenceDVB&)m_reference);
+ eDebug("tune result: %d", r);
m_event(this, evStart);
return 0;
}