// Free Software Foundation, Inc.,
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+/** \file
+ \brief DVBSocketControlle-r non-inline non-template implementation */
+#include "DVBSocketController.hh"
+
+// Custom includes
+#include <sstream>
#include "senf/Utils/Exception.hh"
#include "senf/Utils/Logger/Logger.hh"
#include "senf/Utils/membind.hh"
+#include <boost/shared_ptr.hpp>
-#include "DVBSocketController.hh"
-#include <sstream>
-using namespace std;
#define prefix_
+///////////////////////////////cc.p////////////////////////////////////////
+using namespace std;
+unsigned int senf::DVBSocketController::controllerNr(0);
-senf::DVBSocketController::DVBSocketController(DVBFrontendHandle frontendHandle_, DVBDemuxSectionHandle sectionHandle_ , const Callback & cb_) :
- dir( this ),
- frontendHandle( frontendHandle_ ),
- sectionHandle( sectionHandle_ ),
- type( frontendHandle.protocol().getInfo().type ),
- parser( type ),
- cb( cb_ ),
- event( "senf::DVBSocketController::readEvent", senf::membind(&DVBSocketController::readEvent, this), frontendHandle, senf::scheduler::FdEvent::EV_PRIO, false )
+senf::DVBSocketController::DVBSocketController(DVBFrontendHandle frontendHandle_, const Callback & cb_)
+ : dir( this ),
+ frontendHandle( frontendHandle_ ),
+ type( frontendHandle.protocol().getInfo().type ),
+ parser( type ),
+ cb( cb_ ),
+ sectionNr(1),
+ pesNr(1),
+ event( "senf::DVBSocketController::readEvent", senf::membind(&DVBSocketController::readEvent, this), frontendHandle, senf::scheduler::FdEvent::EV_PRIO, false )
{
initConsole();
}
prefix_ senf::DVBSocketController::~DVBSocketController()
{
}
-prefix_ void senf::DVBSocketController::tuneToCMD(const string & input, const string & mode){
+
+prefix_ senf::DVBDemuxSectionHandle senf::DVBSocketController::createDVBDemuxSectionHandle( int adapternumber, int demuxnumber, bool addToConsole ){
+ DVBDemuxSectionHandle sectionHandle(adapternumber, demuxnumber);
+ if(addToConsole)
+ this->addToConsole(sectionHandle);
+ return sectionHandle;
+
+}
+
+prefix_ senf::DVBDemuxPESHandle senf::DVBSocketController::createDVBDemuxPESHandle( int adapternumber, int demuxnumber, bool addToConsole ){
+ DVBDemuxPESHandle pesHandle(adapternumber, demuxnumber);
+ if(addToConsole )
+ this->addToConsole(pesHandle);
+ return pesHandle;
+
+}
+
+prefix_ void senf::DVBSocketController::addToConsole(senf::DVBDemuxSectionHandle sh){
+ boost::shared_ptr<DVBSectionProtocolWrapper> wrap(new DVBSectionProtocolWrapper(sh));
+ sh.protocol().addWrapper(wrap);
+ dir.node().add("section" + senf::str(sectionNr), wrap->dir);
+ sectionNr++;
+}
+prefix_ void senf::DVBSocketController::addToConsole(senf::DVBDemuxPESHandle sh){
+ boost::shared_ptr<DVBPESProtocolWrapper> wrap(new DVBPESProtocolWrapper(sh));
+ sh.protocol().addWrapper(wrap);
+ dir.node().add("pes"+ senf::str(pesNr), wrap->dir);
+ pesNr++;
+}
+
+prefix_ void senf::DVBSocketController::tuneToCMD(const string & input, const string & mode)
+{
struct dvb_frontend_parameters frontend;
-
-
+
// no valid configline, so it will be treaten like a channel name
if (input.find(":")==string::npos){
if (mode.c_str()[0]=='a')
}
// add psydo name "foo" to complete configline syntax
frontend = parser.getFrontendParam("foo:"+input);
-
+
if (mode.c_str()[0]=='a'){
switch (type) {
case FE_QPSK:
}
else {
switch (type) {
- case FE_QPSK: if (mode.c_str()[0]=='a')
+ case FE_QPSK:
tuneDVB_S_sync(frontend.frequency, frontend.inversion, frontend.u.qpsk.symbol_rate, frontend.u.qpsk.fec_inner);
break;
case FE_QAM:
prefix_ void senf::DVBSocketController::tuneTo(const string & channel)
{
struct dvb_frontend_parameters frontend;
-
+
string configLine = parser.getConfigLine(channel);
-
+
frontend = parser.getFrontendParam(configLine);
switch (type) {
case FE_QPSK:
break;
default:
SENF_THROW_SYSTEM_EXCEPTION("Could not determine type of card.");
- }
+ }
}
-prefix_ void senf::DVBSocketController::tuneDVB_T(unsigned int frequency,
+prefix_ void senf::DVBSocketController::tuneDVB_T(unsigned int frequency,
fe_spectral_inversion_t inversion,
- fe_bandwidth_t bandwidth,
+ fe_bandwidth_t bandwidth,
fe_code_rate_t code_rate_HP, /* high priority stream code rate */
fe_code_rate_t code_rate_LP, /* low priority stream code rate */
fe_modulation_t constellation, /* modulation type (see above) */
- fe_transmit_mode_t transmission_mode,
+ fe_transmit_mode_t transmission_mode,
fe_guard_interval_t guard_interval,
fe_hierarchy_t hierarchy_information
)
{
if(type != FE_OFDM)
SENF_THROW_SYSTEM_EXCEPTION("Type of card is: ") << getTypeString() << " for this operation you need a DVB-T Card!";
-
+
event.enable();
-
+
frontendHandle.protocol().setNonBlock();
- frontendHandle.protocol().tuneDVB_T(frequency,
- inversion,
- bandwidth,
- code_rate_HP,
- code_rate_LP,
- constellation,
- transmission_mode,
- guard_interval,
+ frontendHandle.protocol().tuneDVB_T(frequency,
+ inversion,
+ bandwidth,
+ code_rate_HP,
+ code_rate_LP,
+ constellation,
+ transmission_mode,
+ guard_interval,
hierarchy_information);
}
-prefix_ void senf::DVBSocketController::tuneDVB_S(unsigned int frequency, fe_spectral_inversion_t inversion, unsigned int symbole_rate, fe_code_rate_t code_rate){
+prefix_ void senf::DVBSocketController::tuneDVB_S(unsigned int frequency, fe_spectral_inversion_t inversion, unsigned int symbole_rate, fe_code_rate_t code_rate)
+{
if(type != FE_QPSK)
SENF_THROW_SYSTEM_EXCEPTION("Type of card is: ") << getTypeString() << " for this operation you need a DVB-S Card!";
-
+
event.enable();
-
+
frontendHandle.protocol().setNonBlock();
frontendHandle.protocol().tuneDVB_S(frequency, inversion, symbole_rate, code_rate);
}
-prefix_ void senf::DVBSocketController::tuneDVB_C(unsigned int frequency,
+prefix_ void senf::DVBSocketController::tuneDVB_C(unsigned int frequency,
fe_spectral_inversion_t inversion,
unsigned int symbol_rate,
fe_code_rate_t fec_inner,
fe_modulation_t modulation
)
-{
+{
if(type != FE_QAM)
SENF_THROW_SYSTEM_EXCEPTION("Type of card is: ") << getTypeString() << " for this operation you need a DVB-C Card!";
-
+
event.enable();
-
+
frontendHandle.protocol().setNonBlock();
-
+
frontendHandle.protocol().tuneDVB_C(frequency, inversion, symbol_rate, fec_inner, modulation);
}
struct dvb_frontend_parameters frontend;
dvb_frontend_event ev;
string configLine = parser.getConfigLine(channel);
-
+
frontend = parser.getFrontendParam(configLine);
switch (type) {
case FE_QPSK:
return ev;
}
-prefix_ dvb_frontend_event senf::DVBSocketController::tuneDVB_T_sync(unsigned int frequency,
+prefix_ dvb_frontend_event senf::DVBSocketController::tuneDVB_T_sync(unsigned int frequency,
fe_spectral_inversion_t inversion,
- fe_bandwidth_t bandwidth,
+ fe_bandwidth_t bandwidth,
fe_code_rate_t code_rate_HP, /* high priority stream code rate */
fe_code_rate_t code_rate_LP, /* low priority stream code rate */
fe_modulation_t constellation, /* modulation type (see above) */
- fe_transmit_mode_t transmission_mode,
+ fe_transmit_mode_t transmission_mode,
fe_guard_interval_t guard_interval,
fe_hierarchy_t hierarchy_information
)
{
if(type != FE_OFDM)
SENF_THROW_SYSTEM_EXCEPTION("Type of card is: ") << getTypeString() << " for this operation you need a DVB-T Card!";
-
+
event.disable();
-
+
frontendHandle.protocol().setNonBlock(false);
-
- frontendHandle.protocol().tuneDVB_T(frequency,
- inversion,
- bandwidth,
- code_rate_HP,
- code_rate_LP,
- constellation,
- transmission_mode,
- guard_interval,
+
+ frontendHandle.protocol().tuneDVB_T(frequency,
+ inversion,
+ bandwidth,
+ code_rate_HP,
+ code_rate_LP,
+ constellation,
+ transmission_mode,
+ guard_interval,
hierarchy_information);
-
+
if(!frontendHandle.waitOOBReadable(senf::ClockService::seconds(2)))
SENF_THROW_SYSTEM_EXCEPTION("Could not tune to channel!");
-
+
return frontendHandle.protocol().getEvent();
}
prefix_ dvb_frontend_event senf::DVBSocketController::tuneDVB_S_sync(unsigned int frequency, fe_spectral_inversion_t inversion, unsigned int symbole_rate, fe_code_rate_t code_rate){
if(type != FE_QPSK)
SENF_THROW_SYSTEM_EXCEPTION("Type of card is: ") << getTypeString() << " for this operation you need a DVB-S Card!";
-
+
event.disable();
-
+
frontendHandle.protocol().setNonBlock(false);
-
+
frontendHandle.protocol().tuneDVB_S(frequency, inversion, symbole_rate, code_rate);
-
+
if(!frontendHandle.waitOOBReadable(senf::ClockService::seconds(2)))
SENF_THROW_SYSTEM_EXCEPTION("Could not tune to channel!");
return frontendHandle.protocol().getEvent();
}
-prefix_ dvb_frontend_event senf::DVBSocketController::tuneDVB_C_sync(unsigned int frequency,
+prefix_ dvb_frontend_event senf::DVBSocketController::tuneDVB_C_sync(unsigned int frequency,
fe_spectral_inversion_t inversion,
unsigned int symbol_rate,
fe_code_rate_t fec_inner,
fe_modulation_t modulation
)
-{
+{
if(type != FE_QAM)
SENF_THROW_SYSTEM_EXCEPTION("Type of card is: ") << getTypeString() << " for this operation you need a DVB-C Card!";
-
+
event.disable();
-
+
frontendHandle.protocol().setNonBlock(false);
-
+
frontendHandle.protocol().tuneDVB_C(frequency, inversion, symbol_rate, fec_inner, modulation);
if(!frontendHandle.waitOOBReadable(senf::ClockService::seconds(2)))
SENF_THROW_SYSTEM_EXCEPTION("Could not tune to channel!");
}
-prefix_ string senf::DVBSocketController::getTypeString(){
+prefix_ string senf::DVBSocketController::getTypeString()
+{
switch (type) {
case FE_QPSK:
return "DVB-S";
default:
SENF_THROW_SYSTEM_EXCEPTION("Could not determine type of card.");
}
-
}
-prefix_ unsigned int senf::DVBSocketController::bitErrorRate(){
+
+prefix_ unsigned int senf::DVBSocketController::bitErrorRate()
+{
return frontendHandle.protocol().bitErrorRate();
}
-prefix_ unsigned int senf::DVBSocketController::signalToNoiseRatio(){
+prefix_ unsigned int senf::DVBSocketController::signalToNoiseRatio()
+{
return frontendHandle.protocol().signalNoiseRatio();
}
-prefix_ unsigned int senf::DVBSocketController::signalStrength(){
+prefix_ unsigned int senf::DVBSocketController::signalStrength()
+{
return frontendHandle.protocol().signalStrength();
}
-prefix_ string senf::DVBSocketController::getTuneInfo(const string & conf){
+prefix_ string senf::DVBSocketController::getTuneInfo(const string & conf)
+{
const char* cConf = conf.c_str();
stringstream info;
-
+
fe_status_t status;
frontendHandle.protocol().setNonBlock(false);
uint16_t snr, signal;
signal = frontendHandle.protocol().signalStrength();
ber = frontendHandle.protocol().bitErrorRate();
uncorrected_blocks = frontendHandle.protocol().uncorrectedBlocks();
-
+
info << hex;
-
+
for(unsigned int i = 0; i < conf.size(); ++i){
if(i>0)
info << " | ";
case 'S' :
info << "signal " << signal;
break;
- case 's' :
+ case 's' :
info << "snr " << snr;
break;
case 'b' :
}
return info.str();
}
-prefix_ string senf::DVBSocketController::status2String(fe_status_t status){
- string s("");
+
+prefix_ string senf::DVBSocketController::status2String(fe_status_t status)
+{
+ string s("");
if (status & FE_HAS_LOCK)
- return s += "HAS LOCK";
+ return s += "HAS LOCK";
if (status & FE_HAS_CARRIER)
- s += "HAS CARRIER";
+ s += "HAS CARRIER ";
if (status & FE_HAS_VITERBI)
- s += "HAS VITERBI";
+ s += "HAS VITERBI ";
if (status & FE_HAS_SYNC)
- s += "HAS SYNC";
+ s += "HAS SYNC ";
if (status & FE_HAS_SIGNAL)
- s += "HAS SIGNAL";
+ s += "HAS SIGNAL ";
if (status & FE_TIMEDOUT)
- s += "TIMED OUT";
+ s += "TIMED OUT ";
if (status & FE_REINIT)
- s += "REINIT";
+ s += "REINIT ";
return s;
}
-prefix_ void senf::DVBSocketController::setSectionFilter(unsigned short int pid,
- u_int8_t filter,
- unsigned int flags,
- u_int8_t mask,
- u_int8_t mode,
- unsigned int timeout)
-{
- sectionHandle.protocol().setSectionFilter(pid, timeout, flags, filter, mask, mode);
-
-}
-prefix_ void senf::DVBSocketController::setBufferSize(unsigned long size)
-{
- sectionHandle.protocol().setBufferSize(size);
-}
-
-prefix_ void senf::DVBSocketController::startFiltering()
-{
- sectionHandle.protocol().startFiltering();
-}
-prefix_ void senf::DVBSocketController::stopFiltering()
+prefix_ fe_type_t senf::DVBSocketController::getType()
{
- sectionHandle.protocol().stopFiltering();
-}
-
-prefix_ fe_type_t senf::DVBSocketController::getType(){
return type;
}
-prefix_ void senf::DVBSocketController::readEvent(int event){
+prefix_ void senf::DVBSocketController::readEvent(int event)
+{
if(cb)
cb(frontendHandle.protocol().getEvent());
}
-prefix_ void senf::DVBSocketController::initConsole(){
+prefix_ void senf::DVBSocketController::initConsole()
+{
// binding functions to console
namespace kw = senf::console::kw;
- dir.doc("DVB Controller");
-
+ dir.doc("DVB Controller " + controllerNr);
+ ++controllerNr;
+
dir.add("type", &DVBSocketController::getTypeString)
.doc("Shows actual type of card DVB-{T, S, C}");
-
+
dir.add("info", &DVBSocketController::getTuneInfo)
.doc("Returns a string which shows actual tuning status.\n\
\"S\" prints signal strength (in hex)\n\
features may not be supported be your current driver implementation\n\
and could end in throwing an exception!")
.arg("conf", "Ssbuf", kw::default_value = "Ssbuf");
-
+
dir.add("tune", &DVBSocketController::tuneToCMD)
.doc("tunes to channel listet in the configfile.")
.arg("channel", "channel to tune")
.arg("mode", "mode \"sync\" or \"async\"", kw::default_value = "async");
-
- dir.add("buffersize", &DVBSocketController::setBufferSize)
- .doc("Set the size of the circular buffer used for filtered data.")
- .arg("size", "in byte");
-
- dir.add("start", &DVBSocketController::startFiltering)
- .doc("Starts filtering");
-
- dir.add("stop", &DVBSocketController::setBufferSize)
- .doc("Stops filtering");
-
- dir.add("filter", &DVBSocketController::setSectionFilter)
- .arg("pid", "pid to filter")
- .arg("filter", "filter", kw::default_value = 62)
- .arg("flags", "or-able: DMX_CHECK_CRC(0x01), DMX_ONESHOT(0x02), DMX_IMMEDIATE_START(0x04), DMX_KERNEL_CLIENT(0x8000)", kw::default_value = DMX_IMMEDIATE_START | DMX_CHECK_CRC)
- .arg("mask", "mask", kw::default_value = 0xff)
- .arg("mode", "mode", kw::default_value = 0)
- .arg("timeout", "timeout", kw::default_value = 0)
- .doc("Sets parameters for section filter.");
-
- dir.add("stop", &DVBSocketController::setBufferSize)
- .doc("Stops filtering");
}
+
+///////////////////////////////cc.e////////////////////////////////////////
+#undef prefix_