#include <byteswap.h>
#include <netinet/in.h>
-#include <dvbsi++/event_information_section.h>
-
#define INTERNAL_TELETEXT
#ifndef BYTE_ORDER
eStaticServiceDVBPVRInformation(const eServiceReference &ref);
RESULT getName(const eServiceReference &ref, std::string &name);
int getLength(const eServiceReference &ref);
-
+ RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &SWIG_OUTPUT, time_t start_time);
+
int getInfo(const eServiceReference &ref, int w);
std::string getInfoString(const eServiceReference &ref,int w);
};
}
}
+RESULT eStaticServiceDVBPVRInformation::getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &evt, time_t start_time)
+{
+ if (!ref.path.empty())
+ {
+ ePtr<eServiceEvent> event = new eServiceEvent;
+ std::string filename = ref.path;
+ filename.erase(filename.length()-2, 2);
+ filename+="eit";
+ if (!event->parseFrom(filename, (m_parser.m_ref.getTransportStreamID().get()<<16)|m_parser.m_ref.getOriginalNetworkID().get()))
+ {
+ evt = event;
+ return 0;
+ }
+ }
+ evt = 0;
+ return -1;
+}
+
class eDVBPVRServiceOfflineOperations: public iServiceOfflineOperations
{
DECLARE_REF(eDVBPVRServiceOfflineOperations);
eServiceCenter::getPrivInstance(sc);
if (sc)
sc->addServiceFactory(eServiceFactoryDVB::id, this);
+
+ m_StaticServiceDVBInfo = new eStaticServiceDVBInformation;
+ m_StaticServiceDVBBouquetInfo = new eStaticServiceDVBBouquetInformation;
}
eServiceFactoryDVB::~eServiceFactoryDVB()
return -1;
}
-RESULT eDVBServiceList::addService(eServiceReference &ref)
+RESULT eDVBServiceList::addService(eServiceReference &ref, eServiceReference before)
{
if (!m_bouquet)
return -1;
- return m_bouquet->addService(ref);
+ return m_bouquet->addService(ref, before);
}
RESULT eDVBServiceList::removeService(eServiceReference &ref)
if ((ref.flags & eServiceReference::flagDirectory) == eServiceReference::flagDirectory) // bouquet
{
if ( !ref.name.empty() ) // satellites or providers list
- ptr = new eStaticServiceDVBInformation;
+ ptr = m_StaticServiceDVBInfo;
else // a dvb bouquet
- ptr = new eStaticServiceDVBBouquetInformation;
+ ptr = m_StaticServiceDVBBouquetInfo;
}
else if (!ref.path.empty()) /* do we have a PVR service? */
ptr = new eStaticServiceDVBPVRInformation(ref);
{
ePtr<eDVBService> service;
if (lookupService(service, ref)) // no eDVBService avail for this reference ( Linkage Services... )
- ptr = new eStaticServiceDVBInformation;
+ ptr = m_StaticServiceDVBInfo;
else
/* eDVBService has the iStaticServiceInformation interface, so we pass it here. */
ptr = service;
eServiceReferenceDVB &service = (eServiceReferenceDVB&)m_reference;
r = m_service_handler.tune(service, m_is_pvr, m_cue);
- // get back correct service reference (after parsing of recording meta files)
- m_service_handler.getServiceReference(service);
-
/* inject EIT if there is a stored one */
if (m_is_pvr)
{
std::string filename = service.path;
filename.erase(filename.length()-2, 2);
filename+="eit";
- int fd = ::open( filename.c_str(), O_RDONLY );
- if ( fd > -1 )
+ ePtr<eServiceEvent> event = new eServiceEvent;
+ if (!event->parseFrom(filename, (service.getTransportStreamID().get()<<16)|service.getOriginalNetworkID().get()))
{
- __u8 buf[4096];
- int rd = ::read(fd, buf, 4096);
- ::close(fd);
- if ( rd > 12 /*EIT_LOOP_SIZE*/ )
- {
- Event ev(buf);
- ePtr<eServiceEvent> event = new eServiceEvent;
- ePtr<eServiceEvent> empty;
- event->parseFrom(&ev, (service.getTransportStreamID().get()<<16)|service.getOriginalNetworkID().get());
- m_event_handler.inject(event, 0);
- m_event_handler.inject(empty, 1);
- eDebug("injected");
- }
+ ePtr<eServiceEvent> empty;
+ m_event_handler.inject(event, 0);
+ m_event_handler.inject(empty, 1);
}
}
-
+
if (m_is_pvr)
loadCuesheet();
RESULT eDVBServicePlay::stop()
{
+ /* add bookmark for last play position */
+ if (m_is_pvr)
+ {
+ pts_t play_position;
+ if (!getPlayPosition(play_position))
+ {
+ /* remove last position */
+ for (std::multiset<struct cueEntry>::iterator i(m_cue_entries.begin()); i != m_cue_entries.end();)
+ {
+ if (i->what == 3) /* current play position */
+ {
+ m_cue_entries.erase(i);
+ i = m_cue_entries.begin();
+ continue;
+ } else
+ ++i;
+ }
+
+ m_cue_entries.insert(cueEntry(play_position, 3)); /* last play position */
+ m_cuesheet_changed = 1;
+ }
+ }
+
stopTimeshift(); /* in case timeshift was enabled, remove buffer etc. */
m_service_handler_timeshift.free();
return 0;
}
+RESULT eDVBServicePlay::radioText(ePtr<iRadioText> &ptr)
+{
+ ptr = this;
+ return 0;
+}
+
RESULT eDVBServicePlay::getName(std::string &name)
{
if (m_is_pvr)
case sIsCrypted: return program.isCrypted();
case sVideoPID: if (program.videoStreams.empty()) return -1; return program.videoStreams[0].pid;
case sVideoType: if (program.videoStreams.empty()) return -1; return program.videoStreams[0].type;
- case sAudioPID: if (program.audioStreams.empty()) return -1; return program.audioStreams[m_current_audio_stream].pid;
+ case sAudioPID: if (program.audioStreams.empty()) return -1; return program.audioStreams[0].pid;
case sPCRPID: return program.pcrPid;
case sPMTPID: return program.pmtPid;
case sTXTPID: return program.textPid;
if (m_decoder->setAudioPID(program.audioStreams[i].pid, program.audioStreams[i].type))
return -4;
+ if (m_radiotext_parser)
+ m_radiotext_parser->start(program.audioStreams[i].pid);
+
if (m_dvb_service && !m_is_pvr)
{
if (program.audioStreams[i].type == eDVBAudio::aMPEG)
{
m_dvb_service->setCacheEntry(eDVBService::cAPID, program.audioStreams[i].pid);
m_dvb_service->setCacheEntry(eDVBService::cAC3PID, -1);
- } else
+ }
+ else
{
m_dvb_service->setCacheEntry(eDVBService::cAPID, -1);
m_dvb_service->setCacheEntry(eDVBService::cAC3PID, program.audioStreams[i].pid);
}
}
- m_current_audio_stream = i;
-
return 0;
}
return 0;
}
+std::string eDVBServicePlay::getRadioText(int x)
+{
+ if (m_radiotext_parser)
+ switch(x)
+ {
+ case 0:
+ return m_radiotext_parser->getCurrentText();
+ }
+ return "";
+}
+
+void eDVBServicePlay::radioTextUpdated()
+{
+ m_event((iPlayableService*)this, evUpdatedRadioText);
+}
+
int eDVBServiceBase::getFrontendInfo(int w)
{
eUsePtr<iDVBChannel> channel;
m_decoder = 0;
m_decode_demux = 0;
m_teletext_parser = 0;
+ m_radiotext_parser = 0;
m_new_subtitle_page_connection = 0;
+ m_radiotext_updated_connection = 0;
/* free the timeshift service handler, we need the resources */
m_service_handler_timeshift.free();
m_decode_demux = 0;
m_decoder = 0;
m_teletext_parser = 0;
+ m_radiotext_parser = 0;
m_new_subtitle_page_connection = 0;
-
+ m_radiotext_updated_connection = 0;
+
m_timeshift_active = 1;
m_event((iPlayableService*)this, evSeekableStatusChanged);
}
else // subservice or recording
{
- eServiceReferenceDVB parent = ((eServiceReferenceDVB&)m_reference).getParentServiceReference();
- if (!parent && !m_reference.path.empty()) // is recording
- {
- parent = (eServiceReferenceDVB&)m_reference;
- parent.path="";
- }
+ eServiceReferenceDVB ref;
+ m_service_handler.getServiceReference(ref);
+ eServiceReferenceDVB parent = ref.getParentServiceReference();
+ if (!parent)
+ parent = ref;
if (parent)
{
ePtr<eDVBResourceManager> res_mgr;
ePtr<eDVBService> origService;
if (!db->getService(parent, origService))
{
- ac3_delay = origService->getCacheEntry(eDVBService::cAC3DELAY);
+ ac3_delay = origService->getCacheEntry(eDVBService::cAC3DELAY);
pcm_delay = origService->getCacheEntry(eDVBService::cPCMDELAY);
}
}
}
}
}
-
m_decoder->setAC3Delay(ac3_delay == -1 ? 0 : ac3_delay);
m_decoder->setPCMDelay(pcm_delay == -1 ? 0 : pcm_delay);
m_decoder->setVideoPID(vpid, vpidtype);
- m_current_audio_stream = 0;
m_decoder->setAudioPID(apid, apidtype);
if (!(m_is_pvr || m_timeshift_active || !m_is_primary))
+ {
m_decoder->setSyncPCR(pcrpid);
+ if (apid != -1)
+ {
+ ePtr<iDVBDemux> data_demux;
+ if (!h.getDataDemux(data_demux))
+ {
+ m_radiotext_parser = new eDVBRadioTextParser(data_demux);
+ m_radiotext_parser->connectUpdatedRadiotext(slot(*this, &eDVBServicePlay::radioTextUpdated), m_radiotext_updated_connection);
+ m_radiotext_parser->start(apid);
+ }
+ }
+ }
else
m_decoder->setSyncPCR(-1);
#endif
what = ntohl(what);
- if (what > 2)
+ if (what > 3)
break;
m_cue_entries.insert(cueEntry(where, what));
if (!m_cutlist_enabled)
{
m_cue->commitSpans();
- eDebug("cutlists where disabled");
+ eDebug("cutlists were disabled");
return;
}
continue;
} else if (i->what == 1) /* out */
out = i++->where;
- else /* mark */
+ else /* mark (2) or last play position (3) */
{
i++;
continue;