home *** CD-ROM | disk | FTP | other *** search
/ Education Sampler 1992 [NeXTSTEP] / Education_1992_Sampler.iso / SoundAndMusic / cmix / tape.backup / sfrestore.c < prev    next >
C/C++ Source or Header  |  1991-03-06  |  5KB  |  196 lines

  1. #include "../H/sfheader.h"
  2. #include "label.h"
  3. #include <stdio.h>
  4. #include <sys/file.h>
  5. #include <sys/types.h>
  6. #include <sys/mtio.h>
  7. #include <sys/ioctl.h>
  8. #include <sys/stat.h>
  9. #include <signal.h>
  10. #include <errno.h>
  11. #define  BUFSIZE 32768
  12.  
  13. char tapename[16] = "/dev/nrxt0";
  14. char *usefile;
  15. static SFCODE   ampcode = {
  16.     SF_MAXAMP,
  17.     sizeof(SFMAXAMP) + sizeof(SFCODE)
  18.     }; 
  19.  
  20. main(argc,argv)
  21.  
  22. int argc;
  23. char *argv[];
  24.  
  25. {
  26.     SFHEADER sfh1;
  27.     struct stat sfst1;
  28.     struct mtget mtget ;
  29.     struct mtop mtop ;
  30.     struct label label;
  31.  
  32.     char *cp,*sfout,*getsfcode();
  33.     char buffer[BUFSIZE];
  34.     int totalbytes,i,result,inbytes,sfile,tapeunit,tapefile,skipfile;
  35.     int tapenumber,headersize;
  36.     float duration;
  37.  
  38.     if(argc == 1) {
  39. usage:        printf("Usage: -f [device] -l [tape number] -s [tape files to skip over] sf1 .. sfn\nDefaults: /dev/nrmt0, skip over label only\n");
  40.         exit(1);
  41.     }
  42.     usefile = tapename;
  43.     skipfile = tapenumber = 0;
  44.     tapefile = 1;
  45.     system("date");
  46.     while((*++argv)[0] == '-') {
  47.         argc -= 2; /* Take away two args */
  48.         for(cp = argv[0]+1; *cp; cp++) {
  49.             switch(*cp) { /* Grap options */
  50.             case 'f': 
  51.                 usefile = *++argv;
  52.                 break;
  53.             case 's':
  54.                 tapefile = atoi(*++argv)-1;/*account for label*/
  55.                 skipfile = tapefile ? 1 : 0;
  56.                 /* skip this number of files before writing*/
  57.                 break;
  58.             case 'l':
  59.                 tapenumber = atoi(*++argv);
  60.                 break;
  61.             default:
  62.                 printf("unknown option\n");
  63.                 goto usage;
  64.             }
  65.         }
  66.     }
  67.     if(!tapenumber) {
  68.         printf("You didn't specify a tape number with -n flag\n");
  69.         exit(-1);
  70.     }
  71.     if((tapeunit = open(usefile,0)) < 0) {
  72.         printf("trouble opening tape unit\n");
  73.         exit(tapeunit);
  74.     }
  75.     if(read(tapeunit,&label,SIZEOFLABEL) != SIZEOFLABEL) {
  76.         printf("Can't seem to read the label on this tape\n");
  77.         exit(tapeunit);
  78.     }
  79.     if(label.tapenumber != tapenumber) {
  80.         printf
  81.         ("this is tape number %d, you are asking for tape number %d\n"
  82.         ,label.tapenumber,tapenumber);
  83.         exit(tapeunit);
  84.     }
  85.     mtop.mt_op = MTFSF;
  86.     mtop.mt_count = 1;
  87.     if((ioctl(tapeunit,MTIOCTOP,&mtop)) == -1) {
  88.         printf("error forward spacing tape past label eof\n");
  89.         exit(-2);
  90.     }
  91.     printf("Comment on tape %d: %s\n",label.tapenumber,label.comment);
  92.     close(tapeunit);
  93.  
  94.     for(i=0; i<argc-1; i++) {
  95.         sfout = argv[i];
  96.         if((sfile = open(sfout,O_CREAT | O_RDWR, 0644)) <= 0) {
  97.             printf("Can't open file %s\n");
  98.             exit(1);
  99.         }
  100.         totalbytes = 0;
  101.  
  102.         if((tapeunit = open(usefile,0)) < 0) {
  103.             printf("trouble opening tape unit\n");
  104.             exit(tapeunit);
  105.         }
  106.  
  107.         if(skipfile) {
  108.             mtop.mt_op = MTFSF;
  109.             mtop.mt_count = tapefile;
  110.             if((ioctl(tapeunit,MTIOCTOP,&mtop)) == -1) {
  111.                 printf("error forward spacing tape\n");
  112.                 exit(-2);
  113.             }
  114.         }
  115.         skipfile = 0;
  116.         /* read first record to get header printed up*/
  117.         if((inbytes = read(tapeunit,buffer,BUFSIZE)) != BUFSIZE) {
  118.             printf("Bad read on tape unit %d %d\n",tapeunit,inbytes);
  119.             exit(-1);
  120.         }
  121.         bcopy(buffer,(char *)&sfh1,SIZEOF_BSD_HEADER);
  122.         headersize = getheadersize(&sfh1);
  123. printf("headersize = %d\n",headersize);
  124.         printf("-------------------------------------------------\n");
  125.         newprintsf(&sfh1);
  126.  
  127.         if((write(sfile,buffer,BUFSIZE)) != BUFSIZE) {
  128.             printf("Bad write on soundfile\n");
  129.             exit(-1);
  130.         }
  131.         totalbytes = BUFSIZE;
  132.  
  133.         while(1) {
  134.             if((inbytes=read(tapeunit,buffer,BUFSIZE)) <= 0) {
  135.                 printf("reached eof on input\n");
  136.                 close(sfile);
  137.                 break;
  138.             }
  139.             if(write(sfile,buffer,inbytes) != inbytes) {
  140.                 printf("Bad write on sound file\n");
  141.                 close(sfile);
  142.                 close(tapeunit);
  143.                 exit(0);
  144.             }
  145.             totalbytes += inbytes;
  146.         }
  147.         duration = 
  148.             (float)totalbytes/(float)sfclass(&sfh1)/
  149.                 (float)sfchans(&sfh1)/sfsrate(&sfh1);
  150.         tapefile++;
  151.         printf
  152.              ("Bytes restored = %d, duration = %f, tapefile = %d\n\n\n",
  153.             totalbytes,duration,tapefile);
  154.         fflush(stdout);
  155.         close(sfile);
  156.         if(i == (argc-2)) {
  157.             mtop.mt_op = MTREW;
  158.             mtop.mt_count = 1;
  159.             if((ioctl(tapeunit,MTIOCTOP,&mtop)) == -1) {
  160.                 printf("error rewinding tape\n");
  161.                 exit(-2);
  162.             }
  163.         }
  164.         close(tapeunit);
  165.     }
  166. }
  167. newprintsf(header,size)
  168. SFHEADER *header;
  169. int size;
  170. {
  171.     SFMAXAMP sfmnew;
  172.     int i,j;
  173.     char *pointer;
  174.     if(size == SIZEOF_BSD_HEADER) { printsf(header); return; }
  175.     
  176.     if((header)->sfinfo.NeXTheader.magic != SND_MAGIC) return(-1);
  177.     /* this is a next soundfile so zero out bytes after NeXT header */
  178.     pointer = (char *)header;
  179.     for(j=29; j<i; j++)  *(pointer+j) = 0;
  180.     (header)->sfinfo.sf_srate = (header)->sfinfo.NeXTheader.samplingRate;
  181.     (header)->sfinfo.sf_chans = (header)->sfinfo.NeXTheader.channelCount;
  182.     if((header)->sfinfo.NeXTheader.dataFormat == SND_FORMAT_FLOAT)
  183.          (header)->sfinfo.sf_packmode = SF_FLOAT;
  184.     else if((header)->sfinfo.NeXTheader.dataFormat == SND_FORMAT_LINEAR_16)
  185.         (header)->sfinfo.sf_packmode = SF_SHORT;
  186.     for(i=0; i<2 /*(header)->sfinfo.sf_chans*/; i++) {
  187.         sfmaxamp(&sfmnew,i)=0;
  188.         sfmaxamploc(&sfmnew,i)=0;
  189.     }
  190.     sfmaxamptime(&sfmnew) = 0;
  191.     putsfcode(header,&sfmnew,&code);
  192.     printsf(header);
  193.     return(2);
  194. }
  195.  
  196.