cdrom.c

来自「VLC媒体播放程序」· C语言 代码 · 共 159 行

C
159
字号
/**************************************************************************** * cdrom.c: cdrom tools ***************************************************************************** * Copyright (C) 1998-2001 VideoLAN * $Id: cdrom.c,v 1.1 2003/10/04 18:55:13 gbazin Exp $ * * Authors: Johan Bilien <jobi@via.ecp.fr> *          Gildas Bazin <gbazin@netcourrier.com> *          Jon Lech Johansen <jon-vl@nanocrew.net> * * 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 <stdio.h>#include <stdlib.h>#include <vlc/vlc.h>#ifdef HAVE_UNISTD_H#   include <unistd.h>#endif#include <string.h>#include <errno.h>#include "cdrom.h"/***************************************************************************** * Local Prototypes *****************************************************************************/static void cd_log_handler (cdio_log_level_t level, const char message[]);/***************************************************************************** * ioctl_Open: Opens a VCD device or file and returns an opaque handle *****************************************************************************/cddev_t *ioctl_Open( vlc_object_t *p_this, const char *psz_dev ){    cddev_t *p_cddev;    if( !psz_dev ) return NULL;    /*     *  Initialize structure with default values     */    p_cddev = (cddev_t *)malloc( sizeof(cddev_t) );    if( p_cddev == NULL )    {        msg_Err( p_this, "out of memory" );        return NULL;    }    /* Set where to log errors messages from libcdio. */    cdio_log_set_handler ( cd_log_handler );    p_cddev->cdio = cdio_open(psz_dev, DRIVER_UNKNOWN);    if( p_cddev->cdio == NULL )    {        free( p_cddev );        p_cddev = NULL;    }    return p_cddev;}/***************************************************************************** * ioctl_Close: Closes an already opened VCD device or file. *****************************************************************************/void ioctl_Close( cddev_t *p_cddev ){    cdio_destroy(p_cddev->cdio);}/***************************************************************************** * ioctl_GetTracksMap: Read the Table of Contents, fill in the pp_sectors map *                     if pp_sectors is not null and return the number of *                     tracks available. *                     We allocate and fill one more track than are on  *                     the CD. The last "track" is leadout track information. *                     This makes finding the end of the last track uniform *                     how it is done for other tracks. *****************************************************************************/track_t ioctl_GetTracksMap( vlc_object_t *p_this, const CdIo *cdio,                            lsn_t **pp_sectors ){    track_t i_tracks     = cdio_get_num_tracks(cdio);    track_t first_track  = cdio_get_first_track_num(cdio);    track_t i;    *pp_sectors = malloc( (i_tracks + 1) * sizeof(lsn_t) );    if( *pp_sectors == NULL )      {        msg_Err( p_this, "out of memory" );        return 0;      }    /* Fill the p_sectors structure with the track/sector matches.       Note cdio_get_track_lsn when given num_tracks + 1 will return       the leadout LSN.     */    for( i = 0 ; i <= i_tracks ; i++ )      {        (*pp_sectors)[ i ] = cdio_get_track_lsn(cdio, first_track+i);      }        return i_tracks;}/**************************************************************************** * ioctl_ReadSector: Read a sector (2324 bytes) ****************************************************************************/int ioctl_ReadSector( vlc_object_t *p_this, const cddev_t *p_cddev,                      int i_sector, byte_t * p_buffer ){  typedef struct {    uint8_t subheader   [8];    uint8_t data        [M2F2_SECTOR_SIZE];  } vcdsector_t;  vcdsector_t vcd_sector;    if (cdio_read_mode2_sector(p_cddev->cdio, &vcd_sector, i_sector, true)       != 0)    {      // msg_Err( p_this, "Could not read sector %d", i_sector );      return -1;    }      memcpy (p_buffer, vcd_sector.data, M2F2_SECTOR_SIZE);    return( 0 );}/**************************************************************************** * Private functions ****************************************************************************//* For now we're going to just discard error messages from libcdio... */static voidcd_log_handler (cdio_log_level_t level, const char message[]){  return;}

⌨️ 快捷键说明

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