Commit c818ae89 authored by Rocky Bernstein's avatar Rocky Bernstein

Add a disc-mode and navigation-style control.

parent ea6b3450
...@@ -200,12 +200,20 @@ static block_t * CDDAReadBlocks( access_t * p_access ) ...@@ -200,12 +200,20 @@ static block_t * CDDAReadBlocks( access_t * p_access )
return NULL; 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_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++; 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. */ /* 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 ) ...@@ -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; 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) p_cdda->i_lsn = (i_pos / CDIO_CD_FRAMESIZE_RAW);
+ (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; p_access->info.i_pos = i_pos;
dbg_print( (INPUT_DBG_CALL|INPUT_DBG_EXT|INPUT_DBG_SEEK), 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 ) ...@@ -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 * Open: open cdda device or image file and initialize structures
* for subsequent operations. * 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; access_t *p_access = (access_t*)p_this;
char * psz_source = NULL; char * psz_source = NULL;
...@@ -379,7 +410,10 @@ int E_(CDDAOpen)( vlc_object_t *p_this ) ...@@ -379,7 +410,10 @@ int E_(CDDAOpen)( vlc_object_t *p_this )
p_cdda->i_tracks = 0; p_cdda->i_tracks = 0;
p_cdda->i_titles = 0; p_cdda->i_titles = 0;
p_cdda->i_track = i_track; 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 p_cdda->i_blocks_per_read
= config_GetInt(p_this, MODULE_STRING "-blocks-per-read"); = config_GetInt(p_this, MODULE_STRING "-blocks-per-read");
...@@ -466,7 +500,8 @@ int E_(CDDAOpen)( vlc_object_t *p_this ) ...@@ -466,7 +500,8 @@ int E_(CDDAOpen)( vlc_object_t *p_this )
/***************************************************************************** /*****************************************************************************
* CDDAClose: closes cdda and frees any resources associded with it. * 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; access_t *p_access = (access_t *) p_this;
cdda_data_t *p_cdda = (cdda_data_t *) p_access->p_sys; 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 ) ...@@ -562,11 +597,8 @@ static int CDDAControl( access_t *p_access, int i_query, va_list args )
case ACCESS_GET_TITLE_INFO: 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 ***ppp_title =
(input_title_t***)va_arg( args, input_title_t*** ); (input_title_t***)va_arg( args, input_title_t*** );
char *psz_mrl = malloc( psz_mrl_max );
pi_int = (int*)va_arg( args, int* ); pi_int = (int*)va_arg( args, int* );
*((int*)va_arg( args, int* )) = 1; /* Title offset */ *((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 ) ...@@ -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", "GET TITLE: i_tracks %d, i_tracks %d",
p_cdda->i_tracks, p_cdda->i_tracks ); p_cdda->i_tracks, p_cdda->i_tracks );
if( psz_mrl == NULL ) { CDDAMetaInfo( p_access, CDIO_INVALID_TRACK );
msg_Warn( p_access, "out of memory" );
} else { if ( p_cdda->b_nav_mode) {
snprintf(psz_mrl, psz_mrl_max, "%s%s", char *psz_title =
CDDA_MRL_PREFIX, p_cdda->psz_source); CDDAFormatTitle( p_access, p_cdda->i_track );
CDDAMetaInfo( p_access, CDIO_INVALID_TRACK, psz_mrl ); input_Control( p_cdda->p_input, INPUT_SET_NAME,
free(psz_mrl); psz_title );
free(psz_title);
} }
/* Duplicate title info */ /* Duplicate title info */
...@@ -613,11 +646,23 @@ static int CDDAControl( access_t *p_access, int i_query, va_list args ) ...@@ -613,11 +646,23 @@ static int CDDAControl( access_t *p_access, int i_query, va_list args )
if( i != p_access->info.i_title ) if( i != p_access->info.i_title )
{ {
/* Update info */ /* Update info */
p_access->info.i_update |= p_access->info.i_update |= INPUT_UPDATE_TITLE;
INPUT_UPDATE_TITLE|INPUT_UPDATE_SIZE;
p_access->info.i_title = i; p_access->info.i_title = i;
p_access->info.i_size = p_cdda->p_title[i]->i_size; if ( p_cdda->b_nav_mode) {
p_access->info.i_pos = 0; 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 */ /* Next sector to read */
p_cdda->i_lsn = p_cdda->i_lsn =
......
...@@ -25,9 +25,9 @@ ...@@ -25,9 +25,9 @@
* Open: open cdda device or image file and initialize structures * Open: open cdda device or image file and initialize structures
* for subsequent operations. * for subsequent operations.
*****************************************************************************/ *****************************************************************************/
int E_(CDDAOpen) ( vlc_object_t * ); int CDDAOpen ( vlc_object_t * );
/***************************************************************************** /*****************************************************************************
* CDDAClose: closes cdda and frees any resources associded with it. * CDDAClose: closes cdda and frees any resources associded with it.
*****************************************************************************/ *****************************************************************************/
void E_(CDDAClose) ( vlc_object_t * ); void CDDAClose ( vlc_object_t * );
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#include "cdda.h" #include "cdda.h"
int 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 ) vlc_value_t oldval, vlc_value_t val, void *p_data )
{ {
cdda_data_t *p_cdda; cdda_data_t *p_cdda;
...@@ -46,7 +46,7 @@ E_(CDDADebugCB) ( vlc_object_t *p_this, const char *psz_name, ...@@ -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... /* FIXME: could probably shorten some of the below boilerplate code...
*/ */
int 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 ) vlc_value_t oldval, vlc_value_t val, void *p_data )
{ {
cdda_data_t *p_cdda; cdda_data_t *p_cdda;
...@@ -68,7 +68,7 @@ E_(CDDBEnabledCB) ( vlc_object_t *p_this, const char *psz_name, ...@@ -68,7 +68,7 @@ E_(CDDBEnabledCB) ( vlc_object_t *p_this, const char *psz_name,
} }
int 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 ) vlc_value_t oldval, vlc_value_t val, void *p_data )
{ {
cdda_data_t *p_cdda; cdda_data_t *p_cdda;
...@@ -79,16 +79,35 @@ E_(CDTextEnabledCB) ( vlc_object_t *p_this, const char *psz_name, ...@@ -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)) 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", msg_Dbg( p_cdda_input, "Old CDText Enabled %d, new %d",
p_cdda->b_cdtext_enabled, p_cdda->b_cdtext_enabled, p_cdda->b_cdtext_enabled, val.b_bool);
val.b_bool, val.b_bool);
} }
p_cdda->b_cdtext_enabled = val.b_bool; p_cdda->b_cdtext_enabled = val.b_bool;
return VLC_SUCCESS; return VLC_SUCCESS;
} }
int 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 ) vlc_value_t oldval, vlc_value_t val, void *p_data )
{ {
cdda_data_t *p_cdda; cdda_data_t *p_cdda;
...@@ -110,7 +129,7 @@ E_(CDTextPreferCB) ( vlc_object_t *p_this, const char *psz_name, ...@@ -110,7 +129,7 @@ E_(CDTextPreferCB) ( vlc_object_t *p_this, const char *psz_name,
} }
int 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 ) vlc_value_t oldval, vlc_value_t val, void *p_data )
{ {
cdda_data_t *p_cdda; cdda_data_t *p_cdda;
......
...@@ -30,25 +30,29 @@ ...@@ -30,25 +30,29 @@
#define MAX_BLOCKS_PER_READ 25 #define MAX_BLOCKS_PER_READ 25
#define DEFAULT_BLOCKS_PER_READ 20 #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, vlc_value_t oldval, vlc_value_t val,
void *p_data ); 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, vlc_value_t oldval, vlc_value_t val,
void *p_data ); 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, vlc_value_t oldval, vlc_value_t val,
void *p_data ); 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, vlc_value_t oldval, vlc_value_t val,
void *p_data ); 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, vlc_value_t oldval, vlc_value_t val,
void *p_data ); void *p_data );
...@@ -99,14 +99,14 @@ vlc_module_begin(); ...@@ -99,14 +99,14 @@ vlc_module_begin();
set_description( _("Compact Disc Digital Audio (CD-DA) input") ); set_description( _("Compact Disc Digital Audio (CD-DA) input") );
set_capability( "access2", 10 /* compare with priority of cdda */ ); set_capability( "access2", 10 /* compare with priority of cdda */ );
set_shortname( N_("Audio CD")); set_shortname( N_("Audio CD"));
set_callbacks( E_(CDDAOpen), E_(CDDAClose) ); set_callbacks( CDDAOpen, CDDAClose );
add_shortcut( "cddax" ); add_shortcut( "cddax" );
add_shortcut( "cd" ); add_shortcut( "cd" );
set_category( CAT_INPUT ); set_category( CAT_INPUT );
set_subcategory( SUBCAT_INPUT_ACCESS ); set_subcategory( SUBCAT_INPUT_ACCESS );
/* Configuration options */ /* 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."), N_("If nonzero, this gives additional debug information."),
DEBUG_LONGTEXT, VLC_TRUE ); DEBUG_LONGTEXT, VLC_TRUE );
...@@ -116,7 +116,7 @@ vlc_module_begin(); ...@@ -116,7 +116,7 @@ vlc_module_begin();
CACHING_LONGTEXT, VLC_TRUE ); CACHING_LONGTEXT, VLC_TRUE );
add_integer( MODULE_STRING "-blocks-per-read", 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"), N_("Number of blocks per CD read"),
BLOCKS_PER_READ_LONGTEXT, VLC_TRUE ); BLOCKS_PER_READ_LONGTEXT, VLC_TRUE );
...@@ -132,11 +132,11 @@ vlc_module_begin(); ...@@ -132,11 +132,11 @@ vlc_module_begin();
#ifdef HAVE_LIBCDDB #ifdef HAVE_LIBCDDB
add_string( MODULE_STRING "-cddb-title-format", 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"), N_("Format to use in playlist \"title\" field when using CDDB"),
CDDB_TITLE_FMT_LONGTEXT, VLC_TRUE ); 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_("Do CDDB lookups?"),
N_("If set, lookup CD-DA track information using the CDDB " N_("If set, lookup CD-DA track information using the CDDB "
"protocol"), "protocol"),
...@@ -179,7 +179,7 @@ vlc_module_begin(); ...@@ -179,7 +179,7 @@ vlc_module_begin();
N_("Directory to cache CDDB requests"), N_("Directory to cache CDDB requests"),
VLC_TRUE ); 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_("Prefer CD-Text info to CDDB info?"),
N_("If set, CD-Text information will be preferred " N_("If set, CD-Text information will be preferred "
"to CDDB information when both are available"), "to CDDB information when both are available"),
...@@ -187,9 +187,20 @@ vlc_module_begin(); ...@@ -187,9 +187,20 @@ vlc_module_begin();
#endif #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_("Do CD-Text lookups?"),
N_("If set, get CD-Text information"), N_("If set, get CD-Text information"),
VLC_FALSE ); 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(); vlc_module_end();
...@@ -107,6 +107,7 @@ typedef struct cdda_data_s ...@@ -107,6 +107,7 @@ typedef struct cdda_data_s
WAVEHEADER waveheader; /* Wave header for the output data */ WAVEHEADER waveheader; /* Wave header for the output data */
vlc_bool_t b_header; vlc_bool_t b_header;
vlc_bool_t b_nav_mode;
input_thread_t *p_input; input_thread_t *p_input;
......
...@@ -42,6 +42,8 @@ static char *CDDAFormatStr( const access_t *p_access, cdda_data_t *p_cdda, ...@@ -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, const char format_str[], const char *psz_mrl,
track_t i_track); track_t i_track);
static char *CDDAFormatMRL( const access_t *p_access, track_t i_track );
#ifdef HAVE_LIBCDDB #ifdef HAVE_LIBCDDB
#define free_and_dup(var, val) \ #define free_and_dup(var, val) \
...@@ -259,13 +261,11 @@ CDDAMetaInfoInit( access_t *p_access ) ...@@ -259,13 +261,11 @@ CDDAMetaInfoInit( access_t *p_access )
CD. CD.
*/ */
void 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; 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_meta_artist = NULL;
char *psz_name = NULL;
char *config_varname = MODULE_STRING "-title-format";
if ( ! p_cdda ) return; if ( ! p_cdda ) return;
...@@ -274,11 +274,6 @@ CDDAMetaInfo( access_t *p_access, track_t i_track, /*const*/ char *psz_mrl ) ...@@ -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. */ /* 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 && p_cdda->cddb.disc )
{ {
if (p_cdda->b_cddb_enabled)
{
config_varname = MODULE_STRING "-cddb-title-format";
}
if( CDIO_INVALID_TRACK == i_track ) if( CDIO_INVALID_TRACK == i_track )
{ {
...@@ -384,7 +379,7 @@ CDDAMetaInfo( access_t *p_access, track_t i_track, /*const*/ char *psz_mrl ) ...@@ -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); cdio_get_track_lsn(p_cdda->p_cdio, i_track);
mtime_t i_duration = i_track_frames / CDIO_CD_FRAMES_PER_SEC; 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); 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 ) ...@@ -392,9 +387,6 @@ CDDAMetaInfo( access_t *p_access, track_t i_track, /*const*/ char *psz_mrl )
_("Duration"), "%s", _("Duration"), "%s",
secstotimestr( psz_buffer, i_duration ) ); 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, input_Control( p_cdda->p_input, INPUT_ADD_INFO, psz_track,
_("MRL"), "%s", psz_mrl ); _("MRL"), "%s", psz_mrl );
free(psz_mrl); free(psz_mrl);
...@@ -438,8 +430,6 @@ CDDAMetaInfo( access_t *p_access, track_t i_track, /*const*/ char *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 to CDDB or CD-Text values or the default value depending on
availablity and user preferences. 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 So now add the title and artist to VLC's meta, and the
name as shown in the status bar and playlist entry. 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 ) ...@@ -449,12 +439,9 @@ CDDAMetaInfo( access_t *p_access, track_t i_track, /*const*/ char *psz_mrl )
if ( CDIO_INVALID_TRACK != i_track ) if ( CDIO_INVALID_TRACK != i_track )
{ {
psz_name = char *psz_name = CDDAFormatTitle( p_access, i_track ) ;
CDDAFormatStr( p_access, p_cdda,
config_GetPsz( p_access, config_varname ),
psz_mrl, i_track );
input_Control( p_cdda->p_input, INPUT_SET_NAME, psz_name ); 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) ...@@ -523,7 +510,7 @@ cdda_data_t *p_cdda, char *psz_cdtext)
%Y : The year 19xx or 20xx ** %Y : The year 19xx or 20xx **
%% : a % %% : a %
*/ */
static char * char *
CDDAFormatStr( const access_t *p_access, cdda_data_t *p_cdda, CDDAFormatStr( const access_t *p_access, cdda_data_t *p_cdda,
const char format_str[], const char *psz_mrl, track_t i_track) 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, ...@@ -748,6 +735,56 @@ CDDAFormatStr( const access_t *p_access, cdda_data_t *p_cdda,
return strdup(temp_str); 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" /* Adds a string-valued entry to the playlist information under "Track"
if the string is not null or the null string. 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, ...@@ -758,46 +795,33 @@ CDDAFormatStr( const access_t *p_access, cdda_data_t *p_cdda,
"%s", FIELD); \ "%s", FIELD); \
} }
playlist_item_t * static playlist_item_t *
CDDACreatePlaylistItem( const access_t *p_access, cdda_data_t *p_cdda, CDDACreatePlaylistItem( const access_t *p_access, cdda_data_t *p_cdda,
playlist_t *p_playlist, playlist_item_t *p_item, 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 = 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+1) -
cdio_get_track_lsn(p_cdda->p_cdio, i_track); cdio_get_track_lsn(p_cdda->p_cdio, i_track);
mtime_t i_mduration = mtime_t i_mduration =
i_track_frames * (CLOCK_FREQ / CDIO_CD_FRAMES_PER_SEC) ; i_track_frames * (CLOCK_FREQ / CDIO_CD_FRAMES_PER_SEC) ;
char *psz_title; char *psz_title = NULL;
char *config_varname = MODULE_STRING "-title-format"; char *psz_mrl = NULL;
playlist_item_t *p_child = NULL; playlist_item_t *p_child = NULL;
if( !p_item ) if( !p_item ) return NULL;
{
return NULL;
}
#ifdef HAVE_LIBCDDB
if (p_cdda->b_cddb_enabled)
{
config_varname = MODULE_STRING "-cddb-title-format";
}
#endif /*HAVE_LIBCDDB*/
snprintf(psz_mrl, psz_mrl_max, "%s%s@T%u", psz_title = CDDAFormatTitle( p_access, i_track ) ;
CDDA_MRL_PREFIX, p_cdda->psz_source, i_track); psz_mrl = CDDAFormatMRL( p_access, i_track ) ;
psz_title = CDDAFormatStr( p_access, p_cdda,
config_GetPsz( p_access, config_varname ),
psz_mrl, i_track);
dbg_print( INPUT_DBG_META, "mrl: %s, title: %s, duration, %ld", dbg_print( INPUT_DBG_META, "mrl: %s, title: %s, duration, %ld",
psz_mrl, psz_title, (long int) i_mduration / 1000000 ); psz_mrl, psz_title, (long int) i_mduration / 1000000 );
p_child = playlist_ItemNew( p_playlist, psz_mrl, psz_title ); p_child = playlist_ItemNew( p_playlist, psz_mrl, psz_title );
p_child->input.i_duration = i_mduration; p_child->input.i_duration = i_mduration;
free(psz_mrl);
free(psz_title);
if( !p_child ) return NULL; if( !p_child ) return NULL;
...@@ -869,14 +893,11 @@ CDDAFixupPlaylist( access_t *p_access, cdda_data_t *p_cdda, ...@@ -869,14 +893,11 @@ CDDAFixupPlaylist( access_t *p_access, cdda_data_t *p_cdda,
vlc_bool_t b_single_track ) vlc_bool_t b_single_track )
{ {
int i; int i;
playlist_t * p_playlist; playlist_t * p_playlist = NULL;
char * psz_mrl = NULL;
unsigned int psz_mrl_max = strlen(CDDA_MRL_PREFIX)
+ strlen(p_cdda->psz_source) +
+ strlen("@T") + strlen("100") + 1;
const track_t i_first_track = p_cdda->i_first_track; 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; vlc_bool_t b_play = VLC_FALSE;
track_t i_track;
#ifdef HAVE_LIBCDDB #ifdef HAVE_LIBCDDB
p_cdda->b_cddb_enabled = p_cdda->b_cddb_enabled =
...@@ -888,48 +909,39 @@ CDDAFixupPlaylist( access_t *p_access, cdda_data_t *p_cdda, ...@@ -888,48 +909,39 @@ CDDAFixupPlaylist( access_t *p_access, cdda_data_t *p_cdda,
return VLC_SUCCESS; return VLC_SUCCESS;
#endif #endif
psz_mrl = malloc( psz_mrl_max ); if (! p_cdda->b_nav_mode ) {
p_playlist = (playlist_t *) vlc_object_find( p_access,
if( psz_mrl == NULL ) VLC_OBJECT_PLAYLIST,
{ FIND_ANYWHERE );
msg_Warn( p_access, "out of memory" ); if( !p_playlist )
return VLC_ENOMEM; {
} msg_Warn( p_access, "can't find playlist" );
return VLC_EGENERIC;
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( b_single_track ) if( b_single_track || p_cdda->b_nav_mode ) {
{ i_track = p_cdda->i_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 );
} }
else else
{ {
snprintf(psz_mrl, psz_mrl_max, "%s%s", CDDA_MRL_PREFIX, i_track = CDIO_INVALID_TRACK;
p_cdda->psz_source);
CDDAMetaInfoInit( p_access );
CDDAMetaInfo( p_access, CDIO_INVALID_TRACK, psz_mrl );
} }
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 ); ((input_thread_t *)p_access->p_parent)->input.p_item );
if( p_item == p_playlist->status.p_item && !b_single_track ) if( p_item == p_playlist->status.p_item && !b_single_track )
{ {
b_play = VLC_TRUE; b_play = VLC_TRUE;
} }
else else
{ {
b_play = VLC_FALSE; b_play = VLC_FALSE;
}
} }
if( b_single_track ) if( b_single_track )
...@@ -952,20 +964,25 @@ CDDAFixupPlaylist( access_t *p_access, cdda_data_t *p_cdda, ...@@ -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; 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_cdda->i_titles = 1;
p_access->info.i_size = p_access->info.i_size =
i_track_frames * (int64_t) CDIO_CD_FRAMESIZE_RAW; i_track_frames * (int64_t) CDIO_CD_FRAMESIZE_RAW;
p_access->info.i_update |= INPUT_UPDATE_TITLE|INPUT_UPDATE_SIZE; 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 p_item->input.i_duration = i_track_frames
* (CLOCK_FREQ / CDIO_CD_FRAMES_PER_SEC); * (CLOCK_FREQ / CDIO_CD_FRAMES_PER_SEC);
} }
else else
{ {
input_title_t *t; input_title_t *t;
playlist_ItemToNode( p_playlist, p_item );
if ( ! p_cdda->b_nav_mode )
playlist_ItemToNode( p_playlist, p_item );
for( i = 0 ; i < p_cdda->i_tracks ; i++ ) for( i = 0 ; i < p_cdda->i_tracks ; i++ )
{ {
playlist_item_t *p_child; playlist_item_t *p_child;
...@@ -979,13 +996,16 @@ CDDAFixupPlaylist( access_t *p_access, cdda_data_t *p_cdda, ...@@ -979,13 +996,16 @@ CDDAFixupPlaylist( access_t *p_access, cdda_data_t *p_cdda,
asprintf( &t->psz_name, _("Track %i"), i_track ); asprintf( &t->psz_name, _("Track %i"), i_track );
t->i_size = i_track_frames * (int64_t) CDIO_CD_FRAMESIZE_RAW; 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, if ( ! p_cdda->b_nav_mode ) {
p_item, p_child = CDDACreatePlaylistItem( p_access, p_cdda, p_playlist,
i_track, psz_mrl, p_item,
psz_mrl_max ) ; i_track );
CDDAAddMetaToItem( p_access, p_cdda, p_child, i_track, VLC_TRUE ); CDDAAddMetaToItem( p_access, p_cdda, p_child, i_track,
VLC_TRUE );
}
} }
p_cdda->i_titles = p_cdda->i_tracks; p_cdda->i_titles = p_cdda->i_tracks;
...@@ -993,20 +1013,23 @@ CDDAFixupPlaylist( access_t *p_access, cdda_data_t *p_cdda, ...@@ -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) cdio_get_track_lba(p_cdda->p_cdio, CDIO_CDROM_LEADOUT_TRACK)
* (int64_t) CDIO_CD_FRAMESIZE_RAW; * (int64_t) CDIO_CD_FRAMESIZE_RAW;
p_access->info.i_update |= INPUT_UPDATE_TITLE|INPUT_UPDATE_SIZE; p_access->info.i_update |= INPUT_UPDATE_TITLE|INPUT_UPDATE_SIZE;
p_item->input.i_duration = if (p_item) {
p_access->info.i_size * (CLOCK_FREQ / CDIO_CD_FRAMES_PER_SEC) ; p_item->input.i_duration =
p_item->input.psz_uri = strdup(psz_mrl); 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 ) if( b_play )
{ {
playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, playlist_Control( p_playlist, PLAYLIST_VIEWPLAY,
p_playlist->status.i_view, p_playlist->status.i_view,
p_playlist->status.p_item, NULL ); p_playlist->status.p_item, NULL );
vlc_object_release( p_playlist );
} }
vlc_object_release( p_playlist );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
......
...@@ -32,8 +32,7 @@ int CDDAFixupPlaylist( access_t *p_access, cdda_data_t *p_cdda, ...@@ -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 we handle Meta Information requests and basically copy what we've
saved here. saved here.
*/ */
void CDDAMetaInfo( access_t *p_access, track_t i_track, void CDDAMetaInfo( access_t *p_access, track_t i_track );
/*const*/ char *psz_mrl );
/* /*
Saves Meta Information about the CD-DA. Saves Meta Information about the CD-DA.
...@@ -43,12 +42,5 @@ void CDDAMetaInfo( access_t *p_access, track_t i_track, ...@@ -43,12 +42,5 @@ void CDDAMetaInfo( access_t *p_access, track_t i_track,
*/ */
void CDDAMetaInfoInit( access_t *p_access ); 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 );
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment