X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/c0f5089ea04bd04fe25148e712fa62cd49dc17da..b2ec733c0227ae072b8d3b19bfb9fd98e2b6961e:/lib/nav/core.cpp diff --git a/lib/nav/core.cpp b/lib/nav/core.cpp index b5c229c7..2dfe630d 100644 --- a/lib/nav/core.cpp +++ b/lib/nav/core.cpp @@ -1,4 +1,5 @@ #include +#include void eNavigation::serviceEvent(iPlayableService* service, int event) { @@ -11,21 +12,37 @@ void eNavigation::serviceEvent(iPlayableService* service, int event) switch (event) { case iPlayableService::evEnd: - /* our running main service stopped. */ - if (!m_playlist.empty()) - m_playlist.erase(m_playlist.begin()); - if (!m_playlist.empty()) + 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()) { - RESULT res; - res = playService(m_playlist.front()); - if (res) - m_event(this, evPlayFailed); - } else 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; default: break; } @@ -33,6 +50,9 @@ void eNavigation::serviceEvent(iPlayableService* service, int event) RESULT eNavigation::playService(const eServiceReference &service) { + stopService(); + + assert(m_servicehandler); RESULT res = m_servicehandler->play(service, m_runningService); if (m_runningService) { @@ -44,16 +64,26 @@ RESULT eNavigation::playService(const eServiceReference &service) RESULT eNavigation::enqueueService(const eServiceReference &service) { - int doplay = m_playlist.empty(); - m_playlist.push_back(service); + 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) - return playService(m_playlist.front()); + { + m_playlist->m_current = m_playlist->end(); + --m_playlist->m_current; + return playService(*m_playlist->m_current); + } return 0; } RESULT eNavigation::connectEvent(const Slot2 &event, ePtr &connection) { - connection = new eConnection(m_event.connect(event)); + connection = new eConnection(this, m_event.connect(event)); return 0; } @@ -63,12 +93,59 @@ 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); + + /* kill service. */ + m_runningService = 0; + m_service_event_conn = 0; + return 0; +} + +RESULT eNavigation::recordService(const eServiceReference &service) +{ + if (m_recordingService) + endRecording(); + + assert(m_servicehandler); + RESULT res = m_servicehandler->record(service, m_recordingService); + if (m_recordingService) + { + res = m_recordingService->start(); + } + if (res) + m_recordingService = 0; + return res; +} + +RESULT eNavigation::endRecording() +{ + if (!m_recordingService) + return -1; + m_recordingService->stop(); + m_recordingService = 0; + return 0; +} + 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(); @@ -78,7 +155,12 @@ RESULT eNavigation::pause(int dop) eNavigation::eNavigation(iServiceHandler *serviceHandler) { + assert(serviceHandler); m_servicehandler = serviceHandler; + m_playlist = new ePlaylist; + + /* start with no current selection */ + m_playlist->m_current = m_playlist->end(); } eNavigation::~eNavigation()