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 */
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);
43 case iPlayableService::evUpdatedEventInfo:
44 m_event(this, evUpdatedEventInfo);
46 case iPlayableService::evUpdatedInfo:
47 m_event(this, evUpdatedInfo);
54 RESULT eNavigation::playService(const eServiceReference &service)
58 assert(m_servicehandler);
59 RESULT res = m_servicehandler->play(service, m_runningService);
62 m_runningService->connectEvent(slot(*this, &eNavigation::serviceEvent), m_service_event_conn);
63 res = m_runningService->start();
68 RESULT eNavigation::enqueueService(const eServiceReference &service)
71 /* check if we need to play after the service was enqueued. */
72 int doplay = m_playlist->m_current == m_playlist->end();
74 /* add the service to the playlist. the playlist's m_current */
75 /* points either to a service before the last or 'doplay' is set. */
76 m_playlist->push_back(service);
80 m_playlist->m_current = m_playlist->end();
81 --m_playlist->m_current;
82 return playService(*m_playlist->m_current);
87 RESULT eNavigation::connectEvent(const Slot2<void,eNavigation*,int> &event, ePtr<eConnection> &connection)
89 connection = new eConnection(this, m_event.connect(event));
93 RESULT eNavigation::getCurrentService(ePtr<iPlayableService> &service)
95 service = m_runningService;
99 RESULT eNavigation::getPlaylist(ePtr<ePlaylist> &playlist)
103 playlist = m_playlist;
107 RESULT eNavigation::stopService(void)
109 /* check if there is a running service... */
110 if (!m_runningService)
112 /* send stop event */
113 m_event(this, evStopService);
116 m_runningService = 0;
117 m_service_event_conn = 0;
121 RESULT eNavigation::recordService(const eServiceReference &ref, ePtr<iRecordableService> &service)
123 assert(m_servicehandler);
124 RESULT res = m_servicehandler->record(ref, service);
125 eDebug("record: %d", res);
131 RESULT eNavigation::pause(int dop)
133 if (!m_runningService)
135 ePtr<iPauseableService> p;
136 if (m_runningService->pause(p))
144 eNavigation::eNavigation(iServiceHandler *serviceHandler)
146 assert(serviceHandler);
147 m_servicehandler = serviceHandler;
148 m_playlist = new ePlaylist;
150 /* start with no current selection */
151 m_playlist->m_current = m_playlist->end();
154 eNavigation::~eNavigation()
158 DEFINE_REF(eNavigation);