Blame example/sample3.c

Packit dd8086
/*
Packit dd8086
  Copyright (C) 2003, 2005, 2008, 2011, 2012 Rocky Bernstein <rocky@gnu.org>
Packit dd8086
  
Packit dd8086
  This program is free software: you can redistribute it and/or modify
Packit dd8086
  it under the terms of the GNU General Public License as published by
Packit dd8086
  the Free Software Foundation, either version 3 of the License, or
Packit dd8086
  (at your option) any later version.
Packit dd8086
Packit dd8086
  This program is distributed in the hope that it will be useful,
Packit dd8086
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit dd8086
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit dd8086
  GNU General Public License for more details.
Packit dd8086
Packit dd8086
  You should have received a copy of the GNU General Public License
Packit dd8086
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit dd8086
*/
Packit dd8086
Packit dd8086
/* 
Packit dd8086
   A somewhat simplified program to show the use of cdio_guess_cd_type().
Packit dd8086
   Figure out the kind of CD image we've got.
Packit dd8086
*/
Packit dd8086
#ifdef HAVE_CONFIG_H
Packit dd8086
#include "config.h"
Packit dd8086
#define __CDIO_CONFIG_H__ 1
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#ifdef HAVE_STDIO_H
Packit dd8086
#include <stdio.h>
Packit dd8086
#endif
Packit dd8086
#ifdef HAVE_STRING_H
Packit dd8086
#include <string.h>
Packit dd8086
#endif
Packit dd8086
#ifdef HAVE_SYS_TYPES_H
Packit dd8086
#include <sys/types.h>
Packit dd8086
#endif
Packit dd8086
Packit dd8086
#include <cdio/cdio.h>
Packit dd8086
#include <cdio/cd_types.h>
Packit dd8086
Packit dd8086
static void
Packit dd8086
print_analysis(cdio_iso_analysis_t cdio_iso_analysis, 
Packit dd8086
	       cdio_fs_anal_t fs, int first_data, unsigned int num_audio)
Packit dd8086
{
Packit dd8086
  switch(CDIO_FSTYPE(fs)) {
Packit dd8086
  case CDIO_FS_AUDIO:
Packit dd8086
    break;
Packit dd8086
  case CDIO_FS_ISO_9660:
Packit dd8086
    printf("CD-ROM with ISO 9660 filesystem");
Packit dd8086
    if (fs & CDIO_FS_ANAL_JOLIET) {
Packit dd8086
      printf(" and joliet extension level %d", cdio_iso_analysis.joliet_level);
Packit dd8086
    }
Packit dd8086
    if (fs & CDIO_FS_ANAL_ROCKRIDGE)
Packit dd8086
      printf(" and rockridge extensions");
Packit dd8086
    printf("\n");
Packit dd8086
    break;
Packit dd8086
  case CDIO_FS_ISO_9660_INTERACTIVE:
Packit dd8086
    printf("CD-ROM with CD-RTOS and ISO 9660 filesystem\n");
Packit dd8086
    break;
Packit dd8086
  case CDIO_FS_HIGH_SIERRA:
Packit dd8086
    printf("CD-ROM with High Sierra filesystem\n");
Packit dd8086
    break;
Packit dd8086
  case CDIO_FS_INTERACTIVE:
Packit dd8086
    printf("CD-Interactive%s\n", num_audio > 0 ? "/Ready" : "");
Packit dd8086
    break;
Packit dd8086
  case CDIO_FS_HFS:
Packit dd8086
    printf("CD-ROM with Macintosh HFS\n");
Packit dd8086
    break;
Packit dd8086
  case CDIO_FS_ISO_HFS:
Packit dd8086
    printf("CD-ROM with both Macintosh HFS and ISO 9660 filesystem\n");
Packit dd8086
    break;
Packit dd8086
  case CDIO_FS_UFS:
Packit dd8086
    printf("CD-ROM with Unix UFS\n");
Packit dd8086
    break;
Packit dd8086
  case CDIO_FS_EXT2:
Packit dd8086
    printf("CD-ROM with Linux second extended filesystem\n");
Packit dd8086
	  break;
Packit dd8086
  case CDIO_FS_3DO:
Packit dd8086
    printf("CD-ROM with Panasonic 3DO filesystem\n");
Packit dd8086
    break;
Packit dd8086
  case CDIO_FS_UNKNOWN:
Packit dd8086
    printf("CD-ROM with unknown filesystem\n");
Packit dd8086
    break;
Packit dd8086
  }
Packit dd8086
  switch(CDIO_FSTYPE(fs)) {
Packit dd8086
  case CDIO_FS_ISO_9660:
Packit dd8086
  case CDIO_FS_ISO_9660_INTERACTIVE:
Packit dd8086
  case CDIO_FS_ISO_HFS:
Packit dd8086
    printf("ISO 9660: %i blocks, label `%.32s'\n",
Packit dd8086
	   cdio_iso_analysis.isofs_size, cdio_iso_analysis.iso_label);
Packit dd8086
    break;
Packit dd8086
  }
Packit dd8086
  if (first_data == 1 && num_audio > 0)
Packit dd8086
    printf("mixed mode CD   ");
Packit dd8086
  if (fs & CDIO_FS_ANAL_XA)
Packit dd8086
    printf("XA sectors   ");
Packit dd8086
  if (fs & CDIO_FS_ANAL_MULTISESSION)
Packit dd8086
    printf("Multisession");
Packit dd8086
  if (fs & CDIO_FS_ANAL_HIDDEN_TRACK)
Packit dd8086
    printf("Hidden Track   ");
Packit dd8086
  if (fs & CDIO_FS_ANAL_PHOTO_CD)
Packit dd8086
    printf("%sPhoto CD   ", 
Packit dd8086
		      num_audio > 0 ? " Portfolio " : "");
Packit dd8086
  if (fs & CDIO_FS_ANAL_CDTV)
Packit dd8086
    printf("Commodore CDTV   ");
Packit dd8086
  if (first_data > 1)
Packit dd8086
    printf("CD-Plus/Extra   ");
Packit dd8086
  if (fs & CDIO_FS_ANAL_BOOTABLE)
Packit dd8086
    printf("bootable CD   ");
Packit dd8086
  if (fs & CDIO_FS_ANAL_VIDEOCD && num_audio == 0) {
Packit dd8086
    printf("Video CD   ");
Packit dd8086
  }
Packit dd8086
  if (fs & CDIO_FS_ANAL_SVCD)
Packit dd8086
    printf("Super Video CD (SVCD) or Chaoji Video CD (CVD)");
Packit dd8086
  if (fs & CDIO_FS_ANAL_CVD)
Packit dd8086
    printf("Chaoji Video CD (CVD)");
Packit dd8086
  printf("\n");
Packit dd8086
}
Packit dd8086
Packit dd8086
int
Packit dd8086
main(int argc, const char *argv[])
Packit dd8086
{
Packit dd8086
  CdIo_t *p_cdio = cdio_open (NULL, DRIVER_UNKNOWN);
Packit dd8086
  cdio_fs_anal_t fs=0;
Packit dd8086
  
Packit dd8086
  track_t num_tracks;
Packit dd8086
  track_t first_track_num;
Packit dd8086
  lsn_t start_track;          /* first sector of track */
Packit dd8086
  lsn_t data_start =0;        /* start of data area */
Packit dd8086
Packit dd8086
  int first_data = -1;        /* # of first data track */
Packit dd8086
  int first_audio = -1;       /* # of first audio track */
Packit dd8086
  unsigned int num_data  = 0; /* # of data tracks */
Packit dd8086
  unsigned int num_audio = 0; /* # of audio tracks */
Packit dd8086
  unsigned int i;
Packit dd8086
Packit dd8086
  if (NULL == p_cdio) {
Packit dd8086
    printf("Problem in trying to find a driver.\n\n");
Packit dd8086
    return 1;
Packit dd8086
  }
Packit dd8086
Packit dd8086
  first_track_num = cdio_get_first_track_num(p_cdio);
Packit dd8086
  num_tracks      = cdio_get_num_tracks(p_cdio);
Packit dd8086
Packit dd8086
  /* Count the number of data and audio tracks. */
Packit dd8086
  for (i = first_track_num; i <= num_tracks; i++) {
Packit dd8086
    if (TRACK_FORMAT_AUDIO == cdio_get_track_format(p_cdio, i)) {
Packit dd8086
      num_audio++;
Packit dd8086
      if (-1 == first_audio) first_audio = i;
Packit dd8086
    } else {
Packit dd8086
      num_data++;
Packit dd8086
      if (-1 == first_data)  first_data = i;
Packit dd8086
    }
Packit dd8086
  }
Packit dd8086
Packit dd8086
  /* try to find out what sort of CD we have */
Packit dd8086
  if (0 == num_data) {
Packit dd8086
    printf("Audio CD\n");
Packit dd8086
  } else {
Packit dd8086
    /* we have data track(s) */
Packit dd8086
    cdio_iso_analysis_t cdio_iso_analysis; 
Packit dd8086
Packit dd8086
    memset(&cdio_iso_analysis, 0, sizeof(cdio_iso_analysis));
Packit dd8086
    
Packit dd8086
    for (i = first_data; i <= num_tracks; i++) {
Packit dd8086
      lsn_t lsn;
Packit dd8086
      track_format_t track_format = cdio_get_track_format(p_cdio, i);
Packit dd8086
      
Packit dd8086
      lsn = cdio_get_track_lsn(p_cdio, i);
Packit dd8086
      
Packit dd8086
      switch ( track_format ) {
Packit dd8086
      case TRACK_FORMAT_AUDIO:
Packit dd8086
      case TRACK_FORMAT_ERROR:
Packit dd8086
	break;
Packit dd8086
      case TRACK_FORMAT_CDI:
Packit dd8086
      case TRACK_FORMAT_XA:
Packit dd8086
      case TRACK_FORMAT_DATA: 
Packit dd8086
      case TRACK_FORMAT_PSX: 
Packit dd8086
	;
Packit dd8086
      }
Packit dd8086
      
Packit dd8086
      start_track = (i == 1) ? 0 : lsn;
Packit dd8086
      
Packit dd8086
      /* save the start of the data area */
Packit dd8086
      if (i == first_data) 
Packit dd8086
	data_start = start_track;
Packit dd8086
      
Packit dd8086
      /* skip tracks which belong to the current walked session */
Packit dd8086
      if (start_track < data_start + cdio_iso_analysis.isofs_size)
Packit dd8086
	continue;
Packit dd8086
      
Packit dd8086
      fs = cdio_guess_cd_type(p_cdio, start_track, i, &cdio_iso_analysis);
Packit dd8086
      
Packit dd8086
      print_analysis(cdio_iso_analysis, fs, first_data, num_audio);
Packit dd8086
      
Packit dd8086
      if ( !(CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660 ||
Packit dd8086
	     CDIO_FSTYPE(fs) == CDIO_FS_ISO_HFS  ||
Packit dd8086
	     CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660_INTERACTIVE) )
Packit dd8086
	/* no method for non-ISO9660 multisessions */
Packit dd8086
	break;	
Packit dd8086
    }
Packit dd8086
  }
Packit dd8086
  cdio_destroy(p_cdio);
Packit dd8086
  return 0;
Packit dd8086
}