X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/1a3bd31e5cfcba89f2db03a2b4fa550de1fa2823..6fdb2d2094c50a2bc324f4094473c2107d2ea943:/lib/nav/core.cpp diff --git a/lib/nav/core.cpp b/lib/nav/core.cpp index deec3739..ad777660 100644 --- a/lib/nav/core.cpp +++ b/lib/nav/core.cpp @@ -1,61 +1,32 @@ #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); +} - switch (event) +void eNavigation::recordEvent(iRecordableService* service, int event) +{ + if (m_recordings.find(service) == m_recordings.end()) { - case iPlayableService::evEnd: - assert(m_playlist); /* we need to have a playlist */ - - /* at first, kill the running service */ - stopService(); - - /* our running main service stopped. identify what to do next. */ - - /* unless the playlist current position is invalid (because there was */ - /* playlist, for example when the service was engaged with playService */ - if (m_playlist->m_current != m_playlist->end()) - ++m_playlist->m_current; - - /* was the current service the last one? */ - if (m_playlist->m_current == m_playlist->end()) - { - m_event(this, evPlaylistDone); - break; - } - - /* there is another service in the playlist. play it. */ - RESULT res; - res = playService(*m_playlist->m_current); - if (res) - m_event(this, evPlayFailed); - break; - case iPlayableService::evStart: - m_event(this, evNewService); - break; - case iPlayableService::evUpdatedEventInfo: - m_event(this, evUpdatedEventInfo); - break; - case iPlayableService::evUpdatedInfo: - m_event(this, evUpdatedInfo); - 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); + ASSERT(m_servicehandler); RESULT res = m_servicehandler->play(service, m_runningService); if (m_runningService) { @@ -65,28 +36,15 @@ RESULT eNavigation::playService(const eServiceReference &service) return res; } -RESULT eNavigation::enqueueService(const eServiceReference &service) +RESULT eNavigation::connectEvent(const Slot1 &event, ePtr &connection) { - assert(m_playlist); - /* check if we need to play after the service was enqueued. */ - int doplay = m_playlist->m_current == m_playlist->end(); - - /* add the service to the playlist. the playlist's m_current */ - /* points either to a service before the last or 'doplay' is set. */ - m_playlist->push_back(service); - - if (doplay) - { - m_playlist->m_current = m_playlist->end(); - --m_playlist->m_current; - return playService(*m_playlist->m_current); - } + 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; } @@ -96,38 +54,85 @@ RESULT eNavigation::getCurrentService(ePtr &service) return 0; } -RESULT eNavigation::getPlaylist(ePtr &playlist) -{ - if (!m_playlist) - return -1; - playlist = m_playlist; - return 0; -} - RESULT eNavigation::stopService(void) { /* check if there is a running service... */ if (!m_runningService) return 1; - /* send stop event */ - m_event(this, evStopService); + + ePtr tmp = m_runningService; + m_runningService=0; + tmp->stop(); + + /* send stop event */ + m_event(iPlayableService::evEnd); /* kill service. */ - m_runningService = 0; m_service_event_conn = 0; 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 + { + if (simulate) + m_simulate_recordings.insert(service); + else + { + ePtr conn; + service->connectEvent(slot(*this, &eNavigation::recordEvent), conn); + m_recordings[service]=conn; + } + } return res; } +RESULT eNavigation::stopRecordService(ePtr &service) +{ + service->stop(); + std::set >::iterator it = + m_simulate_recordings.find(service); + if (it != m_simulate_recordings.end()) + { + 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(bool simulate) +{ + ePyObject result = PyList_New(simulate ? m_simulate_recordings.size() : m_recordings.size()); + int pos=0; + 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; +} + RESULT eNavigation::pause(int dop) { if (!m_runningService) @@ -143,16 +148,13 @@ RESULT eNavigation::pause(int dop) eNavigation::eNavigation(iServiceHandler *serviceHandler) { - assert(serviceHandler); + ASSERT(serviceHandler); m_servicehandler = serviceHandler; - m_playlist = new ePlaylist; - - /* start with no current selection */ - m_playlist->m_current = m_playlist->end(); } eNavigation::~eNavigation() { + stopService(); } DEFINE_REF(eNavigation);