fix segfault
[enigma2.git] / lib / service / servicedvb.cpp
index 8f58cdee0b79f06f3c14485484e453559a02b553..bae45aaea2fb12404b8848443ad6755c9719c0b3 100644 (file)
@@ -630,7 +630,7 @@ RESULT eServiceFactoryDVB::lookupService(ePtr<eDVBService> &service, const eServ
 }
 
 eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *service): 
-       m_reference(ref), m_dvb_service(service), m_is_paused(0)
+       m_reference(ref), m_dvb_service(service), m_have_video_pid(0), m_is_paused(0)
 {
        m_is_primary = 1;
        m_is_pvr = !m_reference.path.empty();
@@ -751,7 +751,7 @@ RESULT eDVBServicePlay::start()
        m_first_program_info = 1;
        eServiceReferenceDVB &service = (eServiceReferenceDVB&)m_reference;
        r = m_service_handler.tune(service, m_is_pvr, m_cue);
-       
+
                /* inject EIT if there is a stored one */
        if (m_is_pvr)
        {
@@ -1028,7 +1028,8 @@ RESULT eDVBServicePlay::subServices(ePtr<iSubserviceList> &ptr)
 RESULT eDVBServicePlay::timeshift(ePtr<iTimeshiftService> &ptr)
 {
        ptr = 0;
-       if (m_timeshift_enabled || !m_is_pvr)
+       if (m_have_video_pid &&  // HACK !!! FIXMEE !! temporary no timeshift on radio services !!
+               (m_timeshift_enabled || !m_is_pvr))
        {
                if (!m_timeshift_enabled)
                {
@@ -1290,7 +1291,7 @@ int eDVBServicePlay::getCurrentChannel()
 
 RESULT eDVBServicePlay::selectChannel(int i)
 {
-       if (i < LEFT || i > RIGHT)
+       if (i < LEFT || i > RIGHT || i == STEREO)
                i = -1;  // Stereo
        if (m_dvb_service)
                m_dvb_service->setCacheEntry(eDVBService::cACHANNEL, i);
@@ -1689,30 +1690,31 @@ void eDVBServicePlay::updateDecoder()
                        ac3_delay = m_dvb_service->getCacheEntry(eDVBService::cAC3DELAY);
                        pcm_delay = m_dvb_service->getCacheEntry(eDVBService::cPCMDELAY);
                }
-/*
-               else if (m_reference.path.length()) // workaround for recordings
+               else // subservice or recording
                {
-                       eDebug("playback %s", m_reference.toString().c_str());
-                       
-                       ePtr<eDVBResourceManager> res_mgr;
-                       if (!eDVBResourceManager::getInstance(res_mgr))
+                       eServiceReferenceDVB ref;
+                       m_service_handler.getServiceReference(ref);
+                       eServiceReferenceDVB parent = ref.getParentServiceReference();
+                       if (!parent)
+                               parent = ref;
+                       if (parent)
                        {
-                               ePtr<iDVBChannelList> db;
-                               if (!res_mgr->getChannelList(db))
+                               ePtr<eDVBResourceManager> res_mgr;
+                               if (!eDVBResourceManager::getInstance(res_mgr))
                                {
-                                       ePtr<eDVBService> origService;
-                                       eServiceReference tmp = m_reference;
-                                       tmp.path="";
-                                       if (!db->getService((eServiceReferenceDVB&)tmp, origService))
+                                       ePtr<iDVBChannelList> db;
+                                       if (!res_mgr->getChannelList(db))
                                        {
-                                               ac3_delay = origService->getCacheEntry(eDVBService::cAC3DELAY);
-                                               pcm_delay = origService->getCacheEntry(eDVBService::cPCMDELAY);
+                                               ePtr<eDVBService> origService;
+                                               if (!db->getService(parent, origService))
+                                               {
+                                                       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);
 
@@ -1734,6 +1736,15 @@ void eDVBServicePlay::updateDecoder()
 
                m_decoder->start();
 
+               if (vpid > 0 && vpid < 0x2000)
+                       ;
+               else
+               {
+                       std::string radio_pic;
+                       if (!ePythonConfigQuery::getConfigValue("config.misc.radiopic", radio_pic))
+                               m_decoder->setRadioPic(radio_pic);
+               }
+
                m_decoder->setAudioChannel(achannel);
 
 // how we can do this better?
@@ -1759,6 +1770,7 @@ void eDVBServicePlay::updateDecoder()
                        m_dvb_service->setCacheEntry(eDVBService::cTPID, tpid);
                }
        }
+       m_have_video_pid = (vpid > 0 && vpid < 0x2000);
 }
 
 void eDVBServicePlay::loadCuesheet()
@@ -2004,7 +2016,7 @@ int eDVBServicePlay::getPCMDelay()
 void eDVBServicePlay::setAC3Delay(int delay)
 {
        if (m_dvb_service)
-               m_dvb_service->setCacheEntry(eDVBService::cAC3DELAY, delay);
+               m_dvb_service->setCacheEntry(eDVBService::cAC3DELAY, delay ? delay : -1);
        if (m_decoder)
                m_decoder->setAC3Delay(delay);
 }
@@ -2012,7 +2024,7 @@ void eDVBServicePlay::setAC3Delay(int delay)
 void eDVBServicePlay::setPCMDelay(int delay)
 {
        if (m_dvb_service)
-               m_dvb_service->setCacheEntry(eDVBService::cPCMDELAY, delay);
+               m_dvb_service->setCacheEntry(eDVBService::cPCMDELAY, delay ? delay : -1);
        if (m_decoder)
                m_decoder->setPCMDelay(delay);
 }