gst-plugins-good-02-cdda.diff revision 12239
10828N/A--- gst-plugins-good-0.10.6/configure.ac.orig 2007-06-20 10:45:48.555746752 +0100
10828N/A+++ gst-plugins-good-0.10.6/configure.ac 2007-06-20 11:19:07.357642672 +0100
10828N/A@@ -657,6 +657,12 @@
10819N/A AG_GST_PKG_CHECK_MODULES(CDIO, libcdio >= 0.71)
10819N/A ])
10819N/A
10819N/A+dnl *** cddasrc ***
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+])
10819N/A+
10819N/A dnl **** ESound ****
10819N/A translit(dnm, m, l) AM_CONDITIONAL(USE_ESD, true)
10819N/A AG_GST_CHECK_FEATURE(ESD, [ESounD sound daemon], esdsink, [
10828N/A@@ -932,6 +938,7 @@
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_ESD, false)
10828N/A AM_CONDITIONAL(USE_FLAC, false)
10828N/A AM_CONDITIONAL(USE_GCONF, false)
10828N/A@@ -1035,6 +1042,7 @@
10819N/A ext/aalib/Makefile
10819N/A ext/annodex/Makefile
10819N/A ext/cairo/Makefile
10819N/A+ext/cddasrc/Makefile
10819N/A ext/cdio/Makefile
10819N/A ext/dv/Makefile
10819N/A ext/esd/Makefile
12239N/A--- gst-plugins-good-0.10.6/ext/Makefile.am-orig 2007-03-16 14:36:50.057857000 +0800
12239N/A+++ gst-plugins-good-0.10.6/ext/Makefile.am 2007-03-16 14:37:04.594644000 +0800
10819N/A@@ -22,6 +22,12 @@ else
10819N/A CDIO_DIR =
10819N/A endif
10819N/A
10819N/A+if USE_CDDASRC
10819N/A+CDDASRC_DIR = cddasrc
10819N/A+else
10819N/A+CDDASRC_DIR =
10819N/A+endif
10819N/A+
10819N/A if USE_ESD
10819N/A ESD_DIR = esd
10819N/A else
10819N/A@@ -123,6 +129,7 @@ SUBDIRS = \
10819N/A $(ANNODEX_DIR) \
10819N/A $(CAIRO_DIR) \
10819N/A $(CDIO_DIR) \
10819N/A+ $(CDDASRC_DIR) \
10819N/A $(DV1394_DIR) \
10819N/A $(ESD_DIR) \
10819N/A $(FLAC_DIR) \
12239N/A--- /dev/null 2007-03-19 01:47:57.000000000 +0800
12239N/A+++ gst-plugins-good-0.10.6/ext/cddasrc/Makefile.am 2007-03-19 01:46:41.639278000 +0800
12239N/A@@ -0,0 +1,20 @@
12239N/A+plugin_LTLIBRARIES = libgstcddasrc.la
12239N/A+
12239N/A+libgstcddasrc_la_SOURCES = \
12239N/A+ gstcddasrc.c
12239N/A+
12239N/A+libgstcddasrc_la_CFLAGS = \
12239N/A+ $(GST_PLUGINS_BASE_CFLAGS) \
12239N/A+ $(GST_BASE_CFLAGS) \
12239N/A+ $(GST_CFLAGS) \
12239N/A+ $(CDDASRC_CFLAGS)
12239N/A+
12239N/A+libgstcddasrc_la_LIBADD = \
12239N/A+ $(GST_PLUGINS_BASE_LIBS) -lgstcdda-$(GST_MAJORMINOR) \
12239N/A+ $(GST_BASE_LIBS) \
12239N/A+ $(CDDASRC_LIBS)
12239N/A+
12239N/A+libgstcddasrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
12239N/A+
12239N/A+noinst_HEADERS = \
12239N/A+ gstcddasrc.h
10819N/A--- /dev/null 2007-03-17 20:03:31.000000000 +0800
12239N/A+++ gst-plugins-good-0.10.6/ext/cddasrc/gstcddasrc.h 2007-03-17 20:05:49.318199000 +0800
10819N/A@@ -0,0 +1,67 @@
10819N/A+/* GStreamer
10819N/A+ * Copyright (C) 2007 Brian Cameron <Brian.Cameron@sun.com> and
10819N/A+ * Artem Kachitchkine <Artem.Kachitchkine@sun.com>
10819N/A+ *
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+ *
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+ *
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+ * Boston, MA 02111-1307, USA.
10819N/A+ */
10819N/A+
10819N/A+#ifndef __GST_CDDASRC_H__
10819N/A+#define __GST_CDDASRC_H__
10819N/A+
10819N/A+#include <sys/types.h>
10819N/A+#include "gst/cdda/gstcddabasesrc.h"
10819N/A+
10819N/A+#define CDDASRC_BSIZE 2352
10819N/A+
10819N/A+G_BEGIN_DECLS
10819N/A+
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+
10819N/A+typedef struct _GstCddaSrc GstCddaSrc;
10819N/A+typedef struct _GstCddaSrcClass GstCddaSrcClass;
10819N/A+
10819N/A+#define CDDASRC_BSIZE 2352
10819N/A+
10819N/A+/**
10819N/A+ * GstCddaSrc::
10819N/A+ *
10819N/A+ * The cddasrc object structure.
10819N/A+ */
10819N/A+struct _GstCddaSrc {
10819N/A+ GstCddaBaseSrc cddabasesrc;
10819N/A+
10819N/A+ /*< private >*/
10819N/A+ int fd;
10819N/A+ uint_t track_count;
10819N/A+ char **devices;
10819N/A+ boolean_t *has_audio;
10819N/A+};
10819N/A+
10819N/A+struct _GstCddaSrcClass {
10819N/A+ GstCddaBaseSrcClass parent_class;
10819N/A+};
10819N/A+
10819N/A+GType gst_cddasrc_get_type (void);
10819N/A+
10819N/A+G_END_DECLS
10819N/A+
10819N/A+#endif /* __GST_CDDASRC_H__ */
10819N/A+
12239N/A--- /dev/null 2008-01-21 16:38:34.000000000 -0600
12239N/A+++ gst-plugins-good-0.10.6/ext/cddasrc/gstcddasrc.c 2008-01-21 16:25:24.372154000 -0600
12239N/A@@ -0,0 +1,561 @@
10819N/A+/* GStreamer
10819N/A+ * Copyright (C) <2007> Brian Cameron <Brian.Cameron@sun.com> and
10819N/A+ * Artem Kachitchkine <Artem.Kachitchkine@sun.com>
10819N/A+ *
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+ *
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+ *
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+ * Boston, MA 02111-1307, USA.
10819N/A+ */
10819N/A+
10819N/A+/**
10819N/A+ * SECTION:element-cddasrc
10819N/A+ * @short_description: Reads raw audio from an Audio CD
10819N/A+ * @see_also: GstCddaBaseSrc
10819N/A+ *
10819N/A+ * <refsect2>
10819N/A+ * <para>
10819N/A+ * cddasrc reads and extracts raw audio from Audio CDs using kernel
10819N/A+ * ioctls directly.
10819N/A+ * </para>
10819N/A+ * <title>Example launch line</title>
10819N/A+ * <para>
10819N/A+ * <programlisting>
10819N/A+ * gst-launch cddasrc track=5 ! audioconvert ! vorbisenc ! oggmux ! filesink location=track5.ogg
10819N/A+ * </programlisting>
10819N/A+ * This pipeline extracts track 5 of the audio CD and encodes it into an
10819N/A+ * Ogg/Vorbis file.
10819N/A+ * </para>
10819N/A+ * </refsect2>
10819N/A+ */
10819N/A+
10819N/A+#ifdef HAVE_CONFIG_H
10819N/A+#include "config.h"
10819N/A+#endif
10819N/A+
10819N/A+#include <stdio.h>
10819N/A+#include <stdlib.h>
10819N/A+#include <fcntl.h>
10819N/A+#include <string.h>
10819N/A+#include <libintl.h>
10819N/A+#include <errno.h>
10819N/A+#include <unistd.h>
10819N/A+#include <sys/byteorder.h>
10819N/A+#include <sys/cdio.h>
10819N/A+#include <hal/libhal.h>
10819N/A+#include <hal/libhal-storage.h>
10819N/A+
10819N/A+#include "gstcddasrc.h"
10819N/A+#include "gst/gst-i18n-plugin.h"
10819N/A+
10819N/A+#define DEFAULT_READ_SPEED -1
10819N/A+
10819N/A+enum
10819N/A+{
10819N/A+ PROP0 = 0,
10819N/A+ PROP_READ_SPEED
10819N/A+};
10819N/A+
10819N/A+GST_DEBUG_CATEGORY_STATIC (gst_cddasrc_debug);
10819N/A+#define GST_CAT_DEFAULT gst_cddasrc_debug
10819N/A+
10819N/A+GST_BOILERPLATE (GstCddaSrc, gst_cddasrc, GstCddaBaseSrc,
10819N/A+ GST_TYPE_CDDA_BASE_SRC)
10819N/A+
10819N/A+static void gst_cddasrc_finalize (GObject * obj);
10819N/A+static GstBuffer *gst_cddasrc_read_sector (GstCddaBaseSrc * src,
10819N/A+ gint sector);
10819N/A+static gboolean gst_cddasrc_open (GstCddaBaseSrc * src,
10819N/A+ const gchar * device);
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+
10819N/A+static void gst_cddasrc_hal_find_cdroms (GstCddaSrc *);
10819N/A+
10819N/A+static const GstElementDetails cddasrc_details =
10819N/A+GST_ELEMENT_DETAILS ("CD Audio (cdda) Source",
10819N/A+ "Source/File",
10819N/A+ "Read audio from CD",
10819N/A+ "Brian Cameron <Brian.Cameron@sun.com>, " "Artem Kachitchkine <Artem.Kachitchkine@sun.com>");
10819N/A+
10819N/A+static void
10819N/A+gst_cddasrc_base_init (gpointer g_class)
10819N/A+{
10819N/A+ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
10819N/A+
10819N/A+ gst_element_class_set_details (element_class, &cddasrc_details);
10819N/A+}
10819N/A+
10819N/A+static void
10819N/A+gst_cddasrc_init (GstCddaSrc * src, GstCddaSrcClass * klass)
10819N/A+{
10819N/A+ src->devices = NULL;
10819N/A+}
10819N/A+
10819N/A+static void
10819N/A+gst_cddasrc_class_init (GstCddaSrcClass * klass)
10819N/A+{
10819N/A+ GstCddaBaseSrcClass *cddabasesrc_class = GST_CDDA_BASE_SRC_CLASS (klass);
10819N/A+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
10819N/A+
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+
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+
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+}
10819N/A+
10819N/A+static gchar **
10819N/A+gst_cddasrc_probe_devices (GstCddaBaseSrc * cddabasesrc)
10819N/A+{
10819N/A+ GstCddaSrc *src = GST_CDDASRC (cddabasesrc);
10819N/A+
10819N/A+ if (src->devices != NULL) {
10819N/A+ free (src->devices);
10819N/A+ free (src->has_audio);
10819N/A+
10819N/A+ src->devices = NULL;
10819N/A+ src->has_audio = NULL;
10819N/A+ }
10819N/A+ gst_cddasrc_hal_find_cdroms (src);
10819N/A+
10819N/A+ return (src->devices);
10819N/A+}
10819N/A+
10819N/A+static gchar *
10819N/A+gst_cddasrc_get_default_device (GstCddaBaseSrc * cddabasesrc)
10819N/A+{
10819N/A+ GstCddaSrc *src;
10819N/A+ gchar *ret = NULL;
10819N/A+ int i;
10819N/A+
10819N/A+ src = GST_CDDASRC (cddabasesrc);
10819N/A+
10819N/A+ if (src->devices == NULL) {
10819N/A+ gst_cddasrc_probe_devices (cddabasesrc);
10819N/A+ if (src->devices == NULL) {
10819N/A+ return (NULL);
10819N/A+ }
10819N/A+ }
10819N/A+
10819N/A+ /* prefer a drive with an audio disc, otherwise pick first */
10819N/A+ for (i = 0; src->devices[i] != NULL; i++) {
10819N/A+ if (src->has_audio[i]) {
10819N/A+ ret = src->devices[i];
10819N/A+ break;
10819N/A+ }
10819N/A+ }
10819N/A+
10819N/A+ if (ret == NULL)
10819N/A+ ret = src->devices[0];
10819N/A+
10819N/A+ GST_LOG_OBJECT (src, "returning default device: %s", GST_STR_NULL (ret));
10819N/A+
10819N/A+ return (ret);
10819N/A+}
10819N/A+
10819N/A+static gboolean
10819N/A+cddasrc_init_device (GstCddaSrc *src)
10819N/A+{
10819N/A+ /* spin up and set max speed */
10819N/A+ if (ioctl (src->fd, CDROMSTART) < 0)
10819N/A+ return (FALSE);
10819N/A+ else
10819N/A+ return (TRUE);
10819N/A+}
10819N/A+
10819N/A+static boolean_t
10819N/A+cddasrc_read_toc (GstCddaSrc *src)
10819N/A+{
10819N/A+ struct cdrom_tochdr toc_hdr;
10819N/A+ struct cdrom_tocentry toc_entry;
10819N/A+ uint_t i;
10819N/A+
10819N/A+ /* determine track count */
10819N/A+ if (ioctl (src->fd, CDROMREADTOCHDR, &toc_hdr) < 0) {
10819N/A+ return (FALSE);
10819N/A+ }
10819N/A+
10819N/A+ src->track_count = toc_hdr.cdth_trk1 - toc_hdr.cdth_trk0 + 1;
10819N/A+
10819N/A+ /* retrieve track entries */
10819N/A+ toc_entry.cdte_format = CDROM_LBA;
10819N/A+ for (i = 1; i <= src->track_count; i++) {
10819N/A+ GstCddaBaseSrcTrack track = { 0, };
10819N/A+
10819N/A+ toc_entry.cdte_track = i;
10819N/A+ if (ioctl (src->fd, CDROMREADTOCENTRY, &toc_entry) == -1)
10819N/A+ return (FALSE);
10819N/A+
10819N/A+ track.num = i;
10819N/A+ track.is_audio = (toc_entry.cdte_ctrl != CDROM_DATA_TRACK);
10819N/A+ track.tags = NULL;
10819N/A+ track.start = toc_entry.cdte_addr.lba;
10819N/A+
10819N/A+ /* End of the track is the start of the next track */
10819N/A+ if (i == src->track_count)
10819N/A+ toc_entry.cdte_track = CDROM_LEADOUT;
10819N/A+ else
10819N/A+ toc_entry.cdte_track = i+1;
10819N/A+
10819N/A+ if (ioctl (src->fd, CDROMREADTOCENTRY, &toc_entry) == -1)
10819N/A+ return (FALSE);
10819N/A+
10819N/A+ track.end = toc_entry.cdte_addr.lba - 1;
10819N/A+
10819N/A+ gst_cdda_base_src_add_track (GST_CDDA_BASE_SRC (src), &track);
10819N/A+ }
10819N/A+
10819N/A+ return (TRUE);
10819N/A+}
10819N/A+
10819N/A+static gboolean
10819N/A+gst_cddasrc_open (GstCddaBaseSrc * cddabasesrc, const gchar * device)
10819N/A+{
10819N/A+ GstCddaSrc *src = GST_CDDASRC (cddabasesrc);
10819N/A+ gboolean ret;
10819N/A+
10819N/A+ GST_LOG_OBJECT (src, "Trying to open device %s", device);
10819N/A+
10819N/A+ g_assert (device != NULL);
10819N/A+
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+ return (FALSE);
10819N/A+ }
10819N/A+
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+ ("init () failed"));
10819N/A+ return (FALSE);
10819N/A+ }
10819N/A+ ret = cddasrc_read_toc (src);
10819N/A+
10819N/A+ return ret;
10819N/A+}
10819N/A+
10819N/A+static void
10819N/A+gst_cddasrc_close (GstCddaBaseSrc * cddabasesrc)
10819N/A+{
10819N/A+ GstCddaSrc *src = GST_CDDASRC (cddabasesrc);
10819N/A+ close (src->fd);
10819N/A+}
10819N/A+
10819N/A+static void
10819N/A+cddasrc_byte_swap (void *buf, uint_t len)
10819N/A+{
10819N/A+ uint16_t *p;
10819N/A+ uint16_t v;
10819N/A+
10819N/A+ for (p = buf; p < (uint16_t *)buf + len; p++) {
10819N/A+ v = *p;
10819N/A+ *p = BSWAP_16 (v);
10819N/A+ }
10819N/A+}
10819N/A+
10819N/A+static gboolean
10819N/A+cddasrc_read (GstCddaSrc *src, void *buf, uint_t addr, uint_t len)
10819N/A+{
10819N/A+ struct cdrom_cdda cdda;
10819N/A+
10819N/A+ cdda.cdda_addr = addr;
10819N/A+ cdda.cdda_length = len;
10819N/A+ cdda.cdda_data = (caddr_t)buf;
10819N/A+ cdda.cdda_subcode = CDROM_DA_NO_SUBCODE;
10819N/A+
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+ (_("Failed reading CD.")),
10819N/A+ ("read () failed"));
10819N/A+ return (FALSE);
10819N/A+ }
10819N/A+ }
10819N/A+
10819N/A+#ifdef _BIG_ENDIAN
10819N/A+ cddasrc_byte_swap (buf, len * 2352);
10819N/A+#endif
10819N/A+
10819N/A+ return (TRUE);
10819N/A+}
10819N/A+
10819N/A+static GstBuffer *
10819N/A+gst_cddasrc_read_sector (GstCddaBaseSrc * cddabasesrc, gint sector)
10819N/A+{
12239N/A+ GstCddaSrc *src = GST_CDDASRC (cddabasesrc);
12239N/A+ size_t len = CDDASRC_BSIZE;
12239N/A+ GstBuffer *buf;
10819N/A+
12239N/A+ buf = gst_buffer_new_and_alloc (CDDASRC_BSIZE);
12239N/A+
12239N/A+ if (!cddasrc_read (src, GST_BUFFER_DATA (buf), sector, 1)) {
12239N/A+ gst_buffer_unref (buf);
12239N/A+ buf = NULL;
12239N/A+ return NULL;
10819N/A+ }
10819N/A+
12239N/A+ return (buf);
10819N/A+}
10819N/A+
10819N/A+static void
10819N/A+gst_cddasrc_finalize (GObject * obj)
10819N/A+{
10819N/A+ GstCddaSrc *src = GST_CDDASRC (obj);
10819N/A+
12239N/A+ free (src->devices);
10819N/A+
10819N/A+ G_OBJECT_CLASS (parent_class)->finalize (obj);
10819N/A+}
10819N/A+
10819N/A+static gboolean
10819N/A+plugin_init (GstPlugin * plugin)
10819N/A+{
10819N/A+ GST_DEBUG_CATEGORY_INIT (gst_cddasrc_debug, "cddasrc", 0,
10819N/A+ "CDDA Source");
10819N/A+
10819N/A+ if (!gst_element_register (plugin, "cddasrc", GST_RANK_SECONDARY,
10819N/A+ GST_TYPE_CDDASRC))
10819N/A+ return FALSE;
10819N/A+
10819N/A+#ifdef ENABLE_NLS
10819N/A+ GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE,
10819N/A+ LOCALEDIR);
10819N/A+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
10819N/A+#endif
10819N/A+
10819N/A+
10819N/A+ return TRUE;
10819N/A+}
10819N/A+
10819N/A+static void
10819N/A+gst_cddasrc_set_property (GObject * object, guint prop_id,
10819N/A+ const GValue * value, GParamSpec * pspec)
10819N/A+{
10819N/A+ GstCddaSrc *src = GST_CDDASRC (object);
10819N/A+
10819N/A+ switch (prop_id) {
10819N/A+ case PROP_READ_SPEED:{
10819N/A+ gint read_speed;
10819N/A+ gint solaris_speed;
10819N/A+
10819N/A+ read_speed = g_value_get_int (value);
10819N/A+
10819N/A+ /*
10819N/A+ * Solaris only supports certain speeds, so use the
10819N/A+ * fastest available speed.
10819N/A+ */
10819N/A+ if (read_speed < 2)
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+ else if (read_speed == 12)
10819N/A+ solaris_speed = CDROM_TWELVE_SPEED;
10819N/A+ else if (read_speed >= 12)
10819N/A+ solaris_speed = CDROM_MAXIMUM_SPEED;
10819N/A+
10819N/A+ /*
10819N/A+ * This ioctl will return -1 if the drive doesn't support
10819N/A+ * changing speed.
10819N/A+ */
10819N/A+ ioctl (src->fd, CDROMSDRVSPEED, solaris_speed);
10819N/A+
10819N/A+ break;
10819N/A+ }
10819N/A+ default:
10819N/A+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
10819N/A+ break;
10819N/A+ }
10819N/A+}
10819N/A+
10819N/A+static void
10819N/A+gst_cddasrc_get_property (GObject * object, guint prop_id,
10819N/A+ GValue * value, GParamSpec * pspec)
10819N/A+{
10819N/A+ GstCddaSrc *src = GST_CDDASRC (object);
10819N/A+
10819N/A+ switch (prop_id) {
10819N/A+ case PROP_READ_SPEED:{
10819N/A+ gint solaris_speed;
10819N/A+ gint read_speed;
10819N/A+ gint ret;
10819N/A+
10819N/A+ /*
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+ */
10819N/A+ ret = ioctl (src->fd, CDROMGDRVSPEED, &solaris_speed);
10819N/A+ if (ret < 0)
10819N/A+ read_speed = -1; /* drive does not support getting speed */
10819N/A+ if (solaris_speed == CDROM_NORMAL_SPEED)
10819N/A+ read_speed = 1;
10819N/A+ else if (solaris_speed == CDROM_DOUBLE_SPEED)
10819N/A+ read_speed = 2;
10819N/A+ else if (solaris_speed == CDROM_QUAD_SPEED)
10819N/A+ read_speed = 4;
10819N/A+ else if (solaris_speed == CDROM_TWELVE_SPEED)
10819N/A+ read_speed = 12;
10819N/A+ else if (solaris_speed == CDROM_MAXIMUM_SPEED)
10819N/A+ read_speed = 100;
10819N/A+
10819N/A+ g_value_set_int (value, read_speed);
10819N/A+ break;
10819N/A+ }
10819N/A+ default:
10819N/A+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
10819N/A+ break;
10819N/A+ }
10819N/A+}
10819N/A+
10819N/A+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
10819N/A+ GST_VERSION_MINOR,
10819N/A+ "cddasrc",
10819N/A+ "Read audio from CD",
10819N/A+ plugin_init, VERSION, "GPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
10819N/A+
10819N/A+/* ===== HAL stuff ===== */
10819N/A+
10819N/A+static LibHalContext *
10819N/A+gst_cddasrc_hal_init (GstCddaSrc *src)
10819N/A+{
10819N/A+ DBusError error;
10819N/A+ LibHalContext *hal_ctx = NULL;
10819N/A+
10819N/A+ dbus_error_init (&error);
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+ goto out;
10819N/A+ }
10819N/A+ if (!libhal_ctx_set_dbus_connection(hal_ctx,
10819N/A+ dbus_bus_get (DBUS_BUS_SYSTEM, &error))) {
10819N/A+
10819N/A+ GST_ELEMENT_ERROR (src, LIBRARY, INIT,
10819N/A+ ("DBus connection failed"),
10819N/A+ ("libhal_ctx_set_dbus_connection: %s %s", error.name, error.message));
10819N/A+ libhal_ctx_free (hal_ctx);
10819N/A+ goto out;
10819N/A+ }
10819N/A+ if (!libhal_ctx_init(hal_ctx, &error)) {
10819N/A+ GST_ELEMENT_ERROR (src, LIBRARY, INIT,
10819N/A+ ("HAL context init failed"),
10819N/A+ ("libhal_ctx_init: %s: %s", error.name, error.message));
10819N/A+ libhal_ctx_free (hal_ctx);
10819N/A+ goto out;
10819N/A+ }
10819N/A+out:
10819N/A+ dbus_error_free (&error);
10819N/A+
10819N/A+ return (hal_ctx);
10819N/A+}
10819N/A+
10819N/A+static void
10819N/A+gst_cddasrc_hal_fini (LibHalContext *hal_ctx)
10819N/A+{
10819N/A+ DBusError error;
10819N/A+
10819N/A+ dbus_error_init (&error);
10819N/A+ libhal_ctx_shutdown (hal_ctx, &error);
10819N/A+ libhal_ctx_free (hal_ctx);
10819N/A+ dbus_error_free (&error);
10819N/A+}
10819N/A+
10819N/A+static void
10819N/A+gst_cddasrc_hal_find_cdroms (GstCddaSrc *src)
10819N/A+{
10819N/A+ DBusError error;
10819N/A+ LibHalContext *hal_ctx;
10819N/A+ int i, j, k;
10819N/A+ char **drive_udis, **volume_udis;
10819N/A+ int num_drives, num_volumes;
10819N/A+ char *raw_device;
10819N/A+ LibHalDrive *drive;
10819N/A+ dbus_bool_t has_audio;
10819N/A+
10819N/A+ if ((hal_ctx = gst_cddasrc_hal_init (src)) == NULL) {
10819N/A+ return;
10819N/A+ }
10819N/A+ dbus_error_init (&error);
10819N/A+
10819N/A+ drive_udis = libhal_find_device_by_capability (hal_ctx, "storage.cdrom",
10819N/A+ &num_drives, &error);
10819N/A+
10819N/A+ if (dbus_error_is_set (&error) || drive_udis == NULL) {
10819N/A+ goto out;
10819N/A+ }
10819N/A+
10819N/A+ src->devices = calloc (num_drives + 1, sizeof (char *));
10819N/A+ src->has_audio = calloc (num_drives + 1, sizeof (boolean_t));
10819N/A+
10819N/A+ for (i = j = 0; i < num_drives; i++) {
10819N/A+ raw_device = libhal_device_get_property_string (hal_ctx,
10819N/A+ drive_udis[i], "block.solaris.raw_device", &error);
10819N/A+ dbus_error_free (&error);
10819N/A+
10819N/A+ if ((raw_device == NULL) || (strlen (raw_device) == 0)) {
10819N/A+ libhal_free_string (raw_device);
10819N/A+ continue;
10819N/A+ }
10819N/A+
10819N/A+ src->devices[j] = strdup (raw_device);
10819N/A+ libhal_free_string (raw_device);
10819N/A+
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+
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+ volume_udis[k], "volume.disc.has_audio", &error);
10819N/A+ dbus_error_free (&error);
10819N/A+ if (src->has_audio[j]) {
10819N/A+ break;
10819N/A+ }
10819N/A+ }
10819N/A+ libhal_free_string_array (volume_udis);
10819N/A+ }
10819N/A+ libhal_drive_free (drive);
10819N/A+ }
10819N/A+
10819N/A+ j++;
10819N/A+ }
10819N/A+
10819N/A+out:
10819N/A+ libhal_free_string_array (drive_udis);
10819N/A+ dbus_error_free (&error);
10819N/A+
10819N/A+ gst_cddasrc_hal_fini (hal_ctx);
10819N/A+}
10819N/A+