1 #include <lib/nav/core.h>
3 void eNavigation::serviceEvent(iPlayableService* service, int event)
5 if (service != m_runningService)
7 eDebug("nav: event for other service");
13 case iPlayableService::evEnd:
14 assert(m_playlist); /* we need to have a playlist */
16 /* at first, kill the running service */
17 m_event(this, evStopService);
19 m_service_event_conn = 0;
20 /* our running main service stopped. identify what to do next. */
22 /* unless the playlist current position is invalid (because there was */
23 /* playlist, for example when the service was engaged with playService */
24 if (m_playlist->m_current != m_playlist->end())
25 ++m_playlist->m_current;
27 /* was the current service the last one? */
28 if (m_playlist->m_current == m_playlist->end())
30 m_event(this, evPlaylistDone);
34 /* there is another service in the playlist. play it. */
36 res = playService(*m_playlist->m_current);
38 m_event(this, evPlayFailed);
40 case iPlayableService::evStart:
41 m_event(this, evNewService);
48 RESULT eNavigation::playService(const eServiceReference &service)
50 assert(m_servicehandler);
51 RESULT res = m_servicehandler->play(service, m_runningService);
54 m_runningService->connectEvent(slot(*this, &eNavigation::serviceEvent), m_service_event_conn);
55 res = m_runningService->start();
60 RESULT eNavigation::enqueueService(const eServiceReference &service)
63 /* check if we need to play after the service was enqueued. */
64 int doplay = m_playlist->m_current == m_playlist->end();
66 /* add the service to the playlist. the playlist's m_current */
67 /* points either to a service before the last or 'doplay' is set. */
68 m_playlist->push_back(service);
72 m_playlist->m_current = m_playlist->end();
73 --m_playlist->m_current;
74 return playService(*m_playlist->m_current);
79 RESULT eNavigation::connectEvent(const Slot2<void,eNavigation*,int> &event, ePtr<eConnection> &connection)
81 connection = new eConnection(this, m_event.connect(event));
85 RESULT eNavigation::getCurrentService(ePtr<iPlayableService> &service)
87 service = m_runningService;
91 RESULT eNavigation::getPlaylist(ePtr<ePlaylist> &playlist)
95 playlist = m_playlist;
99 RESULT eNavigation::pause(int dop)
101 if (!m_runningService)
103 ePtr<iPauseableService> p;
104 if (m_runningService->getIPausableService(p))
112 eNavigation::eNavigation(iServiceHandler *serviceHandler)
114 assert(serviceHandler);
115 m_servicehandler = serviceHandler;
116 m_playlist = new ePlaylist;
118 /* start with no current selection */
119 m_playlist->m_current = m_playlist->end();
122 eNavigation::~eNavigation()
126 DEFINE_REF(eNavigation);