FreeburnDisc.cpp
上传用户:cnxinhai
上传日期:2013-08-06
资源大小:265k
文件大小:87k
源码类别:

DVD

开发平台:

Visual C++

  1. /* The Disc class for FreeBurn.  This class is used
  2.  * to represent the basic disc structure in FreeBurn.
  3.  *
  4.  * Copyright (C) 2001, 2002 Adam Schlag
  5.  */
  6. /*
  7.  * FreeBurn Software License
  8.  * (based on the Apache Software License)
  9.  * 
  10.  * Version 1.1
  11.  * 
  12.  * Copyright (c) 2001, 2002 The FreeBurn Project. All rights reserved.
  13.  * 
  14.  * Redistribution and use in source and binary forms, with or without 
  15.  * modification, are permitted provided that the following conditions are met:
  16.  * 
  17.  * 1. Redistributions of source code must retain the above copyright 
  18.  * notice, this list of conditions and the following disclaimer.
  19.  * 
  20.  * 2. Redistributions in binary form must reproduce the above copyright 
  21.  * notice, this list of conditions and the following disclaimer in the 
  22.  * documentation and/or other materials provided with the distribution.
  23.  * 
  24.  * 3. The end-user documentation included with the redistribution, if any, must 
  25.  * include the following acknowledgment:
  26.  * 
  27.  *  "This product includes software developed by the FreeBurn 
  28.  *     Project (http://freeburn.sourceforge.net/)."
  29.  * 
  30.  * Alternately, this acknowledgment may appear in the software itself, 
  31.  * if and wherever such third-party acknowledgments normally appear.
  32.  * 
  33.  * 4. The names "FreeBurn" and "FreeBurn Project" must not be 
  34.  * used to endorse or promote products derived from this software 
  35.  * without prior written permission. For written permission, please 
  36.  * contact aschlag@users.sourceforge.net.
  37.  * 
  38.  * 5. Products derived from this software may not be called "FreeBurn", 
  39.  * nor may "FreeBurn" appear in their name, without prior written 
  40.  * permission of the FreeBurn Project.
  41.  * 
  42.  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED 
  43.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
  44.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
  45.  * DISCLAIMED. IN NO EVENT SHALL THE FREEBURN PROJECT OR ITS 
  46.  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
  47.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
  48.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 
  49.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 
  50.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
  51.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 
  52.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
  53.  * SUCH DAMAGE.
  54.  * 
  55.  * This software consists of voluntary contributions made by many 
  56.  * individuals on behalf of the FreeBurn Project. For more 
  57.  * information on the FreeBurn Project and FreeBurn, please see 
  58.  * <http://freeburn.sourceforge.net/>.
  59.  * 
  60.  * This software is distributed with software that is released under the GNU 
  61.  * General Public License (GPL).  You can find the terms of this license in the
  62.  * file GPL.txt distributed in this package.  You can find information on the
  63.  * software distributed with this package in the file PROGRAMS.txt.
  64.  */
  65.  
  66. // The main FOX include file
  67. #include <fx.h>
  68. // the main freeburn definition class and additional
  69. // helper and gui classes go here
  70. #include "FreeburnDefs.h"
  71. #include "FreeburnTrack.h"
  72. #include "FreeburnDisc.h"
  73. // CFreeburnDisc Constructor
  74. // The constructor initializes any class variables that need to be initialized
  75. CFreeburnDisc::CFreeburnDisc(FXint sizeType, FXint discType)
  76. {
  77.     // Initialize class variables and allocate memory for the basic stuff
  78.     // we want to use for the class so we don't have to initialize ourselves
  79.     
  80.     // set the size type.  It should either be 74_650_DISC (0) or 80_700_DISC (1)
  81.     switch(sizeType)
  82.     {
  83.         // valid size types
  84.         case _74_650_DISC:
  85.         case _80_700_DISC:
  86.             m_discSizeType = sizeType;
  87.             break;
  88.         // set to a valid size type.
  89.         default:
  90.             m_discSizeType = _74_650_DISC;
  91.     }
  92.     
  93.     // set up the size count for the disc.  We are counting disc size in
  94.     // "blocks", or the smallest item of data represented on a CD.  
  95.     m_discCurrentSize = 0;
  96.     if (m_discSizeType == _74_650_DISC)
  97.     {
  98.         m_discFreeSpace = MAX_CD_SPACE_BLOCKS;
  99.     }
  100.     else if (m_discSizeType == _80_700_DISC)
  101.     {
  102.         m_discFreeSpace = MAX_CD_LARGE_SPACE_BLOCKS;
  103.     }
  104.     
  105.     // set up the kind of disc we are going to burn
  106.     switch (discType)
  107.     {
  108.         case CD_DA:
  109.         case CD_ROM:
  110.         case CDROM_XA:
  111.             m_discType = discType;
  112.             break;
  113.         default:    // default to CD_DA if not one of the above
  114.             m_discType = CD_DA;
  115.             break;
  116.     }
  117.     
  118.     // fill the catalog strings to the catalog string capacity
  119.     // with a space (" ") character
  120.     m_catalogNumber.size(CD_CATALOG_STRING_LENGTH);
  121.     m_catalogNumber.fill(' ', CD_CATALOG_STRING_LENGTH);
  122.     
  123.     // by default we won't use CD Text, so set this to false
  124.     m_usingCdText = FALSE;
  125.     
  126.     // set the default CD Text Language Map for the default CD Text
  127.     // Language (English), in case the user decides to use CD Text
  128.     m_languageMapArray[0] = new CdTextLanguageMap;
  129.     m_languageMapArray[0]->mapNumber    = 0;
  130.     m_languageMapArray[0]->languageType = CD_TEXT_ENGLISH_NUM;
  131.     m_languageMapArray[0]->description  = CD_TEXT_ENG_LONGSTR;
  132.     m_cdTextMapCount = 1;
  133.     
  134.     // set up the defaults for the global CD Text block,
  135.     // in case the user decides to use the global CD Text
  136.     // (The strings are automatically initialized to be empty)
  137.     m_pGlobalCdText = new CdTextGlobal;
  138.     m_pGlobalCdText->map_number = 0;
  139.     
  140.     // initialize the track count to zero, since we're creating a new disc
  141.     m_trackCount = 0;
  142. }
  143. // CFreeburnDisc Destructor. Now we'll delete everything that needs
  144. // to be deleted, and clear everything that doesn't
  145. CFreeburnDisc::~CFreeburnDisc()
  146. {
  147.     // delete the pointer to the global CD Text struct
  148.     delete m_pGlobalCdText;
  149.     
  150.     // clear the language map and language map count
  151.     for (FXuint i = 0; i < m_cdTextMapCount; i++)
  152.     {
  153.         delete m_languageMapArray[i];
  154.     }
  155. }
  156. // set the size type of the disc that will be burned.
  157. // Possible values are 74_650_DISC and 80_700_DISC, 
  158. // which represent a 74 min/650 MB disc and an 80 min/
  159. // 700 MB disc, respectively.
  160. // Returns:
  161. //      TRUE if set, FALSE if not
  162. FXbool CFreeburnDisc::discSizeType(FXint sizeType)
  163. {
  164.     // set the size type.  It should either be 74_650_DISC (0) or 80_700_DISC (1)
  165.     if ((sizeType != _74_650_DISC) && (sizeType != _80_700_DISC)) // invalid sizeType
  166.     {
  167.         return FALSE;
  168.     }
  169.     else    // valid sizeType
  170.     {
  171.         m_discSizeType = sizeType;
  172.     }
  173.     
  174.     return TRUE;
  175. }
  176. // set the type of disc this class represents
  177. // Returns:
  178. //      TRUE if type is set
  179. //      FALSE if the input was invalid
  180. FXbool CFreeburnDisc::discType(FXint newType)
  181. {
  182.     switch (newType)
  183.     {
  184.         case CD_DA:
  185.             m_discType = CD_DA;
  186.             break;
  187.         case CD_ROM:
  188.             m_discType = CD_ROM;
  189.             break;
  190.         case CDROM_XA:
  191.             m_discType = CDROM_XA;
  192.             break;
  193.         default:    // no good value
  194.             return FALSE;
  195.     }
  196.     
  197.     return TRUE;
  198. }
  199.     
  200. // Set the value of the catalog number
  201. // Returns:
  202. //      TRUE if set okay
  203. //      FALSE if there was an error with the value
  204. FXbool CFreeburnDisc::catalogNumber(FXString newNumber)
  205. {
  206.     if (newNumber.length() > CD_CATALOG_STRING_LENGTH)   // bad catalog string
  207.     {
  208.         return FALSE;
  209.     }
  210.     else
  211.     {
  212.         m_catalogNumber = newNumber;
  213.     }
  214.     
  215.     return TRUE;
  216. }
  217.     
  218. // Insert a new CD Text Language Mapping at the specified position
  219. // (the default position is zero).
  220. // Returns:
  221. //      TRUE if the map was inserted successfully
  222. //      FALSE if the map was not inserted
  223. FXbool CFreeburnDisc::insertCdTextLanguageMap(CdTextLanguageMap* insertMap, FXuint position)
  224. {
  225.     FXuint insPos;
  226.     
  227.     // if the position specified is greater than the array length, 
  228.     // don't insert and return FALSE
  229.     if (position >= CD_TEXT_LANG_ARRAY_LENGTH)
  230.     {
  231.         return FALSE;
  232.     }
  233.     
  234.     // next, check the array to be sure no values will be duplicated
  235.     for (FXuint i = 0; i < m_cdTextMapCount; i++)
  236.     {
  237.         if (i != position) // we don't need to check the item we're writing over
  238.         {
  239.             // check to be sure the map number isn't going to be duplicated
  240.             if (m_languageMapArray[i]->mapNumber == insertMap->mapNumber)
  241.                 return FALSE;
  242.             // check to be sure the language type isn't going to be duplicated
  243.             if (m_languageMapArray[i]->languageType == insertMap->languageType)
  244.                 return FALSE;
  245.         }
  246.     }
  247.     
  248.     // Everything checks out, so insert the new item.  If the position
  249.     // is greater than the current array length, just append to the 
  250.     // end of the array
  251.     if (position >= m_cdTextMapCount)
  252.     {
  253.         insPos = m_cdTextMapCount;
  254.         m_cdTextMapCount++;
  255.         m_languageMapArray[insPos] = new CdTextLanguageMap;
  256.     }
  257.     else
  258.     {
  259.         insPos = position;
  260.     }
  261.     m_languageMapArray[insPos]->mapNumber    = insertMap->mapNumber;
  262.     m_languageMapArray[insPos]->languageType = insertMap->languageType;
  263.     m_languageMapArray[insPos]->description  = insertMap->description;
  264.     
  265.     return TRUE;
  266. }
  267. // Insert a new CD Text Language Mapping at the specified position
  268. // (the default position is zero).
  269. // Returns:
  270. //      TRUE if the map was inserted successfully
  271. //      FALSE if the map was not inserted
  272. FXbool CFreeburnDisc::insertCdTextLanguageMap(FXint insertMapNumber, FXint insertLanguageType, 
  273.         FXString description, FXint position)
  274. {
  275.     FXbool returnValue;
  276.     
  277.     // create a new language map to hold the values given
  278.     CdTextLanguageMap* tempLanguageMap = new CdTextLanguageMap;
  279.     
  280.     // assign the input parameters to the temp Language Map
  281.     tempLanguageMap->mapNumber    = insertMapNumber;
  282.     tempLanguageMap->languageType = insertLanguageType;
  283.     tempLanguageMap->description  = description;
  284.     
  285.     // call the other insertCdTextLanguageMap with the input position
  286.     // and the temporary language map we created, returning its value
  287.     returnValue = insertCdTextLanguageMap(tempLanguageMap, position);
  288.     
  289.     // delete the tempLanguageMap
  290.     delete tempLanguageMap;
  291.     
  292.     return returnValue;
  293. }
  294. // Append a new CD Text Language Mapping at the end of the array
  295. // Returns:
  296. //      TRUE if the map was appended successfully
  297. //      FALSE if the map was not appended
  298. FXbool CFreeburnDisc::appendCdTextLanguageMap(CdTextLanguageMap* appendMap)
  299. {
  300.     // We're appending to the end of the array, so call
  301.     // isnertCdTextLanguageMap at the position of m_cdTextMapCount,
  302.     // which is the next empty position of the array
  303.     return insertCdTextLanguageMap(appendMap, m_cdTextMapCount);
  304. }
  305. // Append a new CD Text Language Mapping at the end of the array
  306. // Returns:
  307. //      TRUE if the map was appended successfully
  308. //      FALSE if the map was not appended
  309. FXbool CFreeburnDisc::appendCdTextLanguageMap(FXint appendMapNumber, FXint appendLanguageType, 
  310.         FXString description)
  311. {
  312.     FXbool returnValue;
  313.     
  314.     // create a new language map to hold the values given
  315.     CdTextLanguageMap* tempLanguageMap = new CdTextLanguageMap;
  316.     
  317.     // assign the input parameters to the temp Language Map
  318.     tempLanguageMap->mapNumber    = appendMapNumber;
  319.     tempLanguageMap->languageType = appendLanguageType;
  320.     tempLanguageMap->description  = description;
  321.     
  322.     // call the other insertCdTextLanguageMap with m_cdTextMapCount
  323.     // (the next empty value of the array) and the temporary language 
  324.     // map we created, returning its value
  325.     returnValue = insertCdTextLanguageMap(tempLanguageMap, m_cdTextMapCount);
  326.     
  327.     // delete tempLanguageMap
  328.     delete tempLanguageMap;
  329.     
  330.     return returnValue;
  331. }
  332. // This version of appendCdTextLanguageMap appends a new language type and
  333. // automatically gives the type the next map number not used.
  334. FXbool CFreeburnDisc::appendCdTextLanguageMap(FXint appendLanguageType, FXString description)
  335. {
  336.     FXint highestMapNumber = 0; // to hold the highest map number in the array
  337.     
  338.     // first, search for the highest language number in the array
  339.     for (FXuint i = 0; i < m_cdTextMapCount; i++)
  340.     {
  341.         if (m_languageMapArray[i]->mapNumber > highestMapNumber)
  342.             highestMapNumber = m_languageMapArray[i]->mapNumber;
  343.     }
  344.     
  345.     // now increate highestMapNumber by one; that's the number we'll use
  346.     highestMapNumber++;
  347.     
  348.     // call appendCdTextLanguageMap with the new map number
  349.     return appendCdTextLanguageMap(highestMapNumber, appendLanguageType, description);
  350. }
  351. // Get the map number for a specified language type 
  352. // Returns:
  353. //      FXint of the map number
  354. //      If the return value is negative, the mapping was not found.
  355. FXint CFreeburnDisc::mapNumber(FXint langType)
  356. {
  357.     // iterate through the map array to search for the 
  358.     // language type
  359.     for (FXuint i = 0; i < m_cdTextMapCount; i++)
  360.     {
  361.         if (m_languageMapArray[i]->languageType == langType)
  362.         {
  363.             return m_languageMapArray[i]->mapNumber;
  364.         }
  365.     }
  366.     
  367.     // if the language type wasn't found, return FALSE
  368.     return -1;
  369. }
  370. // Get the map number for a specified array position
  371. // Returns:
  372. //      FXint of the map number
  373. //      If the return value is negative, the mapping was not found.
  374. FXint CFreeburnDisc::mapNumberPosition(FXuint position)
  375. {
  376.     // check for a valid position
  377.     if (position > m_cdTextMapCount-1) // position should be values 0..7
  378.     {
  379.         return -1;
  380.     }
  381.     
  382.     // position is good, so return the value
  383.     return m_languageMapArray[position]->mapNumber;
  384. }
  385. // Get the description for a specified language type (or array position)
  386. // Returns:
  387. //      FXString of the map description
  388. //      If the string is null (""), no value was found
  389. FXString CFreeburnDisc::mapDescription(FXint langType)
  390. {
  391.     // iterate through the map array to search for the 
  392.     // language type
  393.     for (FXuint i = 0; i < m_cdTextMapCount; i++)
  394.     {
  395.         if (m_languageMapArray[i]->languageType == langType)
  396.         {
  397.             return m_languageMapArray[i]->description;
  398.         }
  399.     }
  400.     
  401.     // if the language type wasn't found, return FALSE
  402.     return "";
  403. }
  404. FXString CFreeburnDisc::mapDescriptionPosition(FXuint position)
  405. {
  406.     // check for a valid position
  407.     if (position > m_cdTextMapCount-1) // position should be values 0..7
  408.     {
  409.         return "";
  410.     }
  411.     
  412.     // position is good, so return the value
  413.     return m_languageMapArray[position]->description;
  414. }
  415. // Set the global (disc) CD Text Information by values
  416. // Returns:
  417. //      TRUE is set, FALSE if not
  418. FXbool CFreeburnDisc::setGlobalCdTextInfo(FXint mapNum, FXString title, FXString performer, FXString songwriter,  
  419.     FXString composer, FXString arranger, FXString message,  FXString discid, FXString genre)
  420. {
  421.     FXbool haveMapNumber = FALSE;   // for checking the map number
  422.     
  423.     // the map number should be in the map array, so check to be sure
  424.     for (FXuint i = 0; i < m_cdTextMapCount; i++)
  425.     {
  426.         // if the map number is in the map array, we can
  427.         // break out of the loop
  428.         if (m_languageMapArray[i]->mapNumber == mapNum)
  429.         {
  430.             haveMapNumber = TRUE;
  431.             break;
  432.         }
  433.     }
  434.     
  435.     // if we didn't find the map number, return FALSE
  436.     if (haveMapNumber == FALSE)
  437.         return FALSE;
  438.         
  439.     // if we got this far, we can assign the values to the global CD Text struct
  440.     m_pGlobalCdText->map_number = mapNum;
  441.     m_pGlobalCdText->title      = title;
  442.     m_pGlobalCdText->performer  = performer;
  443.     m_pGlobalCdText->songwriter = songwriter;
  444.     m_pGlobalCdText->composer   = composer;
  445.     m_pGlobalCdText->arranger   = arranger;
  446.     m_pGlobalCdText->message    = message;
  447.     m_pGlobalCdText->discid     = discid;
  448.     m_pGlobalCdText->genre      = genre;
  449.     
  450.     return TRUE;
  451. }
  452. // Set the global (disc) CD Text Information by a global CD Text Struct.
  453. // Returns:
  454. //      TRUE is set, FALSE if not
  455. FXbool CFreeburnDisc::setGlobalCdTextInfo(CdTextGlobal* globalText)
  456. {
  457.     // call the above method for the values in globalText
  458.     return setGlobalCdTextInfo(globalText->map_number, globalText->title, globalText->performer, 
  459.         globalText->songwriter, globalText->composer, globalText->arranger, globalText->message,
  460.         globalText->discid, globalText->genre);
  461. }
  462. // Basic methods to set and get the global cd text values one by one
  463. // The method names are given to correspond to the property they 
  464. // are going to assign or return the value of 
  465. void  CFreeburnDisc::discTextMapNumber(FXint num)
  466. {
  467.     m_pGlobalCdText->map_number = num;
  468. }
  469. FXint CFreeburnDisc::discTextMapNumber()
  470. {
  471.     return m_pGlobalCdText->map_number;
  472. }
  473.     
  474. void CFreeburnDisc::discTitle(FXString title)
  475. {
  476.     m_pGlobalCdText->title = title;
  477. }
  478.  
  479. FXString CFreeburnDisc::discTitle()
  480. {
  481.     return m_pGlobalCdText->title;
  482. }
  483.     
  484. void CFreeburnDisc::discPerformer(FXString performer)
  485. {
  486.     m_pGlobalCdText->performer = performer;
  487. }
  488. FXString CFreeburnDisc::discPerformer()
  489. {
  490.     return m_pGlobalCdText->performer;
  491. }
  492.     
  493. void CFreeburnDisc::discSongWriter(FXString songwriter)
  494. {
  495.     m_pGlobalCdText->songwriter = songwriter;
  496. }
  497. FXString CFreeburnDisc::discSongWriter()
  498. {
  499.     return m_pGlobalCdText->songwriter;
  500. }
  501.     
  502. void CFreeburnDisc::discComposer(FXString composer)
  503. {
  504.     m_pGlobalCdText->composer = composer;
  505. }
  506. FXString CFreeburnDisc::discComposer()
  507. {
  508.     return m_pGlobalCdText->composer;
  509. }
  510.     
  511. void CFreeburnDisc::discArranger(FXString arranger)
  512. {
  513.     m_pGlobalCdText->arranger = arranger;
  514. }
  515. FXString CFreeburnDisc::discArranger()
  516. {
  517.     return m_pGlobalCdText->arranger;
  518. }
  519.     
  520. void CFreeburnDisc::discMessage(FXString message)
  521. {
  522.     m_pGlobalCdText->message = message;
  523. }
  524. FXString CFreeburnDisc::discMessage()
  525. {
  526.     return m_pGlobalCdText->message;
  527. }
  528.     
  529. void CFreeburnDisc::discId(FXString id)
  530. {
  531.     m_pGlobalCdText->discid = id;
  532. }
  533. FXString CFreeburnDisc::discId()
  534. {
  535.     return m_pGlobalCdText->discid;
  536. }
  537.     
  538. void CFreeburnDisc::discGenre(FXString genre)
  539. {
  540.     m_pGlobalCdText->genre = genre;
  541. }
  542. FXString CFreeburnDisc::discGenre()
  543. {
  544.     return m_pGlobalCdText->genre;
  545. }
  546.     
  547. // Create a new track at the end of the disc, and set the
  548. // active track to the newly added track
  549. // Returns:
  550. //      TRUE if the track is added
  551. //      FALSE if the track was not added (i.e., the disc is full)
  552. FXbool CFreeburnDisc::createTrack(FXint trackMode, FXint copyProperties, FXint preEmphProperties, 
  553.     FXbool twoChannelAudio, FXbool fourChannelAudio, FXint initialDataArraySize)
  554. {
  555.     // make sure the disc isn't full first
  556.     if (m_trackCount >= MAX_CD_TRACKS) // disc is full
  557.         return FALSE;
  558.         
  559.     // if the track doesn't match the disc type, return false
  560.     switch (trackMode)
  561.     {
  562.         // audio tracks are allowed on any kind of disc
  563.         case AUDIO:
  564.             break;
  565.         case MODE_1:
  566.         case MODE_1_RAW:
  567.             if (m_discType == CD_DA)  return FALSE;
  568.             if (m_discType == CDROM_XA) return FALSE;
  569.             break;
  570.         case MODE_2_FORM_2:
  571.         case MODE_2_FORM_1:
  572.         case MODE_2_RAW:
  573.             if (m_discType == CD_DA)  return FALSE;
  574.             if (m_discType == CD_ROM) return FALSE;
  575.             break;
  576.         default:
  577.             return FALSE;
  578.     }
  579.     
  580.     
  581.     // add the new track to the end of the track array
  582.     m_trackArray[m_trackCount] = new CFreeburnTrack(trackMode, copyProperties, preEmphProperties, 
  583.                                          twoChannelAudio, fourChannelAudio, initialDataArraySize);
  584.                                          
  585.     // set the active track index to the newly added track
  586.     m_currentTrackIndex = m_trackCount;
  587.     
  588.     // increment the track count
  589.     m_trackCount++;
  590.     
  591.     // set the track cd text strings to the strings corresponding with the disc strings
  592.     activeTrackTitle(discTitle());
  593.     activeTrackPerformer(discPerformer());
  594.     activeTrackSongWriter(discSongWriter());
  595.     activeTrackComposer(discComposer());
  596.     activeTrackArranger(discArranger());
  597.     activeTrackMessage(discMessage());
  598.     
  599.     return TRUE;
  600. }
  601. // Like the above, but inserts a new track at the specified track position
  602. // (real pos is pos-1) and set the active track to the new one.  If the 
  603. // array is full, it will not insert.
  604. FXbool CFreeburnDisc::insertTrack(FXuint pos, FXint trackMode, FXint copyProperties, FXint preEmphProperties, 
  605.     FXbool twoChannelAudio, FXbool fourChannelAudio, FXint initialDataArraySize)
  606. {
  607.     // make sure the disc isn't full first
  608.     if (m_trackCount >= MAX_CD_TRACKS) // disc is full
  609.         return FALSE;
  610.         
  611.     // make sure the position is valid
  612.     if ((pos < MIN_CD_TRACKS) || (pos > MAX_CD_TRACKS))
  613.         return FALSE;
  614.     
  615.     // if the track doesn't match the disc type, return false
  616.     switch (trackMode)
  617.     {
  618.         // audio tracks are allowed on any kind of disc
  619.         case AUDIO:
  620.             break;
  621.         case MODE_1:
  622.         case MODE_1_RAW:
  623.             if (m_discType == CD_DA)  return FALSE;
  624.             if (m_discType == CDROM_XA) return FALSE;
  625.             break;
  626.         case MODE_2_FORM_2:
  627.         case MODE_2_FORM_1:
  628.         case MODE_2_RAW:
  629.             if (m_discType == CD_DA)  return FALSE;
  630.             if (m_discType == CD_ROM) return FALSE;
  631.             break;
  632.         default:
  633.             return FALSE;
  634.     }
  635.     
  636.     // if pos is larger than the amount of tracks, just append 
  637.     // the item to the end of the array
  638.     if (pos >= m_trackCount)
  639.     {
  640.         pos = m_trackCount;
  641.     }
  642.     // otherwise, make room for the new item
  643.     else
  644.     {    
  645.         // bump the items from the insert position to the end down one
  646.         for (FXuint i = (m_trackCount - 1); i >= (pos - 1); i--)
  647.         {
  648.             m_trackArray[i+1] = m_trackArray[i];    // move each item up by one
  649.                                                     // to make space for the new item
  650.         }
  651.     }
  652.     
  653.     // insert the new track at the position specified (the new empty spot in the array)
  654.     m_trackArray[pos - 1] = new CFreeburnTrack(trackMode, copyProperties, preEmphProperties, 
  655.                                     twoChannelAudio, fourChannelAudio, initialDataArraySize);
  656.                                 
  657.     // set the active track index to the newly added track
  658.     m_currentTrackIndex = pos - 1;
  659.     
  660.     // increment the track count
  661.     m_trackCount++;
  662.     
  663.     return TRUE;
  664. }
  665. // set the active track to manipulate.  If the trackNumber given
  666. // is not a valid track number (it isn't 1..99 or the track number
  667. // doesn't exist yet), then the number won't change
  668. // Returns: TRUE on set, FALSE on not set
  669. FXbool CFreeburnDisc::setActiveTrack(FXuint trackNumber)
  670. {
  671.     // check to see if 1 <= trackNumber <= 99
  672.     if ((trackNumber < MIN_CD_TRACKS) || (trackNumber > MAX_CD_TRACKS))
  673.         return FALSE;
  674.     
  675.     // check to see if the trackNubmer exists
  676.     if (trackNumber > m_trackCount)
  677.         return FALSE;
  678.         
  679.     // trackNumber is the actual track number to set, while the 
  680.     // array is indexed starting at zero.  So we need to set the
  681.     // active track number to trackNumber - 1
  682.     m_currentTrackIndex = trackNumber - 1;
  683.     
  684.     return TRUE;
  685. }
  686. // get the active track number (1..99)
  687. FXint CFreeburnDisc::getActiveTrack()
  688. {
  689.     // since the active track index is the array index, and the
  690.     // array index starts at zero, return the track index + 1
  691.     return m_currentTrackIndex + 1;
  692. }
  693. // Delete the track at the given position.  If the track
  694. // is not the last track on the disc, other tracks will
  695. // be moved up to fill the gap.
  696. // Returns:
  697. //      TRUE if the track was deleted
  698. //      FALSE if the track was not deleted
  699. FXbool CFreeburnDisc::deleteTrack(FXuint pos)
  700. {
  701.     // make sure the pos is in range
  702.     // check to see if 1 <= trackNumber <= 99
  703.     if ((pos < MIN_CD_TRACKS) || (pos > MAX_CD_TRACKS))
  704.         return FALSE;
  705.     
  706.     // check to see if the trackNubmer exists
  707.     if (pos > m_trackCount)
  708.         return FALSE;
  709.         
  710.     // delete the track at the given position (minus 1 for the 0-index array)
  711.     delete m_trackArray[pos-1];
  712.     
  713.     // if the track wasn't the last one in the array, bump
  714.     // the rest of the items down to fill the gap
  715.     if (pos != m_trackCount)
  716.     {
  717.         for (FXuint i = (pos - 1); i < (m_trackCount - 1); i++)
  718.         {
  719.             m_trackArray[i] = m_trackArray[i+1];
  720.         }
  721.     }
  722.     // set the last pointer to NULL
  723.     m_trackArray[m_trackCount - 1] = NULL;
  724.     
  725.     // decrement the track count
  726.     m_trackCount--;
  727.     
  728.     return TRUE;
  729. }
  730. // Get/set the track mode for the active track number
  731. // Returns: TRUE/track mode if there is an active track
  732. //          FALSE/-1 if there isn't an active track
  733. FXbool CFreeburnDisc::activeTrackMode(FXint newMode)
  734. {
  735.     // if the track doesn't match the disc type, return false
  736.     switch (newMode)
  737.     {
  738.         // audio tracks are allowed on any kind of disc
  739.         case AUDIO:
  740.             break;
  741.         case MODE_1:
  742.         case MODE_1_RAW:
  743.             if (m_discType == CD_DA)  return FALSE;
  744.             if (m_discType == CDROM_XA) return FALSE;
  745.             break;
  746.         case MODE_2_FORM_2:
  747.         case MODE_2_FORM_1:
  748.         case MODE_2_RAW:
  749.             if (m_discType == CD_DA)  return FALSE;
  750.             if (m_discType == CD_ROM) return FALSE;
  751.             break;
  752.         default:
  753.             return FALSE;
  754.     }
  755.     
  756.     // run a switch on newMode.  If the mode is a good mode, the
  757.     // new mode will be set.  If the mode isn't good, it will hit
  758.     // the default switch and return FALSE.
  759.     switch (newMode)
  760.     {
  761.         case AUDIO:
  762.             m_trackArray[m_currentTrackIndex]->m_trackMode = newMode;
  763.             break;
  764.         case MODE_1:
  765.             m_trackArray[m_currentTrackIndex]->m_trackMode = newMode;
  766.             break;
  767.         case MODE_1_RAW:
  768.             m_trackArray[m_currentTrackIndex]->m_trackMode = newMode;
  769.             break;
  770.         case MODE_2_FORM_1:
  771.             m_trackArray[m_currentTrackIndex]->m_trackMode = newMode;
  772.             break;
  773.         case MODE_2_FORM_2:
  774.             m_trackArray[m_currentTrackIndex]->m_trackMode = newMode;
  775.             break;
  776.         case MODE_2_RAW:
  777.             m_trackArray[m_currentTrackIndex]->m_trackMode = newMode;
  778.             break;
  779.         default:
  780.             return FALSE;
  781.     }
  782.     
  783.     return TRUE;
  784. }
  785. FXint CFreeburnDisc::activeTrackMode()
  786. {
  787.     return m_trackArray[m_currentTrackIndex]->m_trackMode;
  788. }
  789. // Get/set the track copy properties for the active track number
  790. // Returns: TRUE/track copy mode if there is an active track
  791. //          FALSE/-1 if there isn't an active track
  792. FXbool CFreeburnDisc::activeTrackCopyMode(FXint copyMode)
  793. {
  794.     // run a switch on copyMode.  If the mode is a good mode, the
  795.     // new mode will be set.  If the mode isn't good, it will hit
  796.     // the default switch and return FALSE.
  797.     switch (copyMode)
  798.     {
  799.         case COPY:
  800.             m_trackArray[m_currentTrackIndex]->m_trackCopyProperties = copyMode;
  801.             break;
  802.         case NO_COPY:
  803.             m_trackArray[m_currentTrackIndex]->m_trackCopyProperties = copyMode;
  804.             break;
  805.         default:
  806.             return FALSE;
  807.     }
  808.     
  809.     return TRUE;
  810. }
  811. FXint CFreeburnDisc::activeTrackCopyMode()
  812. {
  813.     return m_trackArray[m_currentTrackIndex]->m_trackCopyProperties;
  814. }
  815. // Get/set the track pre-emphasis mode for the active track number
  816. // Returns: TRUE/track pre-emphasis mode if there is an active track
  817. //          FALSE/-1 if there isn't an active track
  818. FXbool CFreeburnDisc::activeTrackPreEmphMode(FXint newMode)
  819. {
  820.     // run a switch on copyMode.  If the mode is a good mode, the
  821.     // new mode will be set.  If the mode isn't good, it will hit
  822.     // the default switch and return FALSE.
  823.     switch (newMode)
  824.     {
  825.         case NO_PRE_EMPHASIS:
  826.             m_trackArray[m_currentTrackIndex]->m_trackPreEmphasisProperties = newMode;
  827.             break;
  828.         case PRE_EMPHASIS:
  829.             m_trackArray[m_currentTrackIndex]->m_trackPreEmphasisProperties = newMode;
  830.             break;
  831.         default:
  832.             return FALSE;
  833.     }
  834.     
  835.     return TRUE;
  836. }
  837. FXint  CFreeburnDisc::activeTrackPreEmphMode()
  838. {
  839.     return m_trackArray[m_currentTrackIndex]->m_trackPreEmphasisProperties;
  840. }
  841. // Get/set the track 2 channel and 4 channel audio properties
  842. void   CFreeburnDisc::activeTrackTwoChannelAudio(FXbool mode)
  843. {
  844.     m_trackArray[m_currentTrackIndex]->m_trackTwoChannelAudio = mode;
  845. }
  846. FXbool CFreeburnDisc::activeTrackTwoChannelAudio()
  847. {
  848.     return m_trackArray[m_currentTrackIndex]->m_trackTwoChannelAudio;
  849. }
  850. void   CFreeburnDisc::activeTrackFourChannelAudio(FXbool mode)
  851. {
  852.     m_trackArray[m_currentTrackIndex]->m_trackFourChannelAudio = mode;
  853. }
  854. FXbool CFreeburnDisc::activeTrackFourChannelAudio()
  855. {
  856.     return m_trackArray[m_currentTrackIndex]->m_trackFourChannelAudio;
  857. }
  858. // methods to get/set the active track's CD Text properties
  859. void CFreeburnDisc::activeTrackTextMapNumber(FXint num)
  860. {
  861.     m_trackArray[m_currentTrackIndex]->m_trackCdText->map_number = num;
  862. }
  863. FXint CFreeburnDisc::activeTrackTextMapNumber()
  864. {
  865.     return m_trackArray[m_currentTrackIndex]->m_trackCdText->map_number;
  866. }
  867. void CFreeburnDisc::activeTrackTitle(FXString title)
  868. {
  869.     m_trackArray[m_currentTrackIndex]->m_trackCdText->title = title;
  870. }
  871. FXString CFreeburnDisc::activeTrackTitle()
  872. {
  873.     return m_trackArray[m_currentTrackIndex]->m_trackCdText->title;
  874. }
  875. void CFreeburnDisc::activeTrackPerformer(FXString performer)
  876. {
  877.     m_trackArray[m_currentTrackIndex]->m_trackCdText->performer = performer;
  878. }
  879. FXString CFreeburnDisc::activeTrackPerformer()
  880. {
  881.     return m_trackArray[m_currentTrackIndex]->m_trackCdText->performer;
  882. }
  883. void CFreeburnDisc::activeTrackSongWriter(FXString songwriter)
  884. {
  885.     m_trackArray[m_currentTrackIndex]->m_trackCdText->songwriter = songwriter;
  886. }
  887. FXString CFreeburnDisc::activeTrackSongWriter()
  888. {
  889.     return m_trackArray[m_currentTrackIndex]->m_trackCdText->songwriter;
  890. }
  891. void CFreeburnDisc::activeTrackComposer(FXString composer)
  892. {
  893.     m_trackArray[m_currentTrackIndex]->m_trackCdText->composer = composer;
  894. }
  895. FXString CFreeburnDisc::activeTrackComposer()
  896. {
  897.     return m_trackArray[m_currentTrackIndex]->m_trackCdText->composer;
  898. }
  899. void CFreeburnDisc::activeTrackArranger(FXString arranger)
  900. {
  901.     m_trackArray[m_currentTrackIndex]->m_trackCdText->arranger = arranger;
  902. }
  903. FXString CFreeburnDisc::activeTrackArranger()
  904. {
  905.     return m_trackArray[m_currentTrackIndex]->m_trackCdText->arranger;
  906. }
  907. void CFreeburnDisc::activeTrackMessage(FXString message)
  908. {
  909.     m_trackArray[m_currentTrackIndex]->m_trackCdText->message = message;
  910. }
  911. FXString CFreeburnDisc::activeTrackMessage()
  912. {
  913.     return m_trackArray[m_currentTrackIndex]->m_trackCdText->message;
  914. }
  915. // this sets both the CD Text ISRC and the regular track ISRC
  916. void CFreeburnDisc::activeTrackIsrc(FXString isrc)
  917. {
  918.     FXint count;
  919.     FXint pos;
  920.     
  921.     m_trackArray[m_currentTrackIndex]->m_trackCdText->isrc = isrc;
  922.     m_trackArray[m_currentTrackIndex]->m_trackIsrc = isrc;
  923.     // the regular track isrc doesn't need dashes
  924.     count = m_trackArray[m_currentTrackIndex]->m_trackIsrc.count('-');
  925.     while (count != 0)
  926.     {
  927.         pos = m_trackArray[m_currentTrackIndex]->m_trackIsrc.findf('-');
  928.         m_trackArray[m_currentTrackIndex]->m_trackIsrc.remove(pos);
  929.         count = m_trackArray[m_currentTrackIndex]->m_trackIsrc.count('-');
  930.     }
  931. }
  932. FXString CFreeburnDisc::activeTrackIsrc()
  933. {
  934.     return m_trackArray[m_currentTrackIndex]->m_trackCdText->isrc;
  935. }
  936. // adds a new generic track data item to the
  937. // end of the track data array, and sets the
  938. // active array index to the newly added item
  939. // Returns: True on add, False on no add
  940. FXbool CFreeburnDisc::activeTrackAddData()
  941. {
  942.     // call insert data for the end of the array
  943.     return activeTrackInsertData(m_trackArray[m_currentTrackIndex]->m_trackDataArrayIndex+1);
  944. }
  945. // adds a track data item to the end of the track data array of the 
  946. // data type AUDIOFILE, and set the properties corresponding to this type
  947. // Also set the active array index to this new item.
  948. // Returns: True on add, False on no add
  949. FXbool CFreeburnDisc::activeTrackAddAudioData(FXString filename, DiscTime start, DiscTime length)
  950. {
  951.     // call insert data for the end of the array
  952.     return activeTrackInsertAudioData(m_trackArray[m_currentTrackIndex]->m_trackDataArrayIndex+1, 
  953.         filename, start, length);
  954. }
  955. // adds a track data item to the end of the track data array of the 
  956. // data type DATAFILE, and set the properties corresponding to this type
  957. // Also set the active array index to this new item.
  958. // Returns: True on add, False on no add
  959. FXbool CFreeburnDisc::activeTrackAddDataData(FXString filename, FXuint length)
  960. {
  961.     // call insert data for the end of the array
  962.     return activeTrackInsertDataData(m_trackArray[m_currentTrackIndex]->m_trackDataArrayIndex+1, filename, length);
  963. }
  964. // adds a track data item to the end of the track data array of the 
  965. // data type SILENCE, and set the properties corresponding to this type
  966. // Also set the active array index to this new item.
  967. // Returns: True on add, False on no add
  968. FXbool CFreeburnDisc::activeTrackAddSilenceData(DiscTime length)
  969. {
  970.     // call insert data for the end of the array
  971.     return activeTrackInsertSilenceData(m_trackArray[m_currentTrackIndex]->m_trackDataArrayIndex+1, length);
  972. }
  973. // adds a track data item to the end of the track data array of the 
  974. // data type ZERO, and set the properties corresponding to this type
  975. // Also set the active array index to this new item.
  976. // Returns: True on add, False on no add
  977. FXbool CFreeburnDisc::activeTrackAddZeroData(FXuint length)
  978. {
  979.     // call insert data for the end of the array
  980.     return activeTrackInsertZeroData(m_trackArray[m_currentTrackIndex]->m_trackDataArrayIndex+1, length);
  981. }
  982. // adds a track data item to the end of the track data array of the 
  983. // data type START, and set the properties corresponding to this type
  984. // Also set the active array index to this new item.
  985. // Returns: True on add, False on no add
  986. FXbool CFreeburnDisc::activeTrackAddStartData(DiscTime length)
  987. {
  988.     // call insert data for the end of the array
  989.     return activeTrackInsertStartData(m_trackArray[m_currentTrackIndex]->m_trackDataArrayIndex+1, length);
  990. }
  991. // adds a track data item to the end of the track data array of the 
  992. // data type PREGAP, and set the properties corresponding to this type
  993. // Also set the active array index to this new item.
  994. // Returns: True on add, False on no add
  995. FXbool CFreeburnDisc::activeTrackAddPregapData(DiscTime length)
  996. {
  997.     // call insert data for the end of the array
  998.     return activeTrackInsertPregapData(m_trackArray[m_currentTrackIndex]->m_trackDataArrayIndex+1, length);
  999. }
  1000. // adds a track data item to the end of the track data array of the 
  1001. // data type INDEX, and set the properties corresponding to this type
  1002. // Also set the active array index to this new item.
  1003. // Returns: True on add, False on no add
  1004. FXbool CFreeburnDisc::activeTrackAddIndexData(DiscTime length)
  1005. {
  1006.     // call insert data for the end of the array
  1007.     return activeTrackInsertIndexData(m_trackArray[m_currentTrackIndex]->m_trackDataArrayIndex+1, length);
  1008. }
  1009. // inserts a new generic track data item at the
  1010. // position specified in the data array, and sets the
  1011. // active array index to the newly added item
  1012. // Returns: True on add, False on no add
  1013. FXbool CFreeburnDisc::activeTrackInsertData(FXint pos)
  1014. {
  1015.     // to set up the real index based on input
  1016.     FXint insPos;
  1017.     // a pointer to the active track class, to reduce typing
  1018.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1019.     
  1020.     // first, check the array length.  If the array is full, then
  1021.     // we need to grow it out so it will fit the new data
  1022.     if (pTempTrack->m_trackDataArrayLastIndex == 
  1023.        (pTempTrack->m_trackDataArrayLength -1))
  1024.     {
  1025.         if (activeTrackGrowDataArray() == FALSE)
  1026.             return FALSE;   // the array is full, and we couldn't grow it
  1027.     }
  1028.     
  1029.     // if pos is greater than the last indexed item in the array, make
  1030.     // pos the next un-indexed item in the array
  1031.     if (pos > pTempTrack->m_trackDataArrayLastIndex)
  1032.         insPos = pTempTrack->m_trackDataArrayLastIndex + 1;
  1033.     else
  1034.         insPos = pos;
  1035.         
  1036.     // if insPos is not the new last item in the array, bump the 
  1037.     // other items down to make room
  1038.     if (insPos <= pTempTrack->m_trackDataArrayLastIndex)
  1039.     {
  1040.         for (FXint i = pTempTrack->m_trackDataArrayLastIndex + 1; i > insPos; i--)
  1041.         {
  1042.             // copy the data type
  1043.             pTempTrack->m_trackDataArray[i].dataType = pTempTrack->m_trackDataArray[i-1].dataType;
  1044.             // copy the file name
  1045.             pTempTrack->m_trackDataArray[i].filename = pTempTrack->m_trackDataArray[i-1].filename;
  1046.             // copy the start time
  1047.             pTempTrack->m_trackDataArray[i].startTime.minutes = pTempTrack->m_trackDataArray[i-1].startTime.minutes;
  1048.             pTempTrack->m_trackDataArray[i].startTime.seconds = pTempTrack->m_trackDataArray[i-1].startTime.seconds;
  1049.             pTempTrack->m_trackDataArray[i].startTime.frames  = pTempTrack->m_trackDataArray[i-1].startTime.frames;
  1050.             // copy the data length
  1051.             pTempTrack->m_trackDataArray[i].lengthData = pTempTrack->m_trackDataArray[i-1].lengthData;
  1052.             // copy the time length
  1053.             pTempTrack->m_trackDataArray[i].lengthTime.minutes = pTempTrack->m_trackDataArray[i-1].lengthTime.minutes;
  1054.             pTempTrack->m_trackDataArray[i].lengthTime.seconds = pTempTrack->m_trackDataArray[i-1].lengthTime.seconds;
  1055.             pTempTrack->m_trackDataArray[i].lengthTime.frames  = pTempTrack->m_trackDataArray[i-1].lengthTime.frames;            
  1056.         }
  1057.     }
  1058.     
  1059.     // now insert "dummy" data into the newly inserted track data element
  1060.     pTempTrack->m_trackDataArray[insPos].dataType           = AUDIOFILE; // AUDIOFILE == 0
  1061.     pTempTrack->m_trackDataArray[insPos].filename           = "";
  1062.     pTempTrack->m_trackDataArray[insPos].startTime.minutes  = 0;
  1063.     pTempTrack->m_trackDataArray[insPos].startTime.seconds  = 0;
  1064.     pTempTrack->m_trackDataArray[insPos].startTime.frames   = 0;
  1065.     pTempTrack->m_trackDataArray[insPos].lengthData         = 0;
  1066.     pTempTrack->m_trackDataArray[insPos].lengthTime.minutes = 0;
  1067.     pTempTrack->m_trackDataArray[insPos].lengthTime.seconds = 0;
  1068.     pTempTrack->m_trackDataArray[insPos].lengthTime.frames  = 0;
  1069.     
  1070.     // adjust the current index and max index
  1071.     pTempTrack->m_trackDataArrayIndex     = insPos;
  1072.     pTempTrack->m_trackDataArrayLastIndex++;
  1073.     
  1074.     return TRUE;        
  1075. }
  1076. // inserts a track data item to the track data array at (pos) of the 
  1077. // data type AUDIOFILE, and set the properties corresponding to this type
  1078. // Also set the active array index to this new item.
  1079. // Returns: True on add, False on no add
  1080. FXbool CFreeburnDisc::activeTrackInsertAudioData(FXint pos, FXString filename, DiscTime start, DiscTime length)
  1081. {
  1082.     // a pointer to the active track class, to reduce typing
  1083.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1084.     
  1085.     // if the track type isn't an audio type, exit
  1086.     switch (pTempTrack->m_trackMode)
  1087.     {
  1088.         case AUDIO:
  1089.             break;
  1090.         case MODE_2_FORM_2:
  1091.             break;
  1092.         default:    // not an audio track
  1093.             return FALSE;
  1094.     }
  1095.     
  1096.     // if the filename doesn't exist, exit
  1097.     if (FXFile::exists(filename) == FALSE) return FALSE;
  1098.     // if the start times are not right, exit
  1099.     if (!((start.frames  > MIN_FRAMES)   || (start.frames   < MAX_FRAMES)))  return FALSE;
  1100.     if (!((start.seconds > MIN_SECONDS)  || (start.frames   < MAX_SECONDS))) return FALSE;
  1101.     if (!((start.minutes > MIN_MINUTES)  || 
  1102.         (start.minutes  < (m_discCurrentSize + m_discFreeSpace)/BLOCKS_IN_ONE_MINUTE))) return FALSE;
  1103.     // if the length times are not right, exit
  1104.     if ((length.frames  > MIN_FRAMES)  || (length.frames  < MAX_FRAMES))  return FALSE;
  1105.     if ((length.seconds > MIN_SECONDS) || (length.frames  < MAX_SECONDS)) return FALSE;
  1106.     if ((length.minutes > MIN_MINUTES) || (length.minutes < m_discFreeSpace/BLOCKS_IN_ONE_MINUTE)) return FALSE;
  1107.     
  1108.     // insert a blank track at pos
  1109.     if (activeTrackInsertData(pos) == FALSE)
  1110.         return FALSE;
  1111.         
  1112.     // insert the right data for an audio file data
  1113.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType           = AUDIOFILE;
  1114.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].filename           = filename;
  1115.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.minutes  = start.minutes;
  1116.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.seconds  = start.seconds;
  1117.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.frames   = start.frames;
  1118.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthData         = 0;
  1119.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes = length.minutes;
  1120.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds = length.seconds;
  1121.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.frames  = length.frames;
  1122.     
  1123.     // the disc sizes have changed, so adjust them accordingly
  1124.     FXint blockLength = length.frames + 
  1125.         (length.seconds * BLOCKS_IN_ONE_SECOND) + (length.minutes * BLOCKS_IN_ONE_MINUTE);
  1126.     m_discFreeSpace   -= blockLength;
  1127.     m_discCurrentSize += blockLength;
  1128.     
  1129.     return TRUE;
  1130. }
  1131. // inserts a track data item to the track data array at (pos) of the 
  1132. // data type DATAFILE, and set the properties corresponding to this type
  1133. // Also set the active array index to this new item.
  1134. // Returns: True on add, False on no add
  1135. FXbool CFreeburnDisc::activeTrackInsertDataData(FXint pos, FXString filename, FXuint length)
  1136. {
  1137.     // a pointer to the active track class, to reduce typing
  1138.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1139.     
  1140.     // if the track type isn't an data type, exit
  1141.     switch (pTempTrack->m_trackMode)
  1142.     {
  1143.         case MODE_1:
  1144.             break;
  1145.         case MODE_1_RAW:
  1146.             break;
  1147.         case MODE_2_FORM_1:
  1148.             break;
  1149.         case MODE_2_RAW:
  1150.             break;
  1151.         default:    // not a data track
  1152.             return FALSE;
  1153.     }
  1154.     
  1155.     // if the filename doesn't exist, exit
  1156.     if (FXFile::exists(filename) == FALSE) return FALSE;
  1157.     // if the length is too big, then exit
  1158.     if (length > m_discFreeSpace) return FALSE;
  1159.     
  1160.     // insert a blank track at pos
  1161.     if (activeTrackInsertData(pos) == FALSE)
  1162.         return FALSE;
  1163.         
  1164.     // insert the right data for an audio file data
  1165.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType           = DATAFILE;
  1166.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].filename           = filename;
  1167.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.minutes  = 0;
  1168.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.seconds  = 0;
  1169.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.frames   = 0;
  1170.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthData         = length;
  1171.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes = 0;
  1172.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds = 0;
  1173.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.frames  = 0;
  1174.     
  1175.     // the disc sizes have changed, so adjust them accordingly
  1176.     FXint blockLength = length / BYTES_IN_ONE_BLOCK;
  1177.     if ((length % BYTES_IN_ONE_BLOCK) != 0) // there is a remainder from the divide, so add 1
  1178.         blockLength += 1;
  1179.     m_discFreeSpace   -= blockLength;
  1180.     m_discCurrentSize += blockLength;
  1181.     
  1182.     return TRUE;
  1183. }
  1184. // inserts a track data item to the track data array at (pos) of the 
  1185. // data type SILENCE, and set the properties corresponding to this type
  1186. // Also set the active array index to this new item.
  1187. // Returns: True on add, False on no add
  1188. FXbool CFreeburnDisc::activeTrackInsertSilenceData(FXint pos, DiscTime length)
  1189. {
  1190.     // a pointer to the active track class, to reduce typing
  1191.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1192.     
  1193.     // if the track type isn't an audio type, exit
  1194.     switch (pTempTrack->m_trackMode)
  1195.     {
  1196.         case AUDIO:
  1197.             break;
  1198.         case MODE_2_FORM_2:
  1199.             break;
  1200.         default:    // not an audio track
  1201.             return FALSE;
  1202.     }
  1203.     
  1204.     // if the length times are not right, exit
  1205.     if (!((length.frames  > MIN_FRAMES)  || (length.frames  < MAX_FRAMES)))  return FALSE;
  1206.     if (!((length.seconds > MIN_SECONDS) || (length.frames  < MAX_SECONDS))) return FALSE;
  1207.     // 4500 is 75 Frames * 60 Seconds, or the number of frames per minute
  1208.     if (!((length.minutes > MIN_MINUTES) || (length.minutes < m_discFreeSpace/BLOCKS_IN_ONE_MINUTE))) return FALSE;
  1209.     
  1210.     // insert a blank track at pos
  1211.     if (activeTrackInsertData(pos) == FALSE)
  1212.         return FALSE;
  1213.         
  1214.     // insert the right data for silence data
  1215.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType           = SILENCE;
  1216.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].filename           = "";
  1217.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.minutes  = 0;
  1218.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.seconds  = 0;
  1219.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.frames   = 0;
  1220.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthData         = 0;
  1221.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes = length.minutes;
  1222.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds = length.seconds;
  1223.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.frames  = length.frames;
  1224.     
  1225.     // the disc sizes have changed, so adjust them accordingly
  1226.     FXint blockLength = length.frames + 
  1227.         (length.seconds * BLOCKS_IN_ONE_SECOND) + (length.minutes * BLOCKS_IN_ONE_MINUTE);
  1228.     m_discFreeSpace   -= blockLength;
  1229.     m_discCurrentSize += blockLength;
  1230.     
  1231.     return TRUE;
  1232. }
  1233. // inserts a track data item to the track data array at (pos) of the 
  1234. // data type ZERO, and set the properties corresponding to this type
  1235. // Also set the active array index to this new item.
  1236. // Returns: True on add, False on no add
  1237. FXbool CFreeburnDisc::activeTrackInsertZeroData(FXint pos, FXuint length)
  1238. {
  1239.     // a pointer to the active track class, to reduce typing
  1240.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1241.     
  1242.     // if the track type isn't an data type, exit
  1243.     switch (pTempTrack->m_trackMode)
  1244.     {
  1245.         case MODE_1:
  1246.             break;
  1247.         case MODE_1_RAW:
  1248.             break;
  1249.         case MODE_2_FORM_1:
  1250.             break;
  1251.         case MODE_2_RAW:
  1252.             break;
  1253.         default:    // not a data track
  1254.             return FALSE;
  1255.     }
  1256.     
  1257.     // if the length is too big, then exit
  1258.     if (length > m_discFreeSpace) return FALSE;
  1259.     
  1260.     // insert a blank track at pos
  1261.     if (activeTrackInsertData(pos) == FALSE)
  1262.         return FALSE;
  1263.         
  1264.     // insert the right data for zero data
  1265.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType           = ZERO;
  1266.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].filename           = "";
  1267.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.minutes  = 0;
  1268.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.seconds  = 0;
  1269.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.frames   = 0;
  1270.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthData         = length;
  1271.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes = 0;
  1272.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds = 0;
  1273.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.frames  = 0;
  1274.     
  1275.     // the disc sizes have changed, so adjust them accordingly
  1276.     FXint blockLength = length / BYTES_IN_ONE_BLOCK;
  1277.     if ((length % BYTES_IN_ONE_BLOCK) != 0) // there is a remainder from the divide, so add 1
  1278.         blockLength += 1;
  1279.     m_discFreeSpace   -= blockLength;
  1280.     m_discCurrentSize += blockLength;
  1281.     
  1282.     return TRUE;
  1283. }
  1284. // inserts a track data item to the track data array at (pos) of the 
  1285. // data type START, and set the properties corresponding to this type
  1286. // Also set the active array index to this new item.
  1287. // Returns: True on add, False on no add
  1288. FXbool CFreeburnDisc::activeTrackInsertStartData(FXint pos, DiscTime length)
  1289. {
  1290.     // a pointer to the active track class, to reduce typing
  1291.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1292.     
  1293.     // START can be used on audio and data tracks, but if START was already 
  1294.     // set for this track (we don't want it), return false
  1295.     if (pTempTrack->m_trackStartSet) return FALSE;
  1296.     
  1297.     // if the length times are not right, exit
  1298.     if (!((length.frames  > MIN_FRAMES)  || (length.frames  < MAX_FRAMES)))  return FALSE;
  1299.     if (!((length.seconds > MIN_SECONDS) || (length.frames  < MAX_SECONDS))) return FALSE;
  1300.     // 4500 is 75 Frames * 60 Seconds, or the number of frames per minute
  1301.     if (!((length.minutes > MIN_MINUTES) || (length.minutes < m_discFreeSpace/BLOCKS_IN_ONE_MINUTE))) return FALSE;
  1302.         
  1303.     // insert a blank track at pos
  1304.     if (activeTrackInsertData(pos) == FALSE)
  1305.         return FALSE;
  1306.         
  1307.     // insert the right data for start data
  1308.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType           = START;
  1309.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].filename           = "";
  1310.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.minutes  = 0;
  1311.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.seconds  = 0;
  1312.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.frames   = 0;
  1313.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthData         = 0;
  1314.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes = length.minutes;
  1315.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds = length.seconds;
  1316.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.frames  = length.frames;
  1317.     
  1318.     // set START
  1319.     pTempTrack->m_trackStartSet = TRUE;
  1320.     
  1321.     // the disc sizes have changed, so adjust them accordingly
  1322.     FXint blockLength = length.frames + 
  1323.         (length.seconds * BLOCKS_IN_ONE_SECOND) + (length.minutes * BLOCKS_IN_ONE_MINUTE);
  1324.     m_discFreeSpace   -= blockLength;
  1325.     m_discCurrentSize += blockLength;
  1326.     
  1327.     return TRUE;
  1328. }
  1329. // inserts a track data item to the track data array at (pos) of the 
  1330. // data type PREGAP, and set the properties corresponding to this type
  1331. // Also set the active array index to this new item.
  1332. // Returns: True on add, False on no add
  1333. FXbool CFreeburnDisc::activeTrackInsertPregapData(FXint pos, DiscTime length)
  1334. {
  1335.     // a pointer to the active track class, to reduce typing
  1336.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1337.     
  1338.     // pregap can be used on audio or data tracks, but it replaces
  1339.     // START, so we can't do this if start is set.
  1340.     // if start was already set for this track, return false
  1341.     if (pTempTrack->m_trackStartSet) return FALSE;
  1342.         
  1343.     // if the length times are not right, exit
  1344.     if (!((length.frames  > MIN_FRAMES)  || (length.frames  < MAX_FRAMES)))  return FALSE;
  1345.     if (!((length.seconds > MIN_SECONDS) || (length.frames  < MAX_SECONDS))) return FALSE;
  1346.     // 4500 is 75 Frames * 60 Seconds, or the number of frames per minute
  1347.     if (!((length.minutes > MIN_MINUTES) || (length.minutes < m_discFreeSpace/BLOCKS_IN_ONE_MINUTE))) return FALSE;
  1348.         
  1349.     // insert a blank track at pos
  1350.     if (activeTrackInsertData(pos) == FALSE)
  1351.         return FALSE;
  1352.         
  1353.     // insert the right data for pregap data
  1354.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType           = PREGAP;
  1355.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].filename           = "";
  1356.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.minutes  = 0;
  1357.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.seconds  = 0;
  1358.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.frames   = 0;
  1359.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthData         = 0;
  1360.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes = length.minutes;
  1361.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds = length.seconds;
  1362.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.frames  = length.frames;
  1363.     
  1364.     // set START
  1365.     pTempTrack->m_trackStartSet = TRUE;
  1366.     
  1367.     // the disc sizes have changed, so adjust them accordingly
  1368.     FXint blockLength = length.frames + 
  1369.         (length.seconds * BLOCKS_IN_ONE_SECOND) + (length.minutes * BLOCKS_IN_ONE_MINUTE);
  1370.     m_discFreeSpace   -= blockLength;
  1371.     m_discCurrentSize += blockLength;
  1372.     
  1373.     return TRUE;
  1374. }
  1375. // inserts a track data item to the track data array at (pos) of the 
  1376. // data type INDEX, and set the properties corresponding to this type
  1377. // Also set the active array index to this new item.
  1378. // Returns: True on add, False on no add
  1379. FXbool CFreeburnDisc::activeTrackInsertIndexData(FXint pos, DiscTime length)
  1380. {
  1381.     // a pointer to the active track class, to reduce typing
  1382.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1383.     
  1384.     // if the track type isn't an audio type, exit
  1385.     switch (pTempTrack->m_trackMode)
  1386.     {
  1387.         case AUDIO:
  1388.             break;
  1389.         case MODE_2_FORM_2:
  1390.             break;
  1391.         default:    // not an audio track
  1392.             return FALSE;
  1393.     }
  1394.     
  1395.     // if the length times are not right, exit
  1396.     if (!((length.frames  > MIN_FRAMES)  || (length.frames  < MAX_FRAMES)))  return FALSE;
  1397.     if (!((length.seconds > MIN_SECONDS) || (length.frames  < MAX_SECONDS))) return FALSE;
  1398.     // 4500 is 75 Frames * 60 Seconds, or the number of frames per minute
  1399.     if (!((length.minutes > MIN_MINUTES) || (length.minutes < m_discFreeSpace/BLOCKS_IN_ONE_MINUTE))) return FALSE;
  1400.         
  1401.     // insert a blank track at pos
  1402.     if (activeTrackInsertData(pos) == FALSE)
  1403.         return FALSE;
  1404.         
  1405.     // insert the right data for index data
  1406.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType           = INDEX;
  1407.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].filename           = "";
  1408.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.minutes  = 0;
  1409.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.seconds  = 0;
  1410.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.frames   = 0;
  1411.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthData         = 0;
  1412.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes = length.minutes;
  1413.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds = length.seconds;
  1414.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.frames  = length.frames;
  1415.     
  1416.     // the disc sizes have changed, so adjust them accordingly
  1417.     FXint blockLength = length.frames + 
  1418.         (length.seconds * BLOCKS_IN_ONE_SECOND) + (length.minutes * BLOCKS_IN_ONE_MINUTE);
  1419.     m_discFreeSpace   -= blockLength;
  1420.     m_discCurrentSize += blockLength;
  1421.     
  1422.     return TRUE;
  1423. }
  1424. // Delete the active track data from the track data array.  If the item isn't
  1425. // at the end of the array, bump the rest of the items down to fill the gap
  1426. // Returns: True on delete, False on a fail
  1427. FXbool CFreeburnDisc::activeTrackDeleteData(FXint pos)
  1428. {
  1429.     FXint blockLength;
  1430.     
  1431.     // a pointer to the active track class, to reduce typing
  1432.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1433.     
  1434.     // check to see if the trackNubmer exists
  1435.     // Zero is used because it's a common base index for an array, and it is in FreeBurn as well
  1436.     if ((pos > pTempTrack->m_trackDataArrayLastIndex) || (pos < 0))
  1437.         return FALSE;
  1438.     
  1439.     // if the item we're deleting is a START element, then change the status of having it set
  1440.     if ((pTempTrack->m_trackDataArray[pos].dataType == START) ||
  1441.         (pTempTrack->m_trackDataArray[pos].dataType == PREGAP))
  1442.         pTempTrack->m_trackStartSet = FALSE;
  1443.         
  1444.     // restore the old disc size
  1445.     // DATAFILE and ZERO are the only two data track data types; all others are audio
  1446.     if ((pTempTrack->m_trackDataArray[pos].dataType == DATAFILE) ||
  1447.          pTempTrack->m_trackDataArray[pos].dataType == ZERO)
  1448.     {
  1449.         blockLength = pTempTrack->m_trackDataArray[pos].lengthData / BYTES_IN_ONE_BLOCK;
  1450.         // if there is a remainder from the divide, add 1 block that will contain the remaining space
  1451.         if ((pTempTrack->m_trackDataArray[pos].lengthData % BYTES_IN_ONE_BLOCK) != 0) 
  1452.             blockLength += 1;
  1453.     }
  1454.     else
  1455.     {
  1456.         blockLength = pTempTrack->m_trackDataArray[pos].lengthTime.frames + 
  1457.             (pTempTrack->m_trackDataArray[pos].lengthTime.seconds * BLOCKS_IN_ONE_SECOND) + 
  1458.             (pTempTrack->m_trackDataArray[pos].lengthTime.minutes * BLOCKS_IN_ONE_MINUTE);
  1459.     }
  1460.     m_discFreeSpace   += blockLength;
  1461.     m_discCurrentSize -= blockLength;
  1462.     
  1463.     // if the track wasn't the last one in the array, bump
  1464.     // the rest of the items down to fill the gap
  1465.     if (pos != pTempTrack->m_trackDataArrayLastIndex)
  1466.     {
  1467.         for (FXint i = pos; i < pTempTrack->m_trackDataArrayLastIndex; i++)
  1468.         {
  1469.             // copy the (i+1) element to the i element, which
  1470.             // bumps each item down by one
  1471.             pTempTrack->m_trackDataArray[i].dataType           = pTempTrack->m_trackDataArray[i+1].dataType;
  1472.             pTempTrack->m_trackDataArray[i].filename           = pTempTrack->m_trackDataArray[i+1].filename;
  1473.             pTempTrack->m_trackDataArray[i].startTime.minutes  = pTempTrack->m_trackDataArray[i+1].startTime.minutes;
  1474.             pTempTrack->m_trackDataArray[i].startTime.seconds  = pTempTrack->m_trackDataArray[i+1].startTime.seconds;
  1475.             pTempTrack->m_trackDataArray[i].startTime.frames   = pTempTrack->m_trackDataArray[i+1].startTime.frames;
  1476.             pTempTrack->m_trackDataArray[i].lengthData         = pTempTrack->m_trackDataArray[i+1].lengthData;
  1477.             pTempTrack->m_trackDataArray[i].lengthTime.minutes = pTempTrack->m_trackDataArray[i+1].lengthTime.minutes;
  1478.             pTempTrack->m_trackDataArray[i].lengthTime.seconds = pTempTrack->m_trackDataArray[i+1].lengthTime.seconds;
  1479.             pTempTrack->m_trackDataArray[i].lengthTime.frames  = pTempTrack->m_trackDataArray[i+1].lengthTime.frames;
  1480.         }
  1481.     }
  1482.     // delete the last data item in the array (set it's values to dummy values
  1483.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayLastIndex].dataType           = AUDIOFILE;
  1484.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayLastIndex].filename           = "";
  1485.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayLastIndex].startTime.minutes  = 0;
  1486.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayLastIndex].startTime.seconds  = 0;
  1487.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayLastIndex].startTime.frames   = 0;
  1488.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayLastIndex].lengthData         = 0;
  1489.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayLastIndex].lengthTime.minutes = 0;
  1490.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayLastIndex].lengthTime.seconds = 0;
  1491.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayLastIndex].lengthTime.frames  = 0;
  1492.     
  1493.     // decrement the data array count, and the current index
  1494.     // if it was the last item in the array
  1495.     if (pTempTrack->m_trackDataArrayIndex == pTempTrack->m_trackDataArrayLastIndex)
  1496.         pTempTrack->m_trackDataArrayIndex--;
  1497.     pTempTrack->m_trackDataArrayLastIndex--;
  1498.     
  1499.     return TRUE;
  1500. }
  1501. // change the index of the track data item
  1502. FXbool CFreeburnDisc::activeTrackActiveDataIndex(FXint pos)
  1503. {
  1504.     // check for a valid pos
  1505.     if ((pos < 0) || (pos > m_trackArray[m_currentTrackIndex]->m_trackDataArrayLastIndex))
  1506.         return FALSE;
  1507.     
  1508.     // set the pos
  1509.     m_trackArray[m_currentTrackIndex]->m_trackDataArrayIndex = pos;
  1510.     
  1511.     return TRUE;
  1512. }
  1513. // get the index of the active track data item
  1514. FXint CFreeburnDisc::activeTrackActiveDataIndex()
  1515. {
  1516.     // a pointer to the active track class, to reduce typing
  1517.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1518.     
  1519.     return pTempTrack->m_trackDataArrayIndex;
  1520. }
  1521. // Get the elements of the currently indexed track data item
  1522. FXint CFreeburnDisc::activeTrackActiveDataType()
  1523. {
  1524.     // a pointer to the active track class, to reduce typing
  1525.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1526.     
  1527.     return pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType;
  1528. }
  1529. FXString CFreeburnDisc::activeTrackActiveFileName()
  1530. {
  1531.     // a pointer to the active track class, to reduce typing
  1532.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1533.     
  1534.     return pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].filename;
  1535. }
  1536. FXint CFreeburnDisc::activeTrackActiveStartTimeMinutes()
  1537. {
  1538.     // a pointer to the active track class, to reduce typing
  1539.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1540.     
  1541.     return pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.minutes;
  1542. }
  1543. FXint CFreeburnDisc::activeTrackActiveStartTimeSeconds()
  1544. {
  1545.     // a pointer to the active track class, to reduce typing
  1546.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1547.     
  1548.     return pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.seconds;
  1549. }
  1550. FXint CFreeburnDisc::activeTrackActiveStartTimeFrames()
  1551. {
  1552.     // a pointer to the active track class, to reduce typing
  1553.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1554.     
  1555.     return pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.frames;
  1556. }
  1557. FXint CFreeburnDisc::activeTrackActiveTimeLengthMinutes()
  1558. {
  1559.     // a pointer to the active track class, to reduce typing
  1560.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1561.     
  1562.     return pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes;
  1563. }
  1564. FXint CFreeburnDisc::activeTrackActiveTimeLengthSeconds()
  1565. {
  1566.     // a pointer to the active track class, to reduce typing
  1567.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1568.     
  1569.     return pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds;
  1570. }
  1571. FXint CFreeburnDisc::activeTrackActiveTimeLengthFrames()
  1572. {
  1573.     // a pointer to the active track class, to reduce typing
  1574.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1575.     
  1576.     return pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds;
  1577. }
  1578. FXint CFreeburnDisc::activeTrackActiveDataLength()
  1579. {
  1580.     // a pointer to the active track class, to reduce typing
  1581.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1582.     
  1583.     return pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthData;
  1584. }
  1585. // Set the currently indexed track data item to the new data type
  1586. // Returns: True on change, False if not
  1587. FXbool CFreeburnDisc::activeTrackDataSetAudio(FXString filename, DiscTime start, DiscTime length)
  1588. {
  1589.     FXint blockLength;
  1590.     
  1591.     // a pointer to the active track class, to reduce typing
  1592.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1593.     
  1594.     // if the track type isn't an audio type, exit
  1595.     switch (pTempTrack->m_trackMode)
  1596.     {
  1597.         case AUDIO:
  1598.             break;
  1599.         case MODE_2_FORM_2:
  1600.             break;
  1601.         default:    // not an audio track
  1602.             return FALSE;
  1603.     }
  1604.     
  1605.     // if the filename doesn't exist, exit
  1606.     if (FXFile::exists(filename) == FALSE) return FALSE;
  1607.     // if the start times are not right, exit
  1608.     if (!((start.frames  > MIN_FRAMES)   || (start.frames   < MAX_FRAMES)))  return FALSE;
  1609.     if (!((start.seconds > MIN_SECONDS)  || (start.frames   < MAX_SECONDS))) return FALSE;
  1610.     if (!((start.minutes > MIN_MINUTES)  || 
  1611.         (start.minutes  < (m_discCurrentSize + m_discFreeSpace)/BLOCKS_IN_ONE_MINUTE))) return FALSE;
  1612.     // if the length times are not right, exit
  1613.     if (!((length.frames  > MIN_FRAMES)  || (length.frames  < MAX_FRAMES)))  return FALSE;
  1614.     if (!((length.seconds > MIN_SECONDS) || (length.frames  < MAX_SECONDS))) return FALSE;
  1615.     if (!((length.minutes > MIN_MINUTES) || (length.minutes < m_discFreeSpace/BLOCKS_IN_ONE_MINUTE))) return FALSE;
  1616.     
  1617.     // restore START status
  1618.     if ((pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType == START)  ||
  1619.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType == PREGAP))
  1620.     {
  1621.         pTempTrack->m_trackStartSet = FALSE;
  1622.     }
  1623.     
  1624.     // restore the old disc size
  1625.     blockLength = pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.frames + 
  1626.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds * BLOCKS_IN_ONE_SECOND) + 
  1627.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes * BLOCKS_IN_ONE_MINUTE);
  1628.     m_discFreeSpace   += blockLength;
  1629.     m_discCurrentSize -= blockLength;
  1630.     
  1631.     // insert the right data for an audio file data
  1632.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType           = AUDIOFILE;
  1633.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].filename           = filename;
  1634.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.minutes  = start.minutes;
  1635.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.seconds  = start.seconds;
  1636.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.frames   = start.frames;
  1637.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthData         = 0;
  1638.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes = length.minutes;
  1639.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds = length.seconds;
  1640.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.frames  = length.frames;
  1641.     
  1642.     // the disc sizes have changed, so adjust them accordingly
  1643.     blockLength = length.frames + 
  1644.         (length.seconds * BLOCKS_IN_ONE_SECOND) + (length.minutes * BLOCKS_IN_ONE_MINUTE);
  1645.     m_discFreeSpace   -= blockLength;
  1646.     m_discCurrentSize += blockLength;
  1647.     
  1648.     return TRUE;
  1649. }
  1650. FXbool CFreeburnDisc::activeTrackDataSetData(FXString filename, FXuint length)
  1651. {
  1652.     FXint blockLength;
  1653.     
  1654.     // a pointer to the active track class, to reduce typing
  1655.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1656.     
  1657.     // if the track type isn't an data type, exit
  1658.     switch (pTempTrack->m_trackMode)
  1659.     {
  1660.         case MODE_1:
  1661.             break;
  1662.         case MODE_1_RAW:
  1663.             break;
  1664.         case MODE_2_FORM_1:
  1665.             break;
  1666.         case MODE_2_RAW:
  1667.             break;
  1668.         default:    // not a data track
  1669.             return FALSE;
  1670.     }
  1671.     
  1672.     // if the filename doesn't exist, exit
  1673.     if (FXFile::exists(filename) == FALSE) return FALSE;
  1674.     // if the length is too big, then exit
  1675.     if (length > m_discFreeSpace) return FALSE;
  1676.     
  1677.     // restore START status
  1678.     if ((pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType == START)  ||
  1679.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType == PREGAP))
  1680.     {
  1681.         pTempTrack->m_trackStartSet = FALSE;
  1682.     }
  1683.     
  1684.     // restore old disc size
  1685.     blockLength = pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthData / BYTES_IN_ONE_BLOCK;
  1686.     // if there is a remainder from the divide, add 1 block that will contain the remaining space
  1687.     if ((pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthData % BYTES_IN_ONE_BLOCK) != 0) 
  1688.         blockLength += 1;
  1689.     m_discFreeSpace   += blockLength;
  1690.     m_discCurrentSize -= blockLength;
  1691.         
  1692.     // insert the right data for a data file data
  1693.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType           = DATAFILE;
  1694.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].filename           = filename;
  1695.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.minutes  = 0;
  1696.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.seconds  = 0;
  1697.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.frames   = 0;
  1698.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthData         = length;
  1699.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes = 0;
  1700.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds = 0;
  1701.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.frames  = 0;
  1702.     
  1703.     // the disc sizes have changed, so adjust them accordingly
  1704.     blockLength = length / BYTES_IN_ONE_BLOCK;
  1705.     if ((length % BYTES_IN_ONE_BLOCK) != 0) // there is a remainder from the divide, so add 1
  1706.         blockLength += 1;
  1707.     m_discFreeSpace   -= blockLength;
  1708.     m_discCurrentSize += blockLength;
  1709.     
  1710.     return TRUE;
  1711. }
  1712. FXbool CFreeburnDisc::activeTrackDataSetSilence(DiscTime length)
  1713. {
  1714.     FXint blockLength;
  1715.     
  1716.     // a pointer to the active track class, to reduce typing
  1717.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1718.     
  1719.     // if the track type isn't an audio type, exit
  1720.     switch (pTempTrack->m_trackMode)
  1721.     {
  1722.         case AUDIO:
  1723.             break;
  1724.         case MODE_2_FORM_2:
  1725.             break;
  1726.         default:    // not an audio track
  1727.             return FALSE;
  1728.     }
  1729.     
  1730.     // if the length times are not right, exit
  1731.     if (!((length.frames  > MIN_FRAMES)  || (length.frames  < MAX_FRAMES)))  return FALSE;
  1732.     if (!((length.seconds > MIN_SECONDS) || (length.frames  < MAX_SECONDS))) return FALSE;
  1733.     // 4500 is 75 Frames * 60 Seconds, or the number of frames per minute
  1734.     if (!((length.minutes > MIN_MINUTES) || (length.minutes < m_discFreeSpace/BLOCKS_IN_ONE_MINUTE))) return FALSE;
  1735.     
  1736.     // restore START status
  1737.     if ((pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType == START)  ||
  1738.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType == PREGAP))
  1739.     {
  1740.         pTempTrack->m_trackStartSet = FALSE;
  1741.     }
  1742.     
  1743.     // restore the old disc size
  1744.     blockLength = pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.frames + 
  1745.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds * BLOCKS_IN_ONE_SECOND) + 
  1746.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes * BLOCKS_IN_ONE_MINUTE);
  1747.     m_discFreeSpace   += blockLength;
  1748.     m_discCurrentSize -= blockLength;
  1749.         
  1750.     // insert the right data for silence data
  1751.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType           = SILENCE;
  1752.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].filename           = "";
  1753.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.minutes  = 0;
  1754.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.seconds  = 0;
  1755.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.frames   = 0;
  1756.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthData         = 0;
  1757.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes = length.minutes;
  1758.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds = length.seconds;
  1759.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.frames  = length.frames;
  1760.     
  1761.     // the disc sizes have changed, so adjust them accordingly
  1762.     blockLength = length.frames + 
  1763.         (length.seconds * BLOCKS_IN_ONE_SECOND) + (length.minutes * BLOCKS_IN_ONE_MINUTE);
  1764.     m_discFreeSpace   -= blockLength;
  1765.     m_discCurrentSize += blockLength;
  1766.     
  1767.     return TRUE;
  1768. }
  1769. FXbool CFreeburnDisc::activeTrackDataSetZero(FXuint length)
  1770. {
  1771.     FXint blockLength;
  1772.     
  1773.     // a pointer to the active track class, to reduce typing
  1774.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1775.     
  1776.     // if the track type isn't an data type, exit
  1777.     switch (pTempTrack->m_trackMode)
  1778.     {
  1779.         case MODE_1:
  1780.             break;
  1781.         case MODE_1_RAW:
  1782.             break;
  1783.         case MODE_2_FORM_1:
  1784.             break;
  1785.         case MODE_2_RAW:
  1786.             break;
  1787.         default:    // not a data track
  1788.             return FALSE;
  1789.     }
  1790.     
  1791.     // if the length is too big, then exit
  1792.     if (length > m_discFreeSpace) return FALSE;
  1793.     
  1794.     // restore START status
  1795.     if ((pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType == START)  ||
  1796.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType == PREGAP))
  1797.     {
  1798.         pTempTrack->m_trackStartSet = FALSE;
  1799.     }
  1800.     
  1801.     // restore old disc size
  1802.     blockLength = pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthData / BYTES_IN_ONE_BLOCK;
  1803.     // if there is a remainder from the divide, add 1 block that will contain the remaining space
  1804.     if ((pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthData % BYTES_IN_ONE_BLOCK) != 0) 
  1805.         blockLength += 1;
  1806.     m_discFreeSpace   += blockLength;
  1807.     m_discCurrentSize -= blockLength;
  1808.         
  1809.     // insert the right data for zero data
  1810.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType           = ZERO;
  1811.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].filename           = "";
  1812.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.minutes  = 0;
  1813.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.seconds  = 0;
  1814.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.frames   = 0;
  1815.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthData         = length;
  1816.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes = 0;
  1817.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds = 0;
  1818.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.frames  = 0;
  1819.     
  1820.     // the disc sizes have changed, so adjust them accordingly
  1821.     blockLength = length / BYTES_IN_ONE_BLOCK;
  1822.     if ((length % BYTES_IN_ONE_BLOCK) != 0) // there is a remainder from the divide, so add 1
  1823.         blockLength += 1;
  1824.     m_discFreeSpace   -= blockLength;
  1825.     m_discCurrentSize += blockLength;
  1826.     
  1827.     return TRUE;
  1828. }
  1829. FXbool CFreeburnDisc::activeTrackDataSetStart(DiscTime length)
  1830. {
  1831.     FXint blockLength;
  1832.     
  1833.     // a pointer to the active track class, to reduce typing
  1834.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1835.     
  1836.     // START can be used on audio and data tracks, but if START was already 
  1837.     // set for this track (we don't want it), return false
  1838.     if (pTempTrack->m_trackStartSet &&
  1839.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType != START)  &&
  1840.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType != PREGAP)) 
  1841.         return FALSE;
  1842.         
  1843.     // if the length times are not right, exit
  1844.     if (!((length.frames  > MIN_FRAMES)  || (length.frames  < MAX_FRAMES)))  return FALSE;
  1845.     if (!((length.seconds > MIN_SECONDS) || (length.frames  < MAX_SECONDS))) return FALSE;
  1846.     // 4500 is 75 Frames * 60 Seconds, or the number of frames per minute
  1847.     if (!((length.minutes > MIN_MINUTES) || (length.minutes < m_discFreeSpace/BLOCKS_IN_ONE_MINUTE))) return FALSE;
  1848.     
  1849.     // restore START status
  1850.     if ((pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType == START)  ||
  1851.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType == PREGAP))
  1852.     {
  1853.         pTempTrack->m_trackStartSet = FALSE;
  1854.     }
  1855.     
  1856.     // restore the old disc size
  1857.     blockLength = pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.frames + 
  1858.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds * BLOCKS_IN_ONE_SECOND) + 
  1859.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes * BLOCKS_IN_ONE_MINUTE);
  1860.     m_discFreeSpace   += blockLength;
  1861.     m_discCurrentSize -= blockLength;
  1862.         
  1863.     // insert the right data for start data
  1864.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType           = START;
  1865.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].filename           = "";
  1866.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.minutes  = 0;
  1867.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.seconds  = 0;
  1868.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.frames   = 0;
  1869.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthData         = 0;
  1870.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes = length.minutes;
  1871.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds = length.seconds;
  1872.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.frames  = length.frames;
  1873.     
  1874.     // set START
  1875.     pTempTrack->m_trackStartSet = TRUE;
  1876.     
  1877.     // the disc sizes have changed, so adjust them accordingly
  1878.     blockLength = length.frames + 
  1879.         (length.seconds * BLOCKS_IN_ONE_SECOND) + (length.minutes * BLOCKS_IN_ONE_MINUTE);
  1880.     m_discFreeSpace   -= blockLength;
  1881.     m_discCurrentSize += blockLength;
  1882.     
  1883.     return TRUE;
  1884. }
  1885. FXbool CFreeburnDisc::activeTrackDataSetPregap(DiscTime length)
  1886. {
  1887.     FXint blockLength;
  1888.     
  1889.     // a pointer to the active track class, to reduce typing
  1890.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1891.     
  1892.     // pregap can be used on audio or data tracks, but it replaces
  1893.     // START, so we can't do this if start is set.
  1894.     // if start was already set for this track, return false
  1895.     if (pTempTrack->m_trackStartSet &&
  1896.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType != START)  &&
  1897.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType != PREGAP)) 
  1898.         return FALSE;
  1899.         
  1900.     // if the length times are not right, exit
  1901.     if (!((length.frames  > MIN_FRAMES)  || (length.frames  < MAX_FRAMES)))  return FALSE;
  1902.     if (!((length.seconds > MIN_SECONDS) || (length.frames  < MAX_SECONDS))) return FALSE;
  1903.     // 4500 is 75 Frames * 60 Seconds, or the number of frames per minute
  1904.     if (!((length.minutes > MIN_MINUTES) || (length.minutes < m_discFreeSpace/BLOCKS_IN_ONE_MINUTE))) return FALSE;
  1905.     
  1906.     // restore START status
  1907.     if ((pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType == START)  ||
  1908.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType == PREGAP))
  1909.     {
  1910.         pTempTrack->m_trackStartSet = FALSE;
  1911.     }
  1912.     
  1913.     // restore the old disc size
  1914.     blockLength = pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.frames + 
  1915.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds * BLOCKS_IN_ONE_SECOND) + 
  1916.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes * BLOCKS_IN_ONE_MINUTE);
  1917.     m_discFreeSpace   += blockLength;
  1918.     m_discCurrentSize -= blockLength;
  1919.         
  1920.     // insert the right data for pregap data
  1921.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType           = PREGAP;
  1922.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].filename           = "";
  1923.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.minutes  = 0;
  1924.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.seconds  = 0;
  1925.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.frames   = 0;
  1926.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthData         = 0;
  1927.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes = length.minutes;
  1928.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds = length.seconds;
  1929.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.frames  = length.frames;
  1930.     
  1931.     // set START
  1932.     pTempTrack->m_trackStartSet = TRUE;
  1933.     
  1934.     // the disc sizes have changed, so adjust them accordingly
  1935.     blockLength = length.frames + 
  1936.         (length.seconds * BLOCKS_IN_ONE_SECOND) + (length.minutes * BLOCKS_IN_ONE_MINUTE);
  1937.     m_discFreeSpace   -= blockLength;
  1938.     m_discCurrentSize += blockLength;
  1939.     
  1940.     return TRUE;
  1941. }
  1942. FXbool CFreeburnDisc::activeTrackDataSetIndex(DiscTime length)
  1943. {
  1944.     FXint blockLength;
  1945.     
  1946.     // a pointer to the active track class, to reduce typing
  1947.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  1948.     
  1949.     // if the track type isn't an audio type, exit
  1950.     switch (pTempTrack->m_trackMode)
  1951.     {
  1952.         case AUDIO:
  1953.             break;
  1954.         case MODE_2_FORM_2:
  1955.             break;
  1956.         default:    // not an audio track
  1957.             return FALSE;
  1958.     }
  1959.     
  1960.     // if the length times are not right, exit
  1961.     if (!((length.frames  > MIN_FRAMES)  || (length.frames  < MAX_FRAMES)))  return FALSE;
  1962.     if (!((length.seconds > MIN_SECONDS) || (length.frames  < MAX_SECONDS))) return FALSE;
  1963.     // 4500 is 75 Frames * 60 Seconds, or the number of frames per minute
  1964.     if (!((length.minutes > MIN_MINUTES) || (length.minutes < m_discFreeSpace/BLOCKS_IN_ONE_MINUTE))) return FALSE;
  1965.     
  1966.     // restore START status
  1967.     if ((pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType == START)  ||
  1968.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType == PREGAP))
  1969.     {
  1970.         pTempTrack->m_trackStartSet = FALSE;
  1971.     }
  1972.     
  1973.     // restore the old disc size
  1974.     blockLength = pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.frames + 
  1975.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds * BLOCKS_IN_ONE_SECOND) + 
  1976.         (pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes * BLOCKS_IN_ONE_MINUTE);
  1977.     m_discFreeSpace   += blockLength;
  1978.     m_discCurrentSize -= blockLength;
  1979.         
  1980.     // insert the right data for index data
  1981.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].dataType           = INDEX;
  1982.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].filename           = "";
  1983.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.minutes  = 0;
  1984.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.seconds  = 0;
  1985.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].startTime.frames   = 0;
  1986.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthData         = 0;
  1987.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.minutes = length.minutes;
  1988.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.seconds = length.seconds;
  1989.     pTempTrack->m_trackDataArray[pTempTrack->m_trackDataArrayIndex].lengthTime.frames  = length.frames;
  1990.     
  1991.     // the disc sizes have changed, so adjust them accordingly
  1992.     blockLength = length.frames + 
  1993.         (length.seconds * BLOCKS_IN_ONE_SECOND) + (length.minutes * BLOCKS_IN_ONE_MINUTE);
  1994.     m_discFreeSpace   -= blockLength;
  1995.     m_discCurrentSize += blockLength;
  1996.     
  1997.     return TRUE;
  1998. }
  1999. // This method will double the size of the active tracks
  2000. // data array, in case the size of the array is too small
  2001. FXbool CFreeburnDisc::activeTrackGrowDataArray()
  2002. {
  2003.     // a pointer to the active track class, to reduce typing
  2004.     CFreeburnTrack* pTempTrack = m_trackArray[m_currentTrackIndex];
  2005.     
  2006.     // a temp pointer to the current track data array
  2007.     TrackDataStruct* tempTrackData = pTempTrack->m_trackDataArray;
  2008.     // a pointer to the new track data array
  2009.     TrackDataStruct* newTrackData;
  2010.     
  2011.     // allocate the new data array for twice the size of the current array
  2012.     newTrackData = new TrackDataStruct[pTempTrack->m_trackDataArrayLength * 2];
  2013.     
  2014.     // copy the items in the old array to the new array
  2015.     for (FXint i = 0; i < pTempTrack->m_trackDataArrayLength; i++)
  2016.     {
  2017.         newTrackData[i].dataType           = tempTrackData[i].dataType;
  2018.         newTrackData[i].filename           = tempTrackData[i].filename;
  2019.         newTrackData[i].startTime.minutes  = tempTrackData[i].startTime.minutes;
  2020.         newTrackData[i].startTime.seconds  = tempTrackData[i].startTime.seconds;
  2021.         newTrackData[i].startTime.frames   = tempTrackData[i].startTime.frames;
  2022.         newTrackData[i].lengthData         = tempTrackData[i].lengthData;
  2023.         newTrackData[i].lengthTime.minutes = tempTrackData[i].lengthTime.minutes;
  2024.         newTrackData[i].lengthTime.seconds = tempTrackData[i].lengthTime.seconds;
  2025.         newTrackData[i].lengthTime.frames  = tempTrackData[i].lengthTime.frames;
  2026.     }
  2027.     
  2028.     // set the new array length size
  2029.     pTempTrack->m_trackDataArrayLength *= 2;
  2030.     
  2031.     // delete the old array
  2032.     delete[] m_trackArray[m_currentTrackIndex]->m_trackDataArray;
  2033.     
  2034.     // assign the new array to the class array pointer
  2035.     m_trackArray[m_currentTrackIndex]->m_trackDataArray = newTrackData;
  2036.     
  2037.     return TRUE;
  2038. }