summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>2014-08-12 12:35:00 -0400
committerReynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>2014-08-13 13:10:03 -0400
commit23fccad1fde31ebe149d72006caf9f57ee3f5655 (patch)
treec2286da0b9eaffd867d49eee33fd34e8e7249de9
parent16201cec344d619c7e1624cb83bd9722f82e4971 (diff)
dvbsrc: dvbbasebin: add 'tune' signal
It works the same as the 'tune' property that is used only to signal the element that it should tune, but it is more natural to be used as a signal rather than a property. It is also proxied at the dvbbasebin element
-rw-r--r--sys/dvb/dvbbasebin.c24
-rw-r--r--sys/dvb/dvbbasebin.h1
-rw-r--r--sys/dvb/gstdvbsrc.c43
-rw-r--r--sys/dvb/gstdvbsrc.h2
4 files changed, 60 insertions, 10 deletions
diff --git a/sys/dvb/dvbbasebin.c b/sys/dvb/dvbbasebin.c
index 27fdd0f94..8a3503673 100644
--- a/sys/dvb/dvbbasebin.c
+++ b/sys/dvb/dvbbasebin.c
@@ -54,6 +54,7 @@ enum
SIGNAL_TUNING_START,
SIGNAL_TUNING_DONE,
SIGNAL_TUNING_FAIL,
+ SIGNAL_TUNE,
LAST_SIGNAL
};
@@ -160,6 +161,8 @@ static void tuning_start_signal_cb (GObject * object, DvbBaseBin * dvbbasebin);
static void tuning_done_signal_cb (GObject * object, DvbBaseBin * dvbbasebin);
static void tuning_fail_signal_cb (GObject * object, DvbBaseBin * dvbbasebin);
+static void dvb_base_bin_do_tune (DvbBaseBin * dvbbasebin);
+
#define dvb_base_bin_parent_class parent_class
G_DEFINE_TYPE_EXTENDED (DvbBaseBin, dvb_base_bin, GST_TYPE_BIN,
0,
@@ -252,6 +255,11 @@ tuning_fail_signal_cb (GObject * object, DvbBaseBin * dvbbasebin)
g_signal_emit (dvbbasebin, dvb_base_bin_signals[SIGNAL_TUNING_FAIL], 0);
}
+static void
+dvb_base_bin_do_tune (DvbBaseBin * dvbbasebin)
+{
+ g_signal_emit_by_name (dvbbasebin->dvbsrc, "tune", NULL);
+}
static void
dvb_base_bin_class_init (DvbBaseBinClass * klass)
@@ -259,6 +267,7 @@ dvb_base_bin_class_init (DvbBaseBinClass * klass)
GObjectClass *gobject_class;
GstElementClass *element_class;
GstBinClass *bin_class;
+ DvbBaseBinClass *dvbbasebin_class;
GstElementFactory *dvbsrc_factory;
GObjectClass *dvbsrc_class;
typedef struct
@@ -339,6 +348,9 @@ dvb_base_bin_class_init (DvbBaseBinClass * klass)
gobject_class->dispose = dvb_base_bin_dispose;
gobject_class->finalize = dvb_base_bin_finalize;
+ dvbbasebin_class = (DvbBaseBinClass *) klass;
+ dvbbasebin_class->do_tune = dvb_base_bin_do_tune;
+
/* install dvbsrc properties */
dvbsrc_factory = gst_element_factory_find ("dvbsrc");
dvbsrc_class =
@@ -434,6 +446,18 @@ dvb_base_bin_class_init (DvbBaseBinClass * klass)
g_signal_new ("tuning-fail", G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0);
+ /**
+ * DvbBaseBin::tune:
+ * @dvbbasesink: the element on which the signal is emitted
+ *
+ * Signal emited from the application to the element, instructing it
+ * to tune.
+ */
+ dvb_base_bin_signals[SIGNAL_TUNE] =
+ g_signal_new ("tune", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (DvbBaseBinClass, do_tune),
+ NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
}
static void
diff --git a/sys/dvb/dvbbasebin.h b/sys/dvb/dvbbasebin.h
index 27a91b540..8454c92f3 100644
--- a/sys/dvb/dvbbasebin.h
+++ b/sys/dvb/dvbbasebin.h
@@ -71,6 +71,7 @@ struct _DvbBaseBinClass {
GstBinClass parent_class;
/* signals */
+ void (*do_tune) (DvbBaseBin * dvbbasebin);
};
GType dvb_base_bin_get_type(void);
diff --git a/sys/dvb/gstdvbsrc.c b/sys/dvb/gstdvbsrc.c
index 0aa0dde53..be1b0ee32 100644
--- a/sys/dvb/gstdvbsrc.c
+++ b/sys/dvb/gstdvbsrc.c
@@ -160,6 +160,7 @@ enum
SIGNAL_TUNING_START,
SIGNAL_TUNING_DONE,
SIGNAL_TUNING_FAIL,
+ SIGNAL_TUNE,
LAST_SIGNAL
};
@@ -512,6 +513,7 @@ static gboolean gst_dvbsrc_unlock_stop (GstBaseSrc * bsrc);
static gboolean gst_dvbsrc_is_seekable (GstBaseSrc * bsrc);
static gboolean gst_dvbsrc_get_size (GstBaseSrc * src, guint64 * size);
+static void gst_dvbsrc_do_tune (GstDvbSrc * src);
static gboolean gst_dvbsrc_tune (GstDvbSrc * object);
static gboolean gst_dvbsrc_set_fe_params (GstDvbSrc * object,
struct dtv_properties *props);
@@ -551,11 +553,13 @@ gst_dvbsrc_class_init (GstDvbSrcClass * klass)
GstElementClass *gstelement_class;
GstBaseSrcClass *gstbasesrc_class;
GstPushSrcClass *gstpushsrc_class;
+ GstDvbSrcClass *gstdvbsrc_class;
gobject_class = (GObjectClass *) klass;
gstelement_class = (GstElementClass *) klass;
gstbasesrc_class = (GstBaseSrcClass *) klass;
gstpushsrc_class = (GstPushSrcClass *) klass;
+ gstdvbsrc_class = (GstDvbSrcClass *) klass;
gobject_class->set_property = gst_dvbsrc_set_property;
gobject_class->get_property = gst_dvbsrc_get_property;
@@ -582,6 +586,8 @@ gst_dvbsrc_class_init (GstDvbSrcClass * klass)
gstpushsrc_class->create = GST_DEBUG_FUNCPTR (gst_dvbsrc_create);
+ gstdvbsrc_class->do_tune = GST_DEBUG_FUNCPTR (gst_dvbsrc_do_tune);
+
g_object_class_install_property (gobject_class, ARG_DVBSRC_ADAPTER,
g_param_spec_int ("adapter", "The adapter device number",
"The DVB adapter device number (eg. 0 for adapter0)",
@@ -895,6 +901,19 @@ gst_dvbsrc_class_init (GstDvbSrcClass * klass)
g_signal_new ("tuning-fail", G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0);
+ /**
+ * GstDvbSrc::tune:
+ * @gstdvbsrc: the element on which the signal is emitted
+ *
+ * Signal emited from the application to the element, instructing it
+ * to tune.
+ */
+ gst_dvbsrc_signals[SIGNAL_TUNING_FAIL] =
+ g_signal_new ("tune", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (GstDvbSrcClass, do_tune),
+ NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
}
/* initialize the new element
@@ -1147,18 +1166,10 @@ gst_dvbsrc_set_property (GObject * _object, guint prop_id,
case ARG_DVBSRC_INVERSION:
object->inversion = g_value_get_enum (value);
break;
- case ARG_DVBSRC_TUNE:{
+ case ARG_DVBSRC_TUNE:
GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_TUNE");
-
- /* if we are in paused/playing state tune now, otherwise in ready
- * to paused state change */
- if (GST_STATE (object) > GST_STATE_READY) {
- g_mutex_lock (&object->tune_mutex);
- gst_dvbsrc_tune (object);
- g_mutex_unlock (&object->tune_mutex);
- }
+ gst_dvbsrc_do_tune (object);
break;
- }
case ARG_DVBSRC_STATS_REPORTING_INTERVAL:
object->stats_interval = g_value_get_uint (value);
object->stats_counter = 0;
@@ -1962,6 +1973,18 @@ gst_dvbsrc_get_size (GstBaseSrc * src, guint64 * size)
}
static void
+gst_dvbsrc_do_tune (GstDvbSrc * src)
+{
+ /* if we are in paused/playing state tune now, otherwise in ready
+ * to paused state change */
+ if (GST_STATE (src) > GST_STATE_READY) {
+ g_mutex_lock (&src->tune_mutex);
+ gst_dvbsrc_tune (src);
+ g_mutex_unlock (&src->tune_mutex);
+ }
+}
+
+static void
gst_dvbsrc_output_frontend_stats (GstDvbSrc * src)
{
fe_status_t status;
diff --git a/sys/dvb/gstdvbsrc.h b/sys/dvb/gstdvbsrc.h
index 8cc340279..cbc422dc5 100644
--- a/sys/dvb/gstdvbsrc.h
+++ b/sys/dvb/gstdvbsrc.h
@@ -135,6 +135,8 @@ struct _GstDvbSrcClass
void (*adapter_type) (GstElement * element, gint type);
void (*signal_quality) (GstElement * element, gint strength, gint snr);
+
+ void (*do_tune) (GstDvbSrc * self);
};