X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/d63d2c3c6cbbd574dda4f8b00ebe6c661735edd5..d85ab0bcd4dd553144faa3454c319ae3c54f2f9d:/lib/service/servicemp3.cpp diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index fb5993e4..549a288a 100644 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -8,13 +9,15 @@ // eServiceFactoryMP3 -eServiceFactoryMP3::eServiceFactoryMP3(): ref(0) +eServiceFactoryMP3::eServiceFactoryMP3() { ePtr sc; eServiceCenter::getInstance(sc); if (sc) sc->addServiceFactory(eServiceFactoryMP3::id, this); + + m_service_info = new eStaticServiceMP3Info(); } eServiceFactoryMP3::~eServiceFactoryMP3() @@ -31,15 +34,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; } @@ -55,35 +51,107 @@ RESULT eServiceFactoryMP3::list(const eServiceReference &, ePtr &ptr) +{ + ptr = m_service_info; + return 0; +} + +// eStaticServiceMP3Info + + +// eStaticServiceMP3Info is seperated from eServiceMP3 to give information +// about unopened files. + +// probably eServiceMP3 should use this class as well, and eStaticServiceMP3Info +// should have a database backend where ID3-files etc. are cached. +// this would allow listing the mp3 database based on certain filters. + +DEFINE_REF(eStaticServiceMP3Info) + +eStaticServiceMP3Info::eStaticServiceMP3Info() +{ +} + +RESULT eStaticServiceMP3Info::getName(const eServiceReference &ref, std::string &name) +{ + name = "MP3 file: " + ref.path; + return 0; +} + +int eStaticServiceMP3Info::getLength(const eServiceReference &ref) +{ + return -1; +} + // eServiceMP3 -eServiceMP3::eServiceMP3(const char *filename): filename(filename), ref(0) +void eServiceMP3::test_end() { - printf("MP3: %s start\n", filename); + eDebug("end of mp3!"); + stop(); +} + +eServiceMP3::eServiceMP3(const char *filename): filename(filename), test(eApp) +{ + m_state = stIdle; + eDebug("SERVICEMP3 construct!"); } eServiceMP3::~eServiceMP3() { - printf("MP3: %s stop\n", filename.c_str()); + eDebug("SERVICEMP3 destruct!"); + if (m_state == stRunning) + stop(); } - -void eServiceMP3::AddRef() + +DEFINE_REF(eServiceMP3); + +RESULT eServiceMP3::connectEvent(const Slot2 &event, ePtr &connection) +{ + connection = new eConnection((iPlayableService*)this, 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(1000, 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; } +RESULT eServiceMP3::pause(ePtr &ptr) { ptr=this; return 0; } +RESULT eServiceMP3::seek(ePtr &ptr) { ptr = 0; return -1; } // iPausableService RESULT eServiceMP3::pause() { printf("mp3 pauses!\n"); return 0; } RESULT eServiceMP3::unpause() { printf("mp3 unpauses!\n"); return 0; } +RESULT eServiceMP3::info(ePtr&i) { i = this; return 0; } + +RESULT eServiceMP3::getName(std::string &name) +{ + name = "MP3 File: " + filename; + return 0; +} -eAutoInitP0 init_eServiceFactoryMP3(eAutoInitNumbers::service+1, "eServiceFactoryMP3"); +eAutoInitPtr init_eServiceFactoryMP3(eAutoInitNumbers::service+1, "eServiceFactoryMP3");