patches/gst-plugins-good-02-cdda.diff
author yippi
Mon, 27 Sep 2010 21:07:51 +0000
changeset 20108 51df67ca9307
parent 15397 afba4c1627d1
child 22162 28963895fef8
permissions -rw-r--r--
I had these modules listed as being owned by me, but they are really owned by wangke, correcting.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14971
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
     1
--- gst-plugins-good-0.10.13/configure.ac-orig	2009-01-23 10:02:53.003952000 -0600
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
     2
+++ gst-plugins-good-0.10.13/configure.ac	2009-01-23 10:03:03.048601000 -0600
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
     3
@@ -660,6 +668,24 @@ AG_GST_CHECK_FEATURE(CAIRO, [Cairo graph
13303
cad9fa508e43 2008-08-28 Brian Cameron <[email protected]>
yippi
parents: 12973
diff changeset
     4
   AG_GST_PKG_CHECK_MODULES(CAIRO, cairo >= 1.0.0)
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
     5
 ])
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
     6
 
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
     7
+dnl *** cdda2wav ***
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
     8
+translit(dnm, m, l) AM_CONDITIONAL(USE_CDDA2WAV, true)
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
     9
+AG_GST_CHECK_FEATURE(CDDA2WAV, [HAL libraries], cdda2wav, [
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    10
+  AG_GST_PKG_CHECK_MODULES(CDDA2WAV, [hal >= 0.5.8, hal-storage >= 0.5.8, dbus-1 >= 0.32])
14971
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
    11
+  AC_PATH_PROG(CDDA2WAVBIN, cdda2wav, no)
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
    12
+  if test x$CDDA2WAVBIN = xno; then
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
    13
+    HAVE_CDDA2WAV="no"
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
    14
+  else
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
    15
+    CDDA_VERSION=`$CDDA2WAVBIN --version | grep Schilling`
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
    16
+    if test -z "$CDDA_VERSION"; then
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
    17
+      HAVE_CDDA2WAV="no"
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
    18
+    else
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
    19
+      HAVE_CDDA2WAV="yes"
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
    20
+    fi
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
    21
+  fi
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
    22
+  AC_SUBST(HAVE_CDDA2WAV)
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    23
+])
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    24
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    25
 dnl **** ESound ****
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    26
 translit(dnm, m, l) AM_CONDITIONAL(USE_ESD, true)
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    27
 AG_GST_CHECK_FEATURE(ESD, [ESounD sound daemon], esdsink, [
14971
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
    28
@@ -928,6 +954,7 @@ AM_CONDITIONAL(USE_DIRECTDRAW, false)
14505
166ab6279435 2008-10-27 Brian Cameron <[email protected]>
yippi
parents: 13303
diff changeset
    29
 AM_CONDITIONAL(USE_DIRECTSOUND, false)
166ab6279435 2008-10-27 Brian Cameron <[email protected]>
yippi
parents: 13303
diff changeset
    30
 AM_CONDITIONAL(USE_DV1394, false)
13303
cad9fa508e43 2008-08-28 Brian Cameron <[email protected]>
yippi
parents: 12973
diff changeset
    31
 AM_CONDITIONAL(USE_ESD, false)
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    32
+AM_CONDITIONAL(USE_CDDA2WAV, false)
10086
aeefee804ec9 2007-06-20 Damien Carbery <[email protected]>
dcarbery
parents: 10077
diff changeset
    33
 AM_CONDITIONAL(USE_FLAC, false)
aeefee804ec9 2007-06-20 Damien Carbery <[email protected]>
dcarbery
parents: 10077
diff changeset
    34
 AM_CONDITIONAL(USE_GCONF, false)
14505
166ab6279435 2008-10-27 Brian Cameron <[email protected]>
yippi
parents: 13303
diff changeset
    35
 AM_CONDITIONAL(USE_GCONFTOOL, false)
14971
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
    36
@@ -1055,6 +1083,7 @@ ext/Makefile
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    37
 ext/aalib/Makefile
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    38
 ext/annodex/Makefile
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    39
 ext/cairo/Makefile
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    40
+ext/cdda2wav/Makefile
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    41
 ext/dv/Makefile
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    42
 ext/esd/Makefile
13303
cad9fa508e43 2008-08-28 Brian Cameron <[email protected]>
yippi
parents: 12973
diff changeset
    43
 ext/flac/Makefile
cad9fa508e43 2008-08-28 Brian Cameron <[email protected]>
yippi
parents: 12973
diff changeset
    44
--- gst-plugins-good-0.10.10/ext/Makefile.am-orig	2008-08-27 23:56:51.987944000 -0500
cad9fa508e43 2008-08-28 Brian Cameron <[email protected]>
yippi
parents: 12973
diff changeset
    45
+++ gst-plugins-good-0.10.10/ext/Makefile.am	2008-08-27 23:57:20.124741000 -0500
cad9fa508e43 2008-08-28 Brian Cameron <[email protected]>
yippi
parents: 12973
diff changeset
    46
@@ -16,6 +16,12 @@ else
cad9fa508e43 2008-08-28 Brian Cameron <[email protected]>
yippi
parents: 12973
diff changeset
    47
 CAIRO_DIR =
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    48
 endif
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    49
 
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    50
+if USE_CDDA2WAV
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    51
+CDDA2WAV_DIR = cdda2wav
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    52
+else
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    53
+CDDA2WAV_DIR =
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    54
+endif
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    55
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    56
 if USE_ESD
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    57
 ESD_DIR = esd
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    58
 else
13303
cad9fa508e43 2008-08-28 Brian Cameron <[email protected]>
yippi
parents: 12973
diff changeset
    59
@@ -131,6 +137,7 @@ SUBDIRS = \
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    60
 	$(CAIRO_DIR) \
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    61
 	$(DV1394_DIR) \
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    62
 	$(ESD_DIR) \
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    63
+	$(CDDA2WAV_DIR) \
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    64
 	$(FLAC_DIR) \
13303
cad9fa508e43 2008-08-28 Brian Cameron <[email protected]>
yippi
parents: 12973
diff changeset
    65
 	$(GCONF_DIR) \
cad9fa508e43 2008-08-28 Brian Cameron <[email protected]>
yippi
parents: 12973
diff changeset
    66
 	$(GDK_PIXBUF_DIR) \
11497
80653296c413 2008-01-21 Brian Cameron <[email protected]>
yippi
parents: 10086
diff changeset
    67
--- /dev/null	2007-03-19 01:47:57.000000000 +0800
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    68
+++ gst-plugins-good-0.10.6/ext/cdda2wav/Makefile.am	2007-03-19 01:46:41.639278000 +0800
11497
80653296c413 2008-01-21 Brian Cameron <[email protected]>
yippi
parents: 10086
diff changeset
    69
@@ -0,0 +1,20 @@
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    70
+plugin_LTLIBRARIES = libgstcdda2wav.la
11497
80653296c413 2008-01-21 Brian Cameron <[email protected]>
yippi
parents: 10086
diff changeset
    71
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    72
+libgstcdda2wav_la_SOURCES = \
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    73
+	gstcdda2wav.c
11497
80653296c413 2008-01-21 Brian Cameron <[email protected]>
yippi
parents: 10086
diff changeset
    74
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    75
+libgstcdda2wav_la_CFLAGS = \
11497
80653296c413 2008-01-21 Brian Cameron <[email protected]>
yippi
parents: 10086
diff changeset
    76
+	$(GST_PLUGINS_BASE_CFLAGS) \
80653296c413 2008-01-21 Brian Cameron <[email protected]>
yippi
parents: 10086
diff changeset
    77
+	$(GST_BASE_CFLAGS) \
80653296c413 2008-01-21 Brian Cameron <[email protected]>
yippi
parents: 10086
diff changeset
    78
+	$(GST_CFLAGS) \
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    79
+	$(CDDA2WAV_CFLAGS)
11497
80653296c413 2008-01-21 Brian Cameron <[email protected]>
yippi
parents: 10086
diff changeset
    80
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    81
+libgstcdda2wav_la_LIBADD = \
11497
80653296c413 2008-01-21 Brian Cameron <[email protected]>
yippi
parents: 10086
diff changeset
    82
+	$(GST_PLUGINS_BASE_LIBS) -lgstcdda-$(GST_MAJORMINOR) \
80653296c413 2008-01-21 Brian Cameron <[email protected]>
yippi
parents: 10086
diff changeset
    83
+	$(GST_BASE_LIBS) \
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    84
+	$(CDDA2WAV_LIBS)
11497
80653296c413 2008-01-21 Brian Cameron <[email protected]>
yippi
parents: 10086
diff changeset
    85
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    86
+libgstcdda2wav_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) 
11497
80653296c413 2008-01-21 Brian Cameron <[email protected]>
yippi
parents: 10086
diff changeset
    87
+
80653296c413 2008-01-21 Brian Cameron <[email protected]>
yippi
parents: 10086
diff changeset
    88
+noinst_HEADERS = \
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    89
+	gstcdda2wav.h
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    90
--- /dev/null	2008-12-19 17:50:06.000000000 -0600
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    91
+++ gst-plugins-good-0.10.6/ext/cdda2wav/gstcdda2wav.h	2008-07-17 07:48:57.000000000 -0500
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    92
@@ -0,0 +1,72 @@
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    93
+/* GStreamer
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
    94
+ * Copyright (C) 2007 Brian Cameron <[email protected]> and
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    95
+ *                    Artem Kachitchkine <[email protected]>
15397
afba4c1627d1 update patch
jerrytan
parents: 15382
diff changeset
    96
+ * Copyright (C) 2008 J�rg Schilling <[email protected]>
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    97
+ *
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    98
+ * This library is free software; you can redistribute it and/or
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
    99
+ * modify it under the terms of the GNU Library General Public
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   100
+ * License as published by the Free Software Foundation; either
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   101
+ * version 2 of the License, or (at your option) any later version.
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   102
+ *
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   103
+ * This library is distributed in the hope that it will be useful,
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   104
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   105
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   106
+ * Library General Public License for more details.
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   107
+ *
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   108
+ * You should have received a copy of the GNU Library General Public
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   109
+ * License along with this library; if not, write to the
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   110
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   111
+ * Boston, MA 02111-1307, USA.
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   112
+ */
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   113
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   114
+#ifndef __GST_CDDA2WAV_H__
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   115
+#define __GST_CDDA2WAV_H__
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   116
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   117
+#include <sys/types.h>
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   118
+#include "gst/cdda/gstcddabasesrc.h"
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   119
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   120
+#define CDDA2WAV_BSIZE   2352
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   121
+
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   122
+G_BEGIN_DECLS
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   123
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   124
+#define GST_TYPE_CDDA2WAV           (gst_cdda2wav_get_type())
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   125
+#define GST_CDDA2WAV(obj)           (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CDDA2WAV,GstCdda2Wav))
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   126
+#define GST_CDDA2WAV_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CDDA2WAV,GstCdda2WavClass))
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   127
+#define GST_IS_CDDA2WAV(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CDDA2WAV))
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   128
+#define GST_IS_CDDA2WAV_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CDDA2WAV))
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   129
+#define GST_CDDA2WAV_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_CDDA2WAV, GstCdda2WavClass))
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   130
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   131
+typedef struct _GstCdda2Wav GstCdda2Wav;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   132
+typedef struct _GstCdda2WavClass GstCdda2WavClass;
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   133
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   134
+#define CDDA2WAV_BSIZE   2352
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   135
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   136
+/**
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   137
+ * GstCdda2Wav::
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   138
+ *
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   139
+ * The cdda2wav object structure.
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   140
+ */
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   141
+struct _GstCdda2Wav {
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   142
+  GstCddaBaseSrc   cddabasesrc;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   143
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   144
+  /*< private >*/
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   145
+  FILE            *cdda2wav_in;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   146
+  FILE            *cdda2wav_out;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   147
+  FILE            *cdda2wav_err;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   148
+  pid_t		  cdda2wav_pid;
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   149
+  uint_t          track_count;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   150
+  char            **devices;
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   151
+  char            *current_device;
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   152
+  boolean_t       *has_audio;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   153
+};
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   154
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   155
+struct _GstCdda2WavClass {
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   156
+  GstCddaBaseSrcClass parent_class;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   157
+};
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   158
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   159
+GType    gst_cdda2wav_get_type (void);
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   160
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   161
+G_END_DECLS
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   162
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   163
+#endif /* __GST_CDDA2WAV_H__ */
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   164
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   165
--- /dev/null	2009-01-08 02:18:21.000000000 -0600
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   166
+++ gst-plugins-good-0.10.11/ext/cdda2wav/gstcdda2wav.c	2009-01-08 02:17:15.164536000 -0600
15397
afba4c1627d1 update patch
jerrytan
parents: 15382
diff changeset
   167
@@ -0,0 +1,795 @@
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   168
+/* GStreamer
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   169
+ * Copyright (C) <2007> Brian Cameron <[email protected]> and
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   170
+ *                      Artem Kachitchkine <[email protected]>
15397
afba4c1627d1 update patch
jerrytan
parents: 15382
diff changeset
   171
+ * Copyright (C) 2008	J�rg Schilling <[email protected]>
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   172
+ *
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   173
+ * This library is free software; you can redistribute it and/or
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   174
+ * modify it under the terms of the GNU Library General Public
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   175
+ * License as published by the Free Software Foundation; either
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   176
+ * version 2 of the License, or (at your option) any later version.
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   177
+ *
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   178
+ * This library is distributed in the hope that it will be useful,
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   179
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   180
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   181
+ * Library General Public License for more details.
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   182
+ *
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   183
+ * You should have received a copy of the GNU Library General Public
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   184
+ * License along with this library; if not, write to the
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   185
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   186
+ * Boston, MA 02111-1307, USA.
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   187
+ */
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   188
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   189
+/**
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   190
+ * SECTION:element-cdda2wav
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   191
+ * @short_description: Reads raw audio from an Audio CD
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   192
+ * @see_also: GstCddaBaseSrc
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   193
+ *
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   194
+ * <refsect2>
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   195
+ * <para>
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   196
+ * cdda2wav reads and extracts raw audio from Audio CDs using cdda2wav.
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   197
+ * </para>
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   198
+ * <title>Example launch line</title>
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   199
+ * <para>
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   200
+ * <programlisting>
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   201
+ * gst-launch cdda2wav track=5 ! audioconvert ! vorbisenc ! oggmux ! filesink location=track5.ogg
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   202
+ * </programlisting>
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   203
+ * This pipeline extracts track 5 of the audio CD and encodes it into an
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   204
+ * Ogg/Vorbis file.
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   205
+ * </para>
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   206
+ * </refsect2>
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   207
+ */
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   208
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   209
+#ifdef HAVE_CONFIG_H
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   210
+#include "config.h"
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   211
+#endif
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   212
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   213
+#include <stdio.h>
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   214
+#include <stdlib.h>
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   215
+#include <fcntl.h>
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   216
+#include <string.h>
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   217
+#include <libintl.h>
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   218
+#include <errno.h>
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   219
+#include <unistd.h>
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   220
+#include <sys/filio.h>
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   221
+#include <signal.h>
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   222
+#define	HAVE_POLL		/* XXX Need autoconf test */
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   223
+#ifdef	HAVE_POLL
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   224
+#include <poll.h>
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   225
+#endif
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   226
+#include <sys/byteorder.h>
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   227
+#include <hal/libhal.h>
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   228
+#include <hal/libhal-storage.h>
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   229
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   230
+#include "gstcdda2wav.h"
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   231
+#include "gst/gst-i18n-plugin.h"
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   232
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   233
+enum
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   234
+{
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   235
+  PROP0 = 0,
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   236
+};
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   237
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   238
+GST_DEBUG_CATEGORY_STATIC (gst_cdda2wav_debug);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   239
+#define GST_CAT_DEFAULT gst_cdda2wav_debug
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   240
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   241
+GST_BOILERPLATE (GstCdda2Wav, gst_cdda2wav, GstCddaBaseSrc,
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   242
+    GST_TYPE_CDDA_BASE_SRC)
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   243
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   244
+static void gst_cdda2wav_finalize (GObject * obj);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   245
+static GstBuffer *gst_cdda2wav_read_sector (GstCddaBaseSrc * src,
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   246
+    gint sector);
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   247
+static gboolean gst_cdda2wav_open (GstCddaBaseSrc * src,
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   248
+    const gchar * device);
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   249
+static void gst_cdda2wav_close (GstCddaBaseSrc * src);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   250
+static gchar **gst_cdda2wav_probe_devices (GstCddaBaseSrc * cddabasesrc);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   251
+static gchar *gst_cdda2wav_get_default_device (GstCddaBaseSrc * cddabasesrc);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   252
+static void gst_cdda2wav_set_property (GObject * object, guint prop_id,
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   253
+    const GValue * value, GParamSpec * pspec);
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   254
+static void gst_cdda2wav_get_property (GObject * object, guint prop_id,
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   255
+    GValue * value, GParamSpec * pspec);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   256
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   257
+static void gst_cdda2wav_hal_find_cdroms (GstCdda2Wav *);
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   258
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   259
+static pid_t xpopen(FILE **pfpin, FILE **pfpout, FILE **pfperr, const char *cmd);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   260
+static int xpclose(FILE *fpin, FILE *fpout, FILE *fperr, pid_t child);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   261
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   262
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   263
+static const GstElementDetails cdda2wav_details =
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   264
+GST_ELEMENT_DETAILS ("CD Audio (cdda) Source",
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   265
+    "Source/File",
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   266
+    "Read audio from CD",
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   267
+    "Brian Cameron <[email protected]>, " "Artem Kachitchkine <[email protected]>, "
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   268
+    "Joerg Schilling <[email protected]>");
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   269
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   270
+static void
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   271
+gst_cdda2wav_base_init (gpointer g_class)
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   272
+{
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   273
+  GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   274
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   275
+  gst_element_class_set_details (element_class, &cdda2wav_details);
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   276
+}
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   277
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   278
+static void
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   279
+gst_cdda2wav_init (GstCdda2Wav * src, GstCdda2WavClass * klass)
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   280
+{
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   281
+  src->devices        = NULL;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   282
+  src->current_device = NULL;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   283
+  src->cdda2wav_in    = NULL;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   284
+  src->cdda2wav_out   = NULL;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   285
+  src->cdda2wav_err   = NULL;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   286
+  src->cdda2wav_pid   = 0;
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   287
+}
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   288
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   289
+static void
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   290
+gst_cdda2wav_class_init (GstCdda2WavClass * klass)
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   291
+{
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   292
+  GstCddaBaseSrcClass *cddabasesrc_class = GST_CDDA_BASE_SRC_CLASS (klass);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   293
+  GObjectClass *gobject_class            = G_OBJECT_CLASS (klass);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   294
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   295
+  gobject_class->set_property            = gst_cdda2wav_set_property;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   296
+  gobject_class->get_property            = gst_cdda2wav_get_property;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   297
+  gobject_class->finalize                = gst_cdda2wav_finalize;
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   298
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   299
+  cddabasesrc_class->open                = gst_cdda2wav_open;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   300
+  cddabasesrc_class->close               = gst_cdda2wav_close;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   301
+  cddabasesrc_class->read_sector         = gst_cdda2wav_read_sector;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   302
+  cddabasesrc_class->get_default_device  = gst_cdda2wav_get_default_device;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   303
+  cddabasesrc_class->probe_devices       = gst_cdda2wav_probe_devices;
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   304
+}
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   305
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   306
+static gchar **
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   307
+gst_cdda2wav_probe_devices (GstCddaBaseSrc * cddabasesrc)
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   308
+{
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   309
+  GstCdda2Wav *src = GST_CDDA2WAV (cddabasesrc);
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   310
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   311
+  if (src->devices != NULL) {
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   312
+     free (src->devices);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   313
+     free (src->has_audio);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   314
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   315
+     src->devices = NULL;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   316
+     src->has_audio = NULL;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   317
+  }
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   318
+  gst_cdda2wav_hal_find_cdroms (src);
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   319
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   320
+  return (src->devices);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   321
+}
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   322
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   323
+static gchar *
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   324
+gst_cdda2wav_get_default_device (GstCddaBaseSrc * cddabasesrc)
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   325
+{
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   326
+  GstCdda2Wav *src;
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   327
+  gchar *ret = NULL;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   328
+  int i;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   329
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   330
+  src = GST_CDDA2WAV (cddabasesrc);
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   331
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   332
+  if (src->devices == NULL) {
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   333
+     gst_cdda2wav_probe_devices (cddabasesrc);
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   334
+     if (src->devices == NULL) {
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   335
+        return (NULL);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   336
+     }
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   337
+  }
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   338
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   339
+  /* prefer a drive with an audio disc, otherwise pick first */
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   340
+  for (i = 0; src->devices[i] != NULL; i++) {
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   341
+      if (src->has_audio[i]) {
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   342
+         ret = src->devices[i];
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   343
+         break;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   344
+      }
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   345
+  }
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   346
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   347
+  if (ret == NULL)
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   348
+     ret = src->devices[0];
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   349
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   350
+  GST_LOG_OBJECT (src, "returning default device: %s", GST_STR_NULL (ret));
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   351
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   352
+  return (ret);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   353
+}
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   354
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   355
+static boolean_t
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   356
+cdda2wav_read_toc (GstCdda2Wav *src)
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   357
+{
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   358
+  gchar   *command;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   359
+  char     buf[BUFSIZ];
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   360
+  guint    leadout;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   361
+  int      track_num;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   362
+  uint_t   i;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   363
+  GstCddaBaseSrcTrack tracks[100];
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   364
+  FILE	*f;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   365
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   366
+  /* Open the connection to cdda2wav */
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   367
+  command = g_strdup_printf (
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   368
+	"/usr/bin/cdda2wav -q dev=%s --info-only -vtoc --no-infofile --gui 2>&1",
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   369
+	src->current_device);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   370
+  f = popen (command, "r");
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   371
+  g_free (command);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   372
+	if (f == NULL)
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   373
+		return (FALSE);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   374
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   375
+  track_num = 0;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   376
+  leadout   = 0;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   377
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   378
+  i = 0;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   379
+  while (fgets (buf, BUFSIZ, f) != NULL) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   380
+     char *endptr;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   381
+     g_strchomp (buf);
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   382
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   383
+     if ((strlen (buf) > 12) &&
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   384
+         (buf[0] == 'T') &&
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   385
+         (g_ascii_isdigit(buf[1])) &&
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   386
+         (g_ascii_isdigit(buf[2])) &&
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   387
+         (buf[3] == ':')) {
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   388
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   389
+	track_num = buf[2] - '0' + (buf[1] - '0') * 10;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   390
+	tracks[i].is_audio = strstr((buf + 4), "audio") != 0;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   391
+	tracks[i].num      = buf[2] - '0' + (buf[1] - '0') * 10;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   392
+	tracks[i].tags     = NULL;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   393
+	tracks[i].start    = (guint) (g_ascii_strtod ((buf + 4), &endptr));
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   394
+#ifdef	DEBUG
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   395
+	fprintf(stderr, "Track %2.2d %2.2d audio %d start %u\n",
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   396
+		i, tracks[i].num, tracks[i].is_audio, tracks[i].start);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   397
+#endif
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   398
+	i++;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   399
+     }
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   400
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   401
+     if (strncmp (buf, "Leadout:", 8) == 0) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   402
+         leadout = (guint) (g_ascii_strtod ((buf + 8), &endptr));
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   403
+     }
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   404
+  }
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   405
+  track_num = i;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   406
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   407
+  for (i=0; i < track_num; i++) {
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   408
+     GstCddaBaseSrcTrack track = { 0, };
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   409
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   410
+     track.is_audio = tracks[i].is_audio;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   411
+     track.num      = tracks[i].num;
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   412
+     track.tags     = NULL;
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   413
+     track.start    = tracks[i].start;
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   414
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   415
+     if (i < (track_num - 1))
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   416
+        track.end = tracks[i+1].start - 1;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   417
+     else
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   418
+        track.end = leadout;
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   419
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   420
+     gst_cdda_base_src_add_track (GST_CDDA_BASE_SRC (src), &track);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   421
+  }
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   422
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   423
+  src->track_count = track_num + 1;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   424
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   425
+  pclose (f);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   426
+
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   427
+  return (TRUE);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   428
+}
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   429
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   430
+static gboolean
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   431
+gst_cdda2wav_open (GstCddaBaseSrc * cddabasesrc, const gchar * device)
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   432
+{
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   433
+  GstCdda2Wav *src = GST_CDDA2WAV (cddabasesrc);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   434
+  gchar       *command;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   435
+  gboolean     ret;
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   436
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   437
+  g_assert (device != NULL);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   438
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   439
+  GST_LOG_OBJECT (src, "Trying to open device %s", device);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   440
+  src->current_device = g_strdup (device);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   441
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   442
+  ret = cdda2wav_read_toc (src);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   443
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   444
+  return ret;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   445
+}
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   446
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   447
+static int
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   448
+gst_cdda_close (GstCdda2Wav  * src)
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   449
+{
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   450
+  int rc = 0;
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   451
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   452
+  if (src->cdda2wav_pid != 0) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   453
+     rc = xpclose (src->cdda2wav_in, src->cdda2wav_out, src->cdda2wav_err,
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   454
+		src->cdda2wav_pid);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   455
+  }
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   456
+  src->cdda2wav_in  = NULL;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   457
+  src->cdda2wav_out = NULL;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   458
+  src->cdda2wav_err = NULL;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   459
+  src->cdda2wav_pid = 0;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   460
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   461
+  return rc;
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   462
+}
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   463
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   464
+static void
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   465
+gst_cdda2wav_close (GstCddaBaseSrc * cddabasesrc)
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   466
+{
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   467
+  GstCdda2Wav *src = GST_CDDA2WAV (cddabasesrc);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   468
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   469
+  gst_cdda_close (src);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   470
+}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   471
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   472
+static gboolean
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   473
+getans(GstCdda2Wav *src)
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   474
+{
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   475
+	char	buf[1024];
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   476
+	char	*p;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   477
+	int	ret;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   478
+#ifdef	HAVE_POLL
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   479
+	struct pollfd	pfd[1];
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   480
+#endif
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   481
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   482
+#ifdef	DEBUG
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   483
+	fprintf(stderr, "getans\n");
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   484
+#endif
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   485
+	if (src->cdda2wav_err == NULL)
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   486
+		return (FALSE);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   487
+	do {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   488
+		buf[0] = '\0';
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   489
+#ifdef	HAVE_POLL
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   490
+		pfd[0].fd = fileno(src->cdda2wav_err);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   491
+		pfd[0].events = POLLIN;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   492
+		pfd[0].revents = 0;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   493
+        	if (poll(pfd, 1, 5000) < 1)	/* Give up after 5s */
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   494
+			break;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   495
+#else
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   496
+		insert select code here
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   497
+#endif
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   498
+		p = fgets(buf, sizeof (buf), src->cdda2wav_err);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   499
+#ifdef	DEBUG
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   500
+		fprintf(stderr, "ERR: '%s'\n", buf);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   501
+#endif
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   502
+		if (buf[0] >= '0' && buf[0] <= '9' &&
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   503
+		    buf[1] >= '0' && buf[1] <= '9' &&
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   504
+		    buf[2] >= '0' && buf[2] <= '9' &&
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   505
+		    buf[3] == ' ')
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   506
+			break;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   507
+	} while (p);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   508
+	ret = atoi(buf);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   509
+	if (ret != 200) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   510
+		fprintf(stderr, "ERR: %s\n", buf);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   511
+		gst_cdda_close (src);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   512
+		return (FALSE);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   513
+	}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   514
+	return (TRUE);
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   515
+}
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   516
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   517
+static void
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   518
+flushpipe(FILE *f)
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   519
+{
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   520
+	int	nread;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   521
+	char	fbuf[5120];
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   522
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   523
+	do {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   524
+		ioctl(fileno(f), FIONREAD, &nread);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   525
+		if (nread > 0) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   526
+			int	amt;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   527
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   528
+			amt = nread;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   529
+			if (amt > sizeof (fbuf))
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   530
+				amt = sizeof (fbuf);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   531
+			if (fread(fbuf, amt, 1, f) != 1)
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   532
+				break;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   533
+		}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   534
+	} while (nread > 0);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   535
+}
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   536
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   537
+static gboolean
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   538
+sendcmd(GstCdda2Wav *src, const char *fmt, uint_t addr)
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   539
+{
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   540
+	struct sigaction old;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   541
+	struct sigaction my;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   542
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   543
+	sigemptyset(&my.sa_mask);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   544
+	my.sa_handler == SIG_IGN;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   545
+	my.sa_flags = 0;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   546
+	sigaction(SIGPIPE, &my, &old);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   547
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   548
+	clearerr(src->cdda2wav_in);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   549
+	fprintf(src->cdda2wav_in, fmt, addr);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   550
+	fflush(src->cdda2wav_in);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   551
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   552
+	sigaction(SIGPIPE, &old, NULL);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   553
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   554
+	if (ferror(src->cdda2wav_in)) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   555
+		gst_cdda_close(src);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   556
+		return (FALSE);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   557
+	}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   558
+	return (TRUE);
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   559
+}
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   560
+
15397
afba4c1627d1 update patch
jerrytan
parents: 15382
diff changeset
   561
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
afba4c1627d1 update patch
jerrytan
parents: 15382
diff changeset
   562
+#define CDDA2WAV_BYTE_ORDER "little"
afba4c1627d1 update patch
jerrytan
parents: 15382
diff changeset
   563
+#elif G_BYTE_ORDER == G_BIG_ENDIAN
afba4c1627d1 update patch
jerrytan
parents: 15382
diff changeset
   564
+#define CDDA2WAV_BYTE_ORDER "big"
afba4c1627d1 update patch
jerrytan
parents: 15382
diff changeset
   565
+#else
afba4c1627d1 update patch
jerrytan
parents: 15382
diff changeset
   566
+#error "G_BYTE_ORDER should be big or little endian."
afba4c1627d1 update patch
jerrytan
parents: 15382
diff changeset
   567
+#endif
afba4c1627d1 update patch
jerrytan
parents: 15382
diff changeset
   568
+
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   569
+static gboolean
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   570
+cdda2wav_read (GstCdda2Wav *src, void *buf, uint_t addr, uint_t len)
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   571
+{
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   572
+  static int last_addr = -1; 
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   573
+  char * command;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   574
+  int		did_retry = -1;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   575
+  gboolean	do_paranoia = FALSE;	/* Need to be parameterized from elsewhere */
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   576
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   577
+retry:
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   578
+  if (++did_retry > 1)
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   579
+	return (FALSE);
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   580
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   581
+  if (src->cdda2wav_pid == 0) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   582
+     command = g_strdup_printf (
15397
afba4c1627d1 update patch
jerrytan
parents: 15382
diff changeset
   583
+	"/usr/bin/cdda2wav -q --output-endianess=%s dev=%s -Oraw %s -interactive -",
afba4c1627d1 update patch
jerrytan
parents: 15382
diff changeset
   584
+        CDDA2WAV_BYTE_ORDER, src->current_device,
afba4c1627d1 update patch
jerrytan
parents: 15382
diff changeset
   585
+        do_paranoia ? "-paranoia -paraopts=minoverlap=2":"");
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   586
+     src->cdda2wav_pid = xpopen (&src->cdda2wav_in, &src->cdda2wav_out,
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   587
+						&src->cdda2wav_err, command);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   588
+#ifdef	DEBUG
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   589
+     fprintf(stderr, "PID %d\n", src->cdda2wav_pid);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   590
+#endif
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   591
+     g_free (command);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   592
+	if (!sendcmd(src, "read sectors %u\n", addr))
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   593
+		goto retry;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   594
+	if (!getans(src))
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   595
+		goto retry;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   596
+	last_addr = addr;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   597
+  } else if (addr != (last_addr + 1)) {	/* Check whether we need to seek */
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   598
+	int	nread;
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   599
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   600
+	if (!sendcmd(src, "stop\n", 0))
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   601
+		goto retry;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   602
+	flushpipe(src->cdda2wav_out);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   603
+	if (!getans(src))
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   604
+		goto retry;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   605
+	do {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   606
+		if (!sendcmd(src, "stop\n", 0))
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   607
+			goto retry;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   608
+		flushpipe(src->cdda2wav_out);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   609
+		if (!getans(src))
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   610
+			goto retry;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   611
+		ioctl(fileno(src->cdda2wav_out), FIONREAD, &nread);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   612
+	} while (nread > 0);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   613
+	if (!sendcmd(src, "read sectors %u\n", addr))
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   614
+		goto retry;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   615
+	if (!getans(src))
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   616
+		goto retry;
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   617
+  }
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   618
+  last_addr = addr;
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   619
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   620
+  if (fread (buf, CDDA2WAV_BSIZE, len, src->cdda2wav_out) != len) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   621
+	if (feof(src->cdda2wav_out)) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   622
+		if (gst_cdda_close (src) == 0)
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   623
+			return (TRUE);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   624
+		goto retry;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   625
+	}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   626
+	return (FALSE);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   627
+  }
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   628
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   629
+  return (TRUE);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   630
+}
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   631
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   632
+static GstBuffer *
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   633
+gst_cdda2wav_read_sector (GstCddaBaseSrc * cddabasesrc, gint sector)
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   634
+{
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   635
+  GstCdda2Wav *src = GST_CDDA2WAV (cddabasesrc);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   636
+  size_t       len = CDDA2WAV_BSIZE;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   637
+  GstBuffer   *buf;
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   638
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   639
+  buf = gst_buffer_new_and_alloc (CDDA2WAV_BSIZE);
12187
6ec70c2577d6 better patch for bug 6687261
jerrytan
parents: 12158
diff changeset
   640
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   641
+  if (!cdda2wav_read (src, GST_BUFFER_DATA (buf), sector, 1)) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   642
+     free (buf);
12187
6ec70c2577d6 better patch for bug 6687261
jerrytan
parents: 12158
diff changeset
   643
+     buf = NULL;
6ec70c2577d6 better patch for bug 6687261
jerrytan
parents: 12158
diff changeset
   644
+     return NULL;
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   645
+  }
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   646
+
12187
6ec70c2577d6 better patch for bug 6687261
jerrytan
parents: 12158
diff changeset
   647
+  return (buf);
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   648
+}
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   649
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   650
+static void
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   651
+gst_cdda2wav_finalize (GObject * obj)
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   652
+{
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   653
+  GstCdda2Wav *src = GST_CDDA2WAV (obj);
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   654
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   655
+  gst_cdda_close (src);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   656
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   657
+  g_free (src->devices);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   658
+  g_free (src->current_device);
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   659
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   660
+  G_OBJECT_CLASS (parent_class)->finalize (obj);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   661
+}
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   662
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   663
+static gboolean
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   664
+plugin_init (GstPlugin * plugin)
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   665
+{
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   666
+  GST_DEBUG_CATEGORY_INIT (gst_cdda2wav_debug, "cdda2wav", 0,
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   667
+      "CDDA Source");
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   668
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   669
+  if (!gst_element_register (plugin, "cdda2wav", GST_RANK_SECONDARY,
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   670
+          GST_TYPE_CDDA2WAV))
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   671
+    return FALSE;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   672
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   673
+#ifdef ENABLE_NLS
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   674
+  GST_DEBUG ("binding text domain %s to locale dir %s", GETTEXT_PACKAGE,
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   675
+      LOCALEDIR);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   676
+  bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   677
+#endif
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   678
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   679
+  return TRUE;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   680
+}
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   681
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   682
+static void
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   683
+gst_cdda2wav_set_property (GObject * object, guint prop_id,
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   684
+    const GValue * value, GParamSpec * pspec)
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   685
+{
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   686
+  GstCdda2Wav *src = GST_CDDA2WAV (object);
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   687
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   688
+  switch (prop_id) {
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   689
+    default:
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   690
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   691
+      break;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   692
+  }
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   693
+}
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   694
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   695
+static void
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   696
+gst_cdda2wav_get_property (GObject * object, guint prop_id,
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   697
+    GValue * value, GParamSpec * pspec)
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   698
+{
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   699
+  GstCdda2Wav *src = GST_CDDA2WAV (object);
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   700
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   701
+  switch (prop_id) {
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   702
+    default:
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   703
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   704
+      break;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   705
+  }
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   706
+}
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   707
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   708
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   709
+    GST_VERSION_MINOR,
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   710
+    "cdda2wav",
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   711
+    "Read audio from CD",
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   712
+    plugin_init, VERSION, "GPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   713
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   714
+/* ===== HAL stuff ===== */
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   715
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   716
+static LibHalContext *
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   717
+gst_cdda2wav_hal_init (GstCdda2Wav *src)
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   718
+{
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   719
+  DBusError error;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   720
+  LibHalContext *hal_ctx = NULL;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   721
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   722
+  dbus_error_init (&error);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   723
+  if ((hal_ctx = libhal_ctx_new ()) == NULL) {
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   724
+     GST_ELEMENT_ERROR (src, LIBRARY, INIT,
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   725
+        ("failed to initialize HAL"), ("failed to initialize HAL"));
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   726
+     goto out;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   727
+  }
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   728
+  if (!libhal_ctx_set_dbus_connection(hal_ctx,
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   729
+      dbus_bus_get (DBUS_BUS_SYSTEM, &error))) {
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   730
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   731
+     GST_ELEMENT_ERROR (src, LIBRARY, INIT,
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   732
+        ("DBus connection failed"),
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   733
+        ("libhal_ctx_set_dbus_connection: %s %s", error.name, error.message));
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   734
+     libhal_ctx_free (hal_ctx);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   735
+     goto out;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   736
+  }
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   737
+  if (!libhal_ctx_init(hal_ctx, &error)) {
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   738
+    GST_ELEMENT_ERROR (src, LIBRARY, INIT,
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   739
+       ("HAL context init failed"),
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   740
+       ("libhal_ctx_init: %s: %s", error.name, error.message));
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   741
+    libhal_ctx_free (hal_ctx);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   742
+    goto out;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   743
+  }
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   744
+out:
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   745
+  dbus_error_free (&error);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   746
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   747
+  return (hal_ctx);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   748
+}
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   749
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   750
+static void
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   751
+gst_cdda2wav_hal_fini (LibHalContext *hal_ctx)
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   752
+{
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   753
+  DBusError error;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   754
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   755
+  dbus_error_init (&error);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   756
+  libhal_ctx_shutdown (hal_ctx, &error);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   757
+  libhal_ctx_free (hal_ctx);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   758
+  dbus_error_free (&error);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   759
+}
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   760
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   761
+static void
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   762
+gst_cdda2wav_hal_find_cdroms (GstCdda2Wav *src)
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   763
+{
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   764
+  DBusError       error;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   765
+  LibHalContext   *hal_ctx;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   766
+  int             i, j, k;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   767
+  char            **drive_udis, **volume_udis;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   768
+  int             num_drives, num_volumes;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   769
+  char            *raw_device;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   770
+  LibHalDrive     *drive;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   771
+  dbus_bool_t     has_audio;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   772
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   773
+  if ((hal_ctx = gst_cdda2wav_hal_init (src)) == NULL) {
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   774
+     return;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   775
+  }
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   776
+  dbus_error_init (&error);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   777
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   778
+  drive_udis = libhal_find_device_by_capability (hal_ctx, "storage.cdrom",
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   779
+    &num_drives, &error);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   780
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   781
+  if (dbus_error_is_set (&error) || drive_udis == NULL) {
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   782
+     goto out;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   783
+  }
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   784
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   785
+  src->devices   = calloc (num_drives + 1, sizeof (char *));
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   786
+  src->has_audio = calloc (num_drives + 1, sizeof (boolean_t));
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   787
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   788
+  for (i = j = 0; i < num_drives; i++) {
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   789
+     raw_device = libhal_device_get_property_string (hal_ctx,
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   790
+        drive_udis[i], "block.solaris.raw_device", &error);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   791
+     dbus_error_free (&error);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   792
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   793
+     if ((raw_device == NULL) || (strlen (raw_device) == 0)) {
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   794
+        libhal_free_string (raw_device);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   795
+        continue;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   796
+     }
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   797
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   798
+     src->devices[j] = strdup (raw_device);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   799
+     libhal_free_string (raw_device);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   800
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   801
+     /* check for audio disc in this drive */
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   802
+     if ((drive = libhal_drive_from_udi (hal_ctx, drive_udis[i])) != NULL) {
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   803
+        if ((volume_udis = libhal_drive_find_all_volumes (hal_ctx,
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   804
+             drive, &num_volumes)) != NULL) {
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   805
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   806
+           for (k = 0; k < num_volumes; k++) {
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   807
+               src->has_audio[j] = (boolean_t)
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   808
+               libhal_device_get_property_bool (hal_ctx,
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   809
+                  volume_udis[k], "volume.disc.has_audio", &error);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   810
+               dbus_error_free (&error);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   811
+               if (src->has_audio[j]) {
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   812
+                  break;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   813
+               }
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   814
+           }
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   815
+           libhal_free_string_array (volume_udis);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   816
+        }
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   817
+        libhal_drive_free (drive);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   818
+     }
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   819
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   820
+     j++;
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   821
+  }
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   822
+
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   823
+out:
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   824
+  libhal_free_string_array (drive_udis);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   825
+  dbus_error_free (&error);
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   826
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   827
+  gst_cdda2wav_hal_fini (hal_ctx);
10077
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   828
+}
3d9206bcca93 2007-06-19 Damien Carbery <[email protected]>
dcarbery
parents:
diff changeset
   829
+
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   830
+#define	HAVE_SYS_FORK_H		/* XXX Need autoconf test */
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   831
+#ifdef	HAVE_SYS_FORK_H
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   832
+#include <sys/fork.h>
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   833
+#endif
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   834
+#include <wait.h>
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   835
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   836
+static pid_t
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   837
+xpopen(FILE **pfpin, FILE **pfpout, FILE **pfperr, const char *cmd)
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   838
+{
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   839
+	int	in[2];
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   840
+	int	out[2];
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   841
+	int	err[2];
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   842
+	pid_t	pid;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   843
+ 
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   844
+	in[0]  = STDIN_FILENO;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   845
+	out[1] = STDOUT_FILENO;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   846
+	err[1] = STDERR_FILENO;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   847
+	if (pfpin) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   848
+		if (pipe(in) < 0)
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   849
+			return ((pid_t)-1);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   850
+	}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   851
+	if (pfpout) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   852
+		if (pipe(out) < 0) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   853
+			close(in[0]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   854
+			close(in[1]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   855
+			return ((pid_t)-1);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   856
+		}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   857
+	}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   858
+	if (pfperr) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   859
+		if (pipe(err) < 0) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   860
+			close(in[0]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   861
+			close(in[1]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   862
+			close(out[0]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   863
+			close(out[1]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   864
+			return ((pid_t)-1);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   865
+		}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   866
+	}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   867
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   868
+#ifdef	FORK_NOSIGCHLD
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   869
+	pid = vforkx(FORK_NOSIGCHLD|FORK_WAITPID);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   870
+#else
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   871
+	pid = vfork();	/* Need to find a way to deal with SIGCHLD and wait */
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   872
+#endif
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   873
+	if (pid == (pid_t)-1) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   874
+		return ((pid_t)-1);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   875
+	} else if (pid > 0) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   876
+		if (pfpin) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   877
+			close(in[0]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   878
+			*pfpin = fdopen(in[1], "w");
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   879
+			if (*pfpin == NULL) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   880
+				close(in[1]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   881
+				close(out[0]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   882
+				close(out[1]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   883
+				close(err[0]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   884
+				close(err[1]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   885
+				kill(pid, SIGKILL);
14971
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
   886
+				xpclose(NULL, NULL, NULL, pid);
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   887
+				return ((pid_t)-1);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   888
+			}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   889
+		}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   890
+		if (pfpout) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   891
+			close(out[1]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   892
+			*pfpout = fdopen(out[0], "r");
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   893
+			if (*pfpout == NULL) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   894
+				close(out[0]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   895
+				close(err[0]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   896
+				close(err[1]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   897
+				kill(pid, SIGKILL);
14971
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
   898
+				xpclose(*pfpin, NULL, NULL, pid);
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   899
+				return ((pid_t)-1);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   900
+			}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   901
+		}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   902
+		if (pfperr) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   903
+			close(err[1]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   904
+			*pfperr = fdopen(err[0], "r");
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   905
+			if (*pfperr == NULL) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   906
+				close(err[0]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   907
+				kill(pid, SIGKILL);
14971
89aa946167a8 2009-01-23 Brian Cameron <[email protected]>
yippi
parents: 14884
diff changeset
   908
+				xpclose(*pfpin, *pfpout, NULL, pid);
14884
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   909
+				return ((pid_t)-1);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   910
+			}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   911
+		}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   912
+	} else {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   913
+		if (pfpin)
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   914
+			close(in[1]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   915
+		if (pfpout)
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   916
+			close(out[0]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   917
+		if (pfperr)
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   918
+			close(err[0]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   919
+		if (in[0] != STDIN_FILENO) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   920
+			dup2(in[0], STDIN_FILENO);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   921
+			close(in[0]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   922
+		}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   923
+		if (out[1] != STDOUT_FILENO) { 
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   924
+			dup2(out[1], STDOUT_FILENO); 
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   925
+			close(out[1]); 
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   926
+		} 
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   927
+		if (err[1] != STDERR_FILENO) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   928
+			dup2(err[1], STDERR_FILENO);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   929
+			close(err[1]);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   930
+		}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   931
+		execl("/bin/sh", "sh", "-c", cmd, (char *)0);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   932
+		_exit(1);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   933
+	}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   934
+	return (pid);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   935
+}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   936
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   937
+static int
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   938
+xpclose(FILE *fpin, FILE *fpout, FILE *fperr, pid_t child)
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   939
+{
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   940
+	int	status = 0;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   941
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   942
+	if (fpin)
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   943
+		fclose(fpin);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   944
+	if (fpout)
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   945
+		fclose(fpout);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   946
+	if (fperr)
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   947
+		fclose(fperr);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   948
+
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   949
+	if (child <= 0) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   950
+		errno = ECHILD;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   951
+		return (-1);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   952
+	}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   953
+	if (waitpid(child, &status, WNOHANG) == child)
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   954
+		return (status);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   955
+	while (waitpid(child, &status, 0) < 0) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   956
+		if (errno != EINTR) {
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   957
+			status = -1;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   958
+			break;
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   959
+		}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   960
+	}
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   961
+	return (status);
d5424a7dd252 2009-01-08 Brian Cameron <[email protected]>
yippi
parents: 14505
diff changeset
   962
+}