From b03c31e488d275c94853a70417a0ac31fc0377af Mon Sep 17 00:00:00 2001 From: =?utf8?q?Cl=C3=A9ment=20Stenac?= Date: Sat, 28 Jan 2006 18:11:12 +0000 Subject: [PATCH] Add CDDB support to CDDA module (Refs:#459) --- configure.ac | 17 ++- modules/access/cdda.c | 168 ++++++++++++++++++++- modules/gui/wxwidgets/dialogs/playlist.cpp | 4 +- 3 files changed, 178 insertions(+), 11 deletions(-) diff --git a/configure.ac b/configure.ac index 69610371b9..cdae72ff92 100644 --- a/configure.ac +++ b/configure.ac @@ -189,7 +189,7 @@ case "${target_os}" in # add ws2_32 for closesocket, select, recv 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([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]) fi if test "${SYS}" = "mingwce"; then @@ -391,7 +391,7 @@ fi AC_CHECK_FUNCS(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,,[ AC_CHECK_FUNCS(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,[ VLC_ADD_LDFLAGS([ipv4 access_mms],[-lbind]) @@ -2049,6 +2049,17 @@ then VLC_ADD_LDFLAGS([vcd vcdx cdda cddax],[-framework IOKit -framework CoreFoundation]) VLC_ADD_LDFLAGS([vcdx cddax],[-liconv]) 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 dnl diff --git a/modules/access/cdda.c b/modules/access/cdda.c index e1fa03e006..f4372f5f49 100644 --- a/modules/access/cdda.c +++ b/modules/access/cdda.c @@ -35,6 +35,10 @@ #include +#ifdef HAVE_LIBCDDB +#include +#endif + /***************************************************************************** * Module descriptior *****************************************************************************/ @@ -59,6 +63,12 @@ vlc_module_begin(); CACHING_LONGTEXT, 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_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( "cddasimple" ); vlc_module_end(); @@ -90,6 +100,10 @@ struct access_sys_t vlc_bool_t b_separate_items; vlc_bool_t b_single_track; int i_track; + +#ifdef HAVE_LIBCDDB + cddb_disc_t *p_disc; +#endif }; static block_t *Block( access_t * ); @@ -99,6 +113,10 @@ static int Control( access_t *, int, va_list ); static int GetTracks( access_t *p_access, vlc_bool_t b_separate, 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 *****************************************************************************/ @@ -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; int i; playlist_item_t *p_item; + char *psz_name; p_sys->i_titles = ioctl_GetTracksMap( VLC_OBJECT(p_access), p_sys->vcddev, &p_sys->p_sectors ); if( p_sys->i_titles < 0 ) @@ -527,6 +546,30 @@ static int GetTracks( access_t *p_access, vlc_bool_t b_separate, { 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 */ @@ -545,26 +588,57 @@ static int GetTracks( access_t *p_access, vlc_bool_t b_separate, } 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 ) : 0; - char *psz_name = malloc( strlen( _("Audio CD - Track ") ) + 5 ); - char *psz_opt = (char*)malloc( 14 ); + char *psz_opt; + + psz_name = malloc( strlen( _("Audio CD - Track ") ) + 5 ); + psz_opt = malloc( strlen( "cdda-track=" ) + 3 ); psz_uri = (char*)malloc( i_path_len + 13 ); snprintf( psz_uri, i_path_len + 13, "cdda://%s", p_access->psz_path ? p_access->psz_path : "" ); - snprintf( psz_name, 100, _("Audio CD - Track %i" ), - (i+1) ); - snprintf( psz_opt, 14, "cdda-track=%i", i+1 ); + sprintf( psz_opt, "cdda-track=%i", i+1 ); + + /* Define a "default name" */ + sprintf( psz_name, _("Audio CD - Track %i"), (i+1) ); + /* Create playlist items */ p_item = playlist_ItemNewWithType( VLC_OBJECT( p_playlist ), psz_uri, psz_name, ITEM_TYPE_DISC ); 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, p_parent->pp_parents[0]->i_view, 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, 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*/ diff --git a/modules/gui/wxwidgets/dialogs/playlist.cpp b/modules/gui/wxwidgets/dialogs/playlist.cpp index 85d408924e..9f4cfa00c3 100644 --- a/modules/gui/wxwidgets/dialogs/playlist.cpp +++ b/modules/gui/wxwidgets/dialogs/playlist.cpp @@ -47,6 +47,8 @@ #include #include +#include + #define HELP_SHUFFLE N_( "Shuffle" ) #define HELP_LOOP N_( "Repeat All" ) #define HELP_REPEAT N_( "Repeat One" ) @@ -493,7 +495,7 @@ void Playlist::UpdateTreeItem( wxTreeItemId item ) wxString duration = wxU( "" ); char *psz_author = vlc_input_item_GetInfo( &p_item->input, _("Meta-information"), - _("Artist")); + VLC_META_ARTIST ); if( !psz_author ) { UnlockPlaylist( p_intf->p_sys, p_playlist ); -- 2.39.2