}
}
-void eDVBResourceManager::setFrontendSlotInformations(ePyObject list)
+PyObject *eDVBResourceManager::setFrontendSlotInformations(ePyObject list)
{
if (!PyList_Check(list))
{
PyErr_SetString(PyExc_StandardError, "eDVBResourceManager::setFrontendSlotInformations argument should be a python list");
- return;
+ return NULL;
}
if ((unsigned int)PyList_Size(list) != m_frontend.size())
{
sprintf(blasel, "eDVBResourceManager::setFrontendSlotInformations list size incorrect %d frontends avail, but %d entries in slotlist",
m_frontend.size(), PyList_Size(list));
PyErr_SetString(PyExc_StandardError, blasel);
- return;
+ return NULL;
}
int pos=0;
for (eSmartPtrList<eDVBRegisteredFrontend>::iterator i(m_frontend.begin()); i != m_frontend.end(); ++i)
{
ePyObject obj = PyList_GET_ITEM(list, pos++);
- i->m_frontend->setSlotInfo(obj);
+ if (!i->m_frontend->setSlotInfo(obj))
+ return NULL;
}
+ Py_RETURN_NONE;
}
RESULT eDVBResourceManager::allocateFrontend(ePtr<eDVBAllocatedFrontend> &fe, ePtr<iDVBFrontendParameters> &feparm)
case eCueSheet::evtSkipmode:
{
{
- eSingleLocker l(m_cue->m_lock);
+ m_cue->m_lock.WrLock();
m_cue->m_seek_requests.push_back(std::pair<int, pts_t>(1, 0)); /* resync */
+ m_cue->m_lock.Unlock();
+ eRdLocker l(m_cue->m_lock);
if (m_cue->m_skipmode_ratio)
{
int bitrate = m_tstools.calcBitrate(); /* in bits/s */
m_skipmode_n = m_skipmode_m = 0;
}
}
+ ASSERT(m_pvr_thread);
m_pvr_thread->setIFrameSearch(m_skipmode_n != 0);
eDebug("flush pvr");
flushPVR(m_cue->m_decoding_demux);
return;
}
- eSingleLocker l(m_cue->m_lock);
-
+ m_cue->m_lock.RdLock();
if (!m_cue->m_decoding_demux)
{
start = current_offset;
size = max;
eDebug("getNextSourceSpan, no decoding demux. forcing normal play");
+ m_cue->m_lock.Unlock();
return;
}
while (!m_cue->m_seek_requests.empty())
{
std::pair<int, pts_t> seek = m_cue->m_seek_requests.front();
+ m_cue->m_lock.Unlock();
+ m_cue->m_lock.WrLock();
m_cue->m_seek_requests.pop_front();
+ m_cue->m_lock.Unlock();
+ m_cue->m_lock.RdLock();
int relative = seek.first;
pts_t pts = seek.second;
pts_t nextap;
if (m_tstools.getNextAccessPoint(nextap, now, pts))
{
- pts = now;
+ pts = now - 90000; /* approx. 1s */
eDebug("AP relative seeking failed!");
} else
{
current_offset = align(offset, blocksize); /* in case tstools return non-aligned offset */
}
+ m_cue->m_lock.Unlock();
+
for (std::list<std::pair<off_t, off_t> >::const_iterator i(m_source_span.begin()); i != m_source_span.end(); ++i)
{
long long aligned_start = align(i->first, blocksize);
{
/* in normal playback, just start at the next zone. */
start = i->first;
-
+
/* size is not 64bit! */
if ((i->second - i->first) > max)
size = max;
--i;
eDebug("skip to previous block, which is %llx..%llx", i->first, i->second);
size_t len;
-
- if ((i->second - i->first) > max)
+
+ aligned_start = align(i->first, blocksize);
+ aligned_end = align(i->second, blocksize);
+
+ if ((aligned_end - aligned_start) > max)
len = max;
else
len = aligned_end - aligned_start;
start = aligned_end - len;
eDebug("skipping to %llx, %d", start, len);
}
-
+
eDebug("result: %llx, %x (%llx %llx)", start, size, aligned_start, aligned_end);
return;
}
}
-
+
if ((current_offset < -m_skipmode_m) && (m_skipmode_m < 0))
{
eDebug("reached SOF");
m_skipmode_m = 0;
m_pvr_thread->sendEvent(eFilePushThread::evtUser);
}
-
+
start = current_offset;
size = max;
void eCueSheet::seekTo(int relative, const pts_t &pts)
{
- {
- eSingleLocker l(m_lock);
- m_seek_requests.push_back(std::pair<int, pts_t>(relative, pts));
- }
+ m_lock.WrLock();
+ m_seek_requests.push_back(std::pair<int, pts_t>(relative, pts));
+ m_lock.Unlock();
m_event(evtSeek);
}
void eCueSheet::clear()
{
- eSingleLocker l(m_lock);
+ m_lock.WrLock();
m_spans.clear();
+ m_lock.Unlock();
}
void eCueSheet::addSourceSpan(const pts_t &begin, const pts_t &end)
{
- {
- eSingleLocker l(m_lock);
- m_spans.push_back(std::pair<pts_t, pts_t>(begin, end));
- }
+ m_lock.WrLock();
+ m_spans.push_back(std::pair<pts_t, pts_t>(begin, end));
+ m_lock.Unlock();
}
void eCueSheet::commitSpans()
void eCueSheet::setSkipmode(const pts_t &ratio)
{
- {
- eSingleLocker l(m_lock);
- m_skipmode_ratio = ratio;
- }
+ m_lock.WrLock();
+ m_skipmode_ratio = ratio;
+ m_lock.Unlock();
m_event(evtSkipmode);
}