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


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

/// Includes

#ifndef  _INCLUDE_STDLIB_H
#include <stdlib.h>
#endif

#ifndef  _PEGASE_HPP
#include "Pegase.hpp"
#endif

#ifndef  _FILEINFOS_CLASS_HPP
#include "FileInfosC.hpp"
#endif

#ifndef  CLASS_DISPLAY_HPP
#include "Display.hpp"
#endif

#define  CATCOMP_NUMBERS
#ifndef  PEGASE_H
#include "Pegase.h"
#endif

///


//----------------------------------------------------------------------------------------------------
//======================================== Fonctions locales =========================================
//----------------------------------------------------------------------------------------------------

// Allouer un tampon et y copier la chaîne transmise en argument.

inline char *DuplicateString(STRING str)
{
    char *s = NULL;

    if (str && *str)
    {
        s = new char[ strlen(str)+1 ];

        if (s) strcpy(s, str);
    }

    return s;                               // Chaîne nulle ou pointeur nul.
}


//----------------------------------------------------------------------------------------------------
//========================================= class FileInfos ==========================================
//----------------------------------------------------------------------------------------------------

/// FileInfosC::CONSTRUCTOR
/****** Class FileInfosC/CONSTRUCTOR ****************************************
*
*   NAME
*   FileInfosC::FileInfosC -- Constructeur
*
*   SYNOPSIS
*   FileInfosC::FileInfosC(cFileName, cPath, roConfig)
*
*   FileInfosC::FileInfosC(STRING, STRING, EncoderConfigC);
*
*   FUNCTION
*   Crée un objet FileInfos pour le fichier indiqué.
*   Le nom du fichier et le nom du répertoire parent sont recopiés dans un
*   tampon privé.
*
*   INPUTS
*   cFileName - Nom du fichier à examiner.
*   cPath     - Nom du répertoire contenant ce fichier.
*   roConfig  - Paramètres choisis pour l'encodeur.
*
*   SEE ALSO
*   DESTRUCTOR.
*
*****************************************************************************
*
*/


FileInfosC::FileInfosC(STRING cFileName, STRING cPath, EncoderConfigC &roConfig) : EncoderConfigC(roConfig), fi_roDefConfig(roConfig)
{
    char *name;

    // Dupliquer le nom du fichier ainsi que son chemin d'accès complet.

    name         = DuplicateString(cFileName);
    fi_cFullPath = DuplicateString(cPath);

    // Initialiser les membres données.

    ComputeTime();

    if (name && fi_cFullPath)
    {
        NodeName(name);                          // Le nom du fichier constitue le nom du noeud.
        NodeType(AFT_UNKNOWN);                   // Type de fichier inconnu (pour le moment).
    }
    else
    {
        fi_iIoError = IOERR_NO_MEMORY;
    }
}
///
/// FileInfosC::DESTRUCTOR
/****** Class FileInfosC/DESTRUCTOR *****************************************
*
*   NAME
*   FileInfosC::~FileInfosC -- Destructeur
*
*   SYNOPSIS
*   FileInfosC::~FileInfosC()
*
*   FileInfosC::~FileInfosC();
*
*   FUNCTION
*   Détruit l'objet FileInfos. Les tampons alloués pour la duplication des
*   chaînes (nom du fichier et du répertoire) sont libérés.
*
*   SEE ALSO
*   CONSTRUCTOR
*
*****************************************************************************
*
*/


FileInfosC::~FileInfosC()
{
    // Libérer les tampons alloués pour la duplication du nom du fichier (= nom du noeud) ainsi
    // que de son chemin d'accès. (Cf constructeur de la classe).

    char *s = (char *) NodeName();

    delete [] s;
    delete [] fi_cFullPath;
}
///
/// FileInfosC::ComputeTime()
/****** Class FileInfosC/ComputeTime ****************************************
*
*   NAME
*   FileInfosC::ComputeTime -- Calculer la durée du fichier.
*
*   SYNOPSIS
*   FileInfosC::ComputeTime()
*
*   void FileInfosC::ComputeTime();
*
*   FUNCTION
*   Calcule la durée du fichier en se basant sur le nombre d'échantillons par
*   canal et la fréquence d'échantillonage. Si l'une de ces deux valeurs n'
*   est pas connue, la durée du fichier est définie avec "88:88".
*
*   SEE ALSO
*   FileInfosC::OverrideSettings()
*
*****************************************************************************
*
*/


void FileInfosC::ComputeTime()
{
    if (fi_iSamplingFreq == 0 || fi_iNumFrames == 0)
    {
        fi_sTime.iTime = 0x5858;     // 88:88
    }
    else
    {
        div_t t;
        ULONG iNumSecs = fi_iNumFrames / fi_iSamplingFreq;

        t = div(iNumSecs, 60);
        fi_sTime.sTime.bMinutes  = t.quot;
        fi_sTime.sTime.bSecondes = t.rem;
    }
}
///
/// FileInfosC::OverrideSettings()
/****** Class FileInfosC/OverrideSettings ***********************************
*
*   NAME
*   FileInfosC::OverrideSettings -- Modifie les réglages.
*
*   SYNOPSIS
*   Result = FileInfosC::OverrideSettings(iSampleFreq, bNumChannels)
*
*   bool FileInfosC::OverrideSettings(ULONG, UBYTE);
*
*   FUNCTION
*   Modifie la fréquence d'échantillonage et le nombre de canaux du fichier
*   audio.
*
*   INPUTS
*   iSampleFreq  - Fréquence d'échantillonage (Hz)
*   bNumChannels - Nombre de canaux (1 = mono, 2 = stéréo).
*
*   RESULT
*   Result - TRUE s'il n'y a pas eu d'erreur.
*
*   NOTES
*   La modification de ces valeurs entraîne le recalcul de la durée du
*   fichier. D'autre part, les nouvelles valeurs entrainent aussi une
*   modification des réglages de l'encodeur (fréquence d'échantillonage et
*   mode d'encodage).
*
*   SEE ALSO
*   FileInfosC::ComputeTime()
*
*****************************************************************************
*
*   15.07.98 : Utilise la fréquence d'échantillonage mentionnée sur la ligne
*       de commande (ou celle par défaut) lorsque la fonction reçoit la
*       valeur 0 comme fréquence. Dans le cas contraire, les fichiers RAW
*       sont toujours encodés avec la plus petite fréquence possible, c'est
*       à dire 32 KHz.
*
*/


int FileInfosC::OverrideSettings(ULONG iSampleFreq, UBYTE bNumChannels)
{
    if (bNumChannels == 0 || bNumChannels > 2) return FALSE;

    if (iSampleFreq == 0)
    {
        iSampleFreq = fi_roDefConfig.GetSampleFreq();
    }

    fi_iSamplingFreq = iSampleFreq;
    fi_bNumChannels  = bNumChannels;
    fi_iTotalSamples = fi_iNumFrames * fi_bNumChannels;

    // Modifier la fréquence d'échantillonage utilisée par l'encodeur.

    if (!SetSampleFreq(iSampleFreq)) return FALSE;

    // Modifier le mode d'encodage de l'encodeur en fonction du nombre de canaux.
    //
    //  Fichier     Réglage par défaut      Nouveau réglage
    //  Mono        Dual channel            Dual channel
    //  Mono        #?                      Mono
    //  Stereo      Joint stereo            Joint stereo
    //  Stereo      #?                      Stereo

    e_Encoding eMode = fi_roDefConfig.GetEncodingMode();

    if (bNumChannels == 1)
    {
        SetEncodingMode( (eMode == DUALCHANNEL) ? DUALCHANNEL : MONO);
    }
    else
    {
        SetEncodingMode( (eMode == JOINTSTEREO) ? JOINTSTEREO : STEREO);
    }

    ComputeTime();          // Modifier la durée du fichier.

    return TRUE;
}
///
/// FileInfosC::SetNumFrames()
/****** Class FileInfosC/SetNumFrames ***************************************
*
*   NAME
*   FileInfosC::SetNumFrames -- Définir le nombre de frames.
*
*   SYNOPSIS
*   FileInfosC::SetNumFrames(iFrames)
*
*   void FileInfosC::SetNumFrames(ULONG);
*
*   FUNCTION
*   Définir le nombre d'échantillons disponibles dans le fichier. Il s'agit
*   du nombre d'échantillons par canal, et non du nombre total d'échantillons
*
*   INPUTS
*   iFrames - Nombre d'échantillons par canal.
*
*   NOTES
*   Cette fonction provoque le recalcul de la durée du fichier audio.
*
*   SEE ALSO
*   FileInfosC::ComputeTime()
*
*****************************************************************************
*
*/


void FileInfosC::SetNumFrames(ULONG iFrames)
{
    fi_iNumFrames    = iFrames;
    fi_iTotalSamples = iFrames * fi_bNumChannels;
    ComputeTime();
}
///
/// FileInfosC::DefineOutputName()
/****** Class FileInfosC/DefineOutputName ***********************************
*
*   NAME
*   FileInfosC::DefineOutputName -- Définie le nom du fichier encodé.
*
*   SYNOPSIS
*   FileInfosC::DefineOutputName()
*
*   void FileInfosC::DefineOutputName();
*
*   FUNCTION
*   Détermine le nom du fichier à encoder.
*   La configuration globale de l'encodeur permet trois situations distinctes
*   qui sont :
*   - Aucune destination n'est définie. Dans ce cas, le fichier encodé est
*     placé dans le même répertoire que le fichier audio. L'extension "mp?"
*     est ajoutée au nom du fichier après suppression de l'extension
*     originale
*   - La destination correspond à un répertoire. Le fichier encodé sera placé
*     dans ce répertoire, l'extension "mp?" étant ajoutée au nom du fichier
*     après suppression de l'extension originale.
*   - La destination est un nom de fichier. Le fichier encodé portera ce nom
*     et sera placé dans le répertoire éventuellement indiqué avec ce nom.
*
*   NOTES
*
*   BUGS
*
*****************************************************************************
*
*/


void FileInfosC::DefineOutputName()
{
    char sNameBuff[32];
    char sPathBuff[512];
    char *pos;

    if (GetTargetType() == TARGET_FILE) return;

    if (GetTargetType() == TARGET_DIRECTORY)
    {
        strcpy(sPathBuff, GetOutputName());
    }

    if (GetTargetType() == TARGET_EMPTY)
    {
        strcpy(sPathBuff, GetPathName());
    }

    strncpy(sNameBuff, NodeName(), 26);
    sNameBuff[26] = '\0';

    if ( (pos = strrchr(sNameBuff, '.')) )
        sNameBuff[pos - sNameBuff] = '\0';

    strcat(sNameBuff, asExtensions[GetLayer()]);

    AddPart(sPathBuff, sNameBuff, sizeof(sPathBuff));
    SetOutputName(sPathBuff);
}
///

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

/// FileInfosC::GetAudioName()
const char *FileInfosC::GetAudioName() const
{
    switch (NodePri())
    {
        case AFT_AIFF:
            return "IFF-AIFF";

        case AFT_MAUD:
            return "IFF-MAUD";

        case AFT_WAV:
            return "RIFF-WAV";

        case AFT_CDDA:
            return "CD AUDIO Motorola";

        case AFT_CDDA_INTEL:
            return "CD AUDIO Intel";

        case AFT_PCM:
            return "RAW/PCM 16 bits mono";

        case AFT_DEFAULT:
            return GetString(MSG_ASSUME_RAW_TXT);

        case AFT_UNKNOWN:
            return GetString(MSG_UNKNOWN_FILE_FORMAT);
    }
}
///

