dont try to get frontend informations when the eDVBServicePlay is a pvr service
[enigma2.git] / lib / service / servicedvb.cpp
index b1c18a1d719360311ad8b1ac591e2f68d62c6426..271b94f075e4a38922f812d430d15369b6eea590 100644 (file)
@@ -25,7 +25,7 @@ DEFINE_REF(eStaticServiceDVBInformation);
 
 RESULT eStaticServiceDVBInformation::getName(const eServiceReference &ref, std::string &name)
 {
-       if ( ref.name.length() )
+       if ( !ref.name.empty() )
        {
                name = ref.name;
                return 0;
@@ -312,6 +312,13 @@ RESULT eDVBServiceList::moveService(eServiceReference &ref, int pos)
        return m_bouquet->moveService(ref, pos);
 }
 
+RESULT eDVBServiceList::flushChanges()
+{
+       if (!m_bouquet)
+               return -1;
+       return m_bouquet->flushChanges();
+}
+
 RESULT eServiceFactoryDVB::play(const eServiceReference &ref, ePtr<iPlayableService> &ptr)
 {
        ePtr<eDVBService> service;
@@ -351,22 +358,25 @@ RESULT eServiceFactoryDVB::list(const eServiceReference &ref, ePtr<iListableServ
 
 RESULT eServiceFactoryDVB::info(const eServiceReference &ref, ePtr<iStaticServiceInformation> &ptr)
 {
-               /* do we have a PVR service? */
-       if (ref.flags & eServiceReference::flagDirectory) // bouquet
+       /* is a listable service? */
+       if ((ref.flags & eServiceReference::flagDirectory) == eServiceReference::flagDirectory) // bouquet
        {
-               ptr = new eStaticServiceDVBBouquetInformation;
+               if ( !ref.name.empty() )  // satellites or providers list
+                       ptr = new eStaticServiceDVBInformation;
+               else // a dvb bouquet
+                       ptr = new eStaticServiceDVBBouquetInformation;
                return 0;
        }
-       else if (!ref.path.empty())
+       else if (!ref.path.empty()) /* do we have a PVR service? */
        {
                ptr = new eStaticServiceDVBPVRInformation(ref);
                return 0;
        }
-       else
+       else // normal dvb service
        {
                ePtr<eDVBService> service;
                int r = lookupService(service, ref);
-               if (r)
+               if (r) // no eDVBService avail for this reference ( Linkage Services... )
                        ptr = new eStaticServiceDVBInformation;
                else
                        /* eDVBService has the iStaticServiceInformation interface, so we pass it here. */
@@ -471,7 +481,7 @@ void eDVBServicePlay::serviceEvent(int event)
        }
        case eDVBServicePMTHandler::eventNewProgramInfo:
        {
-               int vpid = -1, apid = -1, pcrpid = -1;
+               int vpid = -1, apid = -1, apidtype = -1, pcrpid = -1;
                eDVBServicePMTHandler::program program;
                if (m_service_handler.getProgramInfo(program))
                        eDebug("getting program info failed.");
@@ -502,7 +512,10 @@ void eDVBServicePlay::serviceEvent(int event)
                                        i != program.audioStreams.end(); ++i)
                                {
                                        if (apid == -1)
+                                       {
                                                apid = i->pid;
+                                               apidtype = i->type;
+                                       }
                                        if (i != program.audioStreams.begin())
                                                eDebugNoNewLine(", ");
                                        eDebugNoNewLine("%04x", i->pid);
@@ -525,7 +538,8 @@ void eDVBServicePlay::serviceEvent(int event)
                if (m_decoder)
                {
                        m_decoder->setVideoPID(vpid);
-                       m_decoder->setAudioPID(apid, 0);
+                       m_current_audio_stream = 0;
+                       m_decoder->setAudioPID(apid, apidtype);
                        if (!m_is_pvr)
                                m_decoder->setSyncPCR(pcrpid);
                        else
@@ -642,7 +656,14 @@ RESULT eDVBServicePlay::seekRelative(int direction, pts_t to)
        if (m_service_handler.getPVRChannel(pvr_channel))
                return -1;
        
-       return pvr_channel->seekToPosition(SEEK_CUR, to);
+       to *= direction;
+       
+       ePtr<iDVBDemux> demux;
+       m_service_handler.getDemux(demux);
+       if (!demux)
+               return -1;
+       
+       return pvr_channel->seekTo(demux, 1, to);
 }
 
 RESULT eDVBServicePlay::getPlayPosition(pts_t &pos)
@@ -652,7 +673,18 @@ RESULT eDVBServicePlay::getPlayPosition(pts_t &pos)
        if (m_service_handler.getPVRChannel(pvr_channel))
                return -1;
        
-       return pvr_channel->getCurrentPosition(pos);
+       ePtr<iDVBDemux> demux;
+       m_service_handler.getDemux(demux);
+       if (!demux)
+               return -1;
+       
+       return pvr_channel->getCurrentPosition(demux, pos);
+}
+
+RESULT eDVBServicePlay::frontendStatusInfo(ePtr<iFrontendStatusInformation> &ptr)
+{
+       ptr = this;
+       return 0;
 }
 
 RESULT eDVBServicePlay::info(ePtr<iServiceInformation> &ptr)
@@ -661,6 +693,12 @@ RESULT eDVBServicePlay::info(ePtr<iServiceInformation> &ptr)
        return 0;
 }
 
+RESULT eDVBServicePlay::audioTracks(ePtr<iAudioTrackSelection> &ptr)
+{
+       ptr = this;
+       return 0;
+}
+
 RESULT eDVBServicePlay::getName(std::string &name)
 {
        if (m_dvb_service)
@@ -678,6 +716,120 @@ RESULT eDVBServicePlay::getEvent(ePtr<eServiceEvent> &evt, int nownext)
        return m_event_handler.getEvent(evt, nownext);
 }
 
+int eDVBServicePlay::getInfo(int w)
+{
+       eDVBServicePMTHandler::program program;
+
+       if (m_service_handler.getProgramInfo(program))
+               return -1;
+       
+       switch (w)
+       {
+       case sVideoPID: if (program.videoStreams.empty()) return -1; return program.videoStreams[0].pid;
+       case sAudioPID: if (program.audioStreams.empty()) return -1; return program.audioStreams[m_current_audio_stream].pid;
+       case sPCRPID: return program.pcrPid;
+       case sPMTPID: return program.pmtPid;
+       case sTXTPID: return -1;
+               
+       case sSID: return ((const eServiceReferenceDVB&)m_reference).getServiceID().get();
+       case sONID: return ((const eServiceReferenceDVB&)m_reference).getOriginalNetworkID().get();
+       case sTSID: return ((const eServiceReferenceDVB&)m_reference).getTransportStreamID().get();
+       case sNamespace: return ((const eServiceReferenceDVB&)m_reference).getDVBNamespace().get();
+       case sProvider: if (!m_dvb_service) return -1; return -2;
+       default:
+               return -1;
+       }
+}
+
+std::string eDVBServicePlay::getInfoString(int w)
+{      
+       switch (w)
+       {
+       case sProvider:
+               if (!m_dvb_service) return "";
+               return m_dvb_service->m_provider_name;
+       default:
+               return "";
+       }
+}
+
+int eDVBServicePlay::getNumberOfTracks()
+{
+       eDVBServicePMTHandler::program program;
+       if (m_service_handler.getProgramInfo(program))
+               return 0;
+       return program.audioStreams.size();
+}
+
+RESULT eDVBServicePlay::selectTrack(unsigned int i)
+{
+       int ret = selectAudioStream(i);
+
+       if (m_decoder->start())
+               return -5;
+
+       return ret;
+}
+
+RESULT eDVBServicePlay::getTrackInfo(struct iAudioTrackInfo &info, unsigned int i)
+{
+       eDVBServicePMTHandler::program program;
+
+       if (m_service_handler.getProgramInfo(program))
+               return -1;
+       
+       if (i >= program.audioStreams.size())
+               return -2;
+       
+       if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atMPEG)
+               info.m_description = "MPEG";
+       else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atAC3)
+               info.m_description = "AC3";
+       else  if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atDTS)
+               info.m_description = "DTS";
+       else
+               info.m_description = "???";
+       
+               /* CHECK here for component tag override. */
+       info.m_language = program.audioStreams[i].language_code;
+       
+       return 0;
+}
+
+int eDVBServicePlay::selectAudioStream(int i)
+{
+       eDVBServicePMTHandler::program program;
+
+       if (m_service_handler.getProgramInfo(program))
+               return -1;
+       
+       if (i >= program.audioStreams.size())
+               return -2;
+       
+       if (!m_decoder)
+               return -3;
+       
+       if (m_decoder->setAudioPID(program.audioStreams[i].pid, program.audioStreams[i].type))
+               return -4;
+
+       m_current_audio_stream = i;
+
+       return 0;
+}
+
+int eDVBServicePlay::getFrontendInfo(int w)
+{
+       if (m_is_pvr)
+               return 0;
+       eUsePtr<iDVBChannel> channel;
+       if(m_service_handler.getChannel(channel))
+               return 0;
+       ePtr<iDVBFrontend> fe;
+       if(channel->getFrontend(fe))
+               return 0;
+       return fe->readFrontendData(w);
+}
+
 DEFINE_REF(eDVBServicePlay)
 
 eAutoInitPtr<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");