X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fnav%2Fcore.cpp;h=cfb132f4e8838efc99df165316063a4d73d39f1b;hp=45b4aa6fe99d251ab65927b2a2626b78bfd5dc7e;hb=4911a0121954f6b6657ba28fab8d9dd9031d9a59;hpb=c54ee36de25775299773381e9f15667659b3b6db diff --git a/lib/nav/core.cpp b/lib/nav/core.cpp index 45b4aa6..cfb132f 100644 --- a/lib/nav/core.cpp +++ b/lib/nav/core.cpp @@ -1,12 +1,13 @@ #include #include #include +#include void eNavigation::serviceEvent(iPlayableService* service, int event) { - if (service != m_runningService) + if (m_runningService && service != m_runningService) { - eDebug("nav: event for other service"); + eDebug("nav: event %d for other service", event); return; } m_event(event); @@ -24,12 +25,18 @@ void eNavigation::recordEvent(iRecordableService* service, int event) RESULT eNavigation::playService(const eServiceReference &service) { - stopService(); - - assert(m_servicehandler); - RESULT res = m_servicehandler->play(service, m_runningService); + RESULT res = -1; + + if (m_fccmgr->tryFCCService(service, m_runningService) == -1) + { + stopService(); + ASSERT(m_servicehandler); + res = m_servicehandler->play(service, m_runningService); + } + if (m_runningService) { + m_runningService->setTarget(m_decoder); m_runningService->connectEvent(slot(*this, &eNavigation::serviceEvent), m_service_event_conn); res = m_runningService->start(); } @@ -59,30 +66,38 @@ RESULT eNavigation::stopService(void) /* check if there is a running service... */ if (!m_runningService) return 1; - /* send stop event */ - m_event(iPlayableService::evEnd); ePtr tmp = m_runningService; m_runningService=0; tmp->stop(); + /* send stop event */ + m_event(iPlayableService::evEnd); + /* kill service. */ m_service_event_conn = 0; + + m_fccmgr->cleanupFCCService(); return 0; } -RESULT eNavigation::recordService(const eServiceReference &ref, ePtr &service) +RESULT eNavigation::recordService(const eServiceReference &ref, ePtr &service, bool simulate) { - assert(m_servicehandler); + ASSERT(m_servicehandler); RESULT res = m_servicehandler->record(ref, service); eDebug("record: %d", res); if (res) service = 0; else { - ePtr conn; - service->connectEvent(slot(*this, &eNavigation::recordEvent), conn); - m_recordings[service]=conn; + if (simulate) + m_simulate_recordings.insert(service); + else + { + ePtr conn; + service->connectEvent(slot(*this, &eNavigation::recordEvent), conn); + m_recordings[service]=conn; + } } return res; } @@ -90,23 +105,40 @@ RESULT eNavigation::recordService(const eServiceReference &ref, ePtr &service) { service->stop(); - std::map, ePtr >::iterator it = - m_recordings.find(service); - if (it != m_recordings.end()) + std::set >::iterator it = + m_simulate_recordings.find(service); + if (it != m_simulate_recordings.end()) { - m_recordings.erase(it); + m_simulate_recordings.erase(it); return 0; } + else + { + std::map, ePtr >::iterator it = + m_recordings.find(service); + if (it != m_recordings.end()) + { + m_recordings.erase(it); + /* send stop event */ + m_record_event(service, iRecordableService::evEnd); + return 0; + } + } + eDebug("try to stop non running recording!!"); // this should not happen return -1; } -PyObject *eNavigation::getRecordings(void) +PyObject *eNavigation::getRecordings(bool simulate) { - ePyObject result = PyList_New(m_recordings.size()); + ePyObject result = PyList_New(simulate ? m_simulate_recordings.size() : m_recordings.size()); int pos=0; - for (std::map, ePtr >::iterator it(m_recordings.begin()); it != m_recordings.end(); ++it) - PyList_SET_ITEM(result, pos++, NEW_iRecordableServicePtr(it->first)); + if (simulate) + for (std::set >::iterator it(m_simulate_recordings.begin()); it != m_simulate_recordings.end(); ++it) + PyList_SET_ITEM(result, pos++, NEW_iRecordableServicePtr(*it)); + else + for (std::map, ePtr >::iterator it(m_recordings.begin()); it != m_recordings.end(); ++it) + PyList_SET_ITEM(result, pos++, NEW_iRecordableServicePtr(it->first)); return result; } @@ -123,10 +155,12 @@ RESULT eNavigation::pause(int dop) return p->unpause(); } -eNavigation::eNavigation(iServiceHandler *serviceHandler) +eNavigation::eNavigation(iServiceHandler *serviceHandler, int decoder) { - assert(serviceHandler); + ASSERT(serviceHandler); m_servicehandler = serviceHandler; + m_decoder = decoder; + m_fccmgr = new eFCCServiceManager(this); } eNavigation::~eNavigation()