diff options
-rw-r--r-- | ChangeLog | 19 | ||||
-rw-r--r-- | po/POTFILES.in | 1 | ||||
-rw-r--r-- | sys/dvb/gstdvbsrc.c | 165 | ||||
-rw-r--r-- | sys/dvb/gstdvbsrc.h | 6 |
4 files changed, 113 insertions, 78 deletions
@@ -1,3 +1,22 @@ +2006-11-04 Thomas Vander Stichele <thomas at apestaart dot org> + + * po/POTFILES.in: + add dvbsrc + * sys/dvb/gstdvbsrc.c: (gst_dvbsrc_class_init), (gst_dvbsrc_init), + (gst_dvbsrc_set_property), (gst_dvbsrc_get_property), + (gst_dvbsrc_open_frontend), (gst_dvbsrc_open_dvr), + (gst_dvbsrc_finalize), (read_device), (gst_dvbsrc_create), + (gst_dvbsrc_start), (gst_dvbsrc_frontend_status), + (gst_dvbsrc_tune), (gst_dvbsrc_unset_pes_filters), + (gst_dvbsrc_set_pes_filter): + * sys/dvb/gstdvbsrc.h: + adapter-prefix is a terrible name for a device, so replace it. + strerror should be used immediately after the syscall related to it. + Actually throw a reasonable GST_ELEMENT_ERROR if we fail to open + (pretty easy to trigger by opening the same device twice). + Use _OBJECT macros where it makes sense. + This element is going to need some work before it moves. + 2006-11-02 Tim-Philipp Müller <tim at centricular dot net> Patch by: Sebastian Dröge <slomo at circular-chaos.org> diff --git a/po/POTFILES.in b/po/POTFILES.in index 3bcb4dfa..43832d16 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -6,3 +6,4 @@ # sys/dxr3/dxr3videosink.c gst/qtdemux/qtdemux.c +sys/dvb/gstdvbsrc.c diff --git a/sys/dvb/gstdvbsrc.c b/sys/dvb/gstdvbsrc.c index 6d70ef5f..2c830fa2 100644 --- a/sys/dvb/gstdvbsrc.c +++ b/sys/dvb/gstdvbsrc.c @@ -40,6 +40,8 @@ #include <linux/dvb/frontend.h> #include <linux/dvb/dmx.h> +#include "../../gst-libs/gst/gst-i18n-plugin.h" + GST_DEBUG_CATEGORY_STATIC (gstdvbsrc_debug); #define GST_CAT_DEFAULT (gstdvbsrc_debug) @@ -89,7 +91,7 @@ static GstElementDetails dvbsrc_details = { enum { ARG_0, - ARG_DVBSRC_ADAPTER_PREFIX, + ARG_DVBSRC_DEVICE, ARG_DVBSRC_DISEQC_SRC, ARG_DVBSRC_FREQ, ARG_DVBSRC_POL, @@ -257,7 +259,6 @@ gst_dvbsrc_inversion_get_type (void) return dvbsrc_inversion_type; } -static void gst_dvbsrc_dispose (GObject * object); static void gst_dvbsrc_finalize (GObject * object); static void gst_dvbsrc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -330,7 +331,6 @@ gst_dvbsrc_class_init (GstDvbSrcClass * klass) gobject_class->set_property = gst_dvbsrc_set_property; gobject_class->get_property = gst_dvbsrc_get_property; - gobject_class->dispose = gst_dvbsrc_dispose; gobject_class->finalize = gst_dvbsrc_finalize; gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_dvbsrc_start); @@ -341,11 +341,10 @@ gst_dvbsrc_class_init (GstDvbSrcClass * klass) gstpushsrc_class->create = gst_dvbsrc_create; - g_object_class_install_property (gobject_class, ARG_DVBSRC_ADAPTER_PREFIX, - g_param_spec_string ("adapter-prefix", - "adapter-prefix", - "The adapter prefix. e.g. /dev/dvb/adapter0", - "/dev/dvb/adapter0", G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, ARG_DVBSRC_DEVICE, + g_param_spec_string ("device", + "device", + "The device directory", "/dev/dvb/adapter0", G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, ARG_DVBSRC_FREQ, g_param_spec_int ("freq", @@ -439,7 +438,7 @@ gst_dvbsrc_init (GstDvbSrc * object, GstDvbSrcClass * klass) { int i = 0; - GST_INFO ("gst_dvbsrc_init"); + GST_INFO_OBJECT (object, "gst_dvbsrc_init"); /* We are a live source */ gst_base_src_set_live (GST_BASE_SRC (object), TRUE); @@ -455,11 +454,10 @@ gst_dvbsrc_init (GstDvbSrc * object, GstDvbSrcClass * klass) object->pids[0] = 8192; /* Setting standard devices */ - object->adapter_prefix = g_strdup (DEFAULT_ADAPTER_PREFIX); - object->frontend_dev = - g_strconcat (object->adapter_prefix, "/frontend0", NULL); - object->demux_dev = g_strconcat (object->adapter_prefix, "/demux0", NULL); - object->dvr_dev = g_strconcat (object->adapter_prefix, "/dvr0", NULL); + object->device = g_strdup (DEFAULT_DEVICE); + object->frontend_dev = g_strconcat (object->device, "/frontend0", NULL); + object->demux_dev = g_strconcat (object->device, "/demux0", NULL); + object->dvr_dev = g_strconcat (object->device, "/dvr0", NULL); object->sym_rate = DEFAULT_SYMBOL_RATE; object->diseqc_src = DEFAULT_DISEQC_SRC; @@ -479,36 +477,35 @@ gst_dvbsrc_set_property (GObject * _object, guint prop_id, object = GST_DVBSRC (_object); switch (prop_id) { - case ARG_DVBSRC_ADAPTER_PREFIX: + case ARG_DVBSRC_DEVICE: { char delim_str[] = "/\0"; - if (object->adapter_prefix != NULL) - g_free (object->adapter_prefix); - object->adapter_prefix = g_value_dup_string (value); + if (object->device != NULL) + g_free (object->device); + object->device = g_value_dup_string (value); - if (g_str_has_suffix (object->adapter_prefix, "/")) + if (g_str_has_suffix (object->device, "/")) delim_str[0] = '\0'; object->frontend_dev = - g_strconcat (object->adapter_prefix, delim_str, "frontend0", NULL); + g_strconcat (object->device, delim_str, "frontend0", NULL); object->demux_dev = - g_strconcat (object->adapter_prefix, delim_str, "demux0", NULL); - object->dvr_dev = - g_strconcat (object->adapter_prefix, delim_str, "dvr0", NULL); + g_strconcat (object->device, delim_str, "demux0", NULL); + object->dvr_dev = g_strconcat (object->device, delim_str, "dvr0", NULL); } - GST_INFO ("Set Property: ARG_DVBSRC_ADAPTER_PREFIX"); + GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_DEVICE"); break; case ARG_DVBSRC_DISEQC_SRC: if (object->diseqc_src != g_value_get_int (value)) { object->diseqc_src = g_value_get_int (value); object->send_diseqc = TRUE; } - GST_INFO ("Set Property: ARG_DVBSRC_DISEQC_ID"); + GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_DISEQC_ID"); break; case ARG_DVBSRC_FREQ: object->freq = g_value_get_int (value); - GST_INFO ("Set Property: ARG_DVBSRC_FREQ"); + GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_FREQ"); break; case ARG_DVBSRC_POL: { @@ -518,7 +515,7 @@ gst_dvbsrc_set_property (GObject * _object, guint prop_id, if (s != NULL) object->pol = (s[0] == 'h' || s[0] == 'H') ? DVB_POL_H : DVB_POL_V; } - GST_INFO ("Set Property: ARG_DVBSRC_POL"); + GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_POL"); break; case ARG_DVBSRC_PIDS: { @@ -528,13 +525,13 @@ gst_dvbsrc_set_property (GObject * _object, guint prop_id, gchar **pids; char **tmp; - GST_INFO ("Set Property: ARG_DVBSRC_PIDS"); + GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_PIDS"); pid_string = g_value_dup_string (value); tmp = pids = g_strsplit (pid_string, ":", MAX_FILTERS); while (*pids != NULL && pid_count < MAX_FILTERS) { pid = strtol (*pids, NULL, 0); if (pid > 0 && pid <= 8192) { - GST_INFO ("Parsed Pid: %d\n", pid); + GST_INFO_OBJECT (object, "Parsed Pid: %d\n", pid); object->pids[pid_count] = pid; pid_count++; } @@ -545,7 +542,7 @@ gst_dvbsrc_set_property (GObject * _object, guint prop_id, break; case ARG_DVBSRC_SYM_RATE: object->sym_rate = g_value_get_int (value); - GST_INFO ("Set Property: ARG_DVBSRC_SYM_RATE to value %d", + GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_SYM_RATE to value %d", g_value_get_int (value)); break; @@ -574,7 +571,7 @@ gst_dvbsrc_set_property (GObject * _object, guint prop_id, object->inversion = g_value_get_enum (value); break; case ARG_DVBSRC_TUNE: - GST_INFO ("Set Property: 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_element_get_state (GST_ELEMENT (object), NULL, NULL, @@ -601,8 +598,8 @@ gst_dvbsrc_get_property (GObject * _object, guint prop_id, object = GST_DVBSRC (_object); switch (prop_id) { - case ARG_DVBSRC_ADAPTER_PREFIX: - g_value_set_string (value, object->adapter_prefix); + case ARG_DVBSRC_DEVICE: + g_value_set_string (value, object->device); break; case ARG_DVBSRC_FREQ: g_value_set_int (value, object->freq); @@ -643,22 +640,36 @@ gst_dvbsrc_open_frontend (GstDvbSrc * object) struct dvb_frontend_info fe_info; char *adapter_desc = NULL; - GST_INFO ("Using frontend: %s", object->frontend_dev); - GST_INFO ("Using dvr: %s", object->dvr_dev); + GST_INFO_OBJECT (object, "Using frontend device: %s", object->frontend_dev); + GST_INFO_OBJECT (object, "Using dvr device: %s", object->dvr_dev); /* open frontend */ if ((object->fd_frontend = open (object->frontend_dev, O_RDWR)) < 0) { + switch (errno) { + case ENOENT: + GST_ELEMENT_ERROR (object, RESOURCE, NOT_FOUND, + (_("Device \"%s\" does not exist."), object->frontend_dev), (NULL)); + break; + default: + GST_ELEMENT_ERROR (object, RESOURCE, OPEN_READ_WRITE, + (_("Could not open frontend device \"%s\"."), object->frontend_dev), + GST_ERROR_SYSTEM); + break; + } + close (object->fd_dvr); - g_warning ("Could not open frontend: %s, %s", object->frontend_dev, - strerror (errno)); + return FALSE; } if (ioctl (object->fd_frontend, FE_GET_INFO, &fe_info) < 0) { + GST_ELEMENT_ERROR (object, RESOURCE, SETTINGS, + (_("Could not get settings from frontend device \"%s\"."), + object->frontend_dev), GST_ERROR_SYSTEM); + close (object->fd_dvr); close (object->fd_frontend); - g_warning ("Unable to get frontend info: %s", strerror (errno)); return FALSE; } @@ -680,7 +691,7 @@ gst_dvbsrc_open_frontend (GstDvbSrc * object) /*g_signal_emit (G_OBJECT (object), gst_dvbsrc_signals[ADAPTER_TYPE_SIGNAL], 0, object->adapter_type); */ - GST_INFO ("DVB card: %s ", fe_info.name); + GST_INFO_OBJECT (object, "DVB card: %s ", fe_info.name); return TRUE; } @@ -689,34 +700,33 @@ gst_dvbsrc_open_dvr (GstDvbSrc * object) { /* open DVR */ if ((object->fd_dvr = open (object->dvr_dev, O_RDONLY | O_NONBLOCK)) < 0) { - g_warning ("Could not open dvr device: %s", object->dvr_dev); + switch (errno) { + case ENOENT: + GST_ELEMENT_ERROR (object, RESOURCE, NOT_FOUND, + (_("Device \"%s\" does not exist."), object->dvr_dev), (NULL)); + break; + default: + GST_ELEMENT_ERROR (object, RESOURCE, OPEN_READ, + (_("Could not open file \"%s\" for reading."), object->dvr_dev), + GST_ERROR_SYSTEM); + break; + } return FALSE; } - GST_INFO ("Setting buffer size"); + GST_INFO_OBJECT (object, "Setting buffer size"); if (ioctl (object->fd_dvr, DMX_SET_BUFFER_SIZE, 1024 * 1024) < 0) { - GST_INFO ("DMX_SET_BUFFER_SIZE failed"); + GST_INFO_OBJECT (object, "DMX_SET_BUFFER_SIZE failed"); return FALSE; } return TRUE; } static void -gst_dvbsrc_dispose (GObject * _object) -{ - GstDvbSrc *object; - - GST_DEBUG ("gst_dvbsrc_dispose"); - - g_return_if_fail (GST_IS_DVBSRC (_object)); - object = GST_DVBSRC (_object); -} - -static void gst_dvbsrc_finalize (GObject * _object) { GstDvbSrc *object; - GST_DEBUG ("gst_dvbsrc_finalize"); + GST_DEBUG_OBJECT (_object, "gst_dvbsrc_finalize"); g_return_if_fail (GST_IS_DVBSRC (_object)); object = GST_DVBSRC (_object); @@ -754,9 +764,11 @@ plugin_init (GstPlugin * plugin) GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "dvbsrc", - "DVB Source", plugin_init, VERSION, "LGPL", "", "University of Paderborn") + "DVB Source", plugin_init, VERSION, "LGPL", "", "University of Paderborn"); + - static GstBuffer *read_device (int fd, const char *fd_name, int size) +static GstBuffer * +read_device (int fd, const char *fd_name, int size) { int count = 0; struct pollfd pfd[1]; @@ -845,7 +857,7 @@ gst_dvbsrc_create (GstPushSrc * element, GstBuffer ** buf) if (object->fd_dvr > -1) { /* --- Read TS from DVR device --- */ - GST_DEBUG ("Reading from DVR device"); + GST_DEBUG_OBJECT (object, "Reading from DVR device"); *buf = read_device (object->fd_dvr, object->dvr_dev, buffer_size); if (*buf != NULL) { GstCaps *caps; @@ -864,7 +876,7 @@ gst_dvbsrc_create (GstPushSrc * element, GstBuffer ** buf) quality_signal_rate++; } } else { - GST_DEBUG ("Failed to read from device"); + GST_DEBUG_OBJECT (object, "Failed to read from device"); } } @@ -884,7 +896,7 @@ gst_dvbsrc_start (GstBaseSrc * bsrc) return FALSE; } if (!gst_dvbsrc_open_dvr (src)) { - GST_ERROR ("\nNot able to open dvr_device"); + GST_ERROR_OBJECT (src, "Not able to open dvr_device"); return FALSE; } @@ -948,19 +960,20 @@ gst_dvbsrc_frontend_status (GstDvbSrc * object) fe_status_t status = 0; gint i; - GST_INFO ("gst_dvbsrc_frontend_status\n"); + GST_INFO_OBJECT (object, "gst_dvbsrc_frontend_status\n"); if (object->fd_frontend < 0) { - GST_ERROR ("Trying to get frontend status from not opened device!"); + GST_ERROR_OBJECT (object, + "Trying to get frontend status from not opened device!"); return FALSE; } else - GST_INFO ("fd-frontend: %d", object->fd_frontend); + GST_INFO_OBJECT (object, "fd-frontend: %d", object->fd_frontend); for (i = 0; i < 15; i++) { usleep (1000000); - GST_INFO ("."); + GST_INFO_OBJECT (object, "."); if (ioctl (object->fd_frontend, FE_READ_STATUS, &status) == -1) { - GST_ERROR ("Failed reading frontend status."); + GST_ERROR_OBJECT (object, "Failed reading frontend status."); return FALSE; } gst_dvbsrc_output_frontend_stats (object); @@ -970,7 +983,8 @@ gst_dvbsrc_frontend_status (GstDvbSrc * object) } if (!(status & FE_HAS_LOCK)) { - GST_INFO ("Not able to lock to the signal on the given frequency.\n"); + GST_INFO_OBJECT (object, + "Not able to lock to the signal on the given frequency.\n"); return FALSE; } else return TRUE; @@ -1047,11 +1061,11 @@ gst_dvbsrc_tune (GstDvbSrc * object) * - then tell the MPEG decoder to start * - before tuning: first stop the MPEG decoder, then stop all filters */ - GST_INFO ("gst_dvbsrc_tune"); + GST_INFO_OBJECT (object, "gst_dvbsrc_tune"); if (object->fd_frontend < 0) { /* frontend not opened yet, tune later */ - GST_INFO ("Frontend not open: tuning later"); + GST_INFO_OBJECT (object, "Frontend not open: tuning later"); return FALSE; } @@ -1077,7 +1091,8 @@ gst_dvbsrc_tune (GstDvbSrc * object) feparams.frequency = freq; object->tone = SEC_TONE_OFF; } - GST_INFO ("tuning DVB-S to L-Band:%u, Pol:%d, srate=%u, 22kHz=%s", + GST_INFO_OBJECT (object, + "tuning DVB-S to L-Band:%u, Pol:%d, srate=%u, 22kHz=%s", feparams.frequency, object->pol, sym_rate, object->tone == SEC_TONE_ON ? "on" : "off"); @@ -1099,7 +1114,7 @@ gst_dvbsrc_tune (GstDvbSrc * object) g_warning ("Error setting tone: %s", strerror (errno)); } } else { - GST_DEBUG ("Sending DISEqC"); + GST_DEBUG_OBJECT (object, "Sending DISEqC"); diseqc (object->fd_frontend, object->diseqc_src, voltage, object->tone); /* Once diseqc source is set, do not set it again until * app decides to change it */ @@ -1118,10 +1133,10 @@ gst_dvbsrc_tune (GstDvbSrc * object) feparams.u.ofdm.hierarchy_information = object->hierarchy_information; feparams.inversion = object->inversion; - GST_INFO ("tuning DVB-T to %d Hz\n", freq); + GST_INFO_OBJECT (object, "tuning DVB-T to %d Hz\n", freq); break; case FE_QAM: - GST_INFO ("Tuning DVB-C to %d, srate=%d", freq, sym_rate); + GST_INFO_OBJECT (object, "Tuning DVB-C to %d, srate=%d", freq, sym_rate); feparams.frequency = freq; feparams.inversion = INVERSION_OFF; feparams.u.qam.fec_inner = FEC_AUTO; @@ -1151,7 +1166,7 @@ gst_dvbsrc_unset_pes_filters (GstDvbSrc * object) { int i = 0; - GST_INFO ("clearing PES filter"); + GST_INFO_OBJECT (object, "clearing PES filter"); for (i = 0; i < MAX_FILTERS; i++) { if (object->fd_filters[i] == -1) @@ -1168,7 +1183,7 @@ gst_dvbsrc_set_pes_filter (GstDvbSrc * object) int pid, i; struct dmx_pes_filter_params pes_filter; - GST_INFO ("Setting PES filter"); + GST_INFO_OBJECT (object, "Setting PES filter"); for (i = 0; i < MAX_FILTERS; i++) { if (object->pids[i] == 0) @@ -1190,8 +1205,8 @@ gst_dvbsrc_set_pes_filter (GstDvbSrc * object) pes_filter.pes_type = DMX_PES_OTHER; pes_filter.flags = DMX_IMMEDIATE_START; - GST_INFO ("Setting pes-filter, pid = %d, type = %d", pes_filter.pid, - pes_filter.pes_type); + GST_INFO_OBJECT (object, "Setting pes-filter, pid = %d, type = %d", + pes_filter.pid, pes_filter.pes_type); if (ioctl (*fd, DMX_SET_PES_FILTER, &pes_filter) < 0) g_warning ("Error setting PES filter on %s: %s", object->demux_dev, diff --git a/sys/dvb/gstdvbsrc.h b/sys/dvb/gstdvbsrc.h index 8bfa0e57..3edb903a 100644 --- a/sys/dvb/gstdvbsrc.h +++ b/sys/dvb/gstdvbsrc.h @@ -22,9 +22,9 @@ extern "C" #define IPACKS 2048 #define TS_SIZE 188 #define IN_SIZE TS_SIZE*10 -#define MAX_ATTEMPTS 10 // limit timeouts for poll +#define MAX_ATTEMPTS 10 /* limit timeouts for poll */ -#define DEFAULT_ADAPTER_PREFIX "/dev/dvb/adapter0" +#define DEFAULT_DEVICE "/dev/dvb/adapter0" #define DEFAULT_SYMBOL_RATE 0 #define DEFAULT_BUFFER_SIZE 8192 #define DEFAULT_DISEQC_SRC -1 /* disabled */ @@ -57,7 +57,7 @@ extern "C" int adapter_type; - char *adapter_prefix; + char *device; /* the device directory with the sub-devices */ char *frontend_dev; char *dvr_dev; char *demux_dev; |