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 )
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 =
......
......@@ -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 * );
......@@ -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;
......
......@@ -30,25 +30,29 @@
#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 );
......@@ -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();
......@@ -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;
......
......@@ -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;
}
......
......@@ -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 );
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