📄 access.c
字号:
"%s", p_cdda->cddb.disc->artist); playlist_ItemAddInfo( p_item, psz_general_cat, _("CDDB Disc Category"), "%s", CDDB_CATEGORY[p_cdda->cddb.disc->category]); playlist_ItemAddInfo( p_item, psz_general_cat, _("Genre"), "%s", p_cdda->cddb.disc->genre); if ( p_cdda->cddb.disc->discid ) { playlist_ItemAddInfo( p_item, psz_general_cat, _("CDDB Disc ID"), "%x", p_cdda->cddb.disc->discid ); } if (p_cdda->cddb.disc->year != 0) { playlist_ItemAddInfo( p_item, psz_general_cat, _("Year"), "%5d", p_cdda->cddb.disc->year ); } if (p_cdda->i_cddb_enabled) { cddb_track_t *t=cddb_disc_get_track(p_cdda->cddb.disc, i_track-1); if (t != NULL && t->artist != NULL) { playlist_ItemAddInfo( p_item, psz_general_cat, _("Track Artist"), "%s", t->artist ); playlist_ItemAddInfo( p_item , psz_general_cat, _("Track Title"), "%s", t->title ); } } }#endif /*HAVE_LIBCDDB*/ vlc_mutex_unlock( &p_item->lock );}static intCDDAFixupPlayList( input_thread_t *p_input, cdda_data_t *p_cdda, const char *psz_source, bool play_single_track){ int i; playlist_t * p_playlist; char * psz_mrl; unsigned int psz_mrl_max = strlen(CDDA_MRL_PREFIX) + strlen(psz_source) + strlen("@T") + strlen("100") + 1;#ifdef HAVE_LIBCDDB p_cdda->i_cddb_enabled = config_GetInt( p_input, MODULE_STRING "-cddb-enabled" ); if( play_single_track && !p_cdda->i_cddb_enabled ) return 0;#else if( play_single_track ) return 0;#endif psz_mrl = malloc( psz_mrl_max ); if( psz_mrl == NULL ) { msg_Warn( p_input, "out of memory" ); return -1; } p_playlist = (playlist_t *) vlc_object_find( p_input, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); if( !p_playlist ) { msg_Warn( p_input, "can't find playlist" ); free(psz_mrl); return -1; }#ifdef HAVE_LIBCDDB if (p_cdda->i_cddb_enabled) GetCDDBInfo(p_input, p_cdda); else p_cdda->cddb.disc = NULL;#endif InformationCreate(p_input); if (play_single_track) { /* May fill out more information when the playlist user interface becomes more mature. */ CDDACreatePlayListItem(p_input, p_cdda, p_playlist, p_cdda->i_track+1, psz_mrl, psz_mrl_max, psz_source, PLAYLIST_REPLACE, p_playlist->i_index); } else { playlist_Delete( p_playlist, p_playlist->i_index); for( i = 1 ; i <= p_cdda->i_nb_tracks ; i++ ) { CDDACreatePlayListItem(p_input, p_cdda, p_playlist, i, psz_mrl, psz_mrl_max, psz_source, PLAYLIST_APPEND, PLAYLIST_END); } playlist_Command( p_playlist, PLAYLIST_GOTO, 0 ); } vlc_object_release( p_playlist ); free(psz_mrl); return 0;}/**************************************************************************** * Public functions ****************************************************************************/intE_(DebugCB) ( 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_access_data; if (p_cdda->i_debug & (INPUT_DBG_CALL|INPUT_DBG_EXT)) { msg_Dbg( p_cdda_input, "Old debug (x%0x) %d, new debug (x%0x) %d", p_cdda->i_debug, p_cdda->i_debug, val.i_int, val.i_int); } p_cdda->i_debug = val.i_int; return VLC_SUCCESS;}intE_(CDDBEnabledCB) ( 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_access_data;#ifdef HAVE_LIBCDDB if (p_cdda->i_debug & (INPUT_DBG_CALL|INPUT_DBG_EXT)) { msg_Dbg( p_cdda_input, "Old CDDB Enabled (x%0x) %d, new (x%0x) %d", p_cdda->i_cddb_enabled, p_cdda->i_cddb_enabled, val.i_int, val.i_int); } p_cdda->i_cddb_enabled = val.i_int;#endif return VLC_SUCCESS;}/*FIXME*/#if PLAYLIST_INTERFACE_IS_FIXEDintE_(TitleFormatCB) ( 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_access_data; if (p_cdda->i_debug & (INPUT_DBG_CALL|INPUT_DBG_EXT)) { msg_Dbg( p_cdda_input, "Old CDDB Enabled (%s), new (%s)", oldval.psz_string, val.psz_string); } ???? return VLC_SUCCESS;}#endif/***************************************************************************** * Open: open cdda *****************************************************************************/intE_(Open)( vlc_object_t *p_this ){ input_thread_t * p_input = (input_thread_t *)p_this; char * psz_orig; char * psz_parser; char * psz_source; cdda_data_t * p_cdda; int i; int i_track = 1; cddev_t *p_cddev; vlc_value_t val; bool play_single_track = false; /* Set where to log errors messages from libcdio. */ p_cdda_input = (input_thread_t *)p_this; /* parse the options passed in command line : */ psz_orig = psz_parser = psz_source = strdup( p_input->psz_name ); if( !psz_orig ) { return( -1 ); } while( *psz_parser && *psz_parser != '@' ) { psz_parser++; } if( *psz_parser == '@' ) { /* Found options */ *psz_parser = '\0'; ++psz_parser; if ('T' == *psz_parser || 't' == *psz_parser ) ++psz_parser; i_track = (int)strtol( psz_parser, NULL, 10 ); i_track = i_track ? i_track : 1; play_single_track = true; } if( !*psz_source ) { /* No source specified, so figure it out. */ if( !p_input->psz_access ) { free( psz_orig ); return -1; } psz_source = config_GetPsz( p_input, "cd-audio" ); if( !psz_source || 0==strlen(psz_source) ) { /* Scan for a CD-ROM drive with a CD-DA in it. */ char **cd_drives = cdio_get_devices_with_cap(NULL, CDIO_FS_AUDIO, false); if (NULL == cd_drives) return -1; if (cd_drives[0] == NULL) { cdio_free_device_list(cd_drives); return -1; } psz_source = strdup(cd_drives[0]); cdio_free_device_list(cd_drives); } } /* Open CDDA */ cdio_log_set_handler ( cdio_log_handler );#ifdef HAVE_LIBCDDB cddb_log_set_handler ( cddb_log_handler );#endif if( !(p_cddev = ioctl_Open( p_this, psz_source )) ) { msg_Warn( p_input, "could not open %s", psz_source ); free( psz_source ); return VLC_EGENERIC; } p_cdda = malloc( sizeof(cdda_data_t) ); if( p_cdda == NULL ) { msg_Err( p_input, "out of memory" ); free( psz_source ); return VLC_ENOMEM; } p_cdda->p_cddev = p_cddev; p_cdda->i_debug = config_GetInt( p_this, MODULE_STRING "-debug" ); p_input->p_access_data = (void *)p_cdda; dbg_print( (INPUT_DBG_CALL|INPUT_DBG_EXT), "%s", psz_source ); p_input->i_mtu = CDDA_DATA_ONCE; /* We read the Table Of Content information */ p_cdda->i_nb_tracks = ioctl_GetTracksMap( VLC_OBJECT(p_input), p_cdda->p_cddev->cdio, &p_cdda->p_sectors ); if( p_cdda->i_nb_tracks < 0 ) msg_Err( p_input, "unable to count tracks" ); else if( p_cdda->i_nb_tracks <= 0 ) msg_Err( p_input, "no audio tracks found" ); if( p_cdda->i_nb_tracks <= 0 ) { ioctl_Close( p_cdda->p_cddev ); free( p_cdda ); free( psz_source ); return VLC_EGENERIC; } if( i_track > p_cdda->i_nb_tracks || i_track < 1 ) i_track = 1; /* Set stream and area data */ vlc_mutex_lock( &p_input->stream.stream_lock ); /* Initialize ES structures */ input_InitStream( p_input, 0 ); /* cdda input method */ p_input->stream.i_method = INPUT_METHOD_CDDA; p_input->stream.b_pace_control = 1; p_input->stream.b_seekable = 1; p_input->stream.i_mux_rate = 44100 * 4 / 50;#define area p_input->stream.pp_areas for( i = 1 ; i <= p_cdda->i_nb_tracks ; i++ ) { input_AddArea( p_input, i, 1 ); /* Absolute start offset and size */ area[i]->i_start = (off_t)p_cdda->p_sectors[i-1] * (off_t)CDIO_CD_FRAMESIZE_RAW; area[i]->i_size = (off_t)(p_cdda->p_sectors[i] - p_cdda->p_sectors[i-1]) * (off_t)CDIO_CD_FRAMESIZE_RAW; }#undef area CDDAPlay( p_input, i_track); vlc_mutex_unlock( &p_input->stream.stream_lock ); CDDAFixupPlayList(p_input, p_cdda, psz_source, play_single_track); p_input->pf_read = CDDARead; p_input->pf_seek = CDDASeek; p_input->pf_set_area = CDDASetArea; p_input->pf_set_program = CDDASetProgram; /* Update default_pts to a suitable value for cdda access */ var_Create( p_input, MODULE_STRING "-caching", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); var_Get( p_input, MODULE_STRING "-caching", &val ); p_input->i_pts_delay = val.i_int * 1000; free( psz_source ); /* Build a WAV header for the output data */ memset( &p_cdda->waveheader, 0, sizeof(WAVEHEADER) ); SetWLE( &p_cdda->waveheader.Format, 1 ); /*WAVE_FORMAT_PCM*/ SetWLE( &p_cdda->waveheader.BitsPerSample, 16); p_cdda->waveheader.MainChunkID = VLC_FOURCC('R', 'I', 'F', 'F'); p_cdda->waveheader.Length = 0; /* we just don't know */ p_cdda->waveheader.ChunkTypeID = VLC_FOURCC('W', 'A', 'V', 'E'); p_cdda->waveheader.SubChunkID = VLC_FOURCC('f', 'm', 't', ' '); SetDWLE( &p_cdda->waveheader.SubChunkLength, 16); SetWLE( &p_cdda->waveheader.Modus, 2); SetDWLE( &p_cdda->waveheader.SampleFreq, 44100); SetWLE( &p_cdda->waveheader.BytesPerSample, 2 /*Modus*/ * 16 /*BitsPerSample*/ / 8 ); SetDWLE( &p_cdda->waveheader.BytesPerSec, 16 /*BytesPerSample*/ * 44100 /*SampleFreq*/ ); p_cdda->waveheader.DataChunkID = VLC_FOURCC('d', 'a', 't', 'a'); p_cdda->waveheader.DataLength = 0; /* we just don't know */ p_cdda->i_header_pos = 0; return VLC_SUCCESS;}/***************************************************************************** * CDDAClose: closes cdda *****************************************************************************/voidE_(Close)( vlc_object_t *p_this ){ input_thread_t * p_input = (input_thread_t *)p_this; cdda_data_t *p_cdda = (cdda_data_t *)p_input->p_access_data; dbg_print( (INPUT_DBG_CALL|INPUT_DBG_EXT), "" ); ioctl_Close( p_cdda->p_cddev ); cdio_log_set_handler (uninit_log_handler);#ifdef HAVE_LIBCDDB cddb_log_set_handler (uninit_log_handler); if (p_cdda->i_cddb_enabled) cddb_disc_destroy(p_cdda->cddb.disc);#endif free( p_cdda->p_sectors ); free( p_cdda ); p_cdda_input = NULL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -