static void gst_vcdsrc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstVCDSrc *src; src = GST_VCDSRC (object); switch (prop_id) { case PROP_DEVICE: g_free (src->device); src->device = g_value_dup_string (value); break; case PROP_TRACK: if (g_value_get_int (value) >= 1 && g_value_get_int (value) < src->numtracks) { src->track = g_value_get_int (value); gst_vcdsrc_recalculate (src); } break; case PROP_MAX_ERRORS: src->max_errors = g_value_get_int (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
/* open the file, necessary to go to RUNNING state */ static gboolean gst_vcdsrc_start (GstBaseSrc * bsrc) { int i; GstVCDSrc *src = GST_VCDSRC (bsrc); /* open the device */ src->fd = open (src->device, O_RDONLY); if (src->fd < 0) goto open_failed; /* read the table of contents */ if (ioctl (src->fd, CDROMREADTOCHDR, &src->tochdr)) goto toc_failed; /* allocate enough track structs for disk */ src->numtracks = (src->tochdr.cdth_trk1 - src->tochdr.cdth_trk0) + 1; src->tracks = g_new (struct cdrom_tocentry, src->numtracks + 1); /* read each track entry */ for (i = 0; i <= src->numtracks; i++) { src->tracks[i].cdte_track = i == src->numtracks ? CDROM_LEADOUT : i + 1; src->tracks[i].cdte_format = CDROM_MSF; if (ioctl (src->fd, CDROMREADTOCENTRY, &src->tracks[i])) goto toc_entry_failed; GST_DEBUG ("track %d begins at %d:%02d.%02d", i, src->tracks[i].cdte_addr.msf.minute, src->tracks[i].cdte_addr.msf.second, src->tracks[i].cdte_addr.msf.frame); } src->curoffset = 0; gst_vcdsrc_recalculate (src); return TRUE; /* ERRORS */ open_failed: { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), GST_ERROR_SYSTEM); return FALSE; } toc_failed: { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), GST_ERROR_SYSTEM); close (src->fd); return FALSE; } toc_entry_failed: { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), GST_ERROR_SYSTEM); g_free (src->tracks); close (src->fd); return FALSE; } }
/* open the file, necessary to go to RUNNING state */ static gboolean gst_vcdsrc_start (GstBaseSrc * bsrc) { int i; GstVCDSrc *src = GST_VCDSRC (bsrc); struct stat buf; /* open the device */ src->fd = open (src->device, O_RDONLY); if (src->fd < 0) goto open_failed; if (fstat (src->fd, &buf) < 0) goto toc_failed; /* If it's not a block device, then we need to try and * parse the cue file if there is one * FIXME implement */ if (!S_ISBLK (buf.st_mode)) { GST_DEBUG ("Reading CUE files not handled yet, cannot process %s", GST_STR_NULL (src->device)); goto toc_failed; } /* read the table of contents */ if (ioctl (src->fd, CDROMREADTOCHDR, &src->tochdr)) goto toc_failed; /* allocate enough track structs for disk */ src->numtracks = (src->tochdr.cdth_trk1 - src->tochdr.cdth_trk0) + 1; src->tracks = g_new (struct cdrom_tocentry, src->numtracks + 1); /* read each track entry */ for (i = 0; i <= src->numtracks; i++) { src->tracks[i].cdte_track = i == src->numtracks ? CDROM_LEADOUT : i + 1; src->tracks[i].cdte_format = CDROM_MSF; if (ioctl (src->fd, CDROMREADTOCENTRY, &src->tracks[i])) goto toc_entry_failed; GST_DEBUG ("track %d begins at %d:%02d.%02d", i, src->tracks[i].cdte_addr.msf.minute, src->tracks[i].cdte_addr.msf.second, src->tracks[i].cdte_addr.msf.frame); } src->curoffset = 0; gst_vcdsrc_recalculate (src); return TRUE; /* ERRORS */ open_failed: { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), GST_ERROR_SYSTEM); return FALSE; } toc_failed: { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), GST_ERROR_SYSTEM); close (src->fd); return FALSE; } toc_entry_failed: { GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), GST_ERROR_SYSTEM); g_free (src->tracks); close (src->fd); return FALSE; } }