-#ifndef DVBSOCKETCONTROLLER_HH_
-#define DVBSOCKETCONTROLLER_HH_
+// $Id$
+//
+// Copyright (C) 2007
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
+// Anton Gillert <atx@berlios.de>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+
+#ifndef HH_SENF_Socket_Protocols_DVB_DVBSocketController_
+#define HH_SENF_Socket_Protocols_DVB_DVBSocketController_ 1
-#include "DVBFrontendHandle.hh"
-#include "DVBDemuxHandles.hh"
// Custom includes
#include <string>
#include <linux/dvb/frontend.h>
-#include <senf/Scheduler/Scheduler.hh>
+#include "DVBFrontendHandle.hh"
+#include "DVBDemuxHandles.hh"
#include "DVBConfigParser.hh"
-#include <senf/Console.hh>
+#include "DVBProtocolWrapper.hh"
+#include "../../../Scheduler/Scheduler.hh"
+#include "../../../Utils/Console/Console.hh"
+
+#define MPE_TABLEID 62
+
namespace senf {
- std::string status2String(fe_status_t status);
+
+/** \brief Helperclass for configuration and controlling DVB devices.
+
+ The DVB API provides two methods for tuning. The first method is
+ synchronous, which means e.g. "tuneTo_sync" will return when the tuning operation on the card
+ succeed, no matter how long it takes. The second (preferred) method is to tune asynchronous.
+ The call "tuneTo" will return immediately and (if a callback was set) call the callback when
+ the tuning operation succeeds. <br>
+
+ Note that you may have to take draw backs in using this API. This dues to the implementation
+ of the DVB device driver which you or your kernel choose. It has shown that the completeness
+ of implementations vary from driver to driver. This wrapper provides the full Frontend API which
+ is defined by <a href="http://www.linuxtv.org/docs/dvbapi/DVB_Frontend_API.html">Convergence</a>.
+ You have to find out which parts of these functionality are implemented by your preferred
+ device driver by your own.
+*/
+
+
+
class DVBSocketController : boost::noncopyable
{
public:
+
senf::console::ScopedDirectory<DVBSocketController> dir;
-
+
typedef boost::function<void (const struct dvb_frontend_event & )> Callback;
-
- DVBSocketController(DVBFrontendHandle frontendHandle_ = DVBFrontendHandle(0,0), DVBDemuxSectionHandle sectionHandle_ = DVBDemuxSectionHandle(0,0), const Callback & cb = NULL);
- ~DVBSocketController();
-
- std::string tuneToCMD( const std::string & channel, const std::string & mode = "async");
-
- void tuneTo(const std::string & channel);
-
- void tuneDVB_S(unsigned int frequency, fe_spectral_inversion_t inversion, unsigned int symbole_rate, fe_code_rate_t code_rate);
- ///< Tunes a DVB-S device
- /**< Tunes a DVB-S device. Needs full configuration */
- void tuneDVB_T(unsigned int frequency,
- fe_spectral_inversion_t inversion, 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_guard_interval_t guard_interval,
- fe_hierarchy_t hierarchy_information); ///< Tunes a DVB-T device
- /**< Tunes a DVB-T device. Needs full configuration */
- void tuneDVB_C(unsigned int frequency,
- fe_spectral_inversion_t inversion, unsigned int symbol_rate,
- fe_code_rate_t fec_inner, fe_modulation_t modulation);
-
- dvb_frontend_event tuneTo_sync( const std::string & channel );
-
- dvb_frontend_event tuneDVB_S_sync(unsigned int frequency, fe_spectral_inversion_t inversion, unsigned int symbole_rate, fe_code_rate_t code_rate);
- ///< Tunes a DVB-S device
- /**< Tunes a DVB-S device. Needs full configuration */
+ ///< Callback which is called when an asynchronous tuning succeeds.
+
+ DVBSocketController(DVBFrontendHandle frontendHandle_ = DVBFrontendHandle(0,0), const Callback & cb = NULL);
+ ~DVBSocketController();
+
+ senf::DVBDemuxSectionHandle createDVBDemuxSectionHandle( int adapternumber=0, int demuxnumber=0, bool addToConsole=false );
+ senf::DVBDemuxPESHandle createDVBDemuxPESHandle( int adapternumber=0, int demuxnumber=0, bool addToConsole=false );
+
+ void addToConsole(senf::DVBDemuxSectionHandle sh);
+ ///< Adds an DVBDemuxSectionHandle to the console
+ /**< Allocates the functionality of DVBDemuxSectionProtocol into the folder
+ of the DVBSocketController. If the protocol is closed, or all handles are
+ discarded the console support will automatically removed.
+ \param[in] handle of a protocol*/
+ void addToConsole(senf::DVBDemuxPESHandle sh);
+ ///< Adds an DVBDemuxPESHandle to the console
+ /**< Allocates the functionality of DVBDemuxPESProtocol into the folder
+ of the DVBSocketController. If the protocol is closed, or all handles are
+ discarded the console support will automatically removed.
+ \param[in] handle of a protocol*/
+
+ void tuneToCMD( const std::string & input, const std::string & mode = "async");
+ ///< Tunes a DVB device given by the type of the DVBFrontendHandle
+ /**< Tunes a DVB device by a channel name or complete
+ configuration line. This method was created for use
+ in the SENF-Console.
+ \param[in] input A channel name or a complete
+ configuration line. If a channel name is given
+ it would be searched in the config file.
+ \param[in] mode The mode in which it will tune
+ "sync" or "async"*/
+ void tuneTo(const std::string & channel);
+ ///< Tunes a DVB device to a channel
+ /**< Tunes a DVB device to a channel whose parameters
+ are stored in a config file. The method determines
+ the type of DVB device by it self.
+ \param[in] channel A channel name which will be
+ looked up in config file.*/
+
+ void tuneDVB_S(unsigned int frequency, fe_spectral_inversion_t inversion, unsigned int symbole_rate, fe_code_rate_t code_rate);
+ ///< Tunes a DVB-S device
+ /**< Tunes a DVB-S device in asynchronous mode and calls
+ the callback if existing. Needs full configuration */
+
+ void tuneDVB_T(unsigned int frequency,
+ fe_spectral_inversion_t inversion, 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_guard_interval_t guard_interval,
+ fe_hierarchy_t hierarchy_information);
+ ///< Tunes a DVB-T device
+ /**< Tunes a DVB-T device in asynchronous mode and calls
+ the callback if existing. Needs full configuration. */
+
+ void tuneDVB_C(unsigned int frequency,
+ fe_spectral_inversion_t inversion, unsigned int symbol_rate,
+ fe_code_rate_t fec_inner, fe_modulation_t modulation);
+ ///< Tunes a DVB-C device
+ /**< Tunes a DVB-C device in asynchronous mode and calls
+ the callback if existing. Needs full configuration. */
+
+ dvb_frontend_event tuneTo_sync( const std::string & channel );
+ ///< Tunes a DVB device given by the type of the DVBFrontendHandle
+ /**< Tunes a DVB device, given by the type of the
+ DVBFrontendHandle, by a channel name in synchronous mode
+ \param[in] channel A channel name which will be looked
+ up in config file.
+ \returns dvb_frontend_event
+ \note The member "dvb_frontend_event.status" should be
+ correct by the most device driver implementations.
+ But "dvb_frontend_event.parameters" maybe not and is
+ definitly not set by: Cinergy T� (2.6.27),
+ Terratec Cinergy DT USB XS Diversity (2.6.27) */
+
+ dvb_frontend_event tuneDVB_S_sync(unsigned int frequency, fe_spectral_inversion_t inversion, unsigned int symbole_rate, fe_code_rate_t code_rate);
+ ///< Tunes a DVB-S device
+ /**< Tunes a DVB-S device in synchronous mode. Needs full configuration
+ \returns dvb_frontend_event
+ \note The member "dvb_frontend_event.status" should be
+ correct by the most device driver implementations.
+ But "dvb_frontend_event.parameters" maybe not and is
+ definitly not set by: Cinergy T� (2.6.27),
+ Terratec Cinergy DT USB XS Diversity (2.6.27) */
+
dvb_frontend_event tuneDVB_T_sync(unsigned int frequency,
fe_spectral_inversion_t inversion, fe_bandwidth_t bandwidth,
fe_code_rate_t code_rate_HP, /* high priority stream code rate */
fe_modulation_t constellation, /* modulation type (see above) */
fe_transmit_mode_t transmission_mode,
fe_guard_interval_t guard_interval,
- fe_hierarchy_t hierarsourcechy_information); ///< Tunes a DVB-T device
- /**< Tunes a DVB-T device. Needs full configuration */
+ fe_hierarchy_t hierarsourcechy_information);
+ ///< Tunes a DVB-T device
+ /**< Tunes a DVB-T device in synchronous mode. Needs full
+ configuration
+ \returns dvb_frontend_event
+ \note The member "dvb_frontend_event.status" should be
+ correct by the most device driver implementations.
+ But "dvb_frontend_event.parameters" maybe not and is
+ definitly not set by: Cinergy T� (2.6.27),
+ Terratec Cinergy DT USB XS Diversity (2.6.27) */
+
dvb_frontend_event 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);
-
- fe_type_t getType();
-
- std::string getTypeString();
-
+ fe_code_rate_t fec_inner, fe_modulation_t modulation);
+ ///< Tunes a DVB-C device
+ /**< Tunes a DVB-C device in synchronous mode. Needs full configuration
+ \returns dvb_frontend_event
+ \note The member "dvb_frontend_event.status" should be
+ correct by the most device driver implementations.
+ But "dvb_frontend_event.parameters" maybe not and is
+ definitly not set by: Cinergy T� (2.6.27),
+ Terratec Cinergy DT USB XS Diversity (2.6.27) */
+
+ fe_type_t getType(); ///< Returns the type of the card. The type is defined in frontend.h
+
+ std::string getTypeString(); ///< Returns the type of the card.
+ /**< Returns the type of the card but human readable e.g.
+ "DVB-S", "DVB-T" or "DVB-C"*/
+
std::string status2String(fe_status_t status);
- unsigned int bitErrorRate();
- unsigned int signalToNoiseRatio();
- unsigned int signalStrength();
-
- void setSectionFilter(unsigned short int pid,
- unsigned char filter = 62,
- unsigned int flags = DMX_IMMEDIATE_START | DMX_CHECK_CRC,
- unsigned char mask = 0xff,
- unsigned char mode = 0,
- unsigned int timeout = 0);
-
- void setBufferSize(unsigned long size);
- ///< set the size of the circular buffer used for filtered data.
- /**< The default size is two maximum sized sections, i.e. if this
- function is not called a buffer size of 2 * 4096 bytes will
- be used.
- \param[in] size Size of circular buffer. */
-
- void startFiltering();
-
- void stopFiltering();
-
- std::string getTuneInfo(const std::string & conf ="Ssbuf"); ///< Returns a string which shows actual tuning status
- /**< Returns a string which shows actual tuning status.
- "S" prints signal strength (in hex)
- "s" prints singal to noise ration (in hex)
- "b" prints bit error rate (in hex)
- "u" prints uncorrected blocks (in hex)
- "f" prints readable overal status e.g. "Has Lock"
- These characters can be used to form the output. Be aware, some
- features may not be supported be your current driver implementation and
- could end in throwing an exception!*/
+ ///< Returns a human readable status information
+ /**< Returns a human readable version of fe_status_t
+ (defined by frontend.h)*/
+
+ unsigned int bitErrorRate(); ///< Returns the bit error rate
+ /**< \note This function may not be implemented by your
+ specific driver implementation. In this case the
+ output is random. This is true for:
+ Cinergy T� (2.6.27),
+ Terratec Cinergy DT USB XS Diversity (2.6.27) */
+
+ unsigned int signalToNoiseRatio(); ///< Returns the signal to noise ratio
+ /**< \note This function may not be implemented by your
+ specific driver implementation. In this case the
+ output is random. This is true for:
+ Cinergy T� (2.6.27),
+ Terratec Cinergy DT USB XS Diversity (2.6.27) */
+
+ unsigned int signalStrength(); ///< Returns the signal strength
+ /**< Returns the signal to noise ratio
+ \note This function may not be implemented by your
+ specific driver implementation. In this case the output is
+ random.*/
+
+ std::string getTuneInfo(const std::string & conf ="Ssbuf");
+ ///< Returns a string which shows actual tuning status
+ /**< <br>"S" prints signal strength (in hex)
+ <br>"s" prints singal to noise ration (in hex)
+ <br>"b" prints bit error rate (in hex)
+ <br>"u" prints uncorrected blocks (in hex)
+ <br>"f" prints readable overal status e.g. "Has Lock"<br>
+ These characters can be used to form the output. Be
+ aware, some features may not be supported be your
+ current driver implementation and could end in throwing
+ an exception! */
private:
DVBFrontendHandle frontendHandle;
- senf::DVBDemuxSectionHandle sectionHandle;
fe_type_t type;
DVBConfigParser parser;
Callback cb;
+ static unsigned int controllerNr;
+ unsigned int sectionNr;
+ unsigned int pesNr;
senf::scheduler::FdEvent event;
-
void readEvent(int i);
void initConsole();
};
}
-#endif /*DVBSOCKETCONTROLLER_HH_*/
+#endif