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

📄 access.c

📁 vlc源码
💻 C
📖 第 1 页 / 共 3 页
字号:
        p_cdda->e_paranoia = PARANOIA_MODE_DISABLE;        if( psz_paranoia && *psz_paranoia )        {            if( !strncmp( psz_paranoia, "full", strlen("full") ) )                p_cdda->e_paranoia = PARANOIA_MODE_FULL;            else if( !strncmp(psz_paranoia, "overlap", strlen("overlap")) )                p_cdda->e_paranoia = PARANOIA_MODE_OVERLAP;            /* Use CD Paranoia? */            if( p_cdda->e_paranoia )            {                p_cdda->paranoia_cd =                            cdio_cddap_identify_cdio( p_cdio, 1, NULL );                /* We'll set for verbose paranoia messages. */                cdio_cddap_verbose_set( p_cdda->paranoia_cd,                                        CDDA_MESSAGE_PRINTIT,                                        CDDA_MESSAGE_PRINTIT );                if ( 0 != cdio_cddap_open(p_cdda->paranoia_cd) )                {                    msg_Warn( p_cdda_input, "unable to get paranoia support - "                                "continuing without it." );                    p_cdda->e_paranoia = PARANOIA_MODE_DISABLE;                }                else                {                    p_cdda->paranoia = cdio_paranoia_init(p_cdda->paranoia_cd);                    cdio_paranoia_seek( p_cdda->paranoia, p_cdda->i_lsn,                                        SEEK_SET);                    /* Set reading mode for full or overlap paranoia,                     * but allow skipping sectors. */                    cdio_paranoia_modeset( p_cdda->paranoia,                            PARANOIA_MODE_FULL == p_cdda->e_paranoia ?                            PARANOIA_MODE_FULL^PARANOIA_MODE_NEVERSKIP :                            PARANOIA_MODE_OVERLAP^PARANOIA_MODE_NEVERSKIP );                }            }        }        free( psz_paranoia );    }#endif    /* Build a WAV header to put in front of the output data.       This gets sent back in the Block (read) routine.     */    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, CDDA_FREQUENCY_SAMPLE);    SetWLE( &p_cdda->waveheader.BytesPerSample,            2 /*Modus*/ * 16 /*BitsPerSample*/ / 8 );    SetDWLE( &p_cdda->waveheader.BytesPerSec,             2*16/8 /*BytesPerSample*/ * CDDA_FREQUENCY_SAMPLE );    p_cdda->waveheader.DataChunkID = VLC_FOURCC('d', 'a', 't', 'a');    p_cdda->waveheader.DataLength  = 0;    /* we just don't know */    /* PTS delay */    var_Create( p_access, MODULE_STRING "-caching",                VLC_VAR_INTEGER|VLC_VAR_DOINHERIT );    vlc_object_release( p_cdda->p_input );    free( psz_source );    return VLC_SUCCESS; error:    cdio_destroy( p_cdda->p_cdio );    free( psz_source );    if( p_cdda )    {        if ( p_cdda->p_input )            vlc_object_release( p_cdda->p_input );        free(p_cdda);    }    return i_rc;}/***************************************************************************** * CDDAClose: closes cdda and frees any resources associded with it. *****************************************************************************/void CDDAClose (vlc_object_t *p_this ){    access_t    *p_access = (access_t *) p_this;    cdda_data_t *p_cdda   = (cdda_data_t *) p_access->p_sys;    track_t      i;#if LIBCDIO_VERSION_NUM >= 73    if( p_cdda->b_audio_ctl )        cdio_audio_stop(p_cdda->p_cdio);#endif    dbg_print( (INPUT_DBG_CALL|INPUT_DBG_EXT), "" );    /* Remove playlist titles */    for( i = 0; i < p_cdda->i_titles; i++ )    {        vlc_input_title_Delete( p_cdda->p_title[i] );    }#ifdef HAVE_LIBCDDB    cddb_log_set_handler( (cddb_log_handler_t) uninit_log_handler );    if( p_cdda->b_cddb_enabled )        cddb_disc_destroy( p_cdda->cddb.disc );#endif    cdio_destroy( p_cdda->p_cdio );    cdio_log_set_handler( uninit_log_handler );#if LIBCDIO_VERSION_NUM >= 72    if( p_cdda->paranoia )        cdio_paranoia_free(p_cdda->paranoia);    if( p_cdda->paranoia_cd )        cdio_cddap_close_no_free_cdio( p_cdda->paranoia_cd );#endif    free( p_cdda->psz_mcn );    free( p_cdda->psz_source );#if LIBCDDB_VERSION_NUM >= 1    libcddb_shutdown();#endif    free( p_cdda );    p_cdda = NULL;    p_cdda_input = NULL;}/***************************************************************************** * Control: The front-end or vlc engine calls here to ether get * information such as meta information or plugin capabilities or to * issue miscellaneous "set" requests. *****************************************************************************/static int CDDAControl( access_t *p_access, int i_query, va_list args ){    cdda_data_t  *p_cdda = (cdda_data_t *) p_access->p_sys;    int          *pi_int;    int i;    dbg_print( (INPUT_DBG_CALL|INPUT_DBG_EXT|INPUT_DBG_EVENT),               "query %d", i_query );    switch( i_query )    {        /* Pass back a copy of meta information that was gathered when we           during the Open/Initialize call.         */        case ACCESS_GET_META:        {#if 0            vlc_meta_t **pp_meta = (vlc_meta_t**)va_arg( args, vlc_meta_t** );            if( p_cdda->p_meta )            {                *pp_meta = vlc_meta_Duplicate( p_cdda->p_meta );                dbg_print( INPUT_DBG_META, "%s", "Meta copied" );                return VLC_SUCCESS;            }            else#endif            {                msg_Warn( p_access, "tried to copy NULL meta info" );                return VLC_EGENERIC;            }        }        case ACCESS_CAN_CONTROL_PACE:        {            bool *pb_bool = (bool*)va_arg( args, bool* );            *pb_bool = p_cdda->b_audio_ctl ? false : true;            dbg_print( INPUT_DBG_META, "can control pace? %d", *pb_bool);            return VLC_SUCCESS;        }        case ACCESS_CAN_FASTSEEK:            dbg_print( INPUT_DBG_META, "can fast seek?");            goto common;        case ACCESS_CAN_SEEK:            dbg_print( INPUT_DBG_META, "can seek?");            goto common;        case ACCESS_CAN_PAUSE:            dbg_print( INPUT_DBG_META, "can pause?"); common:            {                bool *pb_bool = (bool*)va_arg( args, bool* );                *pb_bool = true;                return VLC_SUCCESS;            }        /* */        case ACCESS_GET_MTU:        {            pi_int = (int*)va_arg( args, int * );            *pi_int = p_cdda-> i_blocks_per_read * CDIO_CD_FRAMESIZE_RAW;            dbg_print( INPUT_DBG_META, "Get MTU %d", *pi_int);            break;        }        case ACCESS_GET_PTS_DELAY:        {            int64_t *pi_64 = (int64_t*)va_arg( args, int64_t * );            *pi_64 = var_GetInteger( p_access, MODULE_STRING "-caching" )              * MILLISECONDS_PER_SEC;            break;        }        case ACCESS_GET_TITLE_INFO:        {            input_title_t ***ppp_title =             (input_title_t***)va_arg( args, input_title_t*** );            pi_int    = (int*)va_arg( args, int* );            *((int*)va_arg( args, int* )) = 1; /* Title offset */            dbg_print ( INPUT_DBG_EVENT,                        "GET TITLE: i_tracks %d, i_tracks %d",                        p_cdda->i_tracks, p_cdda->i_tracks );            CDDAMetaInfo( p_access, CDIO_INVALID_TRACK );            if( p_cdda->b_nav_mode)            {                char *psz_title = CDDAFormatTitle( p_access, p_cdda->i_track );                input_Control( p_cdda->p_input, INPUT_SET_NAME, psz_title );                free(psz_title);            }            /* Duplicate title info */            if( p_cdda->i_titles == 0 )            {                *pi_int = 0; ppp_title = NULL;                return VLC_SUCCESS;            }            *pi_int = p_cdda->i_titles;            *ppp_title = calloc(1, sizeof( input_title_t **)                                           * p_cdda->i_titles );            if (!*ppp_title)                return VLC_ENOMEM;            for( i = 0; i < p_cdda->i_titles; i++ )            {                if ( p_cdda->p_title[i] )                {                    (*ppp_title)[i] =                        vlc_input_title_Duplicate( p_cdda->p_title[i] );                }            }            break;        }        case ACCESS_SET_TITLE:        {            i = (int)va_arg( args, int );            dbg_print( INPUT_DBG_EVENT, "set title %d", i );            if( i != p_access->info.i_title )            {                const track_t i_track = p_cdda->i_first_track + i;                /* Update info */                p_access->info.i_title = i;                if( p_cdda->b_nav_mode)                {                    lsn_t i_last_lsn;                    char *psz_title = CDDAFormatTitle( p_access, i_track );                    input_Control( p_cdda->p_input, INPUT_SET_NAME,                                   psz_title );                    free( psz_title );                    p_cdda->i_track = i_track;                    i_last_lsn = cdio_get_track_lsn( p_cdda->p_cdio,                                                CDIO_CDROM_LEADOUT_TRACK );                    if( CDIO_INVALID_LSN != i_last_lsn )                        p_access->info.i_size = (int64_t) CDIO_CD_FRAMESIZE_RAW                                                            * i_last_lsn ;                    p_access->info.i_pos = (int64_t)                                    cdio_get_track_lsn( p_cdda->p_cdio, i_track )                                                        * CDIO_CD_FRAMESIZE_RAW;                }                else                {                    p_access->info.i_size = p_cdda->p_title[i]->i_size;                    p_access->info.i_pos  = 0;                }                p_access->info.i_update = INPUT_UPDATE_TITLE|INPUT_UPDATE_SIZE;                /* Next sector to read */                p_cdda->i_lsn = cdio_get_track_lsn( p_cdda->p_cdio, i_track );            }            break;        }        case ACCESS_SET_PAUSE_STATE:            dbg_print( INPUT_DBG_META, "Pause");            if( p_cdda->b_audio_ctl )                cdda_audio_pause( p_cdda->p_cdio );            break;        case ACCESS_SET_SEEKPOINT:            dbg_print( INPUT_DBG_META, "set seekpoint");            return VLC_EGENERIC;        case ACCESS_SET_PRIVATE_ID_STATE:            dbg_print( INPUT_DBG_META, "set private id state");            return VLC_EGENERIC;        default:            msg_Warn( p_access, "unimplemented query in control" );            return VLC_EGENERIC;    }    return VLC_SUCCESS;}/*****************************************************************************  CDDAInit: Initialize information pertaining to the CD: the number of tracks, first track number, LSNs for each track and the leadout. The leadout information is stored after the last track. The LSN array is 0-origin, same as p_access->info.  Add first_track to get what track number this is on the CD. Note: libcdio uses the real track number. On input we assume p_cdda->p_cdio and p_cdda->i_track have been set. We return the VLC-type status, e.g. VLC_SUCCESS, VLC_ENOMEM, etc. *****************************************************************************/static int CDDAInit( access_t *p_access, cdda_data_t *p_cdda ){    discmode_t  discmode = CDIO_DISC_MODE_NO_INFO;    p_cdda->i_tracks       = cdio_get_num_tracks( p_cdda->p_cdio );    p_cdda->i_first_track  = cdio_get_first_track_num( p_cdda->p_cdio );    discmode = cdio_get_discmode( p_cdda->p_cdio );    switch( discmode )    {        case CDIO_DISC_MODE_CD_DA:        case CDIO_DISC_MODE_CD_MIXED:            /* These are possible for CD-DA */            break;        default:            /* These are not possible for CD-DA */            msg_Err( p_access,                "Disc seems not to be CD-DA. libcdio reports it is %s",                discmode2str[discmode]                );            return VLC_EGENERIC;    }    /* Set reading start LSN. */    p_cdda->i_lsn = cdio_get_track_lsn(p_cdda->p_cdio, p_cdda->i_track);    return VLC_SUCCESS;}/* * Local variables: *  mode: C *  style: gnu * End: */

⌨️ 快捷键说明

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