home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Amiga 14 / MA_Cover_14.iso / source / c / pegase_src / fileinfosc.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1999-08-15  |  10.8 KB  |  429 lines

  1. /*
  2. **
  3. ** FileInfosC.cpp
  4. **
  5. ** $VER: FileInfoC.cpp 1.1 (13.04.98)
  6. **
  7. ** $Revision: 1.3 $
  8. ** $State: Exp $
  9. ** $Date: 1998/08/16 19:03:36 $
  10. **
  11. ** $Log: FileInfosC.cpp $
  12. ** Revision 1.3  1998/08/16 19:03:36  kakace
  13. ** Version Beta3+
  14. **
  15. ** Revision 1.2  1998/08/02 15:17:03  kakace
  16. ** Fonctionnement OK (Layer 1/2 + Stereo/JStereo)
  17. **
  18. ** Revision 1.1  1998/07/24 14:26:52  kakace
  19. ** Automatic global CheckIn
  20. **
  21. ** Revision 1.19  1998/07/24 14:14:25  kakace
  22. ** Version intermédiaire (CheckIn global)
  23. **
  24. ** Revision 1.17  1998/07/02 15:51:59  kakace
  25. ** Automatic global CheckIn
  26. **
  27. */
  28.  
  29.  
  30. //----------------------------------------------------------------------------------------------------
  31.  
  32. /// Includes
  33.  
  34. #ifndef  _INCLUDE_STDLIB_H
  35. #include <stdlib.h>
  36. #endif
  37.  
  38. #ifndef  _PEGASE_HPP
  39. #include "Pegase.hpp"
  40. #endif
  41.  
  42. #ifndef  _FILEINFOS_CLASS_HPP
  43. #include "FileInfosC.hpp"
  44. #endif
  45.  
  46. #ifndef  CLASS_DISPLAY_HPP
  47. #include "Display.hpp"
  48. #endif
  49.  
  50. #define  CATCOMP_NUMBERS
  51. #ifndef  PEGASE_H
  52. #include "Pegase.h"
  53. #endif
  54.  
  55. ///
  56.  
  57.  
  58. //----------------------------------------------------------------------------------------------------
  59. //======================================== Fonctions locales =========================================
  60. //----------------------------------------------------------------------------------------------------
  61.  
  62. // Allouer un tampon et y copier la chaîne transmise en argument.
  63.  
  64. inline char *DuplicateString(STRING str)
  65. {
  66.     char *s = NULL;
  67.  
  68.     if (str && *str)
  69.     {
  70.         s = new char[ strlen(str)+1 ];
  71.  
  72.         if (s) strcpy(s, str);
  73.     }
  74.  
  75.     return s;                               // Chaîne nulle ou pointeur nul.
  76. }
  77.  
  78.  
  79. //----------------------------------------------------------------------------------------------------
  80. //========================================= class FileInfos ==========================================
  81. //----------------------------------------------------------------------------------------------------
  82.  
  83. /// FileInfosC::CONSTRUCTOR
  84. /****** Class FileInfosC/CONSTRUCTOR ****************************************
  85. *
  86. *   NAME
  87. *   FileInfosC::FileInfosC -- Constructeur
  88. *
  89. *   SYNOPSIS
  90. *   FileInfosC::FileInfosC(cFileName, cPath, roConfig)
  91. *
  92. *   FileInfosC::FileInfosC(STRING, STRING, EncoderConfigC);
  93. *
  94. *   FUNCTION
  95. *   Crée un objet FileInfos pour le fichier indiqué.
  96. *   Le nom du fichier et le nom du répertoire parent sont recopiés dans un
  97. *   tampon privé.
  98. *
  99. *   INPUTS
  100. *   cFileName - Nom du fichier à examiner.
  101. *   cPath     - Nom du répertoire contenant ce fichier.
  102. *   roConfig  - Paramètres choisis pour l'encodeur.
  103. *
  104. *   SEE ALSO
  105. *   DESTRUCTOR.
  106. *
  107. *****************************************************************************
  108. *
  109. */
  110.  
  111.  
  112. FileInfosC::FileInfosC(STRING cFileName, STRING cPath, EncoderConfigC &roConfig) : EncoderConfigC(roConfig), fi_roDefConfig(roConfig)
  113. {
  114.     char *name;
  115.  
  116.     // Dupliquer le nom du fichier ainsi que son chemin d'accès complet.
  117.  
  118.     name         = DuplicateString(cFileName);
  119.     fi_cFullPath = DuplicateString(cPath);
  120.  
  121.     // Initialiser les membres données.
  122.  
  123.     ComputeTime();
  124.  
  125.     if (name && fi_cFullPath)
  126.     {
  127.         NodeName(name);                          // Le nom du fichier constitue le nom du noeud.
  128.         NodeType(AFT_UNKNOWN);                   // Type de fichier inconnu (pour le moment).
  129.     }
  130.     else
  131.     {
  132.         fi_iIoError = IOERR_NO_MEMORY;
  133.     }
  134. }
  135. ///
  136. /// FileInfosC::DESTRUCTOR
  137. /****** Class FileInfosC/DESTRUCTOR *****************************************
  138. *
  139. *   NAME
  140. *   FileInfosC::~FileInfosC -- Destructeur
  141. *
  142. *   SYNOPSIS
  143. *   FileInfosC::~FileInfosC()
  144. *
  145. *   FileInfosC::~FileInfosC();
  146. *
  147. *   FUNCTION
  148. *   Détruit l'objet FileInfos. Les tampons alloués pour la duplication des
  149. *   chaînes (nom du fichier et du répertoire) sont libérés.
  150. *
  151. *   SEE ALSO
  152. *   CONSTRUCTOR
  153. *
  154. *****************************************************************************
  155. *
  156. */
  157.  
  158.  
  159. FileInfosC::~FileInfosC()
  160. {
  161.     // Libérer les tampons alloués pour la duplication du nom du fichier (= nom du noeud) ainsi
  162.     // que de son chemin d'accès. (Cf constructeur de la classe).
  163.  
  164.     char *s = (char *) NodeName();
  165.  
  166.     delete [] s;
  167.     delete [] fi_cFullPath;
  168. }
  169. ///
  170. /// FileInfosC::ComputeTime()
  171. /****** Class FileInfosC/ComputeTime ****************************************
  172. *
  173. *   NAME
  174. *   FileInfosC::ComputeTime -- Calculer la durée du fichier.
  175. *
  176. *   SYNOPSIS
  177. *   FileInfosC::ComputeTime()
  178. *
  179. *   void FileInfosC::ComputeTime();
  180. *
  181. *   FUNCTION
  182. *   Calcule la durée du fichier en se basant sur le nombre d'échantillons par
  183. *   canal et la fréquence d'échantillonage. Si l'une de ces deux valeurs n'
  184. *   est pas connue, la durée du fichier est définie avec "88:88".
  185. *
  186. *   SEE ALSO
  187. *   FileInfosC::OverrideSettings()
  188. *
  189. *****************************************************************************
  190. *
  191. */
  192.  
  193.  
  194. void FileInfosC::ComputeTime()
  195. {
  196.     if (fi_iSamplingFreq == 0 || fi_iNumFrames == 0)
  197.     {
  198.         fi_sTime.iTime = 0x5858;     // 88:88
  199.     }
  200.     else
  201.     {
  202.         div_t t;
  203.         ULONG iNumSecs = fi_iNumFrames / fi_iSamplingFreq;
  204.  
  205.         t = div(iNumSecs, 60);
  206.         fi_sTime.sTime.bMinutes  = t.quot;
  207.         fi_sTime.sTime.bSecondes = t.rem;
  208.     }
  209. }
  210. ///
  211. /// FileInfosC::OverrideSettings()
  212. /****** Class FileInfosC/OverrideSettings ***********************************
  213. *
  214. *   NAME
  215. *   FileInfosC::OverrideSettings -- Modifie les réglages.
  216. *
  217. *   SYNOPSIS
  218. *   Result = FileInfosC::OverrideSettings(iSampleFreq, bNumChannels)
  219. *
  220. *   bool FileInfosC::OverrideSettings(ULONG, UBYTE);
  221. *
  222. *   FUNCTION
  223. *   Modifie la fréquence d'échantillonage et le nombre de canaux du fichier
  224. *   audio.
  225. *
  226. *   INPUTS
  227. *   iSampleFreq  - Fréquence d'échantillonage (Hz)
  228. *   bNumChannels - Nombre de canaux (1 = mono, 2 = stéréo).
  229. *
  230. *   RESULT
  231. *   Result - TRUE s'il n'y a pas eu d'erreur.
  232. *
  233. *   NOTES
  234. *   La modification de ces valeurs entraîne le recalcul de la durée du
  235. *   fichier. D'autre part, les nouvelles valeurs entrainent aussi une
  236. *   modification des réglages de l'encodeur (fréquence d'échantillonage et
  237. *   mode d'encodage).
  238. *
  239. *   SEE ALSO
  240. *   FileInfosC::ComputeTime()
  241. *
  242. *****************************************************************************
  243. *
  244. *   15.07.98 : Utilise la fréquence d'échantillonage mentionnée sur la ligne
  245. *       de commande (ou celle par défaut) lorsque la fonction reçoit la
  246. *       valeur 0 comme fréquence. Dans le cas contraire, les fichiers RAW
  247. *       sont toujours encodés avec la plus petite fréquence possible, c'est
  248. *       à dire 32 KHz.
  249. *
  250. */
  251.  
  252.  
  253. int FileInfosC::OverrideSettings(ULONG iSampleFreq, UBYTE bNumChannels)
  254. {
  255.     if (bNumChannels == 0 || bNumChannels > 2) return FALSE;
  256.  
  257.     if (iSampleFreq == 0)
  258.     {
  259.         iSampleFreq = fi_roDefConfig.GetSampleFreq();
  260.     }
  261.  
  262.     fi_iSamplingFreq = iSampleFreq;
  263.     fi_bNumChannels  = bNumChannels;
  264.     fi_iTotalSamples = fi_iNumFrames * fi_bNumChannels;
  265.  
  266.     // Modifier la fréquence d'échantillonage utilisée par l'encodeur.
  267.  
  268.     if (!SetSampleFreq(iSampleFreq)) return FALSE;
  269.  
  270.     // Modifier le mode d'encodage de l'encodeur en fonction du nombre de canaux.
  271.     //
  272.     //  Fichier     Réglage par défaut      Nouveau réglage
  273.     //  Mono        Dual channel            Dual channel
  274.     //  Mono        #?                      Mono
  275.     //  Stereo      Joint stereo            Joint stereo
  276.     //  Stereo      #?                      Stereo
  277.  
  278.     e_Encoding eMode = fi_roDefConfig.GetEncodingMode();
  279.  
  280.     if (bNumChannels == 1)
  281.     {
  282.         SetEncodingMode( (eMode == DUALCHANNEL) ? DUALCHANNEL : MONO);
  283.     }
  284.     else
  285.     {
  286.         SetEncodingMode( (eMode == JOINTSTEREO) ? JOINTSTEREO : STEREO);
  287.     }
  288.  
  289.     ComputeTime();          // Modifier la durée du fichier.
  290.  
  291.     return TRUE;
  292. }
  293. ///
  294. /// FileInfosC::SetNumFrames()
  295. /****** Class FileInfosC/SetNumFrames ***************************************
  296. *
  297. *   NAME
  298. *   FileInfosC::SetNumFrames -- Définir le nombre de frames.
  299. *
  300. *   SYNOPSIS
  301. *   FileInfosC::SetNumFrames(iFrames)
  302. *
  303. *   void FileInfosC::SetNumFrames(ULONG);
  304. *
  305. *   FUNCTION
  306. *   Définir le nombre d'échantillons disponibles dans le fichier. Il s'agit
  307. *   du nombre d'échantillons par canal, et non du nombre total d'échantillons
  308. *
  309. *   INPUTS
  310. *   iFrames - Nombre d'échantillons par canal.
  311. *
  312. *   NOTES
  313. *   Cette fonction provoque le recalcul de la durée du fichier audio.
  314. *
  315. *   SEE ALSO
  316. *   FileInfosC::ComputeTime()
  317. *
  318. *****************************************************************************
  319. *
  320. */
  321.  
  322.  
  323. void FileInfosC::SetNumFrames(ULONG iFrames)
  324. {
  325.     fi_iNumFrames    = iFrames;
  326.     fi_iTotalSamples = iFrames * fi_bNumChannels;
  327.     ComputeTime();
  328. }
  329. ///
  330. /// FileInfosC::DefineOutputName()
  331. /****** Class FileInfosC/DefineOutputName ***********************************
  332. *
  333. *   NAME
  334. *   FileInfosC::DefineOutputName -- Définie le nom du fichier encodé.
  335. *
  336. *   SYNOPSIS
  337. *   FileInfosC::DefineOutputName()
  338. *
  339. *   void FileInfosC::DefineOutputName();
  340. *
  341. *   FUNCTION
  342. *   Détermine le nom du fichier à encoder.
  343. *   La configuration globale de l'encodeur permet trois situations distinctes
  344. *   qui sont :
  345. *   - Aucune destination n'est définie. Dans ce cas, le fichier encodé est
  346. *     placé dans le même répertoire que le fichier audio. L'extension "mp?"
  347. *     est ajoutée au nom du fichier après suppression de l'extension
  348. *     originale
  349. *   - La destination correspond à un répertoire. Le fichier encodé sera placé
  350. *     dans ce répertoire, l'extension "mp?" étant ajoutée au nom du fichier
  351. *     après suppression de l'extension originale.
  352. *   - La destination est un nom de fichier. Le fichier encodé portera ce nom
  353. *     et sera placé dans le répertoire éventuellement indiqué avec ce nom.
  354. *
  355. *   NOTES
  356. *
  357. *   BUGS
  358. *
  359. *****************************************************************************
  360. *
  361. */
  362.  
  363.  
  364. void FileInfosC::DefineOutputName()
  365. {
  366.     char sNameBuff[32];
  367.     char sPathBuff[512];
  368.     char *pos;
  369.  
  370.     if (GetTargetType() == TARGET_FILE) return;
  371.  
  372.     if (GetTargetType() == TARGET_DIRECTORY)
  373.     {
  374.         strcpy(sPathBuff, GetOutputName());
  375.     }
  376.  
  377.     if (GetTargetType() == TARGET_EMPTY)
  378.     {
  379.         strcpy(sPathBuff, GetPathName());
  380.     }
  381.  
  382.     strncpy(sNameBuff, NodeName(), 26);
  383.     sNameBuff[26] = '\0';
  384.  
  385.     if ( (pos = strrchr(sNameBuff, '.')) )
  386.         sNameBuff[pos - sNameBuff] = '\0';
  387.  
  388.     strcat(sNameBuff, asExtensions[GetLayer()]);
  389.  
  390.     AddPart(sPathBuff, sNameBuff, sizeof(sPathBuff));
  391.     SetOutputName(sPathBuff);
  392. }
  393. ///
  394.  
  395. //----------------------------------------------------------------------------------------------------
  396.  
  397. /// FileInfosC::GetAudioName()
  398. const char *FileInfosC::GetAudioName() const
  399. {
  400.     switch (NodePri())
  401.     {
  402.         case AFT_AIFF:
  403.             return "IFF-AIFF";
  404.  
  405.         case AFT_MAUD:
  406.             return "IFF-MAUD";
  407.  
  408.         case AFT_WAV:
  409.             return "RIFF-WAV";
  410.  
  411.         case AFT_CDDA:
  412.             return "CD AUDIO Motorola";
  413.  
  414.         case AFT_CDDA_INTEL:
  415.             return "CD AUDIO Intel";
  416.  
  417.         case AFT_PCM:
  418.             return "RAW/PCM 16 bits mono";
  419.  
  420.         case AFT_DEFAULT:
  421.             return GetString(MSG_ASSUME_RAW_TXT);
  422.  
  423.         case AFT_UNKNOWN:
  424.             return GetString(MSG_UNKNOWN_FILE_FORMAT);
  425.     }
  426. }
  427. ///
  428.  
  429.