]> git.sesse.net Git - vlc/commitdiff
Add a disc-mode and navigation-style control.
authorRocky Bernstein <rocky@videolan.org>
Sat, 25 Dec 2004 19:33:20 +0000 (19:33 +0000)
committerRocky Bernstein <rocky@videolan.org>
Sat, 25 Dec 2004 19:33:20 +0000 (19:33 +0000)
modules/access/cdda/access.c
modules/access/cdda/access.h
modules/access/cdda/callback.c
modules/access/cdda/callback.h
modules/access/cdda/cdda.c
modules/access/cdda/cdda.h
modules/access/cdda/info.c
modules/access/cdda/info.h

index 8d0484115242c91c7612aac4f0bce6db93167b21..8357db927b9de32c6ae04740b56e19be698308e4 100644 (file)
@@ -200,12 +200,20 @@ static block_t * CDDAReadBlocks( access_t * p_access )
             return NULL;
         }
 
-        p_access->info.i_update |= INPUT_UPDATE_TITLE | INPUT_UPDATE_SIZE;
+        p_access->info.i_update |= INPUT_UPDATE_TITLE;
         p_access->info.i_title++;
-        p_access->info.i_size =
-                  p_cdda->p_title[p_access->info.i_title]->i_size;
-        p_access->info.i_pos = 0;
         p_cdda->i_track++;
+
+       if ( p_cdda-> b_nav_mode ) {
+         char *psz_title = CDDAFormatTitle( p_access, p_cdda->i_track );
+         input_Control( p_cdda->p_input, INPUT_SET_NAME, psz_title );
+         free(psz_title);
+       } else {
+         p_access->info.i_size =
+           p_cdda->p_title[p_access->info.i_title]->i_size;
+         p_access->info.i_pos = 0;
+         p_access->info.i_update |= INPUT_UPDATE_SIZE;
+       }
     }
 
     /* Possibly adjust i_blocks so we don't read past the end of a track. */
@@ -255,8 +263,30 @@ static int CDDASeek( access_t * p_access, int64_t i_pos )
 {
     cdda_data_t *p_cdda = (cdda_data_t *) p_access->p_sys;
 
-    p_cdda->i_lsn = cdio_get_track_lsn(p_cdda->p_cdio, p_cdda->i_track)
-                  + (i_pos / CDIO_CD_FRAMESIZE_RAW);
+    p_cdda->i_lsn = (i_pos / CDIO_CD_FRAMESIZE_RAW);
+
+    if ( ! p_cdda->b_nav_mode ) 
+      p_cdda->i_lsn += cdio_get_track_lsn(p_cdda->p_cdio, p_cdda->i_track);
+
+    /* Seeked backwards and we are doing disc mode. */
+    if ( p_cdda->b_nav_mode && p_access->info.i_pos > i_pos ) {
+      track_t i_track;
+      char *psz_title;
+      
+      for( i_track = p_cdda->i_track; 
+          i_track > 1 && 
+            p_cdda->i_lsn < cdio_get_track_lsn(p_cdda->p_cdio, i_track);
+          i_track--, p_access->info.i_title-- ) ;
+
+      p_cdda->i_track = i_track;
+      p_access->info.i_update |= INPUT_UPDATE_TITLE;
+      psz_title  = CDDAFormatTitle( p_access, p_cdda->i_track );
+      input_Control( p_cdda->p_input, INPUT_SET_NAME, 
+                    psz_title );
+      free(psz_title);
+
+    }
+    
     p_access->info.i_pos = i_pos;
 
     dbg_print( (INPUT_DBG_CALL|INPUT_DBG_EXT|INPUT_DBG_SEEK),
@@ -273,7 +303,8 @@ static int CDDASeek( access_t * p_access, int64_t i_pos )
  * Open: open cdda device or image file and initialize structures
  *       for subsequent operations.
  *****************************************************************************/
-int E_(CDDAOpen)( vlc_object_t *p_this )
+int 
+CDDAOpen( vlc_object_t *p_this )
 {
     access_t    *p_access = (access_t*)p_this;
     char *      psz_source = NULL;
@@ -379,7 +410,10 @@ int E_(CDDAOpen)( vlc_object_t *p_this )
     p_cdda->i_tracks   = 0;
     p_cdda->i_titles   = 0;
     p_cdda->i_track    = i_track;
-    p_cdda->i_debug    = config_GetInt(p_this, MODULE_STRING "-debug");
+    p_cdda->i_debug    = config_GetInt(p_this, MODULE_STRING 
+                                      "-debug");
+    p_cdda->b_nav_mode = config_GetInt(p_this, MODULE_STRING 
+                                      "-navigation-mode" );
     p_cdda->i_blocks_per_read
       = config_GetInt(p_this, MODULE_STRING "-blocks-per-read");
 
@@ -466,7 +500,8 @@ int E_(CDDAOpen)( vlc_object_t *p_this )
 /*****************************************************************************
  * CDDAClose: closes cdda and frees any resources associded with it.
  *****************************************************************************/
-void E_(CDDAClose)( vlc_object_t *p_this )
+void 
+CDDAClose (vlc_object_t *p_this )
 {
     access_t    *p_access = (access_t *) p_this;
     cdda_data_t *p_cdda   = (cdda_data_t *) p_access->p_sys;
@@ -562,11 +597,8 @@ static int CDDAControl( access_t *p_access, int i_query, va_list args )
 
         case ACCESS_GET_TITLE_INFO:
         {
-           unsigned int psz_mrl_max = strlen(CDDA_MRL_PREFIX) 
-             + strlen(p_cdda->psz_source) + 1;
            input_title_t ***ppp_title = 
              (input_title_t***)va_arg( args, input_title_t*** );
-           char *psz_mrl = malloc( psz_mrl_max );
 
             pi_int    = (int*)va_arg( args, int* );
             *((int*)va_arg( args, int* )) = 1; /* Title offset */
@@ -575,13 +607,14 @@ static int CDDAControl( access_t *p_access, int i_query, va_list args )
                         "GET TITLE: i_tracks %d, i_tracks %d",
                         p_cdda->i_tracks, p_cdda->i_tracks );
 
-           if( psz_mrl == NULL ) {
-              msg_Warn( p_access, "out of memory" );
-           } else {
-              snprintf(psz_mrl, psz_mrl_max, "%s%s",
-                       CDDA_MRL_PREFIX, p_cdda->psz_source);
-              CDDAMetaInfo( p_access, CDIO_INVALID_TRACK, psz_mrl );
-              free(psz_mrl);
+           CDDAMetaInfo( p_access, CDIO_INVALID_TRACK );
+
+           if ( p_cdda->b_nav_mode) {
+               char *psz_title = 
+                 CDDAFormatTitle( p_access, p_cdda->i_track );
+               input_Control( p_cdda->p_input, INPUT_SET_NAME, 
+                              psz_title );
+               free(psz_title);
            }
 
             /* Duplicate title info */
@@ -613,11 +646,23 @@ static int CDDAControl( access_t *p_access, int i_query, va_list args )
             if( i != p_access->info.i_title )
             {
                 /* Update info */
-                p_access->info.i_update |=
-                    INPUT_UPDATE_TITLE|INPUT_UPDATE_SIZE;
+                p_access->info.i_update |= INPUT_UPDATE_TITLE;
                 p_access->info.i_title = i;
-                p_access->info.i_size = p_cdda->p_title[i]->i_size;
-                p_access->info.i_pos = 0;
+               if ( p_cdda->b_nav_mode) {
+                   char *psz_title = 
+                     CDDAFormatTitle( p_access, i+1 );
+                   input_Control( p_cdda->p_input, INPUT_SET_NAME, 
+                                  psz_title );
+                   free(psz_title);
+                   p_cdda->i_track = i+1;
+                   p_access->info.i_pos = 
+                     cdio_get_track_lsn( p_cdda->p_cdio, p_cdda->i_track ) 
+                     * CDIO_CD_FRAMESIZE_RAW;
+               } else {
+                  p_access->info.i_update |= INPUT_UPDATE_SIZE;
+                  p_access->info.i_size = p_cdda->p_title[i]->i_size;
+                  p_access->info.i_pos = 0;
+               }
 
                 /* Next sector to read */
                 p_cdda->i_lsn = 
index e699496cf85ba9a76c06ce5f768701bc33c876a5..f3da1eb9adc867710d7c02c50d5825533e84d482 100644 (file)
@@ -25,9 +25,9 @@
  * Open: open cdda device or image file and initialize structures 
  * for subsequent operations.
  *****************************************************************************/
-int  E_(CDDAOpen)     ( vlc_object_t * );
+int  CDDAOpen     ( vlc_object_t * );
 
 /*****************************************************************************
  * CDDAClose: closes cdda and frees any resources associded with it.
  *****************************************************************************/
-void E_(CDDAClose)    ( vlc_object_t * );
+void CDDAClose    ( vlc_object_t * );
index cf2c76cc6a9ae1cd8b4d6ec5ad788b7fb13f6fe6..bec4a8e6e80b95c9b7db5ed0db7af114857209c2 100644 (file)
@@ -25,7 +25,7 @@
 #include "cdda.h"
 
 int
-E_(CDDADebugCB)   ( vlc_object_t *p_this, const char *psz_name,
+CDDADebugCB   ( vlc_object_t *p_this, const char *psz_name,
                     vlc_value_t oldval, vlc_value_t val, void *p_data )
 {
     cdda_data_t *p_cdda;
@@ -46,7 +46,7 @@ E_(CDDADebugCB)   ( vlc_object_t *p_this, const char *psz_name,
 /* FIXME: could probably shorten some of the below boilerplate code...
 */
 int
-E_(CDDBEnabledCB)   ( vlc_object_t *p_this, const char *psz_name,
+CDDBEnabledCB   ( vlc_object_t *p_this, const char *psz_name,
                       vlc_value_t oldval, vlc_value_t val, void *p_data )
 {
     cdda_data_t *p_cdda;
@@ -68,7 +68,7 @@ E_(CDDBEnabledCB)   ( vlc_object_t *p_this, const char *psz_name,
 }
 
 int
-E_(CDTextEnabledCB)   ( vlc_object_t *p_this, const char *psz_name,
+CDTextEnabledCB   ( vlc_object_t *p_this, const char *psz_name,
                         vlc_value_t oldval, vlc_value_t val, void *p_data )
 {
     cdda_data_t *p_cdda;
@@ -79,16 +79,35 @@ E_(CDTextEnabledCB)   ( vlc_object_t *p_this, const char *psz_name,
 
     if (p_cdda->i_debug & (INPUT_DBG_CALL|INPUT_DBG_EXT))
     {
-        msg_Dbg( p_cdda_input, "Old CDText Enabled (x%0x) %d, new (x%0x) %d",
-                 p_cdda->b_cdtext_enabled, p_cdda->b_cdtext_enabled,
-                 val.b_bool, val.b_bool);
+        msg_Dbg( p_cdda_input, "Old CDText Enabled %d, new %d",
+                 p_cdda->b_cdtext_enabled, val.b_bool);
     }
     p_cdda->b_cdtext_enabled = val.b_bool;
     return VLC_SUCCESS;
 }
 
 int
-E_(CDTextPreferCB)   ( vlc_object_t *p_this, const char *psz_name,
+CDDANavModeCB( vlc_object_t *p_this, const char *psz_name,
+                        vlc_value_t oldval, vlc_value_t val, void *p_data )
+{
+    cdda_data_t *p_cdda;
+
+    if (NULL == p_cdda_input) return VLC_EGENERIC;
+
+    p_cdda = (cdda_data_t *)p_cdda_input->p_sys;
+
+    if (p_cdda->i_debug & (INPUT_DBG_CALL|INPUT_DBG_EXT))
+    {
+        msg_Dbg( p_cdda_input, 
+                "Old Navigation Mode Enabled %d, new %d",
+                 p_cdda->b_nav_mode, val.b_bool);
+    }
+    p_cdda->b_nav_mode = val.b_bool;
+    return VLC_SUCCESS;
+}
+
+int
+CDTextPreferCB   ( vlc_object_t *p_this, const char *psz_name,
                        vlc_value_t oldval, vlc_value_t val, void *p_data )
 {
     cdda_data_t *p_cdda;
@@ -110,7 +129,7 @@ E_(CDTextPreferCB)   ( vlc_object_t *p_this, const char *psz_name,
 }
 
 int
-E_(CDDABlocksPerReadCB) ( vlc_object_t *p_this, const char *psz_name,
+CDDABlocksPerReadCB ( vlc_object_t *p_this, const char *psz_name,
                           vlc_value_t oldval, vlc_value_t val, void *p_data )
 {
     cdda_data_t *p_cdda;
index 5fec39f5069e6fa23a9d1b177d8afc7ec013f146..969ba07e87fbb9c7f66daf43ad5f40930636cc19 100644 (file)
 #define MAX_BLOCKS_PER_READ 25
 #define DEFAULT_BLOCKS_PER_READ 20
 
-int  E_(CDDADebugCB)  ( vlc_object_t *p_this, const char *psz_name,
+int  CDDADebugCB  ( vlc_object_t *p_this, const char *psz_name,
                         vlc_value_t oldval, vlc_value_t val,
                         void *p_data );
 
-int  E_(CDDBEnabledCB)( vlc_object_t *p_this, const char *psz_name,
+int  CDDBEnabledCB( vlc_object_t *p_this, const char *psz_name,
                         vlc_value_t oldval, vlc_value_t val,
                         void *p_data );
 
 
-int  E_(CDTextEnabledCB)( vlc_object_t *p_this, const char *psz_name,
+int  CDTextEnabledCB( vlc_object_t *p_this, const char *psz_name,
                          vlc_value_t oldval, vlc_value_t val,
                          void *p_data );
 
-int  E_(CDTextPreferCB)( vlc_object_t *p_this, const char *psz_name,
+int  CDTextPreferCB( vlc_object_t *p_this, const char *psz_name,
                         vlc_value_t oldval, vlc_value_t val,
                         void *p_data );
 
+int  CDDANavModeCB( vlc_object_t *p_this, const char *psz_name,
+                   vlc_value_t oldval, vlc_value_t val,
+                   void *p_data );
 
-int E_(CDDABlocksPerReadCB) ( vlc_object_t *p_this, const char *psz_name,
+
+int CDDABlocksPerReadCB ( vlc_object_t *p_this, const char *psz_name,
                              vlc_value_t oldval, vlc_value_t val, 
                              void *p_data );
 
index 4450373eecd27771afe9524c8b97ba46b40011cf..1fd608d0fbe5c63bcfb8efc73a1370dd0c38a02d 100644 (file)
@@ -99,14 +99,14 @@ vlc_module_begin();
     set_description( _("Compact Disc Digital Audio (CD-DA) input") );
     set_capability( "access2", 10 /* compare with priority of cdda */ );
     set_shortname( N_("Audio CD"));
-    set_callbacks( E_(CDDAOpen), E_(CDDAClose) );
+    set_callbacks( CDDAOpen, CDDAClose );
     add_shortcut( "cddax" );
     add_shortcut( "cd" );
     set_category( CAT_INPUT );
     set_subcategory( SUBCAT_INPUT_ACCESS );
 
     /* Configuration options */
-    add_integer ( MODULE_STRING "-debug", 0, E_(CDDADebugCB),
+    add_integer ( MODULE_STRING "-debug", 0, CDDADebugCB,
                   N_("If nonzero, this gives additional debug information."),
                   DEBUG_LONGTEXT, VLC_TRUE );
 
@@ -116,7 +116,7 @@ vlc_module_begin();
                  CACHING_LONGTEXT, VLC_TRUE );
 
     add_integer( MODULE_STRING "-blocks-per-read",
-                 DEFAULT_BLOCKS_PER_READ, E_(CDDABlocksPerReadCB),
+                 DEFAULT_BLOCKS_PER_READ, CDDABlocksPerReadCB,
                  N_("Number of blocks per CD read"),
                  BLOCKS_PER_READ_LONGTEXT, VLC_TRUE );
 
@@ -132,11 +132,11 @@ vlc_module_begin();
 
 #ifdef HAVE_LIBCDDB
     add_string( MODULE_STRING "-cddb-title-format",
-                "Track %T. %t - %p", NULL,
+                "Track %T. %t - %p %A", NULL,
                 N_("Format to use in playlist \"title\" field when using CDDB"),
                 CDDB_TITLE_FMT_LONGTEXT, VLC_TRUE );
 
-    add_bool( MODULE_STRING "-cddb-enabled", 1, E_(CDDBEnabledCB),
+    add_bool( MODULE_STRING "-cddb-enabled", 1, CDDBEnabledCB,
               N_("Do CDDB lookups?"),
               N_("If set, lookup CD-DA track information using the CDDB "
                  "protocol"),
@@ -179,7 +179,7 @@ vlc_module_begin();
                 N_("Directory to cache CDDB requests"),
                VLC_TRUE );
 
-    add_bool( MODULE_STRING "-cdtext-prefer", VLC_TRUE, E_(CDTextPreferCB),
+    add_bool( MODULE_STRING "-cdtext-prefer", VLC_TRUE, CDTextPreferCB,
               N_("Prefer CD-Text info to CDDB info?"),
               N_("If set, CD-Text information will be preferred "
                 "to CDDB information when both are available"),
@@ -187,9 +187,20 @@ vlc_module_begin();
 
 #endif
 
-    add_bool( MODULE_STRING "-cdtext-enabled", VLC_TRUE, E_(CDTextEnabledCB),
+    add_bool( MODULE_STRING "-cdtext-enabled", VLC_TRUE, CDTextEnabledCB,
               N_("Do CD-Text lookups?"),
               N_("If set, get CD-Text information"),
               VLC_FALSE );
 
+    add_bool( MODULE_STRING "-navigation-mode", VLC_TRUE, 
+#if FIXED
+             CDDANavModeCB,
+#else
+             NULL,
+#endif
+              N_("Use Navigation-style playback?"),
+              N_("If set, tracks are navigated via Navagation rather than "
+                "a playlist entries"),
+              VLC_FALSE );
+
 vlc_module_end();
index f2e7befc9f0bf3e573f8280a7678e4bd626badb3..421253f6b5359733b355be5bfe23226be731aae5 100644 (file)
@@ -107,6 +107,7 @@ typedef struct cdda_data_s
 
   WAVEHEADER   waveheader;            /* Wave header for the output data  */
   vlc_bool_t   b_header;
+  vlc_bool_t   b_nav_mode;
   
   input_thread_t *p_input;
   
index a37298c4165de47d8b1a7ee2f6de34e0c248c147..a6f0f9ebc625ce27ac08a0eb84f8945c32583825 100644 (file)
@@ -42,6 +42,8 @@ static char *CDDAFormatStr( const access_t *p_access, cdda_data_t *p_cdda,
                            const char format_str[], const char *psz_mrl, 
                            track_t i_track);
 
+static char *CDDAFormatMRL( const access_t *p_access, track_t i_track );
+
 #ifdef HAVE_LIBCDDB
 
 #define free_and_dup(var, val) \
@@ -259,13 +261,11 @@ CDDAMetaInfoInit( access_t *p_access )
  CD.
  */
 void 
-CDDAMetaInfo( access_t *p_access, track_t i_track, /*const*/ char *psz_mrl )
+CDDAMetaInfo( access_t *p_access, track_t i_track )
 {
     cdda_data_t *p_cdda = (cdda_data_t *) p_access->p_sys;
-    char *psz_meta_title = psz_mrl;
+    char *psz_meta_title = CDDAFormatMRL( p_access, i_track );
     char *psz_meta_artist = NULL;
-    char *psz_name = NULL;
-    char *config_varname = MODULE_STRING "-title-format";
     
     if ( ! p_cdda ) return;
 
@@ -274,11 +274,6 @@ CDDAMetaInfo( access_t *p_access, track_t i_track, /*const*/ char *psz_mrl )
     /* Set up for Meta and name for CDDB access. */
     if ( p_cdda->b_cddb_enabled &&  p_cdda->cddb.disc )
     {
-        if (p_cdda->b_cddb_enabled)
-       {
-           config_varname = MODULE_STRING "-cddb-title-format";
-       }
-
         if( CDIO_INVALID_TRACK == i_track )
        {
 
@@ -384,7 +379,7 @@ CDDAMetaInfo( access_t *p_access, track_t i_track, /*const*/ char *psz_mrl )
            cdio_get_track_lsn(p_cdda->p_cdio, i_track);
 
          mtime_t i_duration = i_track_frames / CDIO_CD_FRAMES_PER_SEC;
-         char *psz_mrl;
+         char *psz_mrl = CDDAFormatMRL( p_access, i_track );
          
          snprintf(psz_track, TITLE_MAX, "%s %02d", _("Track"), i_track);
 
@@ -392,9 +387,6 @@ CDDAMetaInfo( access_t *p_access, track_t i_track, /*const*/ char *psz_mrl )
                         _("Duration"), "%s",
                         secstotimestr( psz_buffer, i_duration ) );
          
-         asprintf(&psz_mrl, "%s%s@T%u",
-                  CDDA_MRL_PREFIX, p_cdda->psz_source, i_track);
-
          input_Control( p_cdda->p_input, INPUT_ADD_INFO, psz_track,
                         _("MRL"), "%s", psz_mrl );
          free(psz_mrl);
@@ -438,8 +430,6 @@ CDDAMetaInfo( access_t *p_access, track_t i_track, /*const*/ char *psz_mrl )
           to CDDB or CD-Text values or the default value depending on
           availablity and user preferences. 
 
-          We also set above config_varname to the format used
-          
           So now add the title and artist to VLC's meta, and the 
           name as shown in the status bar and playlist entry.
         */
@@ -449,12 +439,9 @@ CDDAMetaInfo( access_t *p_access, track_t i_track, /*const*/ char *psz_mrl )
 
        if ( CDIO_INVALID_TRACK != i_track )
        { 
-           psz_name = 
-             CDDAFormatStr( p_access, p_cdda,
-                            config_GetPsz( p_access, config_varname ),
-                            psz_mrl, i_track );
-           
+           char *psz_name = CDDAFormatTitle( p_access, i_track ) ;
            input_Control( p_cdda->p_input, INPUT_SET_NAME, psz_name );
+           free(psz_name);
        }
     }
 }
@@ -523,7 +510,7 @@ cdda_data_t *p_cdda, char *psz_cdtext)
    %Y : The year 19xx or 20xx **
    %% : a %
 */
-static char *
+char *
 CDDAFormatStr( const access_t *p_access, cdda_data_t *p_cdda,
                const char format_str[], const char *psz_mrl, track_t i_track)
 {
@@ -748,6 +735,56 @@ CDDAFormatStr( const access_t *p_access, cdda_data_t *p_cdda,
     return strdup(temp_str);
 }
 
+/* Return a MRL for the given track. The caller must free the 
+   allocated string. */
+static char *
+CDDAFormatMRL( const access_t *p_access, track_t i_track )
+{
+    cdda_data_t *p_cdda = (cdda_data_t *) p_access->p_sys;
+    const unsigned int psz_mrl_max = strlen(CDDA_MRL_PREFIX) 
+      + strlen(p_cdda->psz_source) +
+      + strlen("@T") + strlen("100") + 1;
+    char *psz_mrl = malloc( psz_mrl_max );
+    
+    if (CDIO_INVALID_TRACK == i_track)
+      snprintf(psz_mrl, psz_mrl_max, "%s%s",
+              CDDA_MRL_PREFIX, p_cdda->psz_source);
+    else 
+      snprintf(psz_mrl, psz_mrl_max, "%s%s@T%u",
+              CDDA_MRL_PREFIX, p_cdda->psz_source, i_track);
+    return psz_mrl;
+}
+
+
+/* Return a title string as specified by the titel format string for the 
+   given track. The caller must free the allocated string. */
+char *
+CDDAFormatTitle( const access_t *p_access, track_t i_track )
+{ 
+
+    char *config_varname = MODULE_STRING "-title-format";
+    cdda_data_t *p_cdda = (cdda_data_t *) p_access->p_sys;
+    char *psz_mrl = CDDAFormatMRL( p_access, i_track );
+
+    if( psz_mrl ) 
+    {
+        char *psz_name;
+#ifdef HAVE_LIBCDDB
+       if (p_cdda->b_cddb_enabled)
+       {
+           config_varname = MODULE_STRING "-cddb-title-format";
+       }
+#endif /*HAVE_LIBCDDB*/
+       psz_name = 
+         CDDAFormatStr( p_access, p_cdda,
+                        config_GetPsz( p_access, config_varname ),
+                        psz_mrl, i_track );
+       free(psz_mrl);
+       return psz_name;
+    }
+    return(NULL);
+}
+
 /* Adds a string-valued entry to the playlist information under "Track"
    if the string is not null or the null string.
  */
@@ -758,46 +795,33 @@ CDDAFormatStr( const access_t *p_access, cdda_data_t *p_cdda,
                               "%s", FIELD);                              \
     }
 
-playlist_item_t *
+static playlist_item_t *
 CDDACreatePlaylistItem( const access_t *p_access, cdda_data_t *p_cdda,
                         playlist_t *p_playlist, playlist_item_t *p_item, 
-                        track_t i_track, char *psz_mrl, int psz_mrl_max )
+                        track_t i_track )
 {
   unsigned int i_track_frames = 
     cdio_get_track_lsn(p_cdda->p_cdio, i_track+1) - 
     cdio_get_track_lsn(p_cdda->p_cdio, i_track);
     mtime_t i_mduration = 
       i_track_frames * (CLOCK_FREQ / CDIO_CD_FRAMES_PER_SEC) ;
-    char *psz_title;
-    char *config_varname = MODULE_STRING "-title-format";
+    char *psz_title = NULL;
+    char *psz_mrl   = NULL;
 
     playlist_item_t *p_child = NULL;
 
-    if( !p_item )
-    {
-        return NULL;
-    }
-
-#ifdef HAVE_LIBCDDB
-    if (p_cdda->b_cddb_enabled)
-    {
-        config_varname = MODULE_STRING "-cddb-title-format";
-    }
-#endif /*HAVE_LIBCDDB*/
-
+    if( !p_item ) return NULL;
 
-    snprintf(psz_mrl, psz_mrl_max, "%s%s@T%u",
-             CDDA_MRL_PREFIX, p_cdda->psz_source, i_track);
-
-    psz_title = CDDAFormatStr( p_access, p_cdda,
-                               config_GetPsz( p_access, config_varname ),
-                               psz_mrl, i_track);
+    psz_title = CDDAFormatTitle( p_access, i_track ) ;
+    psz_mrl = CDDAFormatMRL( p_access, i_track  ) ;
 
     dbg_print( INPUT_DBG_META, "mrl: %s, title: %s, duration, %ld",
                psz_mrl, psz_title, (long int) i_mduration / 1000000 );
 
     p_child = playlist_ItemNew( p_playlist, psz_mrl, psz_title );
     p_child->input.i_duration   = i_mduration;
+    free(psz_mrl);
+    free(psz_title);
 
     if( !p_child ) return NULL;
 
@@ -869,14 +893,11 @@ CDDAFixupPlaylist( access_t *p_access, cdda_data_t *p_cdda,
                    vlc_bool_t b_single_track )
 {
     int i;
-    playlist_t * p_playlist;
-    char       * psz_mrl = NULL;
-    unsigned int psz_mrl_max = strlen(CDDA_MRL_PREFIX) 
-      + strlen(p_cdda->psz_source) +
-      + strlen("@T") + strlen("100") + 1;
+    playlist_t * p_playlist = NULL;
     const track_t i_first_track = p_cdda->i_first_track;
-    playlist_item_t *p_item;
+    playlist_item_t *p_item = NULL;
     vlc_bool_t b_play = VLC_FALSE;
+    track_t    i_track;
 
 #ifdef HAVE_LIBCDDB
     p_cdda->b_cddb_enabled =
@@ -888,48 +909,39 @@ CDDAFixupPlaylist( access_t *p_access, cdda_data_t *p_cdda,
         return VLC_SUCCESS;
 #endif
 
-    psz_mrl = malloc( psz_mrl_max );
-
-    if( psz_mrl == NULL )
-    {
-        msg_Warn( p_access, "out of memory" );
-        return VLC_ENOMEM;
-    }
-
-    p_playlist = (playlist_t *) vlc_object_find( p_access, VLC_OBJECT_PLAYLIST,
-                                               FIND_ANYWHERE );
-    if( !p_playlist )
-    {
-        msg_Warn( p_access, "can't find playlist" );
-        free(psz_mrl);
-        return VLC_EGENERIC;
+    if (! p_cdda->b_nav_mode ) {
+        p_playlist = (playlist_t *) vlc_object_find( p_access, 
+                                                    VLC_OBJECT_PLAYLIST,
+                                                    FIND_ANYWHERE );
+       if( !p_playlist )
+         {
+             msg_Warn( p_access, "can't find playlist" );
+             return VLC_EGENERIC;
+         }
     }
 
-    if( b_single_track )
-    {
-        snprintf(psz_mrl, psz_mrl_max, "%s%s@T%u", CDDA_MRL_PREFIX, 
-                p_cdda->psz_source, p_cdda->i_track);
-        CDDAMetaInfoInit( p_access );
-        CDDAMetaInfo( p_access, p_cdda->i_track, psz_mrl );
+    if( b_single_track || p_cdda->b_nav_mode ) {
+        i_track = p_cdda->i_track;
     }
     else
     {
-        snprintf(psz_mrl, psz_mrl_max, "%s%s", CDDA_MRL_PREFIX, 
-                p_cdda->psz_source);
-        CDDAMetaInfoInit( p_access );
-        CDDAMetaInfo( p_access, CDIO_INVALID_TRACK, psz_mrl );
+        i_track = CDIO_INVALID_TRACK;
     }
+    CDDAMetaInfoInit( p_access );
+    CDDAMetaInfo( p_access, p_cdda->i_track );
 
-    p_item = playlist_LockItemGetByInput( p_playlist,
+    if (p_playlist) {
+      p_item = playlist_LockItemGetByInput( p_playlist,
                         ((input_thread_t *)p_access->p_parent)->input.p_item );
 
-    if( p_item == p_playlist->status.p_item && !b_single_track )
-    {
-        b_play = VLC_TRUE;
-    }
-    else
-    {
-        b_play = VLC_FALSE;
+      if( p_item == p_playlist->status.p_item && !b_single_track )
+       {
+         b_play = VLC_TRUE;
+       }
+      else
+       {
+         b_play = VLC_FALSE;
+       }
     }
 
     if( b_single_track )
@@ -952,20 +964,25 @@ CDDAFixupPlaylist( access_t *p_access, cdda_data_t *p_cdda,
         t->i_length = I64C(1000000) * t->i_size / CDDA_FREQUENCY_SAMPLE / 4;
 
 
-        CDDAAddMetaToItem( p_access, p_cdda, p_item, i_track, VLC_FALSE );
+       if (p_item)
+         CDDAAddMetaToItem( p_access, p_cdda, p_item, i_track, VLC_FALSE );
 
         p_cdda->i_titles = 1;
         p_access->info.i_size =
          i_track_frames * (int64_t) CDIO_CD_FRAMESIZE_RAW;
        p_access->info.i_update |= INPUT_UPDATE_TITLE|INPUT_UPDATE_SIZE;
-       p_item->input.psz_uri    = strdup(psz_mrl);
+       p_item->input.psz_uri    = CDDAFormatMRL(p_access, i_track);
        p_item->input.i_duration = i_track_frames 
          * (CLOCK_FREQ / CDIO_CD_FRAMES_PER_SEC);
     }
     else
     {
-        input_title_t *t;
-        playlist_ItemToNode( p_playlist, p_item );
+       input_title_t *t;
+
+
+       if ( ! p_cdda->b_nav_mode )
+         playlist_ItemToNode( p_playlist, p_item );
+
         for( i = 0 ; i < p_cdda->i_tracks ; i++ )
         {
             playlist_item_t *p_child;
@@ -979,13 +996,16 @@ CDDAFixupPlaylist( access_t *p_access, cdda_data_t *p_cdda,
             asprintf( &t->psz_name, _("Track %i"), i_track );
             t->i_size = i_track_frames * (int64_t) CDIO_CD_FRAMESIZE_RAW;
 
-            t->i_length = I64C(1000000) * t->i_size / CDDA_FREQUENCY_SAMPLE / 4;
+            t->i_length = I64C(1000000) * t->i_size 
+             / CDDA_FREQUENCY_SAMPLE / 4;
 
-            p_child = CDDACreatePlaylistItem( p_access, p_cdda, p_playlist,
-                                              p_item,
-                                              i_track, psz_mrl,
-                                              psz_mrl_max ) ;
-            CDDAAddMetaToItem( p_access, p_cdda, p_child, i_track, VLC_TRUE );
+           if ( ! p_cdda->b_nav_mode ) {
+             p_child = CDDACreatePlaylistItem( p_access, p_cdda, p_playlist,
+                                               p_item,
+                                               i_track );
+             CDDAAddMetaToItem( p_access, p_cdda, p_child, i_track, 
+                                VLC_TRUE );
+           }
         }
 
         p_cdda->i_titles = p_cdda->i_tracks;
@@ -993,20 +1013,23 @@ CDDAFixupPlaylist( access_t *p_access, cdda_data_t *p_cdda,
          cdio_get_track_lba(p_cdda->p_cdio, CDIO_CDROM_LEADOUT_TRACK)
          * (int64_t) CDIO_CD_FRAMESIZE_RAW;
        p_access->info.i_update |= INPUT_UPDATE_TITLE|INPUT_UPDATE_SIZE;
-       p_item->input.i_duration = 
-         p_access->info.i_size * (CLOCK_FREQ / CDIO_CD_FRAMES_PER_SEC) ;
-       p_item->input.psz_uri    = strdup(psz_mrl);
+       if (p_item) {
+           p_item->input.i_duration = 
+             p_access->info.i_size * (CLOCK_FREQ / CDIO_CD_FRAMES_PER_SEC) ;
+           p_item->input.psz_uri    = CDDAFormatMRL(p_access, 
+                                                    p_cdda->i_track);
+       }
     }
+    
 
     if( b_play )
     {
         playlist_Control( p_playlist, PLAYLIST_VIEWPLAY,
                           p_playlist->status.i_view,
                           p_playlist->status.p_item, NULL );
+       vlc_object_release( p_playlist );
     }
 
-    vlc_object_release( p_playlist );
-
     return VLC_SUCCESS;
 }
 
index 57dfb8c9f112c644bb3c4d8fdbd2b35fdc1376f1..5cbb8c5b418fe87fb31c3893dce41abdc2d5f4cc 100644 (file)
@@ -32,8 +32,7 @@ int      CDDAFixupPlaylist( access_t *p_access, cdda_data_t *p_cdda,
  we handle Meta Information requests and basically copy what we've
  saved here.
  */
-void     CDDAMetaInfo( access_t *p_access, track_t i_track, 
-                      /*const*/ char *psz_mrl  );
+void     CDDAMetaInfo( access_t *p_access, track_t i_track );
 
 /*
  Saves Meta Information about the CD-DA.
@@ -43,12 +42,5 @@ void     CDDAMetaInfo( access_t *p_access, track_t i_track,
  */
 void     CDDAMetaInfoInit( access_t *p_access );
 
+char *CDDAFormatTitle( const access_t *p_access, track_t i_track );
 
-/*
- Creates a playlist item filling the meta information about that playlist
- item.
- */
-playlist_item_t *
-CDDACreatePlaylistItem( const access_t *p_access, cdda_data_t *p_cdda,
-                        playlist_t *p_playlist, playlist_item_t *p_item,
-                        track_t i_track, char *psz_mrl, int psz_mrl_max );