@@ -2027,18 +2027,22 @@ int eDVBServicePlay::getInfo(int w)
20272027 case sVideoHeight :
20282028 if (m_soft_decoder && m_csa_session && m_csa_session->isActive ()) return m_soft_decoder->getVideoHeight ();
20292029 if (m_decoder) return m_decoder->getVideoHeight ();
2030+ else if (m_soft_decoder) return m_soft_decoder->getVideoHeight ();
20302031 break ;
20312032 case sVideoWidth :
20322033 if (m_soft_decoder && m_csa_session && m_csa_session->isActive ()) return m_soft_decoder->getVideoWidth ();
20332034 if (m_decoder) return m_decoder->getVideoWidth ();
2035+ else if (m_soft_decoder) return m_soft_decoder->getVideoWidth ();
20342036 break ;
20352037 case sFrameRate :
20362038 if (m_soft_decoder && m_csa_session && m_csa_session->isActive ()) return m_soft_decoder->getVideoFrameRate ();
20372039 if (m_decoder) return m_decoder->getVideoFrameRate ();
2040+ else if (m_soft_decoder) return m_soft_decoder->getVideoFrameRate ();
20382041 break ;
20392042 case sProgressive :
20402043 if (m_soft_decoder && m_csa_session && m_csa_session->isActive ()) return m_soft_decoder->getVideoProgressive ();
20412044 if (m_decoder) return m_decoder->getVideoProgressive ();
2045+ else if (m_soft_decoder) return m_soft_decoder->getVideoProgressive ();
20422046 break ;
20432047 case sAspect :
20442048 {
@@ -2047,6 +2051,8 @@ int eDVBServicePlay::getInfo(int w)
20472051 aspect = m_soft_decoder->getVideoAspect ();
20482052 else if (m_decoder)
20492053 aspect = m_decoder->getVideoAspect ();
2054+ else if (m_soft_decoder)
2055+ aspect = m_soft_decoder->getVideoAspect ();
20502056 if (aspect == -1 && no_program_info)
20512057 break ;
20522058 else if (aspect == -1 && !program.videoStreams .empty () && program.videoStreams [0 ].component_tag != -1 )
@@ -2093,6 +2099,7 @@ int eDVBServicePlay::getInfo(int w)
20932099 case sGamma :
20942100 if (m_soft_decoder && m_csa_session && m_csa_session->isActive ()) return m_soft_decoder->getVideoGamma ();
20952101 if (m_decoder) return m_decoder->getVideoGamma ();
2102+ else if (m_soft_decoder) return m_soft_decoder->getVideoGamma ();
20962103 break ;
20972104 case sIsCrypted :
20982105 if (no_program_info) return false ;
@@ -2302,8 +2309,15 @@ RESULT eDVBServicePlay::selectTrack(unsigned int i)
23022309
23032310 int ret = selectAudioStream (i);
23042311
2305- if (m_decoder->set ())
2306- return -5 ;
2312+ if (m_decoder)
2313+ {
2314+ if (m_decoder->set ())
2315+ return -5 ;
2316+ }
2317+ else if (m_soft_decoder)
2318+ {
2319+ // SoftDecoder handles set() internally in selectAudioTrack
2320+ }
23072321
23082322 return ret;
23092323}
@@ -2374,7 +2388,7 @@ int eDVBServicePlay::selectAudioStream(int i)
23742388 if ((i != -1 ) && ((unsigned int )i >= program.audioStreams .size ()))
23752389 return -2 ;
23762390
2377- if (!m_decoder)
2391+ if (!m_decoder && !m_soft_decoder )
23782392 return -3 ;
23792393
23802394 int stream = i;
@@ -2397,10 +2411,24 @@ int eDVBServicePlay::selectAudioStream(int i)
23972411
23982412 m_current_audio_pid = apid;
23992413
2400- if (( m_is_primary || !m_noaudio) && m_decoder-> setAudioPID (apid, apidtype) )
2414+ if (m_is_primary || !m_noaudio)
24012415 {
2402- eDebug (" [eDVBServicePlay] set audio pid %04x failed" , apid);
2403- return -4 ;
2416+ if (m_decoder)
2417+ {
2418+ if (m_decoder->setAudioPID (apid, apidtype))
2419+ {
2420+ eDebug (" [eDVBServicePlay] set audio pid %04x failed" , apid);
2421+ return -4 ;
2422+ }
2423+ }
2424+ else if (m_soft_decoder)
2425+ {
2426+ if (m_soft_decoder->setAudioPID (apid, apidtype))
2427+ {
2428+ eDebug (" [eDVBServicePlay] SoftDecoder set audio pid %04x failed" , apid);
2429+ return -4 ;
2430+ }
2431+ }
24042432 }
24052433
24062434 if (position != -1 )
@@ -2465,9 +2493,11 @@ int eDVBServicePlay::selectAudioStream(int i)
24652493
24662494int eDVBServicePlay::getCurrentChannel ()
24672495{
2468- if (m_soft_decoder && m_csa_session && m_csa_session->isActive ())
2496+ if (m_decoder)
2497+ return m_decoder->getAudioChannel ();
2498+ else if (m_soft_decoder)
24692499 return m_soft_decoder->getAudioChannel ();
2470- return m_decoder ? m_decoder-> getAudioChannel () : STEREO;
2500+ return STEREO;
24712501}
24722502
24732503RESULT eDVBServicePlay::selectChannel (int i)
@@ -2476,10 +2506,10 @@ RESULT eDVBServicePlay::selectChannel(int i)
24762506 i = -1 ; // Stereo
24772507 if (m_dvb_service)
24782508 m_dvb_service->setCacheEntry (eDVBService::cACHANNEL, i);
2479- if (m_soft_decoder && m_csa_session && m_csa_session->isActive ())
2480- m_soft_decoder->setAudioChannel (i);
24812509 if (m_decoder)
24822510 m_decoder->setAudioChannel (i);
2511+ else if (m_soft_decoder)
2512+ m_soft_decoder->setAudioChannel (i);
24832513 return 0 ;
24842514}
24852515
@@ -3756,8 +3786,11 @@ void eDVBServicePlay::newSubtitlePage(const eDVBTeletextSubtitlePage &page)
37563786 if (m_subtitle_widget)
37573787 {
37583788 int subtitledelay = 0 ;
3759- pts_t pts;
3760- m_decoder->getPTS (0 , pts);
3789+ pts_t pts = 0 ;
3790+ if (m_decoder)
3791+ m_decoder->getPTS (0 , pts);
3792+ else if (m_soft_decoder)
3793+ m_soft_decoder->getPTS (0 , pts);
37613794 if (m_is_pvr || m_timeshift_enabled)
37623795 {
37633796 eDebug (" [eDVBServicePlay] Subtitle in recording/timeshift" );
@@ -3794,9 +3827,9 @@ void eDVBServicePlay::checkSubtitleTiming()
37943827 return ;
37953828 }
37963829 if (m_decoder)
3797- {
37983830 m_decoder->getPTS (0 , pos);
3799- }
3831+ else if (m_soft_decoder)
3832+ m_soft_decoder->getPTS (0 , pos);
38003833
38013834 while (1 )
38023835 {
@@ -3852,6 +3885,8 @@ void eDVBServicePlay::newDVBSubtitlePage(const eDVBSubtitlePage &p)
38523885 pts_t pos = 0 ;
38533886 if (m_decoder)
38543887 m_decoder->getPTS (0 , pos);
3888+ else if (m_soft_decoder)
3889+ m_soft_decoder->getPTS (0 , pos);
38553890
38563891 // Where subtitles are delivered out of sync with video, only treat subtitles in the past as having bad timing.
38573892 // Those that are delivered too early are cached for displaying at the appropriate later time
@@ -3892,8 +3927,9 @@ int eDVBServicePlay::getAC3Delay()
38923927 return m_soft_decoder->getAC3Delay ();
38933928 else if (m_decoder)
38943929 return m_decoder->getAC3Delay ();
3895- else
3896- return 0 ;
3930+ else if (m_soft_decoder)
3931+ return m_soft_decoder->getAC3Delay ();
3932+ return 0 ;
38973933}
38983934
38993935int eDVBServicePlay::getPCMDelay ()
@@ -3904,40 +3940,31 @@ int eDVBServicePlay::getPCMDelay()
39043940 return m_soft_decoder->getPCMDelay ();
39053941 else if (m_decoder)
39063942 return m_decoder->getPCMDelay ();
3907- else
3908- return 0 ;
3943+ else if (m_soft_decoder)
3944+ return m_soft_decoder->getPCMDelay ();
3945+ return 0 ;
39093946}
39103947
39113948void eDVBServicePlay::setAC3Delay (int delay)
39123949{
39133950 int generalAC3delay = eConfigManager::getConfigIntValue (" config.av.generalAC3delay" );
39143951 if (m_dvb_service)
39153952 m_dvb_service->setCacheEntry (eDVBService::cAC3DELAY, delay ? delay : -1 );
3916- if (m_soft_decoder && m_csa_session && m_csa_session->isActive ())
3917- {
3918- m_soft_decoder->setAC3Delay (delay + generalAC3delay);
3919- eDebug (" [eDVBServicePlay] Setting audio delay: setAC3Delay (SoftDecoder), %d + %d" , delay, generalAC3delay);
3920- }
39213953 if (m_decoder)
3922- {
39233954 m_decoder->setAC3Delay (delay + generalAC3delay);
3924- }
3955+ else if (m_soft_decoder)
3956+ m_soft_decoder->setAC3Delay (delay + generalAC3delay);
39253957}
39263958
39273959void eDVBServicePlay::setPCMDelay (int delay)
39283960{
39293961 int generalPCMdelay = eConfigManager::getConfigIntValue (" config.av.generalPCMdelay" );
39303962 if (m_dvb_service)
39313963 m_dvb_service->setCacheEntry (eDVBService::cPCMDELAY, delay ? delay : -1 );
3932- if (m_soft_decoder && m_csa_session && m_csa_session->isActive ())
3933- {
3934- m_soft_decoder->setPCMDelay (delay + generalPCMdelay);
3935- eDebug (" [eDVBServicePlay] Setting audio delay: setPCMDelay (SoftDecoder), %d + %d" , delay, generalPCMdelay);
3936- }
39373964 if (m_decoder)
3938- {
39393965 m_decoder->setPCMDelay (delay + generalPCMdelay);
3940- }
3966+ else if (m_soft_decoder)
3967+ m_soft_decoder->setPCMDelay (delay + generalPCMdelay);
39413968}
39423969
39433970void eDVBServicePlay::video_event (struct iTSMPEGDecoder ::videoEvent event)
0 commit comments