Author: schwardt
Date: Fri Nov  3 22:07:25 2006
New Revision: 1976

Added:
   trunk/WIP/record/src/tuner.py   (contents, props changed)
Modified:
   trunk/WIP/record/src/gstdvbtuner.c
   trunk/WIP/record/src/gstdvbtuner.h

Log:
- gstreamer dvbtuner plugin (only dvb-t is tested!)
- hardcoded example tuner (tuner.py)


Modified: trunk/WIP/record/src/gstdvbtuner.c
==============================================================================
--- trunk/WIP/record/src/gstdvbtuner.c  (original)
+++ trunk/WIP/record/src/gstdvbtuner.c  Fri Nov  3 22:07:25 2006
@@ -74,80 +74,7 @@
 
 #include "gstdvbtuner.h"
 
-
-typedef struct {
-       char *name;
-       int value;
-} Param;
-
-static const Param inversion_list [] = {
-       { "INVERSION_OFF", INVERSION_OFF },
-       { "INVERSION_ON", INVERSION_ON },
-       { "INVERSION_AUTO", INVERSION_AUTO },
-        { NULL, 0 }
-};
-
-static const Param bw_list [] = {
-       { "BANDWIDTH_6_MHZ", BANDWIDTH_6_MHZ },
-       { "BANDWIDTH_7_MHZ", BANDWIDTH_7_MHZ },
-       { "BANDWIDTH_8_MHZ", BANDWIDTH_8_MHZ },
-        { NULL, 0 }
-};
-
-static const Param fec_list [] = {
-       { "FEC_1_2", FEC_1_2 },
-       { "FEC_2_3", FEC_2_3 },
-       { "FEC_3_4", FEC_3_4 },
-       { "FEC_4_5", FEC_4_5 },
-       { "FEC_5_6", FEC_5_6 },
-       { "FEC_6_7", FEC_6_7 },
-       { "FEC_7_8", FEC_7_8 },
-       { "FEC_8_9", FEC_8_9 },
-       { "FEC_AUTO", FEC_AUTO },
-       { "FEC_NONE", FEC_NONE },
-        { NULL, 0 }
-};
-
-static const Param guard_list [] = {
-       {"GUARD_INTERVAL_1_16", GUARD_INTERVAL_1_16},
-       {"GUARD_INTERVAL_1_32", GUARD_INTERVAL_1_32},
-       {"GUARD_INTERVAL_1_4", GUARD_INTERVAL_1_4},
-       {"GUARD_INTERVAL_1_8", GUARD_INTERVAL_1_8},
-        { NULL, 0 }
-};
-
-static const Param hierarchy_list [] = {
-       { "HIERARCHY_1", HIERARCHY_1 },
-       { "HIERARCHY_2", HIERARCHY_2 },
-       { "HIERARCHY_4", HIERARCHY_4 },
-       { "HIERARCHY_NONE", HIERARCHY_NONE },
-        { NULL, 0 }
-};
-
-static const Param atsc_list [] = {
-       { "8VSB", VSB_8 },
-       { "QAM_256", QAM_256 },
-       { "QAM_64", QAM_64 },
-       { "QAM", QAM_AUTO },
-        { NULL, 0 }
-};
-
-static const Param qam_list [] = {
-       { "QPSK", QPSK },
-       { "QAM_128", QAM_128 },
-       { "QAM_16", QAM_16 },
-       { "QAM_256", QAM_256 },
-       { "QAM_32", QAM_32 },
-       { "QAM_64", QAM_64 },
-        { NULL, 0 }
-};
-
-static const Param transmissionmode_list [] = {
-       { "TRANSMISSION_MODE_2K", TRANSMISSION_MODE_2K },
-       { "TRANSMISSION_MODE_8K", TRANSMISSION_MODE_8K },
-        { NULL, 0 }
-};
-
+/* 
**********************************************************************************++
 */
 
 GST_DEBUG_CATEGORY_STATIC (gst_dvbtuner_debug);
 #define GST_CAT_DEFAULT gst_dvbtuner_debug
@@ -155,25 +82,53 @@
 /* Filter signals and args */
 enum
 {
-  /* FILL ME */
+  SIGNAL_0,
+
+  /* methods */
+  SIGNAL_ADD_PID,
+  SIGNAL_REMOVE_PID,
+  SIGNAL_CLEAR_PIDS,
+  SIGNAL_TUNE,
+
+  /* signals */
+  SIGNAL_TUNING_FINISHED,
+
   LAST_SIGNAL
 };
 
 enum
 {
-  ARG_0,
-  ARG_DEBUG_OUTPUT,
-  ARG_ADAPTER,
-  ARG_FRONTENDTYPE,
-  ARG_FRONTENDNAME,
-  ARG_HWDECODER,
-  ARG_ERROR,
-  ARG_ERRNO,
-  ARG_PID_FILTER
+  PROP_0,
+
+  PROP_DEBUG_OUTPUT,
+  PROP_ADAPTER,
+  PROP_FRONTENDTYPE,
+  PROP_FRONTENDNAME,
+  PROP_HWDECODER,
+  PROP_STATUS,
+
+  PROP_FREQUENCY,
+  PROP_POLARISATION,
+  PROP_SAT_NO,
+  PROP_SYM_RATE,
+  PROP_INVERSION,
+  PROP_FEC,
+  PROP_CODE_RATE_HIGH_PRIO,
+  PROP_CODE_RATE_LOW_PRIO,
+  PROP_CONSTELLATION,
+  PROP_MODULATION,
+  PROP_GUARD_INTERVAL,
+  PROP_BANDWIDTH,
+  PROP_TRANSMISSION_MODE,
+  PROP_HIERARCHY,
+
+  PROP_LAST
 };
 
+static guint gst_dvbtuner_signals[LAST_SIGNAL] = { 0 };
+
 /* 
**********************************************************************************
- * CODE FOR ARG_FRONTENDTYPE
+ * CODE FOR PROP_FRONTENDTYPE
  * 
**********************************************************************************
 */
 
 typedef enum {
@@ -195,7 +150,7 @@
     static GEnumValue pattern_types[] = {
       { GST_FRONTENDTYPE_UNKNOWN, "unknown", "unknown adapter" },
       { GST_FRONTENDTYPE_QPSK, "QPSK", "DVB-S adapter" },
-      { GST_FRONTENDTYPE_QAM, "QAM", "DVB-C adapter" },
+      { GST_FRONTENDTYPE_QAM,  "QAM",  "DVB-C adapter" },
       { GST_FRONTENDTYPE_OFDM, "OFDM", "DVB-T adapter" },
       { GST_FRONTENDTYPE_ATSC, "ATSC", "DVB-A adapter" },
       { 0, NULL, NULL },
@@ -210,6 +165,207 @@
 }
 
 
+/* 
**********************************************************************************
+ * CODE FOR PROP_INVERSION
+ * 
**********************************************************************************
 */
+
+#define GST_TYPE_INVERSION_PATTERN (gst_inversion_pattern_get_type ())
+static GType
+gst_inversion_pattern_get_type (void)
+{
+  static GType inversion_pattern_type = 0;
+
+  if (!inversion_pattern_type) {
+    static GEnumValue pattern_types[] = {
+      { INVERSION_OFF,  "OFF", "OFF" },
+      { INVERSION_ON,   "ON", "ON" },
+      { INVERSION_AUTO, "AUTO", "AUTO" },
+      { 0, NULL, NULL },
+    };
+
+    inversion_pattern_type =
+       g_enum_register_static ("GstInversionPattern",
+                               pattern_types);
+  }
+
+  return inversion_pattern_type;
+}
+
+/* 
**********************************************************************************
+ * CODE FOR PROP_FEC
+ * 
**********************************************************************************
 */
+
+#define GST_TYPE_FEC_PATTERN (gst_fec_pattern_get_type ())
+static GType
+gst_fec_pattern_get_type (void)
+{
+  static GType fec_pattern_type = 0;
+
+  if (!fec_pattern_type) {
+    static GEnumValue pattern_types[] = {
+      { FEC_NONE,   "NONE",  "NONE" },
+      { FEC_1_2,    "1/2",   "1/2" },
+      { FEC_2_3,    "2/3",   "2/3" },
+      { FEC_3_4,    "3/4",   "3/4" },
+      { FEC_4_5,    "4/5",   "4/5" },
+      { FEC_5_6,    "5/6",   "5/6" },
+      { FEC_6_7,    "6/7",   "6/7" },
+      { FEC_7_8,    "7/8",   "7/8" },
+      { FEC_8_9,    "8/9",   "8/9" },
+      { FEC_AUTO,   "AUTO",  "AUTO" },
+      { 0, NULL, NULL },
+    };
+
+    fec_pattern_type =
+       g_enum_register_static ("GstFecPattern",
+                               pattern_types);
+  }
+
+  return fec_pattern_type;
+}
+
+/* 
**********************************************************************************
+ * CODE FOR PROP_MODULATION
+ * 
**********************************************************************************
 */
+
+#define GST_TYPE_QAM_PATTERN (gst_qam_pattern_get_type ())
+static GType
+gst_qam_pattern_get_type (void)
+{
+  static GType qam_pattern_type = 0;
+
+  if (!qam_pattern_type) {
+    static GEnumValue pattern_types[] = {
+      { QPSK,       "QPSK",      "QPSK" },
+      { QAM_16,     "QAM_16",    "QAM_16" },
+      { QAM_32,     "QAM_32",    "QAM_32" },
+      { QAM_64,     "QAM_64",    "QAM_64" },
+      { QAM_128,    "QAM_128",   "QAM_128" },
+      { QAM_256,    "QAM_256",   "QAM_256" },
+      { QAM_AUTO,   "QAM_AUTO",  "QAM_AUTO" },
+      { VSB_8,      "VSB_8",     "VSB_8" },
+      { VSB_16,     "VSB_16",    "VSB_16" },
+      { 0, NULL, NULL },
+    };
+
+    qam_pattern_type =
+       g_enum_register_static ("GstQamPattern",
+                               pattern_types);
+  }
+
+  return qam_pattern_type;
+}
+
+/* 
**********************************************************************************
+ * CODE FOR PROP_GUARD_INTERVAL
+ * 
**********************************************************************************
 */
+
+#define GST_TYPE_GUARD_PATTERN (gst_guard_pattern_get_type ())
+static GType
+gst_guard_pattern_get_type (void)
+{
+  static GType guard_pattern_type = 0;
+
+  if (!guard_pattern_type) {
+    static GEnumValue pattern_types[] = {
+      { GUARD_INTERVAL_1_32,   "1_32",  "1_32" },
+      { GUARD_INTERVAL_1_16,   "1_16",  "1_16" },
+      { GUARD_INTERVAL_1_8,    "1_8",   "1_8" },
+      { GUARD_INTERVAL_1_4,    "1_4",   "1_4" },
+      { GUARD_INTERVAL_AUTO,   "AUTO",  "AUTO" },
+      { 0, NULL, NULL },
+    };
+
+    guard_pattern_type =
+       g_enum_register_static ("GstGuardPattern",
+                               pattern_types);
+  }
+
+  return guard_pattern_type;
+}
+
+/* 
**********************************************************************************
+ * CODE FOR PROP_TRANSMISSION_MODE
+ * 
**********************************************************************************
 */
+
+#define GST_TYPE_TRANSMISSION_MODE_PATTERN 
(gst_transmission_mode_pattern_get_type ())
+static GType
+gst_transmission_mode_pattern_get_type (void)
+{
+  static GType transmission_mode_pattern_type = 0;
+
+  if (!transmission_mode_pattern_type) {
+    static GEnumValue pattern_types[] = {
+      { TRANSMISSION_MODE_2K,    "2k",    "2k" },
+      { TRANSMISSION_MODE_8K,    "8k",    "8k" },
+      { TRANSMISSION_MODE_AUTO,  "AUTO",  "AUTO" },
+      { 0, NULL, NULL },
+    };
+
+    transmission_mode_pattern_type =
+       g_enum_register_static ("GstTransmissionModePattern",
+                               pattern_types);
+  }
+
+  return transmission_mode_pattern_type;
+}
+
+/* 
**********************************************************************************
+ * CODE FOR PROP_BANDWIDTH
+ * 
**********************************************************************************
 */
+
+#define GST_TYPE_BANDWIDTH_PATTERN (gst_bandwidth_pattern_get_type ())
+static GType
+gst_bandwidth_pattern_get_type (void)
+{
+  static GType bandwidth_pattern_type = 0;
+
+  if (!bandwidth_pattern_type) {
+    static GEnumValue pattern_types[] = {
+      { BANDWIDTH_8_MHZ,   "8_MHZ",  "8_MHZ" },
+      { BANDWIDTH_7_MHZ,   "7_MHZ",  "7_MHZ" },
+      { BANDWIDTH_6_MHZ,   "6_MHZ",  "6_MHZ" },
+      { BANDWIDTH_AUTO,    "AUTO",   "AUTO" },
+      { 0, NULL, NULL },
+    };
+
+    bandwidth_pattern_type =
+       g_enum_register_static ("GstBandwidthPattern",
+                               pattern_types);
+  }
+
+  return bandwidth_pattern_type;
+}
+
+/* 
**********************************************************************************
+ * CODE FOR PROP_HIERARCHY
+ * 
**********************************************************************************
 */
+
+#define GST_TYPE_HIERARCHY_PATTERN (gst_hierarchy_pattern_get_type ())
+static GType
+gst_hierarchy_pattern_get_type (void)
+{
+  static GType hierarchy_pattern_type = 0;
+
+  if (!hierarchy_pattern_type) {
+    static GEnumValue pattern_types[] = {
+      { HIERARCHY_NONE, "NONE", "NONE" },
+      { HIERARCHY_1,    "1",    "1" },
+      { HIERARCHY_2,    "2",    "2" },
+      { HIERARCHY_4,    "4",    "4" },
+      { HIERARCHY_AUTO, "AUTO", "AUTO" },
+      { 0, NULL, NULL },
+    };
+
+    hierarchy_pattern_type =
+       g_enum_register_static ("GstHierarchyPattern",
+                               pattern_types);
+  }
+
+  return hierarchy_pattern_type;
+}
+
+
 /* 
**********************************************************************************++
 */
 
 GST_BOILERPLATE (GstDvbTuner, gst_dvbtuner, GstElement,
@@ -220,8 +376,8 @@
 static void gst_dvbtuner_get_property (GObject * object, guint prop_id,
     GValue * value, GParamSpec * pspec);
 
-static gboolean gst_dvbtuner_set_caps (GstPad * pad, GstCaps * caps);
-static GstFlowReturn gst_dvbtuner_chain (GstPad * pad, GstBuffer * buf);
+/* static gboolean gst_dvbtuner_set_caps (GstPad * pad, GstCaps * caps); */
+/* static GstFlowReturn gst_dvbtuner_chain (GstPad * pad, GstBuffer * buf); */
 
 static void
 gst_dvbtuner_base_init (gpointer gclass)
@@ -250,22 +406,137 @@
   gobject_class->set_property = gst_dvbtuner_set_property;
   gobject_class->get_property = gst_dvbtuner_get_property;
 
-  g_object_class_install_property (gobject_class, ARG_DEBUG_OUTPUT, 
+  g_object_class_install_property (gobject_class, PROP_DEBUG_OUTPUT, 
     g_param_spec_boolean ("debug-output", "DebugOutput", "Produce verbose 
debug output ?", 
                          FALSE, G_PARAM_READWRITE)); 
 
-  g_object_class_install_property (gobject_class, ARG_ADAPTER, 
+  g_object_class_install_property (gobject_class, PROP_ADAPTER, 
     g_param_spec_uint ("adapter", "Adapter", "Number of adapter", 
                        0, 1024, 0, G_PARAM_READWRITE)); 
 
-  g_object_class_install_property (gobject_class, ARG_FRONTENDNAME,
+  g_object_class_install_property (gobject_class, PROP_FRONTENDNAME,
     g_param_spec_string ("frontendname", "FrontendName", "name of frontend", 
                        "", G_PARAM_READABLE)); 
 
-  g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FRONTENDTYPE,
+  g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FRONTENDTYPE,
     g_param_spec_enum ("frontendtype", "Frontend Type",
                       "Type of frontend",
                       GST_TYPE_FRONTENDTYPE_PATTERN, 1, G_PARAM_READABLE));
+
+  g_object_class_install_property (gobject_class, PROP_HWDECODER, 
+    g_param_spec_boolean ("hwdecoder", "HardwareDecoder", "Is a hardware 
decoder present?", 
+                         FALSE, G_PARAM_READABLE)); 
+
+  g_object_class_install_property (gobject_class, PROP_STATUS, 
+    g_param_spec_string ("status", "FrontendStatus", "current frontend 
status", 
+                        "", G_PARAM_READABLE)); 
+
+  g_object_class_install_property (gobject_class, PROP_FREQUENCY, 
+    g_param_spec_uint ("frequency", "Frequency", "frequency of channel", 
+                       0, G_MAXUINT, 0, G_PARAM_READWRITE)); 
+
+  g_object_class_install_property (gobject_class, PROP_POLARISATION, 
+    g_param_spec_boolean ("polarisation", "Polarisation", "polarisation 
(true=H ; false=V)", 
+                       FALSE, G_PARAM_READWRITE)); 
+
+  g_object_class_install_property (gobject_class, PROP_SAT_NO, 
+    g_param_spec_uint ("sat-no", "SatNo", "FIXME SatNo", 
+                       0, G_MAXUINT, 0, G_PARAM_READWRITE)); 
+
+  g_object_class_install_property (gobject_class, PROP_SYM_RATE, 
+    g_param_spec_uint ("symbol-rate", "Symbol-rate", "FIXME symbol-rate", 
+                       0, G_MAXUINT, 0, G_PARAM_READWRITE)); 
+
+  g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_INVERSION,
+    g_param_spec_enum ("inversion", "Inversion",  "FIXME inversion",
+                      GST_TYPE_INVERSION_PATTERN, 1, G_PARAM_READWRITE));
+
+  g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FEC,
+    g_param_spec_enum ("fec", "Fec",  "FIXME fec",
+                      GST_TYPE_FEC_PATTERN, 1, G_PARAM_READWRITE));
+
+  g_object_class_install_property (G_OBJECT_CLASS (klass), 
PROP_CODE_RATE_HIGH_PRIO,
+    g_param_spec_enum ("code-rate-high-prio", "CodeRateHighPrio",  "FIXME code 
rate high prio",
+                      GST_TYPE_FEC_PATTERN, 1, G_PARAM_READWRITE));
+
+  g_object_class_install_property (G_OBJECT_CLASS (klass), 
PROP_CODE_RATE_LOW_PRIO,
+    g_param_spec_enum ("code-rate-low-prio", "CodeRateLowPrio",  "FIXME code 
rate low prio",
+                      GST_TYPE_FEC_PATTERN, 1, G_PARAM_READWRITE));
+
+  g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_CONSTELLATION,
+    g_param_spec_enum ("constellation", "Constellation",  "FIXME 
Constellation",
+                      GST_TYPE_QAM_PATTERN, 1, G_PARAM_READWRITE));
+
+  g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MODULATION,
+    g_param_spec_enum ("modulation", "Modulation",  "FIXME Modulation",
+                      GST_TYPE_QAM_PATTERN, 1, G_PARAM_READWRITE));
+
+  g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_GUARD_INTERVAL,
+    g_param_spec_enum ("guard-interval", "GuardInterval",  "guard interval",
+                      GST_TYPE_GUARD_PATTERN, 1, G_PARAM_READWRITE));
+
+  g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BANDWIDTH,
+    g_param_spec_enum ("bandwidth", "Bandwidth",  "bandwidth",
+                      GST_TYPE_BANDWIDTH_PATTERN, 1, G_PARAM_READWRITE));
+
+  g_object_class_install_property (G_OBJECT_CLASS (klass), 
PROP_TRANSMISSION_MODE,
+    g_param_spec_enum ("transmission-mode", "TransmissionMode",  "transmission 
mode",
+                      GST_TYPE_TRANSMISSION_MODE_PATTERN, 1, 
G_PARAM_READWRITE));
+
+  g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_HIERARCHY,
+    g_param_spec_enum ("hierarchy", "Hierarchy",  "FIXME hierarchy",
+                      GST_TYPE_HIERARCHY_PATTERN, 1, G_PARAM_READWRITE));
+
+  gst_dvbtuner_signals[SIGNAL_ADD_PID] =
+    g_signal_new ("add-pid",                                       /* signal 
name */
+                 G_TYPE_FROM_CLASS (klass),                       /* itype */
+                 G_SIGNAL_RUN_LAST,                               /* signal 
flags */
+                 G_STRUCT_OFFSET (GstDvbTunerClass, add_pid),     /* class 
closure */
+                 NULL,                                            /* 
accumulator */
+                 NULL,                                            /* accu_data 
*/
+                 g_cclosure_marshal_VOID__INT,                    /* 
c_marshaller */
+                 G_TYPE_NONE,                                     /* return 
type */
+                 1,                                               /* n_params 
*/
+                 G_TYPE_INT);                                     /* param 
types */
+  
+  gst_dvbtuner_signals[SIGNAL_REMOVE_PID] =
+    g_signal_new ("remove-pid",                                    /* signal 
name */
+                 G_TYPE_FROM_CLASS (klass),                       /* itype */
+                 G_SIGNAL_RUN_LAST,                               /* signal 
flags */
+                 G_STRUCT_OFFSET (GstDvbTunerClass, remove_pid),  /* class 
closure */
+                 NULL,                                            /* 
accumulator */
+                 NULL,                                            /* accu_data 
*/
+                 g_cclosure_marshal_VOID__INT,                    /* 
c_marshaller */
+                 G_TYPE_NONE,                                     /* return 
type */
+                 1,                                               /* n_params 
*/
+                 G_TYPE_INT);                                     /* param 
types */
+  
+  gst_dvbtuner_signals[SIGNAL_CLEAR_PIDS] =
+    g_signal_new ("clear-pids",                                    /* signal 
name */
+                 G_TYPE_FROM_CLASS (klass),                       /* itype */
+                 G_SIGNAL_RUN_LAST,                               /* signal 
flags */
+                 G_STRUCT_OFFSET (GstDvbTunerClass, clear_pids),  /* class 
closure */
+                 NULL,                                            /* 
accumulator */
+                 NULL,                                            /* accu_data 
*/
+                 g_cclosure_marshal_VOID__VOID,                   /* 
c_marshaller */
+                 G_TYPE_NONE,                                     /* return 
type */
+                 0);                                              /* n_params 
*/
+
+  gst_dvbtuner_signals[SIGNAL_TUNE] =
+    g_signal_new ("tune",                                          /* signal 
name */
+                 G_TYPE_FROM_CLASS (klass),                       /* itype */
+                 G_SIGNAL_RUN_LAST,                               /* signal 
flags */
+                 G_STRUCT_OFFSET (GstDvbTunerClass, tune),        /* class 
closure */
+                 NULL,                                            /* 
accumulator */
+                 NULL,                                            /* accu_data 
*/
+                 g_cclosure_marshal_VOID__VOID,                   /* 
c_marshaller */
+                 G_TYPE_NONE,                                     /* return 
type */
+                 0);                                              /* n_params 
*/
+
+  klass->add_pid = GST_DEBUG_FUNCPTR (gst_dvbtuner_add_pid);
+  klass->remove_pid = GST_DEBUG_FUNCPTR (gst_dvbtuner_remove_pid);
+  klass->clear_pids = GST_DEBUG_FUNCPTR (gst_dvbtuner_clear_pids);
+  klass->tune = GST_DEBUG_FUNCPTR (gst_dvbtuner_tune);
 }
 
 /* initialize the new element
@@ -277,22 +548,24 @@
 gst_dvbtuner_init (GstDvbTuner * filter,
     GstDvbTunerClass * gclass)
 {
-  GstElementClass *klass = GST_ELEMENT_GET_CLASS (filter);
+  int i;
+  
+/*   GstElementClass *klass = GST_ELEMENT_GET_CLASS (filter); */
 
-  filter->sinkpad =
-      gst_pad_new_from_template (gst_element_class_get_pad_template (klass,
-          "sink"), "sink");
-  gst_pad_set_setcaps_function (filter->sinkpad, gst_dvbtuner_set_caps);
-  gst_pad_set_getcaps_function (filter->sinkpad, gst_pad_proxy_getcaps);
-
-  filter->srcpad =
-      gst_pad_new_from_template (gst_element_class_get_pad_template (klass,
-          "src"), "src");
-  gst_pad_set_getcaps_function (filter->srcpad, gst_pad_proxy_getcaps);
-
-  gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad);
-  gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad);
-  gst_pad_set_chain_function (filter->sinkpad, gst_dvbtuner_chain);
+/*   filter->sinkpad = */
+/*       gst_pad_new_from_template (gst_element_class_get_pad_template (klass, 
*/
+/*           "sink"), "sink"); */
+/*   gst_pad_set_setcaps_function (filter->sinkpad, gst_dvbtuner_set_caps); */
+/*   gst_pad_set_getcaps_function (filter->sinkpad, gst_pad_proxy_getcaps); */
+
+/*   filter->srcpad = */
+/*       gst_pad_new_from_template (gst_element_class_get_pad_template (klass, 
*/
+/*           "src"), "src"); */
+/*   gst_pad_set_getcaps_function (filter->srcpad, gst_pad_proxy_getcaps); */
+
+/*   gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); */
+/*   gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); */
+/*   gst_pad_set_chain_function (filter->sinkpad, gst_dvbtuner_chain); */
 
   /* properties */
   filter->debug_output = FALSE;
@@ -305,6 +578,22 @@
   filter->fn_dvr_dev = NULL;
   filter->fn_video_dev = NULL;
 
+  filter->fd_frontend_dev = -1;
+  filter->fd_video_dev = -1;
+
+  /* init pid filter list */
+  filter->pidlist.array = g_malloc( sizeof(GstDvbTunerPidListEntry) * 
GST_DVBTUNER_INIT_PIDLIST_LEN );
+  for(i = 0; i < GST_DVBTUNER_INIT_PIDLIST_LEN; ++i) {
+    filter->pidlist.array[i].pid = -1;
+    filter->pidlist.array[i].fd = -1;
+  }    
+  filter->pidlist.cnt = 4;
+  filter->pidlist.free = 4;
+
+  filter->hor_polarisation = FALSE;
+  filter->sat_no = 0;
+  filter->tone = 0;
+
   gst_dvbtuner_set_new_adapter_fn(filter);
 }
 
@@ -315,14 +604,17 @@
 {
   GstDvbTuner *filter = GST_DVBTUNER (object);
 
+  /* check frontend unspecific properties */
   switch (prop_id) {
-  case ARG_DEBUG_OUTPUT:
-    filter->debug_output = g_value_get_boolean (value);
-    break;
-  case ARG_ADAPTER:  
+  case PROP_DEBUG_OUTPUT:
+    {
+      filter->debug_output = g_value_get_boolean (value);
+      break;
+    }
+  case PROP_ADAPTER:  
     {
       guint new_adapter = g_value_get_uint(value);
-      DEBUGf("setting adapter from %d to %d\n", filter->adapter, new_adapter);
+      DEBUGf("setting adapter from %d to %d", filter->adapter, new_adapter);
       filter->adapter = new_adapter;
       
       gst_dvbtuner_set_new_adapter_fn(filter);
@@ -331,8 +623,191 @@
       break;  
     }
   default:
-    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-    break;
+    {
+      /* check frontend specific properties */
+      switch(filter->feinfo.type) {
+      case FE_QPSK:
+       {
+         switch (prop_id) {
+         case PROP_FREQUENCY:
+           {
+             filter->feparam.frequency = g_value_get_uint(value);
+             if(filter->feparam.frequency > 11700) {
+               filter->feparam.frequency = (filter->feparam.frequency - 
10600)*1000;
+               filter->tone = 1;
+             } else {
+               filter->feparam.frequency = (filter->feparam.frequency - 
9750)*1000;
+               filter->tone = 0;
+             }
+             filter->feparam.inversion = INVERSION_AUTO;
+             break;
+           }
+
+         case PROP_POLARISATION:
+           {
+             filter->hor_polarisation = g_value_get_boolean (value);
+             break;
+           }
+
+         case PROP_SAT_NO:
+           {
+             filter->sat_no = g_value_get_uint(value);
+             break;
+           }
+           
+         case PROP_SYM_RATE:
+           {
+             /* FIXME: adjust value (multiply with 1000) or not? */
+             filter->feparam.u.qpsk.symbol_rate = g_value_get_uint(value) * 
1000;
+             filter->feparam.u.qpsk.fec_inner = FEC_AUTO;
+             break;
+           }
+
+         default:
+           {
+             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+             break;
+           }
+         }
+         break;
+       }
+
+      case FE_QAM:
+       {
+         switch (prop_id) {
+         case PROP_FREQUENCY:
+           {
+             filter->feparam.frequency = g_value_get_uint(value);
+             break;
+           }
+
+         case PROP_INVERSION:
+           {
+             filter->feparam.inversion = g_value_get_enum (value);
+             break;
+           }
+
+         case PROP_SYM_RATE:
+           {
+             filter->feparam.u.qam.symbol_rate = g_value_get_uint(value);
+             break;
+           }
+           
+         case PROP_FEC:
+           {
+             filter->feparam.u.qam.fec_inner = g_value_get_enum (value);
+             break;
+           }
+           
+         case PROP_MODULATION:
+           {
+             filter->feparam.u.qam.modulation = g_value_get_enum (value);
+             break;
+           }
+
+         default:
+           {
+             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+             break;
+           }
+         }
+         break;
+       }
+           
+      case FE_OFDM:
+       {
+         switch (prop_id) {
+         case PROP_FREQUENCY:
+           {
+             filter->feparam.frequency = g_value_get_uint(value);
+             if (filter->feparam.frequency < 1000000) {
+               filter->feparam.frequency *= 1000;
+             }
+             break;
+           }
+
+         case PROP_INVERSION:
+           {
+             filter->feparam.inversion = g_value_get_enum (value);
+             break;
+           }
+
+         case PROP_BANDWIDTH:
+           {
+             filter->feparam.u.ofdm.bandwidth = g_value_get_enum(value);
+             break;
+           }
+           
+         case PROP_CODE_RATE_HIGH_PRIO:
+           {
+             filter->feparam.u.ofdm.code_rate_HP = g_value_get_enum(value);
+             break;
+           }
+
+         case PROP_CODE_RATE_LOW_PRIO:
+           {
+             filter->feparam.u.ofdm.code_rate_LP = g_value_get_enum(value);
+             break;
+           }
+
+         case PROP_CONSTELLATION:
+           {
+             filter->feparam.u.ofdm.constellation = g_value_get_enum(value);
+             break;
+           }
+
+         case PROP_TRANSMISSION_MODE:
+           {
+             filter->feparam.u.ofdm.transmission_mode = 
g_value_get_enum(value);
+             break;
+           }
+
+         case PROP_GUARD_INTERVAL:
+           {
+             filter->feparam.u.ofdm.guard_interval = g_value_get_enum(value);
+             break;
+           }
+
+         case PROP_HIERARCHY:
+           {
+             filter->feparam.u.ofdm.hierarchy_information = 
g_value_get_enum(value);
+             break;
+           }
+
+         default:
+           {
+             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+             break;
+           }
+         }
+         break;
+       }
+           
+      case FE_ATSC:
+       {
+         switch (prop_id) {
+         case PROP_FREQUENCY:
+           {
+             filter->feparam.frequency = g_value_get_uint(value);
+             break;
+           }
+
+         case PROP_MODULATION:
+           {
+             filter->feparam.u.vsb.modulation = g_value_get_enum(value);
+             break;
+           }
+
+         default:
+           {
+             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+             break;
+           }
+         }
+         break;
+       }
+      }
+    }
   }
 }
 
@@ -342,65 +817,267 @@
 {
   GstDvbTuner *filter = GST_DVBTUNER (object);
 
+  /* check frontend unspecific properties */
   switch (prop_id) {
-  case ARG_DEBUG_OUTPUT:
-    g_value_set_boolean (value, filter->debug_output);
-    break;
-  case ARG_ADAPTER:
-    g_value_set_uint (value, filter->adapter);
-    break;
-  case ARG_FRONTENDTYPE: 
-    if (filter->fd_frontend_dev >= 0) {
-      g_value_set_enum (value, filter->feinfo.type); 
-    } else {
-      g_value_set_enum (value, GST_FRONTENDTYPE_UNKNOWN);
-    }
-    break; 
-  case ARG_FRONTENDNAME:
-    if (filter->fn_frontend_dev && filter->feinfo.name) {
-      g_value_set_string (value, filter->feinfo.name); 
-    } else {
-      g_value_set_string (value, "");
+  case PROP_DEBUG_OUTPUT:
+    {
+      g_value_set_boolean (value, filter->debug_output);
+      break;
+    }
+
+  case PROP_ADAPTER:  
+    {
+      g_value_set_uint (value, filter->adapter);
+      break;  
     }
-    break; 
+
+  case PROP_FRONTENDTYPE: 
+    {
+      if (filter->fd_frontend_dev >= 0) {
+       g_value_set_enum (value, filter->feinfo.type); 
+      } else {
+       g_value_set_enum (value, GST_FRONTENDTYPE_UNKNOWN);
+      }
+      break; 
+    }
+
+  case PROP_FRONTENDNAME:
+    {
+      if (filter->fn_frontend_dev && filter->feinfo.name) {
+       g_value_set_string (value, filter->feinfo.name); 
+      } else {
+       g_value_set_string (value, "");
+      }
+      break; 
+    }
+
+  case PROP_HWDECODER:
+    {
+      g_value_set_boolean (value, filter->hwdecoder);
+      break;
+    }
+
+  case PROP_STATUS:
+    {
+      gchar *txt = gst_dvbtuner_get_status(filter);
+      g_value_set_string (value, txt);
+      g_free(txt);
+      break;
+    }
+
   default:
-    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-    break;
+    {
+      /* check frontend specific properties */
+      switch(filter->feinfo.type) {
+      case FE_QPSK:
+       {
+         switch (prop_id) {
+         case PROP_FREQUENCY:
+           {
+             if (filter->tone) {
+               g_value_set_uint(value, (filter->feparam.frequency/1000) + 
10600 );
+             } else {
+               g_value_set_uint(value, (filter->feparam.frequency/1000) + 9750 
);
+             }
+             break;
+           }
+
+         case PROP_POLARISATION:
+           {
+             g_value_set_boolean (value, filter->hor_polarisation);
+             break;
+           }
+
+         case PROP_SAT_NO:
+           {
+             g_value_set_uint (value, filter->sat_no);
+             break;
+           }
+           
+         case PROP_SYM_RATE:
+           {
+             /* FIXME: adjust value (multiply with 1000) or not? */
+             g_value_set_uint (value, filter->feparam.u.qpsk.symbol_rate/1000);
+             break;
+           }
+
+         default:
+           {
+             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+             break;
+           }
+         }
+         break;
+       }
+
+      case FE_QAM:
+       {
+         switch (prop_id) {
+         case PROP_FREQUENCY:
+           {
+             g_value_set_uint (value, filter->feparam.frequency);
+             break;
+           }
+
+         case PROP_INVERSION:
+           {
+             g_value_set_enum (value, filter->feparam.inversion);
+             break;
+           }
+
+         case PROP_SYM_RATE:
+           {
+             g_value_set_uint (value, filter->feparam.u.qam.symbol_rate);
+             break;
+           }
+           
+         case PROP_FEC:
+           {
+             g_value_set_uint (value, filter->feparam.u.qam.fec_inner);
+             break;
+           }
+           
+         case PROP_MODULATION:
+           {
+             g_value_set_enum (value, filter->feparam.u.qam.modulation);
+             break;
+           }
+
+         default:
+           {
+             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+             break;
+           }
+         }
+         break;
+       }
+
+      case FE_OFDM:
+       {
+         switch (prop_id) {
+         case PROP_FREQUENCY:
+           {
+             g_value_set_uint (value, filter->feparam.frequency);
+             break;
+           }
+
+         case PROP_INVERSION:
+           {
+             g_value_set_enum (value, filter->feparam.inversion);
+             break;
+           }
+
+         case PROP_BANDWIDTH:
+           {
+             g_value_set_enum (value, filter->feparam.u.ofdm.bandwidth);
+             break;
+           }
+           
+         case PROP_CODE_RATE_HIGH_PRIO:
+           {
+             g_value_set_enum (value, filter->feparam.u.ofdm.code_rate_HP);
+             break;
+           }
+
+         case PROP_CODE_RATE_LOW_PRIO:
+           {
+             g_value_set_enum (value, filter->feparam.u.ofdm.code_rate_LP);
+             break;
+           }
+
+         case PROP_CONSTELLATION:
+           {
+             g_value_set_enum (value, filter->feparam.u.ofdm.constellation);
+             break;
+           }
+
+         case PROP_TRANSMISSION_MODE:
+           {
+             g_value_set_enum (value, 
filter->feparam.u.ofdm.transmission_mode);
+             break;
+           }
+
+         case PROP_GUARD_INTERVAL:
+           {
+             g_value_set_enum (value, filter->feparam.u.ofdm.guard_interval);
+             break;
+           }
+
+         case PROP_HIERARCHY:
+           {
+             g_value_set_enum (value, 
filter->feparam.u.ofdm.hierarchy_information);
+             break;
+           }
+
+         default:
+           {
+             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+             break;
+           }
+         }
+         break;
+       }
+           
+      case FE_ATSC:
+       {
+         switch (prop_id) {
+         case PROP_FREQUENCY:
+           {
+             g_value_set_uint (value, filter->feparam.frequency);
+             break;
+           }
+
+         case PROP_MODULATION:
+           {
+             g_value_set_enum (value, filter->feparam.u.vsb.modulation);
+             break;
+           }
+
+         default:
+           {
+             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+             break;
+           }
+         }
+         break;
+       }
+      }
+    }
   }
 }
 
 /* GstElement vmethod implementations */
 
 /* this function handles the link with other elements */
-static gboolean
-gst_dvbtuner_set_caps (GstPad * pad, GstCaps * caps)
-{
-  GstDvbTuner *filter;
-  GstPad *otherpad;
+/* static gboolean */
+/* gst_dvbtuner_set_caps (GstPad * pad, GstCaps * caps) */
+/* { */
+/*   GstDvbTuner *filter; */
+/*   GstPad *otherpad; */
 
-  filter = GST_DVBTUNER (gst_pad_get_parent (pad));
-  otherpad = (pad == filter->srcpad) ? filter->sinkpad : filter->srcpad;
+/*   filter = GST_DVBTUNER (gst_pad_get_parent (pad)); */
+/*   otherpad = (pad == filter->srcpad) ? filter->sinkpad : filter->srcpad; */
 
-  return gst_pad_set_caps (pad, caps);
-}
+/*   return gst_pad_set_caps (pad, caps); */
+/* } */
 
 /* chain function
  * this function does the actual processing
  */
 
-static GstFlowReturn
-gst_dvbtuner_chain (GstPad * pad, GstBuffer * buf)
-{
-  GstDvbTuner *filter;
-
-  filter = GST_DVBTUNER (GST_OBJECT_PARENT (pad));
-
-  if (filter->debug_output == FALSE)
-    g_print ("I'm plugged, therefore I'm in.\n");
-
-  /* just push out the incoming buffer without touching it */
-  return gst_pad_push (filter->srcpad, buf);
-}
+/* static GstFlowReturn */
+/* gst_dvbtuner_chain (GstPad * pad, GstBuffer * buf) */
+/* { */
+/*   GstDvbTuner *filter; */
+
+/*   filter = GST_DVBTUNER (GST_OBJECT_PARENT (pad)); */
+
+/*   if (filter->debug_output == FALSE) */
+/*     g_print ("I'm plugged, therefore I'm in."); */
+
+/*   /\* just push out the incoming buffer without touching it *\/ */
+/*   return gst_pad_push (filter->srcpad, buf); */
+/* } */
 
 
 /* entry point to initialize the plug-in
@@ -437,8 +1114,8 @@
 /******/
 
 static void
-gst_dvbtuner_set_new_adapter_fn(GstDvbTuner *filter) {
-
+gst_dvbtuner_set_new_adapter_fn(GstDvbTuner *filter) 
+{
   if (filter->fn_frontend_dev) {
     g_free(filter->fn_frontend_dev);
   }
@@ -466,50 +1143,312 @@
 
 
 static void
-gst_dvbtuner_tuner_release(GstDvbTuner *filter) {
-  DEBUGf("FIXME! NOW!\n");
+gst_dvbtuner_tuner_release(GstDvbTuner *filter) 
+{
+  if (filter->fd_frontend_dev != -1) {
+    close(filter->fd_frontend_dev);
+    filter->fd_frontend_dev = -1;
+  }
+
+  if (filter->fd_video_dev != -1) {
+    close(filter->fd_video_dev);
+    filter->fd_video_dev = -1;
+  }
+    
+  DEBUGf("FIXME! NOW!");
   // - alle file deskriptoren schlie�en
   // - set status to DOWN
 }
 
 
 static void
-gst_dvbtuner_tuner_init(GstDvbTuner *filter) {
+gst_dvbtuner_tuner_init(GstDvbTuner *filter)
+{
 
   gst_dvbtuner_tuner_release(filter);
 
   assert(filter->fn_frontend_dev);
 
-  DEBUGf( "opening frontend device\n");
-  if ((filter->fd_frontend_dev = open(filter->fn_frontend_dev, O_RDWR)) < 0){
-    DEBUGf( "error opening frontend device: %s\n", strerror(errno));
+  DEBUGf( "opening frontend device");
+  if ((filter->fd_frontend_dev = open(filter->fn_frontend_dev, O_RDWR)) < 0) {
+    DEBUGf( "error opening frontend device: %s", strerror(errno));
+    gst_dvbtuner_tuner_release(filter);
+    return;
+  }
+  if ((fcntl(filter->fd_frontend_dev, F_SETFL, O_NONBLOCK)) < 0) {
+    DEBUGf( "setting frontend device to nonblock failed: %s", strerror(errno));
     gst_dvbtuner_tuner_release(filter);
     return;
   }
 
-  DEBUGf( "getting frontend info\n");
+  DEBUGf( "getting frontend info");
   if ((ioctl(filter->fd_frontend_dev, FE_GET_INFO, &filter->feinfo)) < 0) {
-    DEBUGf( "error getting frontend info: %s\n", strerror(errno));
+    DEBUGf( "error getting frontend info: %s", strerror(errno));
     gst_dvbtuner_tuner_release(filter);
     return;
   }
 
   if (filter->debug_output) {
     DEBUGf("frontend '%s':  ",filter->feinfo.name);
-    if(filter->feinfo.type==FE_QPSK) DEBUGf("SAT Card (DVB-S)\n");
-    if(filter->feinfo.type==FE_QAM) DEBUGf("CAB Card (DVB-C)\n");
-    if(filter->feinfo.type==FE_OFDM) DEBUGf("TER Card (DVB-T)\n");
-    if(filter->feinfo.type==FE_ATSC) DEBUGf("US Card (?)\n");
+    if(filter->feinfo.type==FE_QPSK) DEBUGf("SAT Card (DVB-S)");
+    if(filter->feinfo.type==FE_QAM) DEBUGf("CAB Card (DVB-C)");
+    if(filter->feinfo.type==FE_OFDM) DEBUGf("TER Card (DVB-T)");
+    if(filter->feinfo.type==FE_ATSC) DEBUGf("US Card (?)");
   }
   
   if ((filter->fd_video_dev=open(filter->fn_video_dev, O_RDWR)) < 0) {
     filter->hwdecoder = FALSE;
-    DEBUGf("hardware decoder absent\n");
+    DEBUGf("hardware decoder absent");
   }else{
     filter->hwdecoder = TRUE;
-    DEBUGf("hardware decoder present\n");
+    DEBUGf("hardware decoder present");
     close(filter->fd_video_dev);
     filter->fd_video_dev = -1;
   }
 }
 
+
+static void
+gst_dvbtuner_add_pid (GstDvbTuner *filter, uint pid)
+{
+  int i;
+
+  DEBUGf("adding pid %d", pid);
+
+  /* check if already added */
+  for(i=0; i<filter->pidlist.cnt; ++i) {
+    if (filter->pidlist.array[i].pid == pid) {
+      DEBUGf("pid %d already added", pid);
+      return;
+    }
+  }
+
+  /* request more mempry if needed */
+  if (filter->pidlist.free == 0) {
+    DEBUGf("no free space (cnt=%d/free=%d) - requesting more memory", 
+          filter->pidlist.cnt, filter->pidlist.free);
+
+    gint oldsize = filter->pidlist.cnt;
+    filter->pidlist.cnt += 5;
+    filter->pidlist.array = g_realloc( filter->pidlist.array, 
sizeof(GstDvbTunerPidListEntry) * filter->pidlist.cnt );
+    assert(filter->pidlist.array);
+    filter->pidlist.free += 5;
+    for(i=oldsize; i<filter->pidlist.cnt; ++i) {
+      filter->pidlist.array[i].pid = -1;
+      filter->pidlist.array[i].fd = -1;
+    }
+  }
+  
+  /* add new pid and fd */
+  i = 0;
+  while((i < filter->pidlist.cnt) && (filter->pidlist.array[i].pid != -1)) {
+    DEBUGf("i=%d  pidlist.cnt=%d  array[%d].pid=%d", i, filter->pidlist.cnt, 
i, filter->pidlist.array[i].pid);
+    i += 1;
+  }
+  assert(filter->pidlist.array[i].pid == -1);
+  filter->pidlist.array[i].fd = open(filter->fn_demux_dev, O_RDWR);
+  /* open returns -1 in case of an error */
+  if (filter->pidlist.array[i].fd != -1) {
+    DEBUGf("adding pid %d", pid);
+
+    filter->pidlist.array[i].pid = pid;
+    filter->pidlist.free -= 1;
+
+    struct dmx_pes_filter_params M;
+
+    M.pid      = pid;
+    M.input    = DMX_IN_FRONTEND;
+    M.output   = DMX_OUT_TS_TAP;
+    M.pes_type = DMX_PES_OTHER;
+    M.flags    = DMX_IMMEDIATE_START;
+    
+    DEBUGf( "ioctl(%d, DMX_SET_PES_FILTER)  pid=%d", 
+           filter->pidlist.array[i].fd, filter->pidlist.array[i].pid);
+    if (ioctl(filter->pidlist.array[i].fd, DMX_SET_PES_FILTER, &M) < 0) {
+      g_warning("ioctl failed: %s", strerror(errno));
+    }
+  }
+}
+
+
+static void
+gst_dvbtuner_remove_pid (GstDvbTuner *filter, uint pid)
+{
+  int i;
+  for(i=0; i<filter->pidlist.cnt; ++i) {
+    if (filter->pidlist.array[i].pid == pid) {
+
+      DEBUGf( "ioctl(%d, DMX_STOP)  pid=%d",
+             filter->pidlist.array[i].fd, filter->pidlist.array[i].pid);
+      ioctl(filter->pidlist.array[i].fd, DMX_STOP);
+      close(filter->pidlist.array[i].fd);
+      
+      filter->pidlist.array[i].pid = -1;
+      filter->pidlist.array[i].fd = -1;
+
+      filter->pidlist.free += 1;
+      DEBUGf("new pidlist stat: cnt=%d free=%d",
+            filter->pidlist.cnt, filter->pidlist.free);
+      return;
+    }
+  }
+}
+
+
+static void
+gst_dvbtuner_clear_pids (GstDvbTuner *filter)
+{
+  int i;
+  for(i=0; i<filter->pidlist.cnt; ++i) {
+    if (filter->pidlist.array[i].pid != -1) {
+      gst_dvbtuner_remove_pid( filter, filter->pidlist.array[i].pid );
+    }
+  }
+}
+
+
+static gint
+gst_dvbtuner_set_diseqc(GstDvbTuner *filter)
+{
+  /* returns 0 on success and -1 on failure */
+
+  struct dvb_diseqc_master_cmd cmd = {{0xe0, 0x10, 0x38, 0xf0, 0x00, 0x00}, 4};
+
+  DEBUGf("sat_no=%d  tone=%d  pol=%d",
+        filter->sat_no, filter->tone, filter->hor_polarisation);
+
+
+  cmd.msg[3] = 0xf0 | ((filter->sat_no * 4) & 0x0f) | (filter->tone ? 1 : 0) | 
(filter->hor_polarisation ? 0 : 2);
+
+  if (ioctl(filter->fd_frontend_dev, FE_SET_TONE, SEC_TONE_OFF) < 0) {
+    g_warning( "FE_SET_TONE: failed");
+    return -1;
+  }
+
+  if (ioctl(filter->fd_frontend_dev, FE_SET_VOLTAGE, 
+           filter->hor_polarisation ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18) < 0) {
+    g_warning( "FE_SET_VOLTAGE: failed");
+    return -1;
+  }
+
+  usleep(15000);
+  if (ioctl(filter->fd_frontend_dev, FE_DISEQC_SEND_MASTER_CMD, &cmd) < 0) {
+    g_warning( "FE_DISEQC_SEND_MASTER_CMD: failed");
+    return -1;
+  }
+
+  usleep(15000);
+  if (ioctl(filter->fd_frontend_dev, FE_DISEQC_SEND_BURST, 
+           (filter->sat_no / 4) % 2 ? SEC_MINI_B : SEC_MINI_A) < 0) {
+    g_warning( "FE_DISEQC_SEND_BURST: failed");
+    return -1;
+  }
+
+  usleep(15000);
+  if (ioctl(filter->fd_frontend_dev, FE_SET_TONE, 
+           filter->tone ? SEC_TONE_ON : SEC_TONE_OFF) < 0) {
+    g_warning( "FE_SET_TONE: failed");
+    return -1;
+  }
+
+   return 0;
+}
+
+
+static void
+gst_dvbtuner_tune(GstDvbTuner *filter)
+{
+  struct dvb_frontend_event event;
+
+  DEBUGf( "freq=%d  satno=%d  tone=%d  pol=%d",
+         filter->feparam.frequency,
+         filter->sat_no,
+         filter->tone,
+         filter->hor_polarisation
+         );
+
+  if (filter->feinfo.type==FE_QPSK) {
+    if (gst_dvbtuner_set_diseqc(filter) < 0) {
+      return;
+    }
+  }
+
+  if (filter->feinfo.type==FE_OFDM) {
+    DEBUGf( "front_param.frequency          = %d", filter->feparam.frequency);
+    DEBUGf( "front_param.inversion          = %d", filter->feparam.inversion);
+    DEBUGf( "front_param.ofdm.bandwidth     = %d", 
filter->feparam.u.ofdm.bandwidth );
+    DEBUGf( "front_param.ofdm.code_rate_HP  = %d", 
filter->feparam.u.ofdm.code_rate_HP );
+    DEBUGf( "front_param.ofdm.code_rate_LP  = %d", 
filter->feparam.u.ofdm.code_rate_LP );
+    DEBUGf( "front_param.ofdm.constellation = %d", 
filter->feparam.u.ofdm.constellation );
+    DEBUGf( "front_param.ofdm.transmission_m= %d", 
filter->feparam.u.ofdm.transmission_mode );
+    DEBUGf( "front_param.ofdm.guard_interval= %d", 
filter->feparam.u.ofdm.guard_interval );
+    DEBUGf( "front_param.ofdm.hierarchy_info= %d", 
filter->feparam.u.ofdm.hierarchy_information );
+  } else {
+    DEBUGf( "FIXME: print debug output" );
+  }
+  
+  /* discard stale events */
+  while (ioctl(filter->fd_frontend_dev, FE_GET_EVENT, &event) != -1);
+
+  DEBUGf("about to set frontend parameters\n");
+  if (ioctl(filter->fd_frontend_dev, FE_SET_FRONTEND, &filter->feparam) < 0) {
+    g_warning("ioctl(%d, FE_SET_FRONTEND, feparam) failed: %s", 
+             filter->fd_frontend_dev, strerror(errno));
+  }
+
+  return;
+}
+
+
+static gchar*
+gst_dvbtuner_get_status(GstDvbTuner *filter)
+{
+  gchar *txt = g_malloc(8192);
+  fe_status_t status;
+  uint16_t snr, signal;
+  uint32_t ber, uncorrected_blocks;
+
+  if (filter->fd_frontend_dev < 0 ) {
+
+    snprintf(txt, 8191, "FRONTEND NOT READY");
+
+  } else {
+    
+    snprintf(txt, 8191, "ERROR");
+    
+    if (ioctl(filter->fd_frontend_dev, FE_READ_STATUS, &status) < 0) {
+      g_warning("FE_READ_STATUS failed: %s", strerror(errno));
+      return txt;
+    }
+    if (ioctl(filter->fd_frontend_dev, FE_READ_SIGNAL_STRENGTH, &signal) < 0) {
+      g_warning("FE_READ_SIGNAL_STRENGTH failed: %s", strerror(errno));
+      return txt;
+    }
+    if (ioctl(filter->fd_frontend_dev, FE_READ_SNR, &snr) < 0) {
+      g_warning("FE_READ_SNR failed: %s", strerror(errno));
+      return txt;
+    }
+    if (ioctl(filter->fd_frontend_dev, FE_READ_BER, &ber) < 0) {
+      g_warning("FE_READ_BER failed: %s", strerror(errno));
+      return txt;
+    }
+    if (ioctl(filter->fd_frontend_dev, FE_READ_UNCORRECTED_BLOCKS, 
&uncorrected_blocks) < 0) {
+      g_warning("FE_READ_UNCORRECTED_BLOCKS failed: %s", strerror(errno));
+      return txt;
+    }
+
+    snprintf(txt, 8191, "status: %d%s%s%s%s%s%s signalstrength: %d snr: %d 
ber: %d unc: %d",
+            status,
+            (status & FE_HAS_SIGNAL ? " FE_HAS_SIGNAL" : ""),
+            (status & FE_TIMEDOUT   ? " FE_TIMEDOUT"   : ""),
+            (status & FE_HAS_LOCK   ? " FE_HAS_LOCK"   : ""),
+            (status & FE_HAS_CARRIER? " FE_HAS_CARRIER": ""),
+            (status & FE_HAS_VITERBI? " FE_HAS_VITERBI": ""),
+            (status & FE_HAS_SYNC   ? " FE_HAS_SYNC"   : ""),
+            signal,snr, ber, uncorrected_blocks );
+  }
+  
+  // DEBUGf( "%s", txt );
+
+  return txt;
+}

Modified: trunk/WIP/record/src/gstdvbtuner.h
==============================================================================
--- trunk/WIP/record/src/gstdvbtuner.h  (original)
+++ trunk/WIP/record/src/gstdvbtuner.h  Fri Nov  3 22:07:25 2006
@@ -79,10 +79,29 @@
    } while(0);
 
 
-#define GST_DVBTUNER_FN_MAX_LEN  255
+#define GST_DVBTUNER_FN_MAX_LEN          255
+#define GST_DVBTUNER_INIT_PIDLIST_LEN    5
 
 typedef struct _GstDvbTuner      GstDvbTuner;
 typedef struct _GstDvbTunerClass GstDvbTunerClass;
+typedef struct _PidList          GstDvbTunerPidList;
+typedef struct _GstDvbTunerClass GstDvbTunerPidListEntry;
+
+
+struct _PidListEntry
+{
+  gint   pid;
+  gint   fd;
+};
+
+
+struct _PidList
+{
+  gint           cnt;
+  gint           free;
+  struct _PidListEntry  *array;
+};
+
 
 struct _GstDvbTuner
 {
@@ -108,12 +127,24 @@
   gint      fd_frontend_dev;
   gint      fd_video_dev;
 
+  GstDvbTunerPidList  pidlist;
+
+  gboolean  hor_polarisation;
+  guint32   sat_no;
+  gint      tone;
+
   struct dvb_frontend_info       feinfo;
+  struct dvb_frontend_parameters feparam;
 };
 
 struct _GstDvbTunerClass 
 {
   GstElementClass parent_class;
+
+  void          (*add_pid)          (GstDvbTuner *filter, uint pid);
+  void          (*remove_pid)       (GstDvbTuner *filter, uint pid);
+  void          (*clear_pids)       (GstDvbTuner *filter);
+  void          (*tune)             (GstDvbTuner *filter);
 };
 
 GType gst_dvbtuner_get_type (void);
@@ -121,6 +152,11 @@
 static void gst_dvbtuner_set_new_adapter_fn(GstDvbTuner *filter);
 static void gst_dvbtuner_tuner_init(GstDvbTuner *filter);
 static void gst_dvbtuner_tuner_release(GstDvbTuner *filter);
+static void gst_dvbtuner_add_pid (GstDvbTuner *filter, uint pid);
+static void gst_dvbtuner_remove_pid (GstDvbTuner *filter, uint pid);
+static void gst_dvbtuner_clear_pids (GstDvbTuner *filter);
+static void gst_dvbtuner_tune (GstDvbTuner *filter);
+static gchar* gst_dvbtuner_get_status(GstDvbTuner *filter);
 
 G_END_DECLS
 

Added: trunk/WIP/record/src/tuner.py
==============================================================================
--- (empty file)
+++ trunk/WIP/record/src/tuner.py       Fri Nov  3 22:07:25 2006
@@ -0,0 +1,48 @@
+#!/usr/bin/python
+import pygst
+pygst.require('0.10')
+import gst
+import sys
+import time
+
+tuner = gst.element_factory_make("dvbtuner", "tuner")
+
+tuner.set_property('debug-output', True)
+tuner.set_property('adapter', 0)
+
+frontendlist = [ "QPSK (DVB-S)", "QAM (DVB-C)", "OFDM (DVB-T)", "ATSC" ]
+frontendtype = tuner.get_property('frontendtype')
+print 'FRONTEND-TYPE: ', frontendlist[ frontendtype ]
+print 'FRONTEND-NAME: ', tuner.get_property('frontendname')
+print 'HWDECODER?   : ', tuner.get_property('hwdecoder')
+
+if frontendtype != 2:
+    print 'the following code supports only DVB-T cards!'
+    sys.exit()
+
+
+# tuning to RTL (hardcoded values! change them!)
+# run "gst-inspect dvbtuner" for valid values
+tuner.set_property("frequency", 642000000)
+tuner.set_property("inversion", 2)
+tuner.set_property("bandwidth", 0)
+tuner.set_property("code-rate-high-prio", 2)
+tuner.set_property("code-rate-low-prio", 0)
+tuner.set_property("constellation", 1)
+tuner.set_property("transmission-mode", 1)
+tuner.set_property("guard-interval", 2)
+tuner.set_property("hierarchy", 0)
+
+# add tuner and video pid
+tuner.emit("add-pid", 0x151)
+tuner.emit("add-pid", 0x152)
+
+# tune to channel
+tuner.emit("tune")
+
+while 1:
+    time.sleep(1)
+    print tuner.get_property("status")
+
+# now tun something like
+# cat /dev/dvb/adapter0/dvr0 | mplayer -vf pp=md/de,phase=U -

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Freevo-cvslog mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-cvslog

Reply via email to