X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fdvb%2Ffcc.cpp;h=8b1021a83aeccf178b2830ec917f6ed57721bfb2;hp=e83dbc8831ea4500e77ed8a66d456b204afa7166;hb=eb510064c67c19fec47fd04ea03017c17569e3c5;hpb=4911a0121954f6b6657ba28fab8d9dd9031d9a59 diff --git a/lib/dvb/fcc.cpp b/lib/dvb/fcc.cpp index e83dbc8..8b1021a 100644 --- a/lib/dvb/fcc.cpp +++ b/lib/dvb/fcc.cpp @@ -81,7 +81,7 @@ RESULT eFCCServiceManager::playFCCService(const eServiceReference &ref, ePtr conn; service->connectEvent(slot(*this, &eFCCServiceManager::FCCEvent), conn); - FCCServiceElem elem = {ref, conn, fcc_state_preparing}; + FCCServiceElem elem = {ref, conn, fcc_state_preparing, false}; m_FCCServices[service] = elem; res = service->start(); @@ -116,7 +116,7 @@ void eFCCServiceManager::FCCEvent(iPlayableService* service, int event) case iPlayableService::evTuneFailed: case iPlayableService::evFccFailed: { - eDebug("[eFCCServiceManager][%s] set service to state failed.", it->second.m_service_reference.toString().c_str()); + eDebug("[eFCCServiceManager::FCCEvent][%s] set service to state failed.", it->second.m_service_reference.toString().c_str()); it->second.m_state = fcc_state_failed; break; } @@ -189,6 +189,9 @@ RESULT eFCCServiceManager::stopFCCService() RESULT eFCCServiceManager::tryFCCService(const eServiceReference &sref, ePtr &service) { + if (!isEnable()) + return -1; + ePtr new_service = 0; printFCCServices(); @@ -211,17 +214,27 @@ RESULT eFCCServiceManager::tryFCCService(const eServiceReference &sref, ePtrm_service_event_conn = 0; m_core->m_runningService = 0; - /* connect to fcc event */ - ePtr conn; - it->first->connectEvent(slot(*this, &eFCCServiceManager::FCCEvent), conn); - it->second.m_service_event_conn = conn; - it->second.m_state = fcc_state_preparing; + if (it->second.m_useNormalDecode) + { + /* stop service */ + it->first->stop(); + m_FCCServices.erase(it++); + } + else + { + /* connect to fcc event */ + ePtr conn; + it->first->connectEvent(slot(*this, &eFCCServiceManager::FCCEvent), conn); + it->second.m_service_event_conn = conn; + it->second.m_state = fcc_state_preparing; - /* switch to FCC prepare state */ - it->first->start(); + /* switch to FCC prepare state */ + it->first->start(); - /* update FCCServiceChannels */ - m_fccServiceChannels.addFCCService(it->second.m_service_reference); + /* update FCCServiceChannels */ + m_fccServiceChannels.addFCCService(it->second.m_service_reference); + } + break; } } @@ -255,7 +268,7 @@ RESULT eFCCServiceManager::tryFCCService(const eServiceReference &sref, ePtrstart(); // do FCC preparing } @@ -307,7 +320,7 @@ void eFCCServiceManager::printFCCServices() std::map< ePtr, FCCServiceElem >::iterator it = m_FCCServices.begin(); for (;it != m_FCCServices.end();++it) { - eDebug(" [eFCCServiceManager::printFCCServices][*] sref : %s, state : %d, tune : %d", it->second.m_service_reference.toString().c_str(), it->second.m_state, isLocked(it->first)); + eDebug(" [eFCCServiceManager::printFCCServices][*] sref : %s, state : %d, tune : %d, useNormalDecode : %d", it->second.m_service_reference.toString().c_str(), it->second.m_state, isLocked(it->first), it->second.m_useNormalDecode); } #else ; @@ -331,5 +344,34 @@ bool eFCCServiceManager::checkAvailable(const eServiceReference &ref) return false; } +bool eFCCServiceManager::isStateDecoding(iPlayableService* service) +{ + std::map, FCCServiceElem >::iterator it = m_FCCServices.find(service); + if (it != m_FCCServices.end()) + { + return (it->second.m_state == fcc_state_decoding); + } + else + { + eDebug("[eFCCServiceManager] non registered FCC service"); + } + + return false; +} + +void eFCCServiceManager::setNormalDecoding(iPlayableService* service) +{ + std::map, FCCServiceElem >::iterator it = m_FCCServices.find(service); + if (it != m_FCCServices.end()) + { + eDebug("[eFCCServiceManager::setNormalDecoding][%s] set to use normal decoding.", it->second.m_service_reference.toString().c_str()); + it->second.m_useNormalDecode = true; + } + else + { + eDebug("[eFCCServiceManager] non registered FCC service"); + } +} + DEFINE_REF(eFCCServiceManager);