X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fnav%2Fcore.cpp;h=45b4aa6fe99d251ab65927b2a2626b78bfd5dc7e;hp=9314d2c1756b1b428c28dbc5bc4dad3d37808c5e;hb=c54ee36de25775299773381e9f15667659b3b6db;hpb=02da1f586ef7945fef385e6d4743ef53441bc2fa diff --git a/lib/nav/core.cpp b/lib/nav/core.cpp index 9314d2c..45b4aa6 100644 --- a/lib/nav/core.cpp +++ b/lib/nav/core.cpp @@ -1,4 +1,6 @@ #include +#include +#include void eNavigation::serviceEvent(iPlayableService* service, int event) { @@ -7,36 +9,23 @@ void eNavigation::serviceEvent(iPlayableService* service, int event) eDebug("nav: event for other service"); return; } + m_event(event); +} - switch (event) +void eNavigation::recordEvent(iRecordableService* service, int event) +{ + if (m_recordings.find(service) == m_recordings.end()) { - case iPlayableService::evEnd: - /* at first, kill the running service */ - m_event(this, evStopService); - m_runningService = 0; - m_service_event_conn = 0; - /* our running main service stopped. remove it from playlist */ - if (!m_playlist.empty()) - m_playlist.erase(m_playlist.begin()); - if (!m_playlist.empty()) - { - RESULT res; - res = playService(m_playlist.front()); - if (res) - m_event(this, evPlayFailed); - } else - m_event(this, evPlaylistDone); - break; - case iPlayableService::evStart: - m_event(this, evNewService); - break; - default: - break; + eDebug("nav: event for non registered recording service"); + return; } + m_record_event(service, event); } RESULT eNavigation::playService(const eServiceReference &service) { + stopService(); + assert(m_servicehandler); RESULT res = m_servicehandler->play(service, m_runningService); if (m_runningService) @@ -47,18 +36,15 @@ RESULT eNavigation::playService(const eServiceReference &service) return res; } -RESULT eNavigation::enqueueService(const eServiceReference &service) +RESULT eNavigation::connectEvent(const Slot1 &event, ePtr &connection) { - int doplay = m_playlist.empty(); - m_playlist.push_back(service); - if (doplay) - return playService(m_playlist.front()); + connection = new eConnection(this, m_event.connect(event)); return 0; } -RESULT eNavigation::connectEvent(const Slot2 &event, ePtr &connection) +RESULT eNavigation::connectRecordEvent(const Slot2,int> &event, ePtr &connection) { - connection = new eConnection(this, m_event.connect(event)); + connection = new eConnection(this, m_record_event.connect(event)); return 0; } @@ -68,12 +54,68 @@ RESULT eNavigation::getCurrentService(ePtr &service) return 0; } +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(); + + /* kill service. */ + m_service_event_conn = 0; + return 0; +} + +RESULT eNavigation::recordService(const eServiceReference &ref, ePtr &service) +{ + 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; + } + return res; +} + +RESULT eNavigation::stopRecordService(ePtr &service) +{ + service->stop(); + std::map, ePtr >::iterator it = + m_recordings.find(service); + if (it != m_recordings.end()) + { + m_recordings.erase(it); + return 0; + } + eDebug("try to stop non running recording!!"); // this should not happen + return -1; +} + +PyObject *eNavigation::getRecordings(void) +{ + ePyObject result = PyList_New(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)); + return result; +} + RESULT eNavigation::pause(int dop) { if (!m_runningService) return -1; ePtr p; - if (m_runningService->getIPausableService(p)) + if (m_runningService->pause(p)) return -2; if (dop) return p->pause(); @@ -81,7 +123,7 @@ RESULT eNavigation::pause(int dop) return p->unpause(); } -eNavigation::eNavigation(iServiceHandler *serviceHandler): ref(0) +eNavigation::eNavigation(iServiceHandler *serviceHandler) { assert(serviceHandler); m_servicehandler = serviceHandler; @@ -89,6 +131,7 @@ eNavigation::eNavigation(iServiceHandler *serviceHandler): ref(0) eNavigation::~eNavigation() { + stopService(); } DEFINE_REF(eNavigation);