#ifndef _FILEINFOS_CLASS_HPP
#define _FILEINFOS_CLASS_HPP

/*
**
** FileInfosC.hpp
**
** $VER: FileInfosC.hpp 1.0 (12.04.98)
**
** $Revision: 1.3 $
** $State: Exp $
** $Date: 1998/08/16 19:03:36 $
**
** $Log: FileInfosC.hpp $
** Revision 1.3  1998/08/16 19:03:36  kakace
** Version Beta3+
**
** Revision 1.2  1998/08/02 15:17:02  kakace
** Fonctionnement OK (Layer 1/2 + Stereo/JStereo)
**
** Revision 1.1  1998/07/24 14:26:52  kakace
** Automatic global CheckIn
**
** Revision 1.16  1998/07/24 14:14:25  kakace
** Version intermédiaire (CheckIn global)
**
** Revision 1.14  1998/07/02 15:51:58  kakace
** Automatic global CheckIn
**
*/



//----------------------------------------------------------------------------------------------------

#ifndef  _INCLUDE_STRING_H
#include <string.h>
#endif

#ifndef  CLASSES_LISTS_HPP
#include "Lists.hpp"
#endif

#ifndef  _ENCODERCONFIG_CLASS_HPP
#include "EncoderConfigC.hpp"
#endif


// Formats audio supportés.

enum e_AudioTypes {AFT_UNKNOWN,             // Format inconnu.
                   AFT_AIFF,                // IFF/AIFF
                   AFT_MAUD,                // IFF/MAUD
                   AFT_WAV,                 // RIFF/WAV
                   AFT_CDDA,                // CDDA         (Motorola)
                   AFT_CDDA_INTEL,          // CDDA         (Intel)
                   AFT_PCM,                 // RAW/PCM      (Format déterminé par l'extension).
                   AFT_DEFAULT,             // RAW/PCM      (Hypothèse).
                   // Fichiers rejetés...
                   AFT_NOT_AUDIO,           // Fichier audio, non supporté pour le moment.
                   AFT_BAD_AIFF,            // Fichier AIFF non supporté.
                   AFT_BAD_MAUD,            // Fichier MAUD non supporté.
                   AFT_BAD_WAV};            // Fichier WAV non supporté.


// Codes d'erreur.

enum e_IoErrors {IOERR_NONE,                // Pas d'erreur.
                 IOERR_WARN,                // Avertissements (placés par Pégase)
                 IOERR_DOS,                 // Erreur du DOS (non précisée).
                 IOERR_IFF,                 // Erreur générale IFF.
                 IOERR_OPEN,                // Erreur pendant l'ouverture du fichier.
                 IOERR_READ,                // Erreur de la lecture du fichier.
                 IOERR_WRITE,               // Erreur d'écriture du fichier.
                 IOERR_INTERNAL,            // Erreurs internes (placées par Pégase)
                 IOERR_NO_MEMORY};          // Plus de mémoire.


// Structures particulières.

struct s_Time{UBYTE bMinutes;
              UBYTE bSecondes;
             };


union u_Time{UWORD  iTime;
             s_Time sTime;
            };


//----------------------------------------------------------------------------------------------------
//========================================= class FileInfos ==========================================
//----------------------------------------------------------------------------------------------------
//
//   Chaque objet de cette classe centralise les informations concernant un fichier précis. Il est
// utilisé pour mémoriser les réglages particulier du fichier, et sert aussi de référence aux objets
// manipulant ce fichier (comme la classe InputStreamC par exemple).
//
//   Le type du fichier est stocké en tant que priorité de l'objet Node. Cela permet de chaîner les
// objets en les regroupant par type.

typedef const char * STRING;


class FileInfosC : public CNode, public EncoderConfigC
{
    public:

        // Constructeur et destructeur.

        FileInfosC(STRING cFileName, STRING cPathName, EncoderConfigC &roConfig);
        ~FileInfosC();

        // Fonctions d'accès aux membres privés.

        const char  *GetAudioName() const;

        e_AudioTypes GetFileType()     const {return (e_AudioTypes) NodePri();}
        e_IoErrors   GetIoError()      const {return fi_iIoError;}
        LONG         GetError2()       const {return fi_iError2;}
        ULONG        GetSamplingFreq() const {return fi_iSamplingFreq;}
        ULONG        GetNumFrames()    const {return fi_iNumFrames;}
        ULONG        GetNumSamples()   const {return fi_iTotalSamples;}
        UBYTE        GetNumChannels()  const {return fi_bNumChannels;}
        char        *GetPathName()     const {return fi_cFullPath;}
        u_Time       GetTime()         const {return fi_sTime;}

        void    DefineOutputName();

        void    ComputeTime();                                              // Calculer la durée du fichier.
        int     OverrideSettings(ULONG iSampleFreq, UBYTE bNumChannels);    // Modifier les réglages.

        void    SetFileLength(ULONG iLength) {fi_iFileLength = iLength;}
        ULONG   GetFileLength() const        {return fi_iFileLength;}

        void    SetNumFrames(ULONG iFrames);                    // Définir le nombre de frames.
        void    SetIoError(e_IoErrors iErr, LONG iErr2 = 0);    // Définir les codes d'erreur.
        void    SetFileType(e_AudioTypes iFileType)             // Définir le type du fichier.
                {NodePri(iFileType);}
        void    SetByteOrder(UBYTE bByteOrderFlag) {ecfg_iIntelFormat = bByteOrderFlag;}

    protected:

        char         *fi_cFullPath;         // Nom complet du répertoire parent.
        e_IoErrors    fi_iIoError;          // Code d'erreur. 0 = OK.
        LONG          fi_iError2;           // Code d'erreur spécifique (DOS/IFF/...)

        // Données définies par le fichier.

        ULONG         fi_iSamplingFreq;     // Fréquence d'échantillonage (0 = non définie)
        ULONG         fi_iNumFrames;        // Nombre d'échantillons par canal (0 = non défini)
        ULONG         fi_iTotalSamples;     // Nombre total d'échantillons.
        ULONG         fi_iFileLength;       // Longueur du fichier.
        UBYTE         fi_bNumChannels;      // Nombre de canaux (0 = non défini)
        UBYTE         fi_bPad;
        u_Time        fi_sTime;             // Durée du fichier (88:88 si inconnue).

        EncoderConfigC &fi_roDefConfig;     // Réglages par défaut de l'encodeur.

        FileInfosC& operator = (const FileInfosC &);
};


//----------------------------------------------------------------------------------------------------

inline void FileInfosC::SetIoError(e_IoErrors iErr, LONG iErr2)
{
    fi_iIoError = iErr;
    fi_iError2 = iErr2;
}

#endif  // _FILEINFOS_CLASS_HPP

