X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fservice%2Fservicedvbfcc.cpp;h=b2b53f9d1218f9af912e9c3c51c5980d4a14eb3b;hp=610ccc45a43572ad64479c0caee6d3291683c4e8;hb=eb510064c67c19fec47fd04ea03017c17569e3c5;hpb=27e06ba9c8b055c20ea8c70a405deb0e4019edc5 diff --git a/lib/service/servicedvbfcc.cpp b/lib/service/servicedvbfcc.cpp index 610ccc4..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); } } @@ -137,6 +167,9 @@ void eDVBServiceFCCPlay::changeFCCMode() eDebug("[eDVBServiceFCCPlay::changeFCCMode][%s] disable FCC decoding.", m_reference.toString().c_str()); m_fcc_mode = fcc_mode_preparing; + /* stop timeshift */ + eDVBServicePlay::stopTimeshift(); + /* remove CaHandler */ m_service_handler.removeCaHandler(); @@ -233,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); } @@ -410,15 +443,23 @@ void eDVBServiceFCCPlay::FCCDecoderStop() { eDebug("[eDVBServiceFCCPlay::FCCDecoderStop][%s]", m_reference.toString().c_str()); - if ((m_fcc_flag & fcc_ready) && m_decoder) + if (m_decoder) { m_teletext_parser = 0; m_new_subtitle_page_connection = 0; m_subtitle_parser = 0; m_new_dvb_subtitle_page_connection = 0; - m_decoder->fccDecoderStop(); - m_fcc_flag &=~fcc_decoding; + if (m_fcc_flag & fcc_ready) + { + m_decoder->fccDecoderStop(); + m_fcc_flag &=~fcc_decoding; + } + else if (m_fcc_flag & fcc_novideo) + { + m_video_event_connection = 0; + m_decoder = 0; + } } } @@ -436,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)