Commit b03c31e4 authored by Clément Stenac's avatar Clément Stenac

Add CDDB support to CDDA module (Refs:#459)

parent 501990a7
...@@ -189,7 +189,7 @@ case "${target_os}" in ...@@ -189,7 +189,7 @@ case "${target_os}" in
# add ws2_32 for closesocket, select, recv # add ws2_32 for closesocket, select, recv
CPPFLAGS_save="${CPPFLAGS_save} -D_OFF_T_ -D_off_t=long"; CPPFLAGS="${CPPFLAGS_save}" CPPFLAGS_save="${CPPFLAGS_save} -D_OFF_T_ -D_off_t=long"; CPPFLAGS="${CPPFLAGS_save}"
VLC_ADD_LDFLAGS([vlc],[-lws2_32 -lnetapi32 -lwinmm -mwindows]) VLC_ADD_LDFLAGS([vlc],[-lws2_32 -lnetapi32 -lwinmm -mwindows])
VLC_ADD_LDFLAGS([vcdx cddax],[-lwinmm]) VLC_ADD_LDFLAGS([cdda vcdx cddax],[-lwinmm])
VLC_ADD_LDFLAGS([ipv4 ipv6 access_http access_mms access_udp access_tcp access_ftp access_output_udp sap slp http stream_out_standard stream_out_rtp vod_rtsp telnet netsync],[-lws2_32]) VLC_ADD_LDFLAGS([ipv4 ipv6 access_http access_mms access_udp access_tcp access_ftp access_output_udp sap slp http stream_out_standard stream_out_rtp vod_rtsp telnet netsync],[-lws2_32])
fi fi
if test "${SYS}" = "mingwce"; then if test "${SYS}" = "mingwce"; then
...@@ -391,7 +391,7 @@ fi ...@@ -391,7 +391,7 @@ fi
AC_CHECK_FUNCS(connect,,[ AC_CHECK_FUNCS(connect,,[
AC_CHECK_LIB(socket,connect,[ AC_CHECK_LIB(socket,connect,[
VLC_ADD_LDFLAGS([vlc ipv4 cddax],-lsocket) VLC_ADD_LDFLAGS([vlc ipv4 cdda cddax],-lsocket)
]) ])
]) ])
...@@ -403,7 +403,7 @@ AC_CHECK_FUNCS(send,,[ ...@@ -403,7 +403,7 @@ AC_CHECK_FUNCS(send,,[
AC_CHECK_FUNCS(gethostbyname,,[ AC_CHECK_FUNCS(gethostbyname,,[
AC_CHECK_LIB(nsl,gethostbyname,[ AC_CHECK_LIB(nsl,gethostbyname,[
VLC_ADD_LDFLAGS([cddax ipv4 vlc],[-lnsl]) VLC_ADD_LDFLAGS([cdda cddax ipv4 vlc],[-lnsl])
],[ ],[
AC_CHECK_LIB(bind,gethostbyname,[ AC_CHECK_LIB(bind,gethostbyname,[
VLC_ADD_LDFLAGS([ipv4 access_mms],[-lbind]) VLC_ADD_LDFLAGS([ipv4 access_mms],[-lbind])
...@@ -2049,6 +2049,17 @@ then ...@@ -2049,6 +2049,17 @@ then
VLC_ADD_LDFLAGS([vcd vcdx cdda cddax],[-framework IOKit -framework CoreFoundation]) VLC_ADD_LDFLAGS([vcd vcdx cdda cddax],[-framework IOKit -framework CoreFoundation])
VLC_ADD_LDFLAGS([vcdx cddax],[-liconv]) VLC_ADD_LDFLAGS([vcdx cddax],[-liconv])
fi fi
if test "$enable_libcddb" != "no"; then
PKG_CHECK_MODULES(LIBCDDB, libcddb >= 0.9.5, [
HAVE_LIBCDDB=yes
AC_DEFINE(HAVE_LIBCDDB, [], [Define this if you have libcddb installed])
VLC_ADD_LDFLAGS([cdda],[$LIBCDDB_LIBS])
VLC_ADD_CFLAGS([cdda],[$LIBCDDB_CFLAGS])
],:
[AC_MSG_WARN(new enough libcddb not found. CDDB access disabled)
HAVE_LIBCDDB=no])
fi
fi fi
dnl dnl
......
...@@ -35,6 +35,10 @@ ...@@ -35,6 +35,10 @@
#include <vlc_playlist.h> #include <vlc_playlist.h>
#ifdef HAVE_LIBCDDB
#include <cddb/cddb.h>
#endif
/***************************************************************************** /*****************************************************************************
* Module descriptior * Module descriptior
*****************************************************************************/ *****************************************************************************/
...@@ -59,6 +63,12 @@ vlc_module_begin(); ...@@ -59,6 +63,12 @@ vlc_module_begin();
CACHING_LONGTEXT, VLC_TRUE ); CACHING_LONGTEXT, VLC_TRUE );
add_bool( "cdda-separate-tracks", VLC_TRUE, NULL, NULL, NULL, VLC_TRUE ); add_bool( "cdda-separate-tracks", VLC_TRUE, NULL, NULL, NULL, VLC_TRUE );
add_integer( "cdda-track", -1 , NULL, NULL, NULL, VLC_TRUE ); add_integer( "cdda-track", -1 , NULL, NULL, NULL, VLC_TRUE );
add_string( "cddb-server", "freedb.freedb.org", NULL,
N_( "CDDB Server" ), N_( "Adress of the CDDB server to use" ),
VLC_TRUE );
add_integer( "cddb-port", 8880, NULL,
N_( "CDDB port" ), N_( "CDDB Server port to use" ),
VLC_TRUE );
add_shortcut( "cdda" ); add_shortcut( "cdda" );
add_shortcut( "cddasimple" ); add_shortcut( "cddasimple" );
vlc_module_end(); vlc_module_end();
...@@ -90,6 +100,10 @@ struct access_sys_t ...@@ -90,6 +100,10 @@ struct access_sys_t
vlc_bool_t b_separate_items; vlc_bool_t b_separate_items;
vlc_bool_t b_single_track; vlc_bool_t b_single_track;
int i_track; int i_track;
#ifdef HAVE_LIBCDDB
cddb_disc_t *p_disc;
#endif
}; };
static block_t *Block( access_t * ); static block_t *Block( access_t * );
...@@ -99,6 +113,10 @@ static int Control( access_t *, int, va_list ); ...@@ -99,6 +113,10 @@ static int Control( access_t *, int, va_list );
static int GetTracks( access_t *p_access, vlc_bool_t b_separate, static int GetTracks( access_t *p_access, vlc_bool_t b_separate,
playlist_t *p_playlist, playlist_item_t *p_parent ); playlist_t *p_playlist, playlist_item_t *p_parent );
#ifdef HAVE_LIBCDDB
static void GetCDDBInfo( access_t *p_access, int i_titles, int *p_sectors );
#endif
/***************************************************************************** /*****************************************************************************
* Open: open cdda * Open: open cdda
*****************************************************************************/ *****************************************************************************/
...@@ -508,6 +526,7 @@ static int GetTracks( access_t *p_access, vlc_bool_t b_separate, ...@@ -508,6 +526,7 @@ static int GetTracks( access_t *p_access, vlc_bool_t b_separate,
access_sys_t *p_sys = p_access->p_sys; access_sys_t *p_sys = p_access->p_sys;
int i; int i;
playlist_item_t *p_item; playlist_item_t *p_item;
char *psz_name;
p_sys->i_titles = ioctl_GetTracksMap( VLC_OBJECT(p_access), p_sys->i_titles = ioctl_GetTracksMap( VLC_OBJECT(p_access),
p_sys->vcddev, &p_sys->p_sectors ); p_sys->vcddev, &p_sys->p_sectors );
if( p_sys->i_titles < 0 ) if( p_sys->i_titles < 0 )
...@@ -527,6 +546,30 @@ static int GetTracks( access_t *p_access, vlc_bool_t b_separate, ...@@ -527,6 +546,30 @@ static int GetTracks( access_t *p_access, vlc_bool_t b_separate,
{ {
playlist_LockItemToNode( p_playlist, p_parent ); playlist_LockItemToNode( p_playlist, p_parent );
} }
psz_name = strdup( "Audio CD" );
vlc_mutex_lock( &p_playlist->object_lock );
playlist_ItemSetName( p_parent, psz_name );
vlc_mutex_unlock( &p_playlist->object_lock );
var_SetInteger( p_playlist, "item-change",
p_parent->input.i_id );
free( psz_name );
#ifdef HAVE_LIBCDDB
GetCDDBInfo( p_access, p_sys->i_titles, p_sys->p_sectors );
if( p_sys->p_disc )
{
if( p_sys->p_disc->title )
{
asprintf( &psz_name, "%s", p_sys->p_disc->title );
vlc_mutex_lock( &p_playlist->object_lock );
playlist_ItemSetName( p_parent, psz_name );
vlc_mutex_unlock( &p_playlist->object_lock );
var_SetInteger( p_playlist, "item-change",
p_parent->input.i_id );
free( psz_name );
}
}
#endif
} }
/* Build title table */ /* Build title table */
...@@ -545,26 +588,57 @@ static int GetTracks( access_t *p_access, vlc_bool_t b_separate, ...@@ -545,26 +588,57 @@ static int GetTracks( access_t *p_access, vlc_bool_t b_separate,
} }
else else
{ {
char *psz_uri; char *psz_uri; int i_size, i_length;
int i_path_len = p_access->psz_path ? strlen( p_access->psz_path ) int i_path_len = p_access->psz_path ? strlen( p_access->psz_path )
: 0; : 0;
char *psz_name = malloc( strlen( _("Audio CD - Track ") ) + 5 ); char *psz_opt;
char *psz_opt = (char*)malloc( 14 );
psz_name = malloc( strlen( _("Audio CD - Track ") ) + 5 );
psz_opt = malloc( strlen( "cdda-track=" ) + 3 );
psz_uri = (char*)malloc( i_path_len + 13 ); psz_uri = (char*)malloc( i_path_len + 13 );
snprintf( psz_uri, i_path_len + 13, "cdda://%s", snprintf( psz_uri, i_path_len + 13, "cdda://%s",
p_access->psz_path ? p_access->psz_path : "" ); p_access->psz_path ? p_access->psz_path : "" );
snprintf( psz_name, 100, _("Audio CD - Track %i" ), sprintf( psz_opt, "cdda-track=%i", i+1 );
(i+1) );
snprintf( psz_opt, 14, "cdda-track=%i", i+1 ); /* Define a "default name" */
sprintf( psz_name, _("Audio CD - Track %i"), (i+1) );
/* Create playlist items */ /* Create playlist items */
p_item = playlist_ItemNewWithType( VLC_OBJECT( p_playlist ), p_item = playlist_ItemNewWithType( VLC_OBJECT( p_playlist ),
psz_uri, psz_name, ITEM_TYPE_DISC ); psz_uri, psz_name, ITEM_TYPE_DISC );
playlist_ItemAddOption( p_item, psz_opt ); playlist_ItemAddOption( p_item, psz_opt );
#ifdef HAVE_LIBCDDB
/* If we have CDDB info, change the name */
if( p_sys->p_disc )
{
char *psz_result;
cddb_track_t *t = cddb_disc_get_track( p_sys->p_disc, i );
if( t!= NULL )
{
if( t->title != NULL )
{
vlc_input_item_AddInfo( &p_item->input,
_("Meta-information"),
VLC_META_TITLE, t->title );
if( p_item->input.psz_name )
free( p_item->input.psz_name );
asprintf( &p_item->input.psz_name, "%s", t->title );
}
psz_result = cddb_track_get_artist( t );
if( psz_result )
{
vlc_input_item_AddInfo( &p_item->input,
_("Meta-information"),
VLC_META_ARTIST, psz_result );
}
}
}
#endif
playlist_NodeAddItem( p_playlist, p_item, playlist_NodeAddItem( p_playlist, p_item,
p_parent->pp_parents[0]->i_view, p_parent->pp_parents[0]->i_view,
p_parent, PLAYLIST_APPEND, PLAYLIST_END ); p_parent, PLAYLIST_APPEND, PLAYLIST_END );
free( psz_uri ); free( psz_opt ); free( psz_uri ); free( psz_opt ); free( psz_name );
} }
} }
...@@ -576,3 +650,83 @@ static int GetTracks( access_t *p_access, vlc_bool_t b_separate, ...@@ -576,3 +650,83 @@ static int GetTracks( access_t *p_access, vlc_bool_t b_separate,
return VLC_SUCCESS; return VLC_SUCCESS;
} }
#ifdef HAVE_LIBCDDB
static void GetCDDBInfo( access_t *p_access, int i_titles, int *p_sectors )
{
int i, i_matches;
int64_t i_length = 0, i_size = 0;
cddb_conn_t *p_cddb = cddb_new();
// cddb_log_set_handler( CDDBLogHandler );
if( !p_cddb )
{
msg_Warn( p_access, "unable to use CDDB" );
goto cddb_destroy;
}
cddb_set_email_address( p_cddb, "vlc@videolan.org" );
cddb_set_server_name( p_cddb, config_GetPsz( p_access, "cddb-server" ) );
cddb_set_server_port( p_cddb, config_GetInt( p_access, "cddb-port" ) );
/// \todo
cddb_cache_disable( p_cddb );
// cddb_cache_set_dir( p_cddb,
// config_GetPsz( p_access,
// MODULE_STRING "-cddb-cachedir") );
cddb_set_timeout( p_cddb, 10 );
/// \todo
cddb_http_disable( p_cddb);
p_access->p_sys->p_disc = cddb_disc_new();
if(! p_access->p_sys->p_disc )
{
msg_Err( p_access, "Unable to create CDDB disc structure." );
goto cddb_end;
}
for(i = 0; i < i_titles ; i++ )
{
cddb_track_t *t = cddb_track_new();
cddb_track_set_frame_offset(t, p_sectors[i] );
cddb_disc_add_track( p_access->p_sys->p_disc, t );
i_size = ( p_sectors[i+1] - p_sectors[i] ) *
(int64_t)CDDA_DATA_SIZE;
i_length += I64C(1000000) * i_size / 44100 / 4 ;
}
cddb_disc_set_length( p_access->p_sys->p_disc, (int)(i_length/1000000) );
if (!cddb_disc_calc_discid(p_access->p_sys->p_disc ))
{
msg_Err( p_access, "CDDB disc ID calculation failed" );
goto cddb_destroy;
}
i_matches = cddb_query( p_cddb, p_access->p_sys->p_disc);
if (i_matches > 0)
{
if (i_matches > 1)
msg_Warn( p_access, "Found %d matches in CDDB. Using first one.",
i_matches);
cddb_read( p_cddb, p_access->p_sys->p_disc );
// cddb_disc_print( p_access->p_sys->p_disc );
}
else
{
msg_Warn( p_access, "CDDB error: %s", cddb_error_str(errno));
}
cddb_destroy:
cddb_destroy( p_cddb);
cddb_end: ;
}
#endif /*HAVE_LIBCDDB*/
...@@ -47,6 +47,8 @@ ...@@ -47,6 +47,8 @@
#include <wx/dynarray.h> #include <wx/dynarray.h>
#include <wx/imaglist.h> #include <wx/imaglist.h>
#include <vlc_meta.h>
#define HELP_SHUFFLE N_( "Shuffle" ) #define HELP_SHUFFLE N_( "Shuffle" )
#define HELP_LOOP N_( "Repeat All" ) #define HELP_LOOP N_( "Repeat All" )
#define HELP_REPEAT N_( "Repeat One" ) #define HELP_REPEAT N_( "Repeat One" )
...@@ -493,7 +495,7 @@ void Playlist::UpdateTreeItem( wxTreeItemId item ) ...@@ -493,7 +495,7 @@ void Playlist::UpdateTreeItem( wxTreeItemId item )
wxString duration = wxU( "" ); wxString duration = wxU( "" );
char *psz_author = vlc_input_item_GetInfo( &p_item->input, char *psz_author = vlc_input_item_GetInfo( &p_item->input,
_("Meta-information"), _("Meta-information"),
_("Artist")); VLC_META_ARTIST );
if( !psz_author ) if( !psz_author )
{ {
UnlockPlaylist( p_intf->p_sys, p_playlist ); UnlockPlaylist( p_intf->p_sys, p_playlist );
......
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