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

SCSI/ASPI

开发平台:

MultiPlatform

  1. /*  cdrdao - write audio CD-Rs in disc-at-once mode
  2.  *
  3.  *  Copyright (C) 1998, 1999  Andreas Mueller <mueller@daneb.ping.de>
  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. /*
  20.  * $Log$
  21.  */
  22. static char rcsid[] = "$Id$";
  23. #include "config.h"
  24. #include <stdio.h>
  25. #include <malloc.h>
  26. #include <errno.h>
  27. #include <string.h>
  28. #include <signal.h>
  29. #include <sys/types.h>
  30. #include "dao.h"
  31. #include "util.h"
  32. #define BUFSIZE 150
  33. // buffer size in blocks
  34. int BUFFER_SIZE = BUFSIZE;
  35. static int TERMINATE = 0;
  36. unsigned char rbuf1[BUFSIZE * AUDIO_BLOCK_LEN];
  37. // unsigned char rbuf2[BUFSIZE * AUDIO_BLOCK_LEN];
  38. /*
  39. typedef struct uebergabe_write
  40. {
  41.    CdrDriver *cdr;
  42.    int testmode;
  43.    DWORD total;
  44. } UWRITE;
  45. */
  46. int writeDiskAtOnce (const Toc *toc, CdrDriver *cdr, int nofBuffers, int swap,
  47.      int testMode)
  48. {
  49.   long length  = toc->length().lba();
  50.   long total   = length * AUDIO_BLOCK_LEN;
  51.   long n, rn;
  52.   int  err = 0;
  53.   long cnt      = 0;
  54.   long blkCount = 0;
  55.   long lba      = 0;     // LBA for writing
  56.   long encodeLba = 150;  // LBA for encoding data blocks
  57.   long cntMb;
  58.   long lastMb     = 0;
  59.   const Track *track = NULL;
  60.   int trackNr = 1;
  61.   Msf tstart, tend;
  62.   TrackData::Mode dataMode;
  63.   int encodingMode = 0;
  64.   /*
  65.   DWORD thread;
  66.   UWRITE uw;
  67.   */
  68.   TERMINATE = 0;
  69.   if (cdr != NULL && cdr->bigEndianSamples() == 0) 
  70.   {
  71.      // swap samples for little endian recorders
  72.      swap = !swap;
  73.      encodingMode = cdr->encodingMode();
  74.   }
  75.   if (!testMode) 
  76.   {
  77.      if (cdr->initDao() != 0) 
  78.      {
  79.         err = 1;
  80.         goto fail;
  81.      }
  82.   }
  83.   TrackIterator itr(toc_);
  84.   TrackReader reader;
  85.   track = itr.first(tstart, tend);
  86.   reader.init(track);
  87.   if (reader.openData() != 0) {
  88.     message(-2, "Opening of track data failed.");
  89.     err = 1;
  90.     goto fail;
  91.   }
  92.   dataMode = encodingMode == 0 ? TrackData::AUDIO : track->type();
  93.   if (!testMode) {
  94.     if (cdr->startDao() != 0)
  95.     {
  96.       err = 2;
  97.       goto fail;
  98.     }
  99.      
  100.     message(0, "Writing tracks...");
  101.   }
  102.   message(0, "Writing track %02d (mode %s/%s)...", trackNr,
  103.   TrackData::mode2String(track->type()),
  104.   TrackData::mode2String(dataMode));
  105.   while (length > 0 && !TERMINATE) {
  106.     n = (length > BUFFER_SIZE ? BUFFER_SIZE : length);
  107.     do {
  108.       rn = reader.readData(encodingMode, encodeLba, (char*)rbuf1, n);
  109.     
  110.       if (rn < 0) {
  111. message(-2, "Reading of track data failed.");
  112. err = 1;
  113. goto fail;
  114.       }
  115.       
  116.       if (rn == 0) {
  117. track = itr.next(tstart, tend);
  118. reader.init(track);
  119. if (reader.openData() != 0) {
  120.   message(-2, "Opening of track data failed.");
  121.   err = 1;
  122.   goto fail;
  123. }
  124. trackNr++;
  125. if (encodingMode != 0)
  126.   dataMode = track->type();
  127. message(0, "Writing track %02d (mode %s/%s)...", trackNr,
  128. TrackData::mode2String(track->type()),
  129. TrackData::mode2String(dataMode));
  130.       }
  131.     } while (rn == 0);
  132.     encodeLba += rn;
  133.     if (track->type() == TrackData::AUDIO && swap) 
  134.       swapSamples ((Sample *)rbuf1, rn * SAMPLES_PER_BLOCK);
  135.     if (!testMode) 
  136.     {
  137.       if (cdr->writeData(dataMode, lba, (char *) rbuf1, rn) != 0) 
  138.       {
  139. message (-2, "Write of audio data failed.");
  140. cdr->flushCache();
  141. err = 1;
  142. goto fail;
  143.       }
  144.       else 
  145.       {
  146. cntMb = cnt >> 20;
  147. if (cntMb > lastMb)
  148. {
  149.   message (0, "Wrote %ld of %ld MB.r", cnt >> 20, total >> 20);
  150.   lastMb = cntMb;
  151. }
  152.       }
  153.     }
  154.     else 
  155.     {
  156.       message (0, "Read %ld of %ld MB.r", cnt >> 20, total >> 20);
  157.     }
  158.     
  159.     length   -= rn;
  160.     cnt      += rn * AUDIO_BLOCK_LEN;
  161.     blkCount += rn;
  162.     /*
  163.       uw.cdr      = cdr;
  164.       uw.testmode = testMode; 
  165.       uw.total    = total;
  166.       
  167.       if ((thread = _beginthread (writeSlave, 4096, &uw)) != -1)
  168.       {
  169.       
  170.       }
  171.       */
  172.   }
  173.   if (testMode)
  174.     message (0, "Read %ld blocks.", blkCount);
  175.   else
  176.      message (0, "Wrote %ld blocks.", blkCount);
  177.   if (!testMode && daoStarted) 
  178.   {
  179.      if (cdr->finishDao() != 0)
  180.         err = 3;
  181.   }
  182. fail:
  183.   return err;
  184. }