X-Git-Url: http://code.vuplus.com/gitweb/?a=blobdiff_plain;f=lib%2Fservice%2Fservicedvbfcc.cpp;h=b2b53f9d1218f9af912e9c3c51c5980d4a14eb3b;hb=a9984df92fc78bd4955b24502724b74b935dcc3f;hp=972e73ed72b5097135bab0def6de9aa3f113f97c;hpb=87ba1afb9532930f2d1df558b191f88b81c192ee;p=vuplus_dvbapp diff --git a/lib/service/servicedvbfcc.cpp b/lib/service/servicedvbfcc.cpp index 972e73e..b2b53f9 100644 --- a/lib/service/servicedvbfcc.cpp +++ b/lib/service/servicedvbfcc.cpp @@ -5,7 +5,7 @@ eDVBServiceFCCPlay::eDVBServiceFCCPlay(const eServiceReference &ref, eDVBService *service) :eDVBServicePlay(ref, service, false), m_fcc_flag(0), m_fcc_mode(fcc_mode_preparing), m_fcc_mustplay(false), - m_pmtVersion(-1) + m_pmtVersion(-1), m_normal_decoding(false) { CONNECT(m_service_handler.serviceEvent, eDVBServiceFCCPlay::serviceEvent); } @@ -43,19 +43,50 @@ void eDVBServiceFCCPlay::serviceEvent(int event) pushbackFCCEvents(evTuneFailed); break; } + case eDVBServicePMTHandler::eventChannelAllocated: + { + bool is_usb_tuner = checkUsbTuner(); + bool fcc_state_decoding = getFCCStateDecoding(); + int slotId = getFrontendInfo(iDVBFrontend_ENUMS::frontendNumber); + + if (is_usb_tuner) + { + if (fcc_state_decoding) + { + m_normal_decoding = true; + setNormalDecoding(); + } + else + { + eDVBServicePlay::serviceEvent(eDVBServicePMTHandler::eventTuneFailed); + pushbackFCCEvents(evTuneFailed); + } + } + break; + } case eDVBServicePMTHandler::eventNewProgramInfo: { - eDebug("eventNewProgramInfo %d %d", m_timeshift_enabled, m_timeshift_active); - if (m_timeshift_enabled) + if (m_fcc_flag & fcc_tune_failed) + return; + + eDebug("eventNewProgramInfo %d %d %d", m_timeshift_enabled, m_timeshift_active, m_normal_decoding); + if (m_normal_decoding) + { + eDVBServicePlay::serviceEvent(event); + } + else + { + if (m_timeshift_enabled) updateTimeshiftPids(); - if (!m_timeshift_active) - processNewProgramInfo(); + if (!m_timeshift_active) + processNewProgramInfo(); - if (!m_timeshift_active) - { - m_event((iPlayableService*)this, evUpdatedInfo); - pushbackFCCEvents(evUpdatedInfo); + if (!m_timeshift_active) + { + m_event((iPlayableService*)this, evUpdatedInfo); + pushbackFCCEvents(evUpdatedInfo); + } } break; } @@ -125,7 +156,6 @@ void eDVBServiceFCCPlay::popFCCEvents() for (std::list::iterator it = m_fcc_events.begin(); it != m_fcc_events.end(); ++it) { int event = *it; -// eDebug("[eDVBServiceFCCPlay::popFCCEvents][%s] send event : %s", m_reference.toString().c_str(), eventDesc[event]); m_event((iPlayableService*)this, event); } } @@ -236,7 +266,7 @@ void eDVBServiceFCCPlay::updateFCCDecoder(bool sendSeekableStateChanged) h.getDecodeDemux(m_decode_demux); if (m_decode_demux) { - m_decode_demux->getMPEGDecoder(m_decoder, m_is_primary); + m_decode_demux->getMPEGDecoder(m_decoder, m_decoder_index); if (m_decoder) m_decoder->connectVideoEvent(slot(*this, &eDVBServiceFCCPlay::video_event), m_video_event_connection); } @@ -447,11 +477,27 @@ void eDVBServiceFCCPlay::switchToLive() /* free the timeshift service handler, we need the resources */ m_service_handler_timeshift.free(); - //updateDecoder(true); m_fcc_flag &=~fcc_ready; m_fcc_flag &=~fcc_decoding; processNewProgramInfo(true); } +bool eDVBServiceFCCPlay::checkUsbTuner() +{ + return (bool)getFrontendInfo(iDVBFrontend_ENUMS::isUsbTuner); +} + +bool eDVBServiceFCCPlay::getFCCStateDecoding() +{ + eFCCServiceManager *fcc_service_mgr = eFCCServiceManager::getInstance(); + return fcc_service_mgr->isStateDecoding((iPlayableService*)this); +} + +void eDVBServiceFCCPlay::setNormalDecoding() +{ + eFCCServiceManager *fcc_service_mgr = eFCCServiceManager::getInstance(); + return fcc_service_mgr->setNormalDecoding((iPlayableService*)this); +} + DEFINE_REF(eDVBServiceFCCPlay)