eDVBResourceManager *eDVBResourceManager::instance;
+RESULT eDVBResourceManager::getInstance(ePtr<eDVBResourceManager> &ptr)
+{
+ if (instance)
+ {
+ ptr = instance;
+ return 0;
+ }
+ return -1;
+}
+
eDVBResourceManager::eDVBResourceManager()
:m_releaseCachedChannelTimer(eApp)
{
{
ePtr<eDVBAllocatedDemux> demux;
+ if (m_cached_channel && m_releaseCachedChannelTimer.isActive())
+ {
+ m_cached_channel_state_changed_conn.disconnect();
+ m_cached_channel=0;
+ m_releaseCachedChannelTimer.stop();
+ }
+
eDVBChannel *ch;
ch = new eDVBChannel(this, 0);
-
+
channel = ch;
return 0;
}
} else if (state == iDVBFrontend::stateLostLock)
{
/* on managed channels, we try to retune in order to re-acquire lock. */
- if (m_feparm)
+ if (m_current_frontend_parameters)
{
eDebug("OURSTATE: lost lock, trying to retune");
ourstate = state_tuning;
- m_frontend->get().tune(*m_feparm);
+ m_frontend->get().tune(*m_current_frontend_parameters);
} else
/* on unmanaged channels, we don't do this. the client will do this. */
{
}
if (relative == 1) /* pts relative */
+ {
pts += now;
+ if (pts < 0)
+ pts = 0;
+ }
if (relative != 2)
if (pts < 0)
if ((current_offset >= i->first) && (current_offset < i->second))
{
start = current_offset;
- size = i->second - current_offset;
- if (size > max)
+ /* max can not exceed max(size_t). i->second - current_offset, however, can. */
+ if ((i->second - current_offset) > max)
size = max;
- eDebug("HIT, %lld < %lld < %lld", i->first, current_offset, i->second);
+ else
+ size = i->second - current_offset;
+ eDebug("HIT, %lld < %lld < %lld, size: %d", i->first, current_offset, i->second, size);
return;
}
if (current_offset < i->first)
{
/* in normal playback, just start at the next zone. */
start = i->first;
- size = i->second - i->first;
- if (size > max)
+
+ /* size is not 64bit! */
+ if ((i->second - i->first) > max)
size = max;
+ else
+ size = i->second - i->first;
+
eDebug("skip");
if (m_skipmode_m < 0)
{
/* when skipping reverse, however, choose the zone before. */
--i;
eDebug("skip to previous block, which is %llx..%llx", i->first, i->second);
- size_t len = i->second - i->first;
- if (max > len)
- max = len;
- start = i->second - max;
- size = max;
- eDebug("skipping to %llx, %d", start, size);
+ size_t len;
+
+ if ((i->second - i->first) > max)
+ len = max;
+ else
+ len = i->second - i->first;
+
+ start = i->second - len;
+ eDebug("skipping to %llx, %d", start, len);
}
return;
}
/* if tuning fails, shutdown the channel immediately. */
int res;
res = m_frontend->get().tune(*feparm);
- m_feparm = feparm;
+ m_current_frontend_parameters = feparm;
if (res)
{
RESULT eDVBChannel::getFrontend(ePtr<iDVBFrontend> &frontend)
{
+ frontend = 0;
+ if (!m_frontend)
+ return -ENODEV;
frontend = &m_frontend->get();
if (frontend)
return 0;
- else
- return -ENODEV;
+ return -ENODEV;
+}
+
+RESULT eDVBChannel::getCurrentFrontendParameters(ePtr<iDVBFrontendParameters> ¶m)
+{
+ param = m_current_frontend_parameters;
+ return 0;
}
RESULT eDVBChannel::playFile(const char *file)
eDebug("can't open /dev/misc/pvr - you need to buy the new(!) $$$ box! (%m)"); // or wait for the driver to be improved.
return -ENODEV;
}
-
- m_pvr_fd_src = open(file, O_RDONLY|O_LARGEFILE);
- if (m_pvr_fd_src < 0)
- {
- eDebug("can't open PVR m_pvr_fd_src file %s (%m)", file);
- close(m_pvr_fd_dst);
- return -ENOENT;
- }
-
- m_state = state_ok;
- m_stateChanged(this);
-
+
m_pvr_thread = new eFilePushThread();
m_pvr_thread->enablePVRCommit(1);
m_pvr_thread->setScatterGather(this);
- m_pvr_thread->start(m_pvr_fd_src, m_pvr_fd_dst);
+ if (m_pvr_thread->start(file, m_pvr_fd_dst))
+ {
+ delete m_pvr_thread;
+ m_pvr_thread = 0;
+ eDebug("can't open PVR file %s (%m)", file);
+ return -ENOENT;
+ }
CONNECT(m_pvr_thread->m_event, eDVBChannel::pvrEvent);
+ m_state = state_ok;
+ m_stateChanged(this);
+
return 0;
}
if (m_pvr_thread)
{
m_pvr_thread->stop();
- ::close(m_pvr_fd_src);
::close(m_pvr_fd_dst);
delete m_pvr_thread;
m_pvr_thread = 0;