cdrom.c
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:5k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /****************************************************************************
  2.  * cdrom.c: cdrom tools
  3.  *****************************************************************************
  4.  * Copyright (C) 1998-2001 VideoLAN
  5.  * $Id: cdrom.c 8313 2004-07-29 15:18:04Z hartman $
  6.  *
  7.  * Authors: Johan Bilien <jobi@via.ecp.fr>
  8.  *          Gildas Bazin <gbazin@netcourrier.com>
  9.  *          Jon Lech Johansen <jon-vl@nanocrew.net>
  10.  *
  11.  * This program is free software; you can redistribute it and/or modify
  12.  * it under the terms of the GNU General Public License as published by
  13.  * the Free Software Foundation; either version 2 of the License, or
  14.  * (at your option) any later version.
  15.  *
  16.  * This program is distributed in the hope that it will be useful,
  17.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19.  * GNU General Public License for more details.
  20.  *
  21.  * You should have received a copy of the GNU General Public License
  22.  * along with this program; if not, write to the Free Software
  23.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  24.  *****************************************************************************/
  25. /*****************************************************************************
  26.  * Preamble
  27.  *****************************************************************************/
  28. #include <stdio.h>
  29. #include <stdlib.h>
  30. #include <vlc/vlc.h>
  31. #ifdef HAVE_UNISTD_H
  32. #   include <unistd.h>
  33. #endif
  34. #include <string.h>
  35. #include <errno.h>
  36. #include "cdrom.h"
  37. /*****************************************************************************
  38.  * Local Prototypes
  39.  *****************************************************************************/
  40. static void cd_log_handler (cdio_log_level_t level, const char message[]);
  41. /*****************************************************************************
  42.  * ioctl_Open: Opens a VCD device or file and returns an opaque handle
  43.  *****************************************************************************/
  44. cddev_t *ioctl_Open( vlc_object_t *p_this, const char *psz_dev )
  45. {
  46.     cddev_t *p_cddev;
  47.     if( !psz_dev ) return NULL;
  48.     /*
  49.      *  Initialize structure with default values
  50.      */
  51.     p_cddev = (cddev_t *)malloc( sizeof(cddev_t) );
  52.     if( p_cddev == NULL )
  53.     {
  54.         msg_Err( p_this, "out of memory" );
  55.         return NULL;
  56.     }
  57.     /* Set where to log errors messages from libcdio. */
  58.     cdio_log_set_handler ( cd_log_handler );
  59.     p_cddev->cdio = cdio_open(psz_dev, DRIVER_UNKNOWN);
  60.     if( p_cddev->cdio == NULL )
  61.     {
  62.         free( p_cddev );
  63.         p_cddev = NULL;
  64.     }
  65.     return p_cddev;
  66. }
  67. /*****************************************************************************
  68.  * ioctl_Close: Closes an already opened VCD device or file.
  69.  *****************************************************************************/
  70. void ioctl_Close( cddev_t *p_cddev )
  71. {
  72.     cdio_destroy(p_cddev->cdio);
  73. }
  74. /*****************************************************************************
  75.  * ioctl_GetTracksMap: Read the Table of Contents, fill in the pp_sectors map
  76.  *                     if pp_sectors is not null and return the number of
  77.  *                     tracks available.
  78.  *                     We allocate and fill one more track than are on 
  79.  *                     the CD. The last "track" is leadout track information.
  80.  *                     This makes finding the end of the last track uniform
  81.  *                     how it is done for other tracks.
  82.  *****************************************************************************/
  83. track_t ioctl_GetTracksMap( vlc_object_t *p_this, const CdIo *cdio,
  84.                             lsn_t **pp_sectors )
  85. {
  86.     track_t i_tracks     = cdio_get_num_tracks(cdio);
  87.     track_t first_track  = cdio_get_first_track_num(cdio);
  88.     track_t i;
  89.     *pp_sectors = malloc( (i_tracks + 1) * sizeof(lsn_t) );
  90.     if( *pp_sectors == NULL )
  91.       {
  92.         msg_Err( p_this, "out of memory" );
  93.         return 0;
  94.       }
  95.     /* Fill the p_sectors structure with the track/sector matches.
  96.        Note cdio_get_track_lsn when given num_tracks + 1 will return
  97.        the leadout LSN.
  98.      */
  99.     for( i = 0 ; i <= i_tracks ; i++ )
  100.       {
  101.         (*pp_sectors)[ i ] = cdio_get_track_lsn(cdio, first_track+i);
  102.       }
  103.     
  104.     return i_tracks;
  105. }
  106. /****************************************************************************
  107.  * ioctl_ReadSector: Read a sector (2324 bytes)
  108.  ****************************************************************************/
  109. int ioctl_ReadSector( vlc_object_t *p_this, const cddev_t *p_cddev,
  110.                       int i_sector, byte_t * p_buffer )
  111. {
  112.   typedef struct {
  113.     uint8_t subheader   [8];
  114.     uint8_t data        [M2F2_SECTOR_SIZE];
  115.   } vcdsector_t;
  116.   vcdsector_t vcd_sector;
  117.   
  118.   if( cdio_read_mode2_sector(p_cddev->cdio, &vcd_sector, i_sector, VLC_TRUE) 
  119.       != 0)
  120.   {
  121.       // msg_Err( p_this, "Could not read sector %d", i_sector );
  122.       return -1;
  123.   }
  124.     
  125.   memcpy (p_buffer, vcd_sector.data, M2F2_SECTOR_SIZE);
  126.   
  127.   return( 0 );
  128. }
  129. /****************************************************************************
  130.  * Private functions
  131.  ****************************************************************************/
  132. /* For now we're going to just discard error messages from libcdio... */
  133. static void
  134. cd_log_handler (cdio_log_level_t level, const char message[])
  135. {
  136.   return;
  137. }