cdjob.c
上传用户:weiliju62
上传日期:2007-01-06
资源大小:619k
文件大小:5k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /*  cdjob.c 
  2.  *
  3.  *  Copyright (C) 1999  Fabio Baracca <fabiobar@tiscalinet.it>
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19. #include <stdio.h>
  20. #include <string.h>
  21. #define BUF_S 1024
  22. #define DATA_SIGN "DATAFILE"
  23. #define AUDIO_SIGN "FILE"
  24. #define TRACKTYPE_SIGN "TRACK"
  25. #define MODE1_SIGN "MODE1"
  26. #define MODE2_SIGN "MODE2"
  27. #define SECT_SIZE 2048
  28. FILE *inf, *outf, *device;
  29. char *fname, *track_info, *cdrom_device;
  30. char buf[BUF_S], file_to_read[BUF_S];
  31. int is_data_track = 0, line_count = 0;
  32. int i, j, k, x, data_size, chr;
  33. int min, sec, frame, size_in_sect, rcode = 0, rem, readin;
  34. int audio_begin = 0, audio_end = 0, tracks = 0, prevseek = 0;
  35. int main(int argc, char *argv[])
  36. {
  37.     if (argc != 3) {
  38. fprintf(stderr, "Usage: %s <cue-sheet> <cdrom device>n", argv[0]);
  39. return 1;
  40.     }
  41.     fname = argv[1];
  42.     cdrom_device = argv[2];
  43.     inf = (FILE *) fopen(fname, "r+");
  44.     if (inf == NULL) {
  45. fprintf(stderr, "Unable to open "%s" cue-sheet!n", fname);
  46. return 2;
  47.     }
  48.     device = (FILE *) fopen(cdrom_device, "r");
  49. /*
  50.     if (device == NULL) {
  51. fprintf(stderr, "Unable to open "%s" for reading!n", cdrom_device);
  52. return 4;
  53.     }
  54.     fclose (device);
  55. */    
  56.     /* Testing for PSX CD */
  57.     sprintf (buf, "psxdump -T -d %s", cdrom_device);
  58.     i=system (buf);   
  59.     
  60.     if (i!=0) {
  61.        fprintf(stderr, "Unable to read from %s or disk is not PSX, please check and retry.n", cdrom_device);
  62.        exit (1);
  63.     }
  64.     
  65.     /* Total bytes (about to) read */
  66.     readin = 0;
  67.     printf("cdjob 0.2 - Fabio Baracca <fabiobar@tiscalinet.it>nn");
  68.     while (!feof(inf)) {
  69.         prevseek=ftell (inf);
  70. fgets(buf, BUF_S, inf);
  71. if (!feof(inf)) {
  72.     line_count++;
  73.     /* Store data type */
  74.     if (strncasecmp(buf, TRACKTYPE_SIGN, strlen(TRACKTYPE_SIGN)) == 0) {
  75. if (strstr(buf, MODE1_SIGN))
  76.     is_data_track = 1;
  77. else if (strstr(buf, MODE2_SIGN)) { /* HACK IT! */
  78.     is_data_track = 1;
  79.     buf[11]=0x20;
  80.     buf[12]='/';
  81.     buf[13]='/';
  82.     fseek (inf, prevseek, SEEK_SET);
  83.     fputs (buf, inf);
  84. }
  85. else
  86.     is_data_track = 0;
  87.     }
  88.     /* Data to be read.. */
  89.     if ((strncasecmp(buf, DATA_SIGN, strlen(DATA_SIGN)) == 0) ||
  90. (strncasecmp(buf, AUDIO_SIGN, strlen(AUDIO_SIGN)) == 0)) {
  91. /* Zero vars */
  92. i = j = k = x = 0;
  93. /* Search the name */
  94. for (j = 0, i = 0; i < strlen(buf); i++) {
  95.     if (buf[i] == '"') {
  96. j++;
  97. if (j == 1)
  98.     k = i + 1;
  99. else if (j >= 2) {
  100.     x = i - 1;
  101.     break;
  102. }
  103.     }
  104. }
  105. /* Check the name */
  106. if (j != 2) {
  107.     fprintf(stderr, "Bogus characters at line %dn", line_count);
  108.     rcode = 100;
  109. } else if ((x - k + 1) > BUF_S) {
  110.     fprintf(stderr, "Ooppss.. filename too long..n");
  111.     rcode = 101;
  112. } else {
  113.     strcpy(file_to_read, buf + k);
  114.     /* Track size info */
  115.     track_info = buf + x + 2;
  116.     for (j = 0, i = x + 2; i < strlen(buf); i++) {
  117. if (buf[i] == ':') {
  118.     j++;
  119.     if (j >= 2) {
  120. track_info[i - x + 1] = 0;
  121. break;
  122.     }
  123. }
  124.     }
  125.     x -= k;
  126.     file_to_read[++x] = 0;
  127.     if (!is_data_track) { /* audio ? :-D */
  128. tracks++;
  129. if (audio_begin != 0)
  130.     audio_end = tracks;
  131. else
  132.     audio_begin = tracks;
  133.     }
  134.     if (is_data_track) {
  135. tracks++;
  136. /* printf("About data file: "%s"..", file_to_read);*/
  137. if ((sscanf(track_info, "%d:%d:%d", &min, &sec, &frame)) != 3) {
  138.     printf("bogus size info!n");
  139.     rcode = 102;
  140. } else {
  141.                             char toshell[1024]; /* HACK!!! */
  142.     size_in_sect = (((min * 60 + sec) * 75 + frame) * SECT_SIZE);
  143.     track_info[1]=0x20;
  144.     track_info[2]='/';
  145.     track_info[3]='/';
  146.                             fseek (inf, prevseek, SEEK_SET);
  147.                             fputs (buf, inf);
  148.                                             
  149.     sprintf (toshell, "psxdump -f %s -d %s", file_to_read, cdrom_device);
  150.                             system (toshell);
  151. }
  152.     } else {
  153. /* Silenty trash garbage */
  154. /* printf ("mm.. not a data file.. ignoring!n"); */
  155. /* rcode=200; */
  156.     }
  157. }
  158.     }
  159. }
  160.     }
  161.     fclose(inf);
  162.     fclose(device);
  163.     if (audio_begin != 0) { /* Start cdparanoia */
  164. printf("Ok.. now reading audio part of the disk.nn");
  165. sprintf(buf, "cdparanoia -z %d- data.wav", audio_begin);
  166. if (system(buf) != 0)
  167.     fprintf(stderr, "nnCdparanoia execution error. - CD dump can be corrupted.n");
  168.     }
  169.     printf ("n");
  170.     return rcode;
  171. }