#include <list>
#include <utility>
+#include <lib/base/object.h>
class eAutoInit;
}
};
+template<class T1> class
+eAutoInitPtr: protected eAutoInit
+{
+ ePtr<T1> t;
+ void initNow()
+ {
+ t = new T1();
+ }
+ void closeNow()
+ {
+ t = 0;
+ }
+public:
+ operator T1*()
+ {
+ return t;
+ }
+ T1 *operator->()
+ {
+ return t;
+ }
+ eAutoInitPtr(int runl, char *description): eAutoInit(runl, description)
+ {
+ eInit::add(rl, this);
+ }
+ ~eAutoInitPtr()
+ {
+ eInit::remove(rl, this);
+ }
+};
+
#endif
RESULT eDVBChannel::connectStateChange(const Slot1<void,iDVBChannel*> &stateChange, ePtr<eConnection> &connection)
{
- connection = new eConnection(m_stateChanged.connect(stateChange));
+ connection = new eConnection(this, m_stateChanged.connect(stateChange));
return 0;
}
RESULT eDVBFrontend::connectStateChange(const Slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection)
{
- connection = new eConnection(m_stateChanged.connect(stateChange));
+ connection = new eConnection(this, m_stateChanged.connect(stateChange));
return 0;
}
RESULT eDVBScan::connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &connection)
{
- connection = new eConnection(m_event.connect(event));
+ connection = new eConnection(this, m_event.connect(event));
return 0;
}
#include <lib/dvb_si/bat.h>
#include <lib/dvb/db.h>
-class eDVBScan: public Object
+class eDVBScan: public Object, public virtual iObject
{
/* chid helper functions: */
DEFINE_REF(eDVBSatelliteEquipmentControl);
+eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl(): ref(0)
+{
+}
+
RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, struct dvb_frontend_parameters &parm, eDVBFrontendParametersSatellite &sat)
{
int hi;
{
public:
DECLARE_REF;
+ eDVBSatelliteEquipmentControl();
RESULT prepare(iDVBFrontend &frontend, struct dvb_frontend_parameters &parm, eDVBFrontendParametersSatellite &sat);
};
switch (event)
{
case iPlayableService::evEnd:
- /* our running main service stopped. */
+ /* 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())
RESULT eNavigation::playService(const eServiceReference &service)
{
+ assert(m_servicehandler);
RESULT res = m_servicehandler->play(service, m_runningService);
if (m_runningService)
{
RESULT eNavigation::connectEvent(const Slot2<void,eNavigation*,int> &event, ePtr<eConnection> &connection)
{
- connection = new eConnection(m_event.connect(event));
+ connection = new eConnection(this, m_event.connect(event));
return 0;
}
return p->unpause();
}
-eNavigation::eNavigation(iServiceHandler *serviceHandler)
+eNavigation::eNavigation(iServiceHandler *serviceHandler): ref(0)
{
+ assert(serviceHandler);
m_servicehandler = serviceHandler;
}
public:
enum
{
- evNewService,
+ evStopService, /** the "current" service was just stopped and likes to be deallocated (clear refs!) */
+ evNewService, /** a new "current" service was just started */
evPlayFailed,
evPlaylistDone
};
eServiceCenter *eServiceCenter::instance;
-eServiceCenter::eServiceCenter()
+eServiceCenter::eServiceCenter(): ref(0)
{
if (!instance)
+ {
+ eDebug("settings instance.");
instance = this;
+ }
}
eServiceCenter::~eServiceCenter()
{
if (instance == this)
+ {
+ eDebug("clear instance");
instance = 0;
+ }
}
DEFINE_REF(eServiceCenter);
return 0;
}
-eAutoInitP0<eServiceCenter> init_eServiceCenter(eAutoInitNumbers::service, "eServiceCenter");
+eAutoInitPtr<eServiceCenter> init_eServiceCenter(eAutoInitNumbers::service, "eServiceCenter");
DEFINE_REF(eDVBServicePlay)
-eAutoInitP0<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");
+eAutoInitPtr<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");
return 0;
}
-eAutoInitP0<eServiceFactoryFS> init_eServiceFactoryFS(eAutoInitNumbers::service+1, "eServiceFactoryFS");
+eAutoInitPtr<eServiceFactoryFS> init_eServiceFactoryFS(eAutoInitNumbers::service+1, "eServiceFactoryFS");
eServiceMP3::eServiceMP3(const char *filename): ref(0), filename(filename), test(eApp)
{
m_state = stIdle;
+ eDebug("SERVICEMP3 construct!");
}
eServiceMP3::~eServiceMP3()
{
+ eDebug("SERVICEMP3 destruct!");
if (m_state == stRunning)
stop();
}
RESULT eServiceMP3::connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)
{
- connection = new eConnection(m_event.connect(event));
+ connection = new eConnection(this, m_event.connect(event));
return 0;
}
printf("mp3 starts\n");
printf("MP3: %s start\n", filename.c_str());
- test.start(10000, 1);
+ test.start(1000, 1);
CONNECT(test.timeout, eServiceMP3::test_end);
m_event(this, evStart);
return 0;
RESULT eServiceMP3::pause() { printf("mp3 pauses!\n"); return 0; }
RESULT eServiceMP3::unpause() { printf("mp3 unpauses!\n"); return 0; }
-RESULT eServiceMP3::getIServiceInformation(ePtr<iServiceInformation>&) { return -1; }
+RESULT eServiceMP3::getIServiceInformation(ePtr<iServiceInformation>&i) { i = this; return 0; }
+RESULT eServiceMP3::getName(eString &name)
+{
+ name = "MP3 File: " + filename;
+ return 0;
+}
-eAutoInitP0<eServiceFactoryMP3> init_eServiceFactoryMP3(eAutoInitNumbers::service+1, "eServiceFactoryMP3");
+eAutoInitPtr<eServiceFactoryMP3> init_eServiceFactoryMP3(eAutoInitNumbers::service+1, "eServiceFactoryMP3");
RESULT list(const eServiceReference &, ePtr<iListableService> &ptr);
};
-class eServiceMP3: public virtual iPlayableService, public virtual iPauseableService, public virtual iObject, public Object
+class eServiceMP3: public virtual iPlayableService, public virtual iPauseableService, public virtual iServiceInformation, public virtual iObject, public Object
{
DECLARE_REF;
private:
RESULT unpause();
RESULT getIServiceInformation(ePtr<iServiceInformation>&);
+
+ // iServiceInformation
+ RESULT getName(eString &name);
};
#endif
ePtr<iPlayableService> m_playservice;
ePtr<eNavigation> m_nav;
ePtr<eConnection> m_conn_event;
+ ePtr<iServiceInformation> m_serviceInformation;
public:
eMain()
{
ePtr<eServiceCenter> service_center;
eServiceCenter::getInstance(service_center);
+ assert(service_center);
m_nav = new eNavigation(service_center);
-#if 1
+#if 0
if (service_center)
{
eServiceReference ref("2:0:1:0:0:0:0:0:0:0:/");
{
switch (ev)
{
+ case eNavigation::evStopService:
+ /* very important: the old service should be deallocated, so clear *all* references to it */
+ m_serviceInformation = 0;
+ eDebug("STOP service!");
+ break;
case eNavigation::evNewService:
{
ePtr<iPlayableService> service;
eDebug("no running service!");
break;
}
- ePtr<iServiceInformation> s;
- if (service->getIServiceInformation(s))
+ if (service->getIServiceInformation(m_serviceInformation))
{
eDebug("failed to get iserviceinformation");
break;
}
eString name;
- s->getName(name);
+ m_serviceInformation->getName(name);
eDebug("NEW running service: %s", name.c_str());
break;
}
break;
case eNavigation::evPlaylistDone:
eDebug("playlist done");
+ quit();
break;
default:
eDebug("Navigation event %d", ev);
~eMain()
{
-
}
};
#endif
int main()
-{
+{
#ifdef OBJECT_DEBUG
atexit(object_dump);
#endif
eMain app;
- return app.exec();
+ int res = app.exec();
+ eDebug("after exec");
}