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_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_access->info.i_size =
p_cdda->p_title[p_access->info.i_title]->i_size; p_cdda->p_title[p_access->info.i_title]->i_size;
p_access->info.i_pos = 0; p_access->info.i_pos = 0;
p_cdda->i_track++; 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;
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_size = p_cdda->p_title[i]->i_size;
p_access->info.i_pos = 0; 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,
void *p_data );
int CDDANavModeCB( 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_(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;
......
This diff is collapsed.
...@@ -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