1 #include <lib/nav/core.h>
2 #include <lib/base/eerror.h>
4 void eNavigation::serviceEvent(iPlayableService* service, int event)
6 if (service != m_runningService)
8 eDebug("nav: event for other service");
14 case iPlayableService::evEnd:
15 assert(m_playlist); /* we need to have a playlist */
17 /* at first, kill the running service */
18 m_event(this, evStopService);
20 m_service_event_conn = 0;
21 /* our running main service stopped. identify what to do next. */
23 /* unless the playlist current position is invalid (because there was */
24 /* playlist, for example when the service was engaged with playService */
25 if (m_playlist->m_current != m_playlist->end())
26 ++m_playlist->m_current;
28 /* was the current service the last one? */
29 if (m_playlist->m_current == m_playlist->end())
31 m_event(this, evPlaylistDone);
35 /* there is another service in the playlist. play it. */
37 res = playService(*m_playlist->m_current);
39 m_event(this, evPlayFailed);
41 case iPlayableService::evStart:
42 m_event(this, evNewService);
49 RESULT eNavigation::playService(const eServiceReference &service)
51 assert(m_servicehandler);
52 RESULT res = m_servicehandler->play(service, m_runningService);
55 m_runningService->connectEvent(slot(*this, &eNavigation::serviceEvent), m_service_event_conn);
56 res = m_runningService->start();
61 RESULT eNavigation::enqueueService(const eServiceReference &service)
64 /* check if we need to play after the service was enqueued. */
65 int doplay = m_playlist->m_current == m_playlist->end();
67 /* add the service to the playlist. the playlist's m_current */
68 /* points either to a service before the last or 'doplay' is set. */
69 m_playlist->push_back(service);
73 m_playlist->m_current = m_playlist->end();
74 --m_playlist->m_current;
75 return playService(*m_playlist->m_current);
80 RESULT eNavigation::connectEvent(const Slot2<void,eNavigation*,int> &event, ePtr<eConnection> &connection)
82 connection = new eConnection(this, m_event.connect(event));
86 RESULT eNavigation::getCurrentService(ePtr<iPlayableService> &service)
88 service = m_runningService;
92 RESULT eNavigation::getPlaylist(ePtr<ePlaylist> &playlist)
96 playlist = m_playlist;
100 RESULT eNavigation::pause(int dop)
102 if (!m_runningService)
104 ePtr<iPauseableService> p;
105 if (m_runningService->pause(p))
113 eNavigation::eNavigation(iServiceHandler *serviceHandler)
115 assert(serviceHandler);
116 m_servicehandler = serviceHandler;
117 m_playlist = new ePlaylist;
119 /* start with no current selection */
120 m_playlist->m_current = m_playlist->end();
123 eNavigation::~eNavigation()
127 DEFINE_REF(eNavigation);