patches/gvfs-02-enable-cdda-without-cdio.diff
author yippi
Mon, 27 Sep 2010 21:07:51 +0000
changeset 20108 51df67ca9307
parent 16217 c202ed3034e3
permissions -rw-r--r--
I had these modules listed as being owned by me, but they are really owned by wangke, correcting.

--- gvfs-1.1.6/configure.ac.old 2009-02-17 12:51:28.708111000 +0800
+++ gvfs-1.1.6/configure.ac     2009-02-17 12:51:51.196942000 +0800
@@ -311,10 +311,10 @@
 CDDA_CFLAGS=
 
 if test "x$enable_cdda" != "xno" -a \( "x$msg_hal" = "xyes" -o "x$msg_gudev" = "xyes" \); then
-  PKG_CHECK_EXISTS(libcdio_paranoia >= 0.78.2, msg_cdda=yes)
+  PKG_CHECK_EXISTS(hal >= $HAL_REQUIRED, msg_cdda=yes)
 
   if test "x$msg_cdda" = "xyes"; then
-    PKG_CHECK_MODULES(CDDA, libcdio_paranoia)
+    PKG_CHECK_MODULES(CDDA, hal >= $HAL_REQUIRED)
     AC_DEFINE(HAVE_CDDA, 1, [Define to 1 if CDDA is going to be built])
   fi
 fi

diff -urN -x'*.rej' -x'*.orig' gvfs-1.3.2/daemon/cdda.mount.in ../SUNWgnome-gvfs-2.26.1.changed/gvfs-1.3.2/daemon/cdda.mount.in
--- gvfs-1.3.2/daemon/cdda.mount.in	2009-05-01 20:50:01.000000000 +0100
+++ ../SUNWgnome-gvfs-2.26.1.changed/gvfs-1.3.2/daemon/cdda.mount.in	2009-07-23 18:19:28.188809476 +0100
@@ -1,4 +1,4 @@
 [Mount]
 Type=cdda
 Exec=@libexecdir@/gvfsd-cdda
-AutoMount=false
+AutoMount=true
diff -urN -x'*.rej' -x'*.orig' gvfs-1.3.2/daemon/gvfsbackendcdda.c ../SUNWgnome-gvfs-2.26.1.changed/gvfs-1.3.2/daemon/gvfsbackendcdda.c
--- gvfs-1.3.2/daemon/gvfsbackendcdda.c	2009-07-08 18:08:27.000000000 +0100
+++ ../SUNWgnome-gvfs-2.26.1.changed/gvfs-1.3.2/daemon/gvfsbackendcdda.c	2009-07-23 18:36:32.145085560 +0100
@@ -54,9 +54,11 @@
 #include "gvfsjobqueryinfo.h"
 #include "gvfsjobenumerate.h"
 
+#ifdef HAVE_CDIO
 #define DO_NOT_WANT_PARANOIA_COMPATIBILITY
 #include <cdio/paranoia.h>
 #include <cdio/cdio.h>
+#endif
 
 /* TODO:
  *
@@ -109,14 +111,18 @@
   guint64 size;
 
   char *device_path;
+#ifdef HAVE_CDIO
   cdrom_drive_t *drive;
+#endif
   int num_open_files;
 
   /* Metadata from CD-Text */
   char *album_title;
   char *album_artist;
+  guint track_num;
   char *genre;
   GList *tracks; /* a GList of GVfsBackendCddaTrack */
+ 
 };
 
 G_DEFINE_TYPE (GVfsBackendCdda, g_vfs_backend_cdda, G_VFS_TYPE_BACKEND)
@@ -127,11 +133,13 @@
   g_free (cdda_backend->device_path);
   cdda_backend->device_path = NULL;
 
+#ifdef HAVE_CDIO
   if (cdda_backend->drive != NULL)
     {
       cdio_cddap_close (cdda_backend->drive);
       cdda_backend->drive = NULL;
     }
+#endif
 }
 
 /* Metadata related functions */
@@ -157,10 +165,73 @@
   g_list_free (cdda_backend->tracks);
   cdda_backend->tracks = NULL;
 }
+static boolean_t
+cdda2wav_read_toc (GVfsBackendCdda *cdda_backend)
+{
+  gchar   *command;
+  char     buf[BUFSIZ];
+  guint    leadout;
+  int      track_num;
+  uint_t   i;
+  FILE	*f;
+
+  /* Open the connection to cdda2wav */
+  gchar* device_path = g_strdup_printf("/dev/rdsk/%s", cdda_backend->device_path + strlen("/dev/dsk/"));
+  command = g_strdup_printf (
+	"/usr/bin/cdda2wav -q dev=%s --info-only -vtoc --no-infofile --gui 2>&1",
+	device_path);
+  f = popen (command, "r");
+  g_free (command);
+  if (f == NULL)
+    return (FALSE);
+
+  track_num = 0;
+  leadout   = 0;
+
+  i = 0;
+  /* the line looks like 
+   T01:       0  3:48.47 audio linear copydenied stereo title '' from ''
+  */
+
+  while (fgets (buf, BUFSIZ, f) != NULL) {
+    char *endptr;
+    g_strchomp (buf);
+    if ((strlen (buf) > 12) &&
+      g_strrstr(buf, "audio") != NULL &&
+      (buf[0] == 'T') &&
+      (g_ascii_isdigit(buf[1])) &&
+      (g_ascii_isdigit(buf[2])) &&
+      (buf[3] == ':')) {
+
+      i++; 
+      track_num = buf[2] - '0' + (buf[1] - '0') * 10;
+      gchar** temp_str = g_strsplit(g_strchug(buf + 12),":",10);
+      guint min  = (guint) (g_ascii_strtod(temp_str[0],&endptr));
+      guint second  = (guint) (g_ascii_strtod(g_strndup(temp_str[1],2),&endptr));
+
+      GVfsBackendCddaTrack *track;
+      track = g_new0 (GVfsBackendCddaTrack, 1);
+      track->title = g_strdup_printf("No %d Track", i);
+      track->duration = min * 60 + second;
+      cdda_backend->tracks = g_list_append (cdda_backend->tracks, track);
+
+    }
+
+  }
+  track_num = i;
+  pclose (f); 
+
+  cdda_backend->track_num = track_num;
+  g_free (device_path);
+
+  return (TRUE);
+}
+
 
 static void
 fetch_metadata (GVfsBackendCdda *cdda_backend)
 {
+#ifdef HAVE_CDIO
   CdIo *cdio;
   track_t cdtrack, last_cdtrack;
   const cdtext_t *cdtext;
@@ -193,6 +264,10 @@
   }
 
   cdio_destroy (cdio);
+#else
+   /* get CD tracks information using cdda2wav command */
+   cdda2wav_read_toc(cdda_backend);
+#endif
 }
 
 #ifdef HAVE_GUDEV
@@ -398,7 +473,11 @@
       return;
     }
 
+#ifdef __sun
+  cdda_backend->device_path = g_strdup_printf ("/dev/dsk/%s", host);
+#else
   cdda_backend->device_path = g_strdup_printf ("/dev/%s", host);
+#endif
 
 #ifdef HAVE_GUDEV
   gudev_device = g_udev_client_query_by_device_file (cdda_backend->gudev_client, cdda_backend->device_path);
@@ -410,6 +489,7 @@
   find_udi_for_device (cdda_backend);
 #endif
 
+#ifdef HAVE_CDIO
   cdda_backend->drive = cdio_cddap_identify (cdda_backend->device_path, 0, NULL);
   if (cdda_backend->drive == NULL)
     {
@@ -435,6 +515,24 @@
       return;
     }
 
+#else
+  //to prevent gvfs-mount cdda://1 to create a disc icon here
+  if (cdda_backend->hal_udi== NULL)
+    {
+      g_set_error (&error, G_IO_ERROR, G_IO_ERROR_FAILED,
+                   _("Cannot find drive %s"), cdda_backend->device_path);
+      g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
+      g_error_free (error);
+      release_device (cdda_backend);
+      release_metadata (cdda_backend);
+      return;
+    }
+ 
+  fetch_metadata (cdda_backend);
+
+
+#endif
+
   /* Translator: %s is the device the disc is inserted into */
   fuse_name = g_strdup_printf (_("cdda mount on %s"), host);
   display_name = g_strdup_printf (_("Audio Disc"));
@@ -535,7 +633,9 @@
 }
 
 typedef struct {
+#ifdef HAVE_CDIO
   cdrom_paranoia_t *paranoia;
+#endif
 
   long size;           /* size of file being read */
   long header_size;    /* size of the header */
@@ -553,15 +653,19 @@
    * is to avoid seeking back if fewer bytes than whole sector is requested.
    */
   long buf_at_sector_num;                     /* the sector that is cached */
+#ifdef HAVE_CDIO
   char buf_at_sector[CDIO_CD_FRAMESIZE_RAW];  /* the data of the sector */
+#endif
 
 } ReadHandle;
 
 static void
 free_read_handle (ReadHandle *read_handle)
 {
+#ifdef HAVE_CDIO
   if (read_handle->paranoia != NULL)
     cdio_paranoia_free (read_handle->paranoia);
+#endif
   g_free (read_handle->header);
   g_free (read_handle);
 }
@@ -595,7 +699,11 @@
   /* TODO: fill in from metadata */
   artist = NULL;
   title = NULL;
+#ifdef HAVE_CDIO
   software = "gvfs-cdda using libcdio " CDIO_VERSION;
+#else
+  software = "gvfs-cdda not using libcdio ";
+#endif
 
   artist_len = 0;
   title_len = 0;
@@ -698,20 +806,25 @@
       return;
     }
 
-
+#ifdef HAVE_CDIO
   read_handle->first_sector = cdio_cddap_track_firstsector (cdda_backend->drive, track_num);
   read_handle->last_sector = cdio_cddap_track_lastsector (cdda_backend->drive, track_num);
+#endif
   read_handle->sector_cursor = -1;
 
   read_handle->cursor = 0;
   read_handle->buf_at_sector_num = -1;
+#ifdef HAVE_CDIO
   read_handle->content_size  = ((read_handle->last_sector - read_handle->first_sector) + 1) * CDIO_CD_FRAMESIZE_RAW;
+#endif
 
   read_handle->header = create_header (cdda_backend, &(read_handle->header_size), read_handle->content_size);
   read_handle->size = read_handle->header_size + read_handle->content_size;
 
+#ifdef HAVE_CDIO
   read_handle->paranoia = cdio_paranoia_init (cdda_backend->drive);
   cdio_paranoia_modeset (read_handle->paranoia, PARANOIA_MODE_DISABLE);
+#endif
 
   cdda_backend->num_open_files++;
 
@@ -721,10 +834,12 @@
 }
 
 /* We have to pass in a callback to paranoia_read, even though we don't use it */
+#ifdef HAVE_CDIO
 static void 
 paranoia_callback (long int inpos, paranoia_cb_mode_t function)
 {
 }
+#endif
 
 
 static void
@@ -765,16 +880,20 @@
 
   cursor_in_stream = read_handle->cursor - read_handle->header_size;
 
+#ifdef HAVE_CDIO
   desired_sector = cursor_in_stream / CDIO_CD_FRAMESIZE_RAW + read_handle->first_sector;
+#endif
 
   if (desired_sector == read_handle->buf_at_sector_num)
     {
       /* got it cached */
 
       /* skip some bytes */
+#ifdef HAVE_CDIO
       skip_bytes = cursor_in_stream - (desired_sector - read_handle->first_sector) * CDIO_CD_FRAMESIZE_RAW;
       readbuf = read_handle->buf_at_sector + skip_bytes;
       bytes_read = CDIO_CD_FRAMESIZE_RAW - skip_bytes;
+#endif
 
       //g_warning ("read from cache for cursor @ %ld", read_handle->buf_at_sector_num);
     }
@@ -783,16 +902,20 @@
       /* first check that we're at the right sector */
       if (desired_sector != read_handle->sector_cursor)
         {
+#ifdef HAVE_CDIO
           cdio_paranoia_seek (read_handle->paranoia, desired_sector, SEEK_SET);
+#endif
           read_handle->sector_cursor = desired_sector;
           //g_warning ("seeking cursor to %ld", read_handle->sector_cursor);
         }
       
       /* skip some bytes */
+#ifdef HAVE_CDIO
       skip_bytes = cursor_in_stream - (read_handle->sector_cursor - read_handle->first_sector) * CDIO_CD_FRAMESIZE_RAW;
       //g_warning ("advanced cursor to %ld", read_handle->sector_cursor);
       
       readbuf = (char *) cdio_paranoia_read (read_handle->paranoia, paranoia_callback);
+#endif
 
       if (readbuf == NULL)
         {
@@ -806,12 +929,14 @@
         }
 
       read_handle->buf_at_sector_num = read_handle->sector_cursor;
+#ifdef HAVE_CDIO
       memcpy (read_handle->buf_at_sector, readbuf, CDIO_CD_FRAMESIZE_RAW);
 
       read_handle->sector_cursor++;
 
       readbuf += skip_bytes;
       bytes_read = CDIO_CD_FRAMESIZE_RAW - skip_bytes;
+#endif
 
 
     }
@@ -904,9 +1029,11 @@
   GIcon *icon;
   GVfsBackendCddaTrack *track;
 
+#ifdef HAVE_CDIO
   first = cdio_cddap_track_firstsector (cdda_backend->drive, track_num);
   last = cdio_cddap_track_lastsector (cdda_backend->drive, track_num);
   content_size = (last - first + 1) * CDIO_CD_FRAMESIZE_RAW;
+#endif
 
   header = create_header (cdda_backend, &header_size, content_size);
   g_free (header);
@@ -954,6 +1081,7 @@
 
   //g_warning ("get_file_info (%s)", filename);
 
+
   if (strcmp (filename, "/") == 0)
     {
       GIcon *icon;
@@ -981,19 +1109,23 @@
           return;
         }
 
+#ifdef HAVE_CDIO
       if (track_num > cdda_backend->drive->tracks)
         {
           error = g_error_new (G_IO_ERROR, G_IO_ERROR_NOT_FOUND, _("File doesn't exist"));
           g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
           return;
         }
+#endif
 
+#ifdef HAVE_CDIO
       if (! cdio_cddap_track_audiop (cdda_backend->drive, track_num))
         {
           error = g_error_new (G_IO_ERROR, G_IO_ERROR_NOT_FOUND, _("The file does not exist or isn't an audio track"));
           g_vfs_job_failed_from_error (G_VFS_JOB (job), error);
           return;
         }
+#endif
 
       set_info_for_track (cdda_backend, info, track_num);
     }
@@ -1017,6 +1149,7 @@
   //g_warning ("enumerate (%s)", filename);
 
   l = NULL;
+#ifdef HAVE_CDIO
   for (n = 1; n <= cdda_backend->drive->tracks; n++)
     {
       char *name;
@@ -1036,6 +1169,20 @@
       
       l = g_list_append (l, info);
     }
+#else
+    for (n = 1; n <= cdda_backend->track_num; n++)
+    {
+      char *name;
+
+      info = g_file_info_new ();
+      name = g_strdup_printf ("Track %d.wav", n);
+      g_file_info_set_name (info, name);
+      g_file_info_set_display_name (info, name);
+      g_free (name);
+      set_info_for_track (cdda_backend, info, n);
+      l = g_list_append (l, info);
+    }
+#endif
 
   g_vfs_job_succeeded (G_VFS_JOB (job));