From c0f5089ea04bd04fe25148e712fa62cd49dc17da Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Sun, 23 May 2004 10:39:21 +0000 Subject: [PATCH] added nav core --- configure.ac | 7 ++-- lib/Makefile.am | 3 +- lib/dvb/dvb.cpp | 2 +- lib/nav/Makefile.am | 8 +++++ lib/nav/core.cpp | 88 ++++++++++++++++++++++++++++++++++++++++++++++ lib/nav/core.h | 37 +++++++++++++++++++ lib/service/iservice.h | 16 ++++++++- lib/service/servicedvb.cpp | 31 +++++++++++----- lib/service/servicedvb.h | 8 ++++- lib/service/servicemp3.cpp | 60 ++++++++++++++++++++++--------- lib/service/servicemp3.h | 21 +++++++---- main/Makefile.am | 1 + main/enigma.cpp | 62 +++++++++++++++++++++++++++----- 13 files changed, 298 insertions(+), 46 deletions(-) create mode 100644 lib/nav/Makefile.am create mode 100644 lib/nav/core.cpp create mode 100644 lib/nav/core.h diff --git a/configure.ac b/configure.ac index 54d9789..19dee31 100644 --- a/configure.ac +++ b/configure.ac @@ -9,14 +9,14 @@ AC_PROG_CXX AC_PROG_RANLIB TUXBOX_APPS_DVB -TUXBOX_APPS_DRIVER +#TUXBOX_APPS_DRIVER TUXBOX_APPS_LIB_CONFIG(FREETYPE,freetype-config) -TUXBOX_APPS_LIB_PKGCONFIG(FRIBIDI,fribidi) +#TUXBOX_APPS_LIB_PKGCONFIG(FRIBIDI,fribidi) TUXBOX_APPS_LIB_PKGCONFIG(ID3TAG,id3tag) TUXBOX_APPS_LIB_PKGCONFIG(MAD,mad) TUXBOX_APPS_LIB_PKGCONFIG(MD5SUM,tuxbox-md5sum) -TUXBOX_APPS_LIB_PKGCONFIG(PLUGINS,tuxbox-plugins) +#TUXBOX_APPS_LIB_PKGCONFIG(PLUGINS,tuxbox-plugins) TUXBOX_APPS_LIB_PKGCONFIG(PNG,libpng) TUXBOX_APPS_LIB_PKGCONFIG(SIGC,sigc++-1.2) TUXBOX_APPS_LIB_PKGCONFIG(XMLTREE,tuxbox-xmltree) @@ -35,6 +35,7 @@ lib/dvb/Makefile lib/dvb_si/Makefile lib/gdi/Makefile lib/gui/Makefile +lib/nav/Makefile lib/network/Makefile lib/service/Makefile main/Makefile diff --git a/lib/Makefile.am b/lib/Makefile.am index 7811ca1..c4197e3 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -1,3 +1,4 @@ -SUBDIRS = base dvb dvb_si gdi gui network service driver +SUBDIRS = base dvb dvb_si gdi gui network service driver nav + diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index 176b07c..895ff08 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -180,7 +180,7 @@ RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid) RESULT eDVBChannel::connectStateChange(const Slot1 &stateChange, ePtr &connection) { - connection = new eConnection( m_stateChanged.connect(stateChange) ); + connection = new eConnection(m_stateChanged.connect(stateChange)); return 0; } diff --git a/lib/nav/Makefile.am b/lib/nav/Makefile.am new file mode 100644 index 0000000..a180e0b --- /dev/null +++ b/lib/nav/Makefile.am @@ -0,0 +1,8 @@ +INCLUDES = \ + -I$(top_srcdir)/include + +noinst_LIBRARIES = libenigma_nav.a + +libenigma_nav_a_SOURCES = \ + core.cpp + diff --git a/lib/nav/core.cpp b/lib/nav/core.cpp new file mode 100644 index 0000000..b5c229c --- /dev/null +++ b/lib/nav/core.cpp @@ -0,0 +1,88 @@ +#include + +void eNavigation::serviceEvent(iPlayableService* service, int event) +{ + if (service != m_runningService) + { + eDebug("nav: event for other service"); + return; + } + + switch (event) + { + case iPlayableService::evEnd: + /* our running main service stopped. */ + if (!m_playlist.empty()) + m_playlist.erase(m_playlist.begin()); + if (!m_playlist.empty()) + { + RESULT res; + res = playService(m_playlist.front()); + if (res) + m_event(this, evPlayFailed); + } else + m_event(this, evPlaylistDone); + break; + case iPlayableService::evStart: + m_event(this, evNewService); + break; + default: + break; + } +} + +RESULT eNavigation::playService(const eServiceReference &service) +{ + RESULT res = m_servicehandler->play(service, m_runningService); + if (m_runningService) + { + m_runningService->connectEvent(slot(*this, &eNavigation::serviceEvent), m_service_event_conn); + res = m_runningService->start(); + } + return res; +} + +RESULT eNavigation::enqueueService(const eServiceReference &service) +{ + int doplay = m_playlist.empty(); + m_playlist.push_back(service); + if (doplay) + return playService(m_playlist.front()); + return 0; +} + +RESULT eNavigation::connectEvent(const Slot2 &event, ePtr &connection) +{ + connection = new eConnection(m_event.connect(event)); + return 0; +} + +RESULT eNavigation::getCurrentService(ePtr &service) +{ + service = m_runningService; + return 0; +} + +RESULT eNavigation::pause(int dop) +{ + if (!m_runningService) + return -1; + ePtr p; + if (m_runningService->getIPausableService(p)) + return -2; + if (dop) + return p->pause(); + else + return p->unpause(); +} + +eNavigation::eNavigation(iServiceHandler *serviceHandler) +{ + m_servicehandler = serviceHandler; +} + +eNavigation::~eNavigation() +{ +} + +DEFINE_REF(eNavigation); diff --git a/lib/nav/core.h b/lib/nav/core.h new file mode 100644 index 0000000..056c150 --- /dev/null +++ b/lib/nav/core.h @@ -0,0 +1,37 @@ +#ifndef __nav_core_h +#define __nav_core_h + +#include +#include +#include + +class eNavigation: public iObject, public Object +{ + DECLARE_REF; +private: + ePtr m_runningService; + ePtr m_servicehandler; + Signal2 m_event; + ePtr m_service_event_conn; + void serviceEvent(iPlayableService* service, int event); + + std::list m_playlist; +public: + enum + { + evNewService, + evPlayFailed, + evPlaylistDone + }; + RESULT playService(const eServiceReference &service); + RESULT enqueueService(const eServiceReference &service); + RESULT connectEvent(const Slot2 &event, ePtr &connection); +/* int connectServiceEvent(const Slot1 &event, ePtr &connection); */ + RESULT getCurrentService(ePtr &service); + + RESULT pause(int p); + eNavigation(iServiceHandler *serviceHandler); + virtual ~eNavigation(); +}; + +#endif diff --git a/lib/service/iservice.h b/lib/service/iservice.h index bedb0d6..9eeb07c 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -3,6 +3,7 @@ #include #include +#include #include class eServiceReference @@ -133,6 +134,12 @@ public: } }; +class iServiceInformation: public virtual iObject +{ +public: + virtual RESULT getName(eString &name)=0; +}; + class iPauseableService: public virtual iObject { public: @@ -144,9 +151,16 @@ class iPlayableService: public virtual iObject { friend class iServiceHandler; public: - // it's PRIVATE to the class factory + enum + { + evStart, + evEnd + }; + virtual RESULT connectEvent(const Slot2 &event, ePtr &connection)=0; virtual RESULT start()=0; + virtual RESULT stop()=0; virtual RESULT getIPausableService(ePtr &ptr)=0; + virtual RESULT getIServiceInformation(ePtr &ptr)=0; }; class iRecordableService: public virtual iObject diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index fc48fa6..62dbee5 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -28,15 +28,8 @@ eServiceFactoryDVB::~eServiceFactoryDVB() RESULT eServiceFactoryDVB::play(const eServiceReference &ref, ePtr &ptr) { - RESULT res; // check resources... ptr = new eDVBServicePlay(ref); - res = ptr->start(); - if (res) - { - ptr = 0; - return res; - } return 0; } @@ -138,10 +131,20 @@ void eDVBServicePlay::serviceEvent(int event) RESULT eDVBServicePlay::start() { eDebug("starting DVB service"); - m_serviceHandler.tune((eServiceReferenceDVB&)m_reference); + return m_serviceHandler.tune((eServiceReferenceDVB&)m_reference); +} + +RESULT eDVBServicePlay::stop() +{ + eDebug("stopping.."); return 0; } +RESULT eDVBServicePlay::connectEvent(const Slot2 &event, ePtr &connection) +{ + return -1; +} + RESULT eDVBServicePlay::getIPausableService(ePtr &ptr) { // not yet possible, maybe later... @@ -149,6 +152,18 @@ RESULT eDVBServicePlay::getIPausableService(ePtr &ptr) return -1; } +RESULT eDVBServicePlay::getIServiceInformation(ePtr &ptr) +{ + ptr = this; + return 0; +} + +RESULT eDVBServicePlay::getName(eString &name) +{ + name = "DVB service"; + return 0; +} + DEFINE_REF(eDVBServicePlay) eAutoInitP0 init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB"); diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h index fac9edf..1de4586 100644 --- a/lib/service/servicedvb.h +++ b/lib/service/servicedvb.h @@ -20,7 +20,7 @@ public: RESULT list(const eServiceReference &, ePtr &ptr); }; -class eDVBServicePlay: public virtual iPlayableService, public virtual iObject, public Object +class eDVBServicePlay: public virtual iPlayableService, public virtual iObject, public Object, public virtual iServiceInformation { DECLARE_REF; private: @@ -38,8 +38,14 @@ public: virtual ~eDVBServicePlay(); // iPlayableService + RESULT connectEvent(const Slot2 &event, ePtr &connection); RESULT start(); + RESULT stop(); RESULT getIPausableService(ePtr &ptr); + RESULT getIServiceInformation(ePtr &ptr); + + // iServiceInformation + RESULT getName(eString &name); }; #endif diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index fb5993e..27ae114 100644 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -31,15 +32,8 @@ DEFINE_REF(eServiceFactoryMP3) // iServiceHandler RESULT eServiceFactoryMP3::play(const eServiceReference &ref, ePtr &ptr) { - RESULT res; // check resources... ptr = new eServiceMP3(ref.path.c_str()); - res = ptr->start(); - if (res) - { - ptr = 0; - return res; - } return 0; } @@ -57,33 +51,65 @@ RESULT eServiceFactoryMP3::list(const eServiceReference &, ePtr &event, ePtr &connection) +{ + connection = new eConnection(m_event.connect(event)); + return 0; +} + +RESULT eServiceMP3::start() { - ++ref; + assert(m_state == stIdle); + + m_state = stRunning; + + printf("mp3 starts\n"); + printf("MP3: %s start\n", filename.c_str()); + test.start(10000, 1); + CONNECT(test.timeout, eServiceMP3::test_end); + m_event(this, evStart); + return 0; } -void eServiceMP3::Release() +RESULT eServiceMP3::stop() { - if (!--ref) - delete this; + assert(m_state != stIdle); + if (m_state == stStopped) + return -1; + test.stop(); + printf("MP3: %s stop\n", filename.c_str()); + m_state = stStopped; + m_event(this, evEnd); + return 0; } -RESULT eServiceMP3::start() { printf("mp3 starts\n"); return 0; } RESULT eServiceMP3::getIPausableService(ePtr &ptr) { ptr=this; return 0; } // iPausableService RESULT eServiceMP3::pause() { printf("mp3 pauses!\n"); return 0; } RESULT eServiceMP3::unpause() { printf("mp3 unpauses!\n"); return 0; } +RESULT eServiceMP3::getIServiceInformation(ePtr&) { return -1; } + eAutoInitP0 init_eServiceFactoryMP3(eAutoInitNumbers::service+1, "eServiceFactoryMP3"); diff --git a/lib/service/servicemp3.h b/lib/service/servicemp3.h index 0f2c074..b443d6e 100644 --- a/lib/service/servicemp3.h +++ b/lib/service/servicemp3.h @@ -17,26 +17,35 @@ public: RESULT list(const eServiceReference &, ePtr &ptr); }; -class eServiceMP3: public virtual iPlayableService, public virtual iPauseableService, public virtual iObject +class eServiceMP3: public virtual iPlayableService, public virtual iPauseableService, public virtual iObject, public Object { +DECLARE_REF; +private: friend class eServiceFactoryMP3; std::string filename; eServiceMP3(const char *filename); - int ref; + eTimer test; + void test_end(); + Signal2 m_event; + enum + { + stIdle, stRunning, stStopped, + }; + int m_state; public: virtual ~eServiceMP3(); - // iObject - void AddRef(); - void Release(); - // iPlayableService + RESULT connectEvent(const Slot2 &event, ePtr &connection); RESULT start(); + RESULT stop(); RESULT getIPausableService(ePtr &ptr); // iPausableService RESULT pause(); RESULT unpause(); + + RESULT getIServiceInformation(ePtr&); }; #endif diff --git a/main/Makefile.am b/main/Makefile.am index 2f63dff..1e663e7 100644 --- a/main/Makefile.am +++ b/main/Makefile.am @@ -13,6 +13,7 @@ enigma2_LDADD_WHOLE = \ $(top_builddir)/lib/dvb_si/libenigma_dvb_si.a \ $(top_builddir)/lib/gui/libenigma_gui.a \ $(top_builddir)/lib/gdi/libenigma_gdi.a \ + $(top_builddir)/lib/nav/libenigma_nav.a \ $(top_builddir)/lib/network/libenigma_network.a \ $(top_builddir)/lib/service/libenigma_service.a diff --git a/main/enigma.cpp b/main/enigma.cpp index 7543e45..4cc8eaf 100644 --- a/main/enigma.cpp +++ b/main/enigma.cpp @@ -14,6 +14,7 @@ #include #include +#include class eMain: public eApplication, public Object { @@ -24,6 +25,8 @@ class eMain: public eApplication, public Object ePtr m_dvbdb; ePtr m_playservice; + ePtr m_nav; + ePtr m_conn_event; public: eMain() { @@ -35,6 +38,8 @@ public: ePtr service_center; eServiceCenter::getInstance(service_center); + m_nav = new eNavigation(service_center); +#if 1 if (service_center) { eServiceReference ref("2:0:1:0:0:0:0:0:0:0:/"); @@ -52,17 +57,58 @@ public: eDebug("%s", i->toString().c_str()); } } +#endif + m_nav->connectEvent(slot(*this, &eMain::event), m_conn_event); - eServiceReference ref("1:0:1:6de2:44d:1:c00000:0:0:0:"); +// eServiceReference ref("1:0:1:6de2:44d:1:c00000:0:0:0:"); + eServiceReference ref("4097:47:0:0:0:0:0:0:0:0:/sine_60s_100.mp3"); + eServiceReference ref1("4097:47:0:0:0:0:0:0:0:0:/sine_60s_100.mp31"); + eServiceReference ref2("4097:47:0:0:0:0:0:0:0:0:/sine_60s_100.mp32"); - if (service_center) + if (m_nav->enqueueService(ref)) + eDebug("play sucked around!"); + else + eDebug("play r00lz!"); + + m_nav->enqueueService(ref1); + m_nav->enqueueService(ref2); + m_nav->enqueueService(ref1); + } + + void event(eNavigation *nav, int ev) + { + switch (ev) { - if (service_center->play(ref, m_playservice)) - eDebug("play sucked around!"); - else - eDebug("play r00lz!"); - } else - eDebug("no service center: no play."); + case eNavigation::evNewService: + { + ePtr service; + nav->getCurrentService(service); + if (!service) + { + eDebug("no running service!"); + break; + } + ePtr s; + if (service->getIServiceInformation(s)) + { + eDebug("failed to get iserviceinformation"); + break; + } + eString name; + s->getName(name); + eDebug("NEW running service: %s", name.c_str()); + break; + } + case eNavigation::evPlayFailed: + eDebug("play failed!"); + break; + case eNavigation::evPlaylistDone: + eDebug("playlist done"); + break; + default: + eDebug("Navigation event %d", ev); + break; + } } ~eMain() -- 2.7.4