diff options
| author | Felix Domke <tmbinc@elitedvb.net> | 2004-05-27 11:43:17 +0000 |
|---|---|---|
| committer | Felix Domke <tmbinc@elitedvb.net> | 2004-05-27 11:43:17 +0000 |
| commit | 4c54cecb6020cde399b564f17dacb048b937018a (patch) | |
| tree | cf81f3b93e5e749acdc23a9ba529632d180e4567 /lib/nav/core.cpp | |
| parent | 6bfb37ae9c010c866900239281d345efcdd611bd (diff) | |
| download | enigma2-4c54cecb6020cde399b564f17dacb048b937018a.tar.gz enigma2-4c54cecb6020cde399b564f17dacb048b937018a.zip | |
add playlists
Diffstat (limited to 'lib/nav/core.cpp')
| -rw-r--r-- | lib/nav/core.cpp | 56 |
1 files changed, 44 insertions, 12 deletions
diff --git a/lib/nav/core.cpp b/lib/nav/core.cpp index 9314d2c1..c9dcb502 100644 --- a/lib/nav/core.cpp +++ b/lib/nav/core.cpp @@ -11,21 +11,31 @@ void eNavigation::serviceEvent(iPlayableService* service, int event) switch (event) { case iPlayableService::evEnd: + assert(m_playlist); /* we need to have a playlist */ + /* 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()) + /* 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); @@ -49,10 +59,20 @@ 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; } @@ -68,6 +88,14 @@ RESULT eNavigation::getCurrentService(ePtr<iPlayableService> &service) return 0; } +RESULT eNavigation::getPlaylist(ePtr<ePlaylist> &playlist) +{ + if (!m_playlist) + return -1; + playlist = m_playlist; + return 0; +} + RESULT eNavigation::pause(int dop) { if (!m_runningService) @@ -85,6 +113,10 @@ eNavigation::eNavigation(iServiceHandler *serviceHandler): ref(0) { assert(serviceHandler); m_servicehandler = serviceHandler; + m_playlist = new ePlaylist; + + /* start with no current selection */ + m_playlist->m_current = m_playlist->end(); } eNavigation::~eNavigation() |
