10819N/A AG_GST_PKG_CHECK_MODULES(CDIO, libcdio >= 0.71)
10819N/A+translit(dnm, m, l) AM_CONDITIONAL(USE_CDDASRC, true)
10828N/A+AG_GST_CHECK_FEATURE(CDDASRC, [HAL libraries], cddasrc, [
10828N/A+ AG_GST_PKG_CHECK_MODULES(CDDASRC, [hal >= 0.5.8, hal-storage >= 0.5.8, dbus-1 >= 0.32])
10819N/A translit(dnm, m, l) AM_CONDITIONAL(USE_ESD, true)
10819N/A AG_GST_CHECK_FEATURE(ESD, [ESounD sound daemon], esdsink, [
10828N/A AM_CONDITIONAL(USE_ANNODEX, false)
10828N/A AM_CONDITIONAL(USE_CAIRO, false)
10828N/A AM_CONDITIONAL(USE_CDIO, false)
10828N/A+AM_CONDITIONAL(USE_CDDASRC, false)
10828N/A AM_CONDITIONAL(USE_FLAC, false)
10828N/A AM_CONDITIONAL(USE_GCONF, false)
12239N/A+ $(GST_PLUGINS_BASE_LIBS) -lgstcdda-$(GST_MAJORMINOR) \
12239N/A+libgstcddasrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
10819N/A+ * Copyright (C) 2007 Brian Cameron <Brian.Cameron@sun.com> and
10819N/A+ * Artem Kachitchkine <Artem.Kachitchkine@sun.com>
10819N/A+ * This library is free software; you can redistribute it
and/or 10819N/A+ * modify it under the terms of the GNU Library General Public
10819N/A+ * License as published by the Free Software Foundation; either
10819N/A+ * version 2 of the License, or (at your option) any later version.
10819N/A+ * This library is distributed in the hope that it will be useful,
10819N/A+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10819N/A+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10819N/A+ * Library General Public License for more details.
10819N/A+ * You should have received a copy of the GNU Library General Public
10819N/A+ * License along with this library; if not, write to the
10819N/A+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
10819N/A+#define GST_TYPE_CDDASRC (gst_cddasrc_get_type())
10819N/A+#define GST_CDDASRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CDDASRC,GstCddaSrc))
10819N/A+#define GST_CDDASRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CDDASRC,GstCddaSrcClass))
10819N/A+#define GST_IS_CDDASRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CDDASRC))
10819N/A+#define GST_IS_CDDASRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CDDASRC))
10819N/A+#define GST_CDDASRC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_CDDASRCSRC, GstCddaSrcClass))
10819N/A+typedef struct _GstCddaSrc GstCddaSrc;
10819N/A+typedef struct _GstCddaSrcClass GstCddaSrcClass;
10819N/A+ * The cddasrc object structure.
10819N/A+ GstCddaBaseSrcClass parent_class;
10819N/A+GType gst_cddasrc_get_type (void);
10819N/A+ * Copyright (C) <2007> Brian Cameron <Brian.Cameron@sun.com> and
10819N/A+ * Artem Kachitchkine <Artem.Kachitchkine@sun.com>
10819N/A+ * This library is free software; you can redistribute it
and/or 10819N/A+ * modify it under the terms of the GNU Library General Public
10819N/A+ * License as published by the Free Software Foundation; either
10819N/A+ * version 2 of the License, or (at your option) any later version.
10819N/A+ * This library is distributed in the hope that it will be useful,
10819N/A+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10819N/A+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10819N/A+ * Library General Public License for more details.
10819N/A+ * You should have received a copy of the GNU Library General Public
10819N/A+ * License along with this library; if not, write to the
10819N/A+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
10819N/A+ * @short_description: Reads raw audio from an Audio CD
10819N/A+ * cddasrc reads and extracts raw audio from Audio CDs using kernel
10819N/A+ * <title>Example launch line</title>
10819N/A+ * gst-launch cddasrc track=5 ! audioconvert ! vorbisenc ! oggmux ! filesink location=
track5.ogg 10819N/A+ * This pipeline extracts track 5 of the audio CD and encodes it into an
10819N/A+GST_DEBUG_CATEGORY_STATIC (gst_cddasrc_debug);
10819N/A+#define GST_CAT_DEFAULT gst_cddasrc_debug
10819N/A+GST_BOILERPLATE (GstCddaSrc, gst_cddasrc, GstCddaBaseSrc,
10819N/A+static void gst_cddasrc_finalize (GObject * obj);
10819N/A+static GstBuffer *gst_cddasrc_read_sector (GstCddaBaseSrc * src,
10819N/A+static gboolean gst_cddasrc_open (GstCddaBaseSrc * src,
10819N/A+static void gst_cddasrc_close (GstCddaBaseSrc * src);
10819N/A+static gchar **gst_cddasrc_probe_devices (GstCddaBaseSrc * cddabasesrc);
10819N/A+static gchar *gst_cddasrc_get_default_device (GstCddaBaseSrc * cddabasesrc);
10819N/A+static void gst_cddasrc_set_property (GObject * object, guint prop_id,
10819N/A+ const GValue * value, GParamSpec * pspec);
10819N/A+static void gst_cddasrc_get_property (GObject * object, guint prop_id,
10819N/A+ GValue * value, GParamSpec * pspec);
10819N/A+static void gst_cddasrc_hal_find_cdroms (GstCddaSrc *);
10819N/A+static const GstElementDetails cddasrc_details =
10819N/A+GST_ELEMENT_DETAILS ("CD Audio (cdda) Source",
10819N/A+ "Brian Cameron <Brian.Cameron@sun.com>, " "Artem Kachitchkine <Artem.Kachitchkine@sun.com>");
10819N/A+gst_cddasrc_base_init (gpointer g_class)
10819N/A+ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
10819N/A+ gst_element_class_set_details (element_class, &cddasrc_details);
10819N/A+gst_cddasrc_init (GstCddaSrc * src, GstCddaSrcClass * klass)
10819N/A+gst_cddasrc_class_init (GstCddaSrcClass * klass)
10819N/A+ GstCddaBaseSrcClass *cddabasesrc_class = GST_CDDA_BASE_SRC_CLASS (klass);
10819N/A+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
10819N/A+ gobject_class->set_property = gst_cddasrc_set_property;
10819N/A+ gobject_class->get_property = gst_cddasrc_get_property;
10819N/A+ gobject_class->finalize = gst_cddasrc_finalize;
10819N/A+ cddabasesrc_class->open = gst_cddasrc_open;
10819N/A+ cddabasesrc_class->close = gst_cddasrc_close;
10819N/A+ cddabasesrc_class->read_sector = gst_cddasrc_read_sector;
10819N/A+ cddabasesrc_class->get_default_device = gst_cddasrc_get_default_device;
10819N/A+ cddabasesrc_class->probe_devices = gst_cddasrc_probe_devices;
10819N/A+ g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_READ_SPEED,
10819N/A+ g_param_spec_int ("read-speed", "Read speed",
10819N/A+ "Read from device at the specified speed (-1 = default)", -1, 100,
10819N/A+ DEFAULT_READ_SPEED, G_PARAM_READWRITE));
10819N/A+gst_cddasrc_probe_devices (GstCddaBaseSrc * cddabasesrc)
10819N/A+ GstCddaSrc *src = GST_CDDASRC (cddabasesrc);
10819N/A+ gst_cddasrc_hal_find_cdroms (src);
10819N/A+gst_cddasrc_get_default_device (GstCddaBaseSrc * cddabasesrc)
10819N/A+ src = GST_CDDASRC (cddabasesrc);
10819N/A+ gst_cddasrc_probe_devices (cddabasesrc);
10819N/A+ /* prefer a drive with an audio disc, otherwise pick first */
10819N/A+ for (i = 0; src->devices[i] != NULL; i++) {
10819N/A+ GST_LOG_OBJECT (src, "returning default device: %s", GST_STR_NULL (ret));
10819N/A+cddasrc_init_device (GstCddaSrc *src)
10819N/A+ /* spin up and set max speed */
10819N/A+ if (ioctl (src->fd, CDROMSTART) < 0)
10819N/A+cddasrc_read_toc (GstCddaSrc *src)
10819N/A+ struct cdrom_tocentry toc_entry;
10819N/A+ if (ioctl (src->fd, CDROMREADTOCHDR, &toc_hdr) < 0) {
10819N/A+ for (i = 1; i <= src->track_count; i++) {
10819N/A+ GstCddaBaseSrcTrack track = { 0, };
10819N/A+ if (ioctl (src->fd, CDROMREADTOCENTRY, &toc_entry) == -1)
10819N/A+ /* End of the track is the start of the next track */
10819N/A+ if (ioctl (src->fd, CDROMREADTOCENTRY, &toc_entry) == -1)
10819N/A+ gst_cdda_base_src_add_track (GST_CDDA_BASE_SRC (src), &track);
10819N/A+gst_cddasrc_open (GstCddaBaseSrc * cddabasesrc, const gchar * device)
10819N/A+ GstCddaSrc *src = GST_CDDASRC (cddabasesrc);
10819N/A+ GST_LOG_OBJECT (src, "Trying to open device %s", device);
10819N/A+ if ((src->fd = open (device, O_RDONLY)) < 0) {
10819N/A+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ,
10819N/A+ (_("Could not open CD device for reading.")),
10819N/A+ ("open () of %s failed", device));
10819N/A+ if (!cddasrc_init_device (src)) {
10819N/A+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ,
10819N/A+ (_("Could not open CD device for reading.")),
10819N/A+gst_cddasrc_close (GstCddaBaseSrc * cddabasesrc)
10819N/A+ GstCddaSrc *src = GST_CDDASRC (cddabasesrc);
10819N/A+cddasrc_byte_swap (void *buf, uint_t len)
10819N/A+ for (p = buf; p < (uint16_t *)buf + len; p++) {
10819N/A+cddasrc_read (GstCddaSrc *src, void *buf, uint_t addr, uint_t len)
10819N/A+ if (ioctl (src->fd, CDROMCDDA, &cdda) < 0) {
10819N/A+ if (ioctl (src->fd, CDROMCDDA, &cdda) < 0) {
10819N/A+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ,
10819N/A+ cddasrc_byte_swap (buf, len * 2352);
10819N/A+gst_cddasrc_read_sector (GstCddaBaseSrc * cddabasesrc, gint sector)
12239N/A+ GstCddaSrc *src = GST_CDDASRC (cddabasesrc);
12239N/A+ buf = gst_buffer_new_and_alloc (CDDASRC_BSIZE);
12239N/A+ if (!cddasrc_read (src, GST_BUFFER_DATA (buf), sector, 1)) {
10819N/A+gst_cddasrc_finalize (GObject * obj)
10819N/A+ GstCddaSrc *src = GST_CDDASRC (obj);
10819N/A+ G_OBJECT_CLASS (parent_class)->finalize (obj);
10819N/A+plugin_init (GstPlugin * plugin)
10819N/A+ GST_DEBUG_CATEGORY_INIT (gst_cddasrc_debug, "cddasrc", 0,
10819N/A+ if (!gst_element_register (plugin, "cddasrc", GST_RANK_SECONDARY,
10819N/A+ GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE,
10819N/A+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
10819N/A+gst_cddasrc_set_property (GObject * object, guint prop_id,
10819N/A+ const GValue * value, GParamSpec * pspec)
10819N/A+ GstCddaSrc *src = GST_CDDASRC (object);
10819N/A+ read_speed = g_value_get_int (value);
10819N/A+ * Solaris only supports certain speeds, so use the
10819N/A+ solaris_speed = CDROM_NORMAL_SPEED;
10819N/A+ else if (read_speed >= 2 && read_speed < 4)
10819N/A+ solaris_speed = CDROM_DOUBLE_SPEED;
10819N/A+ else if (read_speed >= 4 && read_speed < 12)
10819N/A+ solaris_speed = CDROM_QUAD_SPEED;
10819N/A+ solaris_speed = CDROM_TWELVE_SPEED;
10819N/A+ solaris_speed = CDROM_MAXIMUM_SPEED;
10819N/A+ * This ioctl will return -1 if the drive doesn't support
10819N/A+ ioctl (src->fd, CDROMSDRVSPEED, solaris_speed);
10819N/A+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
10819N/A+gst_cddasrc_get_property (GObject * object, guint prop_id,
10819N/A+ GValue * value, GParamSpec * pspec)
10819N/A+ GstCddaSrc *src = GST_CDDASRC (object);
10819N/A+ * Solaris only supports certain speeds, so return
10819N/A+ * supported values. Just say MAXIMUM is 100 since
10819N/A+ * Solaris ioctls doesn't let you find out the actual
10819N/A+ * drive speed, but we know it is max (100).
10819N/A+ ret = ioctl (src->fd, CDROMGDRVSPEED, &solaris_speed);
10819N/A+ read_speed = -1; /* drive does not support getting speed */
10819N/A+ if (solaris_speed == CDROM_NORMAL_SPEED)
10819N/A+ else if (solaris_speed == CDROM_DOUBLE_SPEED)
10819N/A+ else if (solaris_speed == CDROM_QUAD_SPEED)
10819N/A+ else if (solaris_speed == CDROM_TWELVE_SPEED)
10819N/A+ else if (solaris_speed == CDROM_MAXIMUM_SPEED)
10819N/A+ g_value_set_int (value, read_speed);
10819N/A+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
10819N/A+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
10819N/A+ plugin_init, VERSION, "GPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
10819N/A+gst_cddasrc_hal_init (GstCddaSrc *src)
10819N/A+ LibHalContext *hal_ctx = NULL;
10819N/A+ if ((hal_ctx = libhal_ctx_new ()) == NULL) {
10819N/A+ GST_ELEMENT_ERROR (src, LIBRARY, INIT,
10819N/A+ ("failed to initialize HAL"), ("failed to initialize HAL"));
10819N/A+ if (!libhal_ctx_set_dbus_connection(hal_ctx,
10819N/A+ dbus_bus_get (DBUS_BUS_SYSTEM, &error))) {
10819N/A+ GST_ELEMENT_ERROR (src, LIBRARY, INIT,
10819N/A+ if (!libhal_ctx_init(hal_ctx, &error)) {
10819N/A+ GST_ELEMENT_ERROR (src, LIBRARY, INIT,
10819N/A+gst_cddasrc_hal_fini (LibHalContext *hal_ctx)
10819N/A+ libhal_ctx_shutdown (hal_ctx, &error);
10819N/A+gst_cddasrc_hal_find_cdroms (GstCddaSrc *src)
10819N/A+ char **drive_udis, **volume_udis;
10819N/A+ if ((hal_ctx = gst_cddasrc_hal_init (src)) == NULL) {
10819N/A+ if (dbus_error_is_set (&error) || drive_udis == NULL) {
10819N/A+ src->devices = calloc (num_drives + 1, sizeof (char *));
10819N/A+ src->has_audio = calloc (num_drives + 1, sizeof (boolean_t));
10819N/A+ for (i = j = 0; i < num_drives; i++) {
10819N/A+ raw_device = libhal_device_get_property_string (hal_ctx,
10819N/A+ if ((raw_device == NULL) || (strlen (raw_device) == 0)) {
10819N/A+ libhal_free_string (raw_device);
10819N/A+ src->devices[j] = strdup (raw_device);
10819N/A+ libhal_free_string (raw_device);
10819N/A+ /* check for audio disc in this drive */
10819N/A+ if ((drive = libhal_drive_from_udi (hal_ctx, drive_udis[i])) != NULL) {
10819N/A+ if ((volume_udis = libhal_drive_find_all_volumes (hal_ctx,
10819N/A+ drive, &num_volumes)) != NULL) {
10819N/A+ for (k = 0; k < num_volumes; k++) {
10819N/A+ src->has_audio[j] = (boolean_t)
10819N/A+ libhal_device_get_property_bool (hal_ctx,
10819N/A+ libhal_free_string_array (volume_udis);
10819N/A+ libhal_free_string_array (drive_udis);
10819N/A+ gst_cddasrc_hal_fini (hal_ctx);