⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 info.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 3 页
字号:
/***************************************************************************** * info.c : CD digital audio input information routines ***************************************************************************** * Copyright (C) 2004, 2005 VideoLAN * $Id: info.c 8845 2004-09-29 09:00:41Z rocky $ * * Authors: Rocky Bernstein <rocky@panix.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA. *****************************************************************************//***************************************************************************** * Preamble *****************************************************************************/#include "callback.h"      /* FIXME - reorganize callback.h, cdda.h better */#include "cdda.h"          /* private structures. Also #includes vlc things */#include <vlc_playlist.h>  /* Has to come *after* cdda.h */#include <cdio/cdio.h>#include <cdio/cdtext.h>#include <cdio/logging.h>#include <cdio/cd_types.h>#include "info.h"#ifdef HAVE_ERRNO_H#   include <errno.h>#endifstatic 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) \  if (var) free(var);          \  if (val) var=strdup(val);/* Saves CDDB information about CD-DA via libcddb. */static void GetCDDBInfo( access_t *p_access, cdda_data_t *p_cdda ){    int i, i_matches;    cddb_conn_t  *conn = cddb_new();    const CdIo_t *p_cdio = p_cdda->p_cdio;    dbg_print( (INPUT_DBG_CALL), "" );#ifdef FIXME_NOW    cddb_log_set_handler (uninit_log_handler);#endif    if (!conn)    {        msg_Warn( p_access, "Unable to initialize libcddb" );        goto cddb_destroy;    }    cddb_set_email_address( conn,                            config_GetPsz( p_access,                                           MODULE_STRING "-cddb-email") );    cddb_set_server_name( conn,                          config_GetPsz( p_access,                                         MODULE_STRING "-cddb-server") );    cddb_set_server_port(conn,                         config_GetInt( p_access,                                        MODULE_STRING "-cddb-port") );  /* Set the location of the local CDDB cache directory.     The default location of this directory is */    if (!config_GetInt( p_access, MODULE_STRING "-cddb-enable-cache" ))        cddb_cache_disable(conn);    cddb_cache_set_dir(conn,                     config_GetPsz( p_access,                                    MODULE_STRING "-cddb-cachedir") );    cddb_set_timeout(conn,                   config_GetInt( p_access, MODULE_STRING "-cddb-timeout") );    if (config_GetInt( p_access, MODULE_STRING "-cddb-httpd" ) )    {        cddb_http_enable(conn);    }    else    {        cddb_http_disable(conn);    }    p_cdda->cddb.disc = cddb_disc_new();    if (!p_cdda->cddb.disc)    {        msg_Err( p_access, "Unable to create CDDB disc structure." );        goto cddb_end;    }    for(i = 0; i < p_cdda->i_tracks; i++)    {        track_t i_track =  p_cdda->i_first_track + i;        cddb_track_t *t = cddb_track_new();        t->frame_offset = cdio_get_track_lba(p_cdio, i_track);        cddb_disc_add_track(p_cdda->cddb.disc, t);    }    p_cdda->cddb.disc->length =        cdio_get_track_lba(p_cdio, CDIO_CDROM_LEADOUT_TRACK)        / CDIO_CD_FRAMES_PER_SEC;    if (!cddb_disc_calc_discid(p_cdda->cddb.disc))    {        msg_Err( p_access, "CDDB disc ID calculation failed" );        goto cddb_destroy;    }    i_matches = cddb_query(conn, p_cdda->cddb.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(conn, p_cdda->cddb.disc);        if (p_cdda->i_debug & INPUT_DBG_CDDB)            cddb_disc_print(p_cdda->cddb.disc);    }    else    {        msg_Warn( p_access, "CDDB error: %s", cddb_error_str(errno));    }cddb_destroy:    cddb_destroy(conn);cddb_end: ;}#endif /*HAVE_LIBCDDB*/#define add_meta_val(VLC_META, VAL)					\  if ( p_cdda->p_meta && VAL) {                                         \    vlc_meta_Add( p_cdda->p_meta, VLC_META, VAL );                      \    dbg_print( INPUT_DBG_META, "field %s: %s\n", VLC_META, VAL );       \  }                                                                     \#define add_cddb_meta(FIELD, VLC_META)			                \  add_meta_val(VLC_META, p_cdda->cddb.disc->FIELD);#define add_cddb_meta_fmt(FIELD, FORMAT_SPEC, VLC_META)                 \  {                                                                     \    char psz_buf[100];                                                  \    snprintf( psz_buf, sizeof(psz_buf)-1, FORMAT_SPEC,                  \              p_cdda->cddb.disc->FIELD );                               \    psz_buf[sizeof(psz_buf)-1] = '\0';                                  \    add_meta_val(VLC_META, psz_buf);					\  }/* Adds a string-valued entry to the stream and media information if   the string is not null or the null string. */#define add_info_str(CATEGORY, TITLE, FIELD)                      \  if (FIELD && strlen(FIELD)) {                                   \    input_Control( p_cdda->p_input, INPUT_ADD_INFO, CATEGORY,     \                   _(TITLE), "%s", FIELD );                       \  }/* Adds a numeric-valued entry to the stream and media information   if the number is not zero. */#define add_info_val(CATEGORY, TITLE, FMT, FIELD)                 \  if (FIELD) {                                                    \    input_Control( p_cdda->p_input, INPUT_ADD_INFO, CATEGORY,     \                   _(TITLE), FMT, FIELD );                        \  }/* Adds a CDDB string-valued entry to the stream and media information   under category "Disc" if the string is not null or the null string. */#define add_cddb_disc_info_str(TITLE, FIELD)                    \  add_info_str("Disc", TITLE, p_cdda->cddb.disc->FIELD)/* Adds a CDDB numeric-valued entry to the stream and media information   under category "Disc" if the string is not null or the null string. */#define add_cddb_disc_info_val(TITLE, FMT, FIELD)               \  add_info_val("Disc", TITLE, FMT, p_cdda->cddb.disc->FIELD)/* Adds a CD-Text string-valued entry to the stream and media information   under category "Disc" if the string is not null or the null string. */#define add_cdtext_info_str(CATEGORY, TITLE, INDEX, FIELD)              \    add_info_str(CATEGORY, TITLE, p_cdda->p_cdtext[INDEX]->field[FIELD])/* Adds a CD-Text string-valued entry to the stream and media information   under category "Disc" if the string is not null or the null string. */#define add_cdtext_disc_info_str(TITLE, FIELD) \  add_cdtext_info_str("Disc", TITLE, 0, FIELD)/*  Saves Meta Information about the CD-DA.  Meta information used in "stream and media info" or in playlist  info. The intialization of CD-Text or CDDB is done here though.  Therefore, this should be called before CDDAMetaInfo is called. */void CDDAMetaInfoInit( access_t *p_access ){    cdda_data_t *p_cdda   = (cdda_data_t *) p_access->p_sys;        if ( ! p_cdda ) return;    dbg_print( (INPUT_DBG_CALL), "p_cdda->i_tracks %d", 	       p_cdda->i_tracks );    p_cdda->psz_mcn = cdio_get_mcn(p_cdda->p_cdio);    p_cdda->p_meta = vlc_meta_New();#ifdef HAVE_LIBCDDB    if ( p_cdda->b_cddb_enabled )    {        GetCDDBInfo(p_access, p_cdda);    }#endif /*HAVE_LIBCDDB*/    #define TITLE_MAX 30    {        track_t i_track;	for( i_track = 0 ; i_track < p_cdda->i_tracks ; i_track++ )	{	    p_cdda->p_cdtext[i_track] =	      cdio_get_cdtext(p_cdda->p_cdio, i_track);	}    }}/* In the Control routine, we handle Meta Information requests and basically copy what was saved in CDDAMetaInfoInit. If i_track is CDIO_INVALID_TRACK we are probably asking about the entire CD. */void 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 = CDDAFormatMRL( p_access, i_track );    char *psz_meta_artist = NULL;        if ( ! p_cdda ) return;    dbg_print( (INPUT_DBG_CALL), "i_track %d", i_track );#ifdef HAVE_LIBCDDB    /* Set up for Meta and name for CDDB access. */    if ( p_cdda->b_cddb_enabled &&  p_cdda->cddb.disc )    {        if( CDIO_INVALID_TRACK == i_track )	{	    psz_meta_title  = p_cdda->cddb.disc->title;	    psz_meta_artist = p_cdda->cddb.disc->artist;	    if ( p_cdda->cddb.disc->genre && strlen(p_cdda->cddb.disc->genre) )	        add_cddb_meta(genre, VLC_META_GENRE);	    if ( 0 != p_cdda->cddb.disc->year )	        add_cddb_meta_fmt(year, "%d", VLC_META_DATE );	}	else	{	  cddb_track_t *t=cddb_disc_get_track(p_cdda->cddb.disc, i_track-1);	  if (t != NULL )	  {	      if( t->title != NULL && ! p_cdda->b_nav_mode )	      {		  add_meta_val( VLC_META_TITLE, t->title );	      }	      if( t->artist != NULL )	      {		add_meta_val( VLC_META_ARTIST, t->artist );	      }	  }	}    }#endif /*HAVE_LIBCDDB*/    #define TITLE_MAX 30    {        track_t i = p_cdda->i_tracks;        const int i_first_track = p_cdda->i_first_track;        char psz_buffer[MSTRTIME_MAX_SIZE];	unsigned int i_track_frames = 	  cdio_get_track_lba(p_cdda->p_cdio, CDIO_CDROM_LEADOUT_TRACK);	          mtime_t i_duration = i_track_frames / CDIO_CD_FRAMES_PER_SEC;        dbg_print( INPUT_DBG_META, "Duration %ld, tracks %d", 		   (long int) i_duration, p_cdda->i_tracks );        input_Control( p_cdda->p_input, INPUT_ADD_INFO,                       _("Disc"), _("Duration"), "%s",                       secstotimestr( psz_buffer, i_duration ) );	if (p_cdda->psz_mcn) {	    input_Control( p_cdda->p_input, INPUT_ADD_INFO,			   _("Disc"), _("Media Catalog Number (MCN)"), "%s", 			   p_cdda->psz_mcn );	    	    input_Control( p_cdda->p_input, INPUT_ADD_INFO,			   _("Disc"), _("Tracks"), "%d", p_cdda->i_tracks );	}	#ifdef HAVE_LIBCDDB        if (p_cdda->b_cddb_enabled && p_cdda->cddb.disc)        {          add_cddb_disc_info_str("Artist (CDDB)", artist);	  if ( CDDB_CAT_INVALID != p_cdda->cddb.disc->category )	    add_info_str("Disc", "Category (CDDB)",			 CDDB_CATEGORY[p_cdda->cddb.disc->category]);          add_cddb_disc_info_val("Disc ID (CDDB)", "%x", discid);          add_cddb_disc_info_str("Extended Data (CDDB)", ext_data);	  add_cddb_disc_info_str("Genre (CDDB)",  genre);          add_cddb_disc_info_str("Title (CDDB)",  title);	  if ( 0 != p_cdda->cddb.disc->year ) 	    add_cddb_disc_info_val("Year (CDDB)", "%d", year);        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -