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

📄 access.c

📁 VLC媒体播放程序
💻 C
📖 第 1 页 / 共 3 页
字号:
                      "%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 + -