📄 info.c
字号:
#endif /*HAVE_LIBCDDB*/ if (p_cdda->p_cdtext[0]) { char *psz_field; add_cdtext_disc_info_str("Arranger (CD-Text)", CDTEXT_ARRANGER); add_cdtext_disc_info_str("Composer (CD-Text)", CDTEXT_COMPOSER); add_cdtext_disc_info_str("Disc ID (CD-Text)", CDTEXT_DISCID); add_cdtext_disc_info_str("Genre (CD-Text)", CDTEXT_GENRE); add_cdtext_disc_info_str("Message (CD-Text)", CDTEXT_MESSAGE); add_cdtext_disc_info_str("Performer (CD-Text)", CDTEXT_PERFORMER); add_cdtext_disc_info_str("Songwriter (CD-Text)", CDTEXT_SONGWRITER); add_cdtext_disc_info_str("Title (CD-Text)", CDTEXT_TITLE); psz_field = p_cdda->p_cdtext[0]->field[CDTEXT_TITLE]; if (psz_field && strlen(psz_field)) { psz_meta_title = psz_field; } psz_field = p_cdda->p_cdtext[0]->field[CDTEXT_PERFORMER]; if (psz_field && strlen(psz_field)) { psz_meta_artist = psz_field; } } for( i = 0 ; i < p_cdda->i_tracks ; i++ ) { char psz_track[TITLE_MAX]; const track_t i_track = i_first_track + i; 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_duration = i_track_frames / CDIO_CD_FRAMES_PER_SEC; char *psz_mrl = CDDAFormatMRL( p_access, i_track ); snprintf(psz_track, TITLE_MAX, "%s %02d", _("Track"), i_track); input_Control( p_cdda->p_input, INPUT_ADD_INFO, psz_track, _("Duration"), "%s", secstotimestr( psz_buffer, i_duration ) ); input_Control( p_cdda->p_input, INPUT_ADD_INFO, psz_track, _("MRL"), "%s", psz_mrl ); free(psz_mrl); if (p_cdda->p_cdtext[i_track]) { add_cdtext_info_str( psz_track, "Arranger (CD-Text)", i_track, CDTEXT_ARRANGER); add_cdtext_info_str( psz_track, "Composer (CD-Text)", i_track, CDTEXT_COMPOSER); add_cdtext_info_str( psz_track, "Disc ID (CD-Text)", i_track, CDTEXT_DISCID); add_cdtext_info_str( psz_track, "Genre (CD-Text)", i_track, CDTEXT_GENRE); add_cdtext_info_str( psz_track, "Message (CD-Text)", i_track, CDTEXT_MESSAGE); add_cdtext_info_str( psz_track, "Performer (CD-Text)", i_track, CDTEXT_PERFORMER); add_cdtext_info_str( psz_track, "Songwriter (CD-Text)", i_track, CDTEXT_SONGWRITER); add_cdtext_info_str( psz_track, "Title (CD-Text)", i_track, CDTEXT_TITLE); } #ifdef HAVE_LIBCDDB if (p_cdda->b_cddb_enabled) { cddb_track_t *t=cddb_disc_get_track(p_cdda->cddb.disc, i); if (t != NULL) { add_info_str(psz_track, "Artist (CDDB)", t->artist); add_info_str(psz_track, "Title (CDDB)", t->title); add_info_str(psz_track, "Extended Data (CDDB)", t->ext_data); } }#endif /*HAVE_LIBCDDB*/ } /* Above we should have set psz_meta_title and psz_meta_artist to CDDB or CD-Text values or the default value depending on availablity and user preferences. So now add the title and artist to VLC's meta, and the name as shown in the status bar and playlist entry. For playlist mode, the meta title is what's seen at the bottom and in the playlist. For nav-mode playing, it is done by input_control. I don't understand why they do different things. In either case, we may have customized to put in the track name. */ if ( CDIO_INVALID_TRACK != i_track ) { char *psz_name = CDDAFormatTitle( p_access, i_track ) ; if ( !p_cdda->b_nav_mode ) { add_meta_val( VLC_META_TITLE, psz_name ); } else { input_Control( p_cdda->p_input, INPUT_SET_NAME, psz_name ); free(psz_name); } if (psz_meta_artist) add_meta_val( VLC_META_ARTIST, psz_meta_artist ); } }}#define add_format_str_info(val) \ { \ const char *str = val; \ unsigned int len; \ if (val != NULL) { \ len=strlen(str); \ if (len != 0) { \ strncat(tp, str, TEMP_STR_LEN-(tp-temp_str)); \ tp += len; \ } \ saw_control_prefix = false; \ } \ }#define add_format_num_info(val, fmt) \ { \ char num_str[10]; \ unsigned int len; \ sprintf(num_str, fmt, val); \ len=strlen(num_str); \ if (len != 0) { \ strncat(tp, num_str, TEMP_STR_LEN-(tp-temp_str)); \ tp += len; \ } \ saw_control_prefix = false; \ }static inline boolwant_cddb_info(cdda_data_t *p_cdda, char *psz_cdtext) { /* We either don't have CD-Text info, or we do but we prefer to get CDDB which means CDDB has been enabled and we were able to retrieve the info.*/#ifdef HAVE_LIBCDDB return !psz_cdtext || (!p_cdda->b_cdtext_prefer && p_cdda->b_cddb_enabled && p_cdda->cddb.disc);#else return false;#endif}/*! Take a format string and expand escape sequences, that is sequences that begin with %, with information from the current CD. The expanded string is returned. Here is a list of escape sequences: %a : The album artist ** %A : The album information ** %C : Category ** %e : The extended track data %I : CDDB disk ID ** %G : Genre ** %M : The current MRL %m : The CD-DA Media Catalog Number (MCN) %n : The number of tracks on the CD %p : The artist/performer/composer in the track ** %T : The track number ** %s : Number of seconds in this track, or seconds in CD if invalid track %S : Number of seconds on the CD %t : The track name or MRL if no name %Y : The year 19xx or 20xx ** %% : a %*/char *CDDAFormatStr( const access_t *p_access, cdda_data_t *p_cdda, const char format_str[], const char *psz_mrl, track_t i_track){#define TEMP_STR_SIZE 256#define TEMP_STR_LEN (TEMP_STR_SIZE-1) static char temp_str[TEMP_STR_SIZE]; size_t i; char * tp = temp_str; vlc_bool_t saw_control_prefix = false; size_t format_len = strlen(format_str); memset(temp_str, 0, TEMP_STR_SIZE); for (i=0; i<format_len; i++) { char *psz = NULL; if (!saw_control_prefix && format_str[i] != '%') { *tp++ = format_str[i]; saw_control_prefix = false; continue; } switch(format_str[i]) { case '%': if (saw_control_prefix) { *tp++ = '%'; } saw_control_prefix = !saw_control_prefix; break;#ifdef HAVE_LIBCDDB case 'a': if (p_cdda->p_cdtext[0] && p_cdda->p_cdtext[0]->field[CDTEXT_PERFORMER]) psz = p_cdda->p_cdtext[0]->field[CDTEXT_PERFORMER]; if (want_cddb_info(p_cdda, psz)) psz = p_cdda->cddb.disc->artist; goto format_str; case 'A': if (p_cdda->p_cdtext[0] && p_cdda->p_cdtext[0]->field[CDTEXT_TITLE]) psz = p_cdda->p_cdtext[0]->field[CDTEXT_TITLE]; if (want_cddb_info(p_cdda, psz)) psz = p_cdda->cddb.disc->title; goto format_str; case 'C': if (!p_cdda->b_cddb_enabled) goto not_special; if (p_cdda->cddb.disc) add_format_str_info( CDDB_CATEGORY[p_cdda->cddb.disc->category]); break; case 'G': if (p_cdda->p_cdtext[0] && p_cdda->p_cdtext[0]->field[CDTEXT_GENRE]) psz = p_cdda->p_cdtext[0]->field[CDTEXT_GENRE]; if (want_cddb_info(p_cdda, psz)) psz = p_cdda->cddb.disc->genre; goto format_str; case 'I': if (p_cdda->p_cdtext[0] && p_cdda->p_cdtext[0]->field[CDTEXT_DISCID]) psz = p_cdda->p_cdtext[0]->field[CDTEXT_DISCID]; if (want_cddb_info(p_cdda, psz)) { add_format_num_info(p_cdda->cddb.disc->discid, "%x"); } else if (psz) add_format_str_info(psz); break; case 'Y': if (!p_cdda->b_cddb_enabled) goto not_special; if (p_cdda->cddb.disc) add_format_num_info(p_cdda->cddb.disc->year, "%5d"); break; case 't': if ( CDIO_INVALID_TRACK == i_track ) break; if (p_cdda && p_cdda->b_cddb_enabled && p_cdda->cddb.disc) { cddb_track_t *t=cddb_disc_get_track(p_cdda->cddb.disc, i_track-1); if (t != NULL && t->title != NULL) { add_format_str_info(t->title); } else { add_format_str_info(psz_mrl); } } else { if (p_cdda->p_cdtext[i_track] && p_cdda->p_cdtext[i_track]->field[CDTEXT_TITLE]) { add_format_str_info(p_cdda->p_cdtext[i_track]->field[CDTEXT_TITLE]); } else add_format_str_info(psz_mrl); } break; case 'p': if ( CDIO_INVALID_TRACK == i_track ) break; if (p_cdda->p_cdtext[i_track] && p_cdda->p_cdtext[i_track]->field[CDTEXT_PERFORMER]) psz = p_cdda->p_cdtext[i_track]->field[CDTEXT_PERFORMER]; if (want_cddb_info(p_cdda, psz)) { cddb_track_t *t=cddb_disc_get_track(p_cdda->cddb.disc, i_track-1); if (t != NULL && t->artist != NULL) psz = t->artist; } goto format_str; case 'e': if ( CDIO_INVALID_TRACK == i_track ) break; if (p_cdda->p_cdtext[i_track] && p_cdda->p_cdtext[i_track]->field[CDTEXT_MESSAGE]) psz = p_cdda->p_cdtext[i_track]->field[CDTEXT_MESSAGE]; if (want_cddb_info(p_cdda, psz)) { cddb_track_t *t=cddb_disc_get_track(p_cdda->cddb.disc, i_track-1); if (t != NULL && t->ext_data != NULL) psz = t->ext_data; } goto format_str; break;#else case 'a': if (p_cdda->p_cdtext[0] && p_cdda->p_cdtext[0]->field[CDTEXT_PERFORMER]) psz = p_cdda->p_cdtext[0]->field[CDTEXT_PERFORMER]; goto format_str; case 'A': if (p_cdda->p_cdtext[0] && p_cdda->p_cdtext[0]->field[CDTEXT_TITLE]) psz = p_cdda->p_cdtext[0]->field[CDTEXT_TITLE]; goto format_str; case 'G': if (p_cdda->p_cdtext[0] && p_cdda->p_cdtext[0]->field[CDTEXT_GENRE]) psz = p_cdda->p_cdtext[0]->field[CDTEXT_GENRE]; goto format_str; case 'I': if (p_cdda->p_cdtext[0] && p_cdda->p_cdtext[0]->field[CDTEXT_DISCID]) add_format_str_info(p_cdda->p_cdtext[0]->field[CDTEXT_DISCID]); break; case 'p': if ( CDIO_INVALID_TRACK == i_track ) break; if (p_cdda->p_cdtext[i_track] && p_cdda->p_cdtext[i_track]->field[CDTEXT_PERFORMER]) psz = p_cdda->p_cdtext[i_track]->field[CDTEXT_PERFORMER]; goto format_str; case 't': if ( CDIO_INVALID_TRACK == i_track ) break; if (p_cdda->p_cdtext[i_track] && p_cdda->p_cdtext[i_track]->field[CDTEXT_TITLE]) psz = p_cdda->p_cdtext[i_track]->field[CDTEXT_TITLE]; else psz = psz_mrl; goto format_str; case 'e': if ( CDIO_INVALID_TRACK == i_track ) break; if (p_cdda->p_cdtext[i_track] && p_cdda->p_cdtext[i_track]->field[CDTEXT_MESSAGE]) psz = p_cdda->p_cdtext[i_track]->field[CDTEXT_MESSAGE]; goto format_str; break;#endif /*HAVE_LIBCDDB*/ case 's': if ( CDIO_INVALID_TRACK != i_track ) { char psz_buffer[MSTRTIME_MAX_SIZE]; unsigned int i_track_frames = cdio_get_track_sec_count(p_cdda->p_cdio, i_track); mtime_t i_duration = i_track_frames / CDIO_CD_FRAMES_PER_SEC;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -