IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[Wanted] Loader wav


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Par défaut [Wanted] Loader wav
    Bonjour à tous,

    Pour un projet en C++ je dois coder un loader de fichier wave.
    J'ai cherché sur Internet des exemples pour m'inspirer mais ils sont tous un peu trop compliqué et je n'arrive pas à adapter l'un d'eux.

    Il y a t'il un moyen pas trop compliqué pour faire un loader de fichier wave?

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    La structure d'un fichier wave est très simple, fais des recherches sur ce format. Tu veux vraiment le charger ou bien simplement le jouer, parce que dans le dernier cas, ce sera encore plus simple. C'est pour quel système ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Par défaut
    En fait je voudrais charger les différents éléments composant un fichier wave comme la frequence d'échantillonage ou les échantillons par exemple dans des variables.

    Sinon je code sous Linux (je ne sais pas si c'est le système dont tu parles, je débute en programmation)

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Tape Wave file format dans google ça doit te donner de bons résultats. Lire un fichier n'est pas compliqué comme tu le dis. Je vais voir si je pourrais écrire une telle fonction ce soir vu que j'en aurai aussi besoin .

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 6
    Par défaut
    Oki merci c'est gentil

    Voici les liens que j'ai trouvé sur le format wave :
    http://fr.wikipedia.org/wiki/WAVEform_audio_format
    http://replaygain.hydrogenaudio.org/...ormat_wav.html

    Et dans ce lien il y a un loader wave en C mais apparemment il n'a pas été testé après je sais pas si ça va être galère ou pas pour "l'adapter" en C++
    http://www.gamedev.net/reference/art...article709.asp

  6. #6
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Bon voilà je l'ai fait. Le code n'est pas aussi portable que tu peux le croire car j'ai osé faire des lectures brutes de structures au lieu de lire les données une à une avant de les mettre ensuite dans une structure. L'avantage bien sûr c'est que c'était plus rapide à programmer et que, côté portabilité, c'est pas en fait si nul que ça car je peux très bien l'utiliser sous Windows et toi sous Linux (PC) ...

    Voici la doc sur le format que j'ai utilisé (mieux que ce que t'as trouvé ) : Microsoft WAVE soundfile format.

    Et voici le code :

    Fichier : wave.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #ifndef H_WAVE_H
     
    #define H_WAVE_H
     
    struct WAVEFILEHDR;
    struct WAVEFMT;
    struct WAVEDATAHDR;
     
    class CWaveStream
    {
        char * lpBuffer;
     
    public:
        CWaveStream(const char * lpFileName);
        const WAVEFILEHDR * FileHeader();
        const WAVEFMT * Format();
        const WAVEDATAHDR * DataHeader();
        const unsigned char * Data();
        virtual ~CWaveStream();
    };
     
    struct WAVEFILEHDR
    {
        unsigned char Signature[4];
        unsigned int Size;
        unsigned char Format[4];
    };
     
    struct WAVEFMT
    {
        unsigned char Signature[4];
        unsigned int Size;
        unsigned short Format;
        unsigned short NumChannels;
        unsigned int SampleRate;
        unsigned int ByteRate;
        unsigned short BlockAlign;
        unsigned short BitsPerSample;
    };
     
    struct WAVEDATAHDR
    {
        unsigned char Signature[4];
        unsigned int Size;
    };
     
    #endif
    Fichier : wave.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #include <fstream>
    #include "wave.h"
     
    using namespace std;
     
    static int FileSize(ifstream & f);
     
    CWaveStream::CWaveStream(const char * lpFileName)
    {
        ifstream f(lpFileName, ios::binary);
     
        if (f.is_open())
        {
            int fsize = FileSize(f);
     
            lpBuffer = new char [fsize];
     
            if (lpBuffer != NULL)
                f.read(lpBuffer, fsize);
     
            f.close();
        }
        else
            lpBuffer = NULL;
    }
     
    const WAVEFILEHDR * CWaveStream::FileHeader()
    {
        return (WAVEFILEHDR *)lpBuffer;
    }
     
    const WAVEFMT * CWaveStream::Format()
    {
        return (WAVEFMT *)(lpBuffer + sizeof(WAVEFILEHDR));
    }
     
    const WAVEDATAHDR * CWaveStream::DataHeader()
    {
        return (WAVEDATAHDR *)(lpBuffer + sizeof(WAVEFILEHDR) + sizeof(WAVEFMT));
    }
     
    const unsigned char * CWaveStream::Data()
    {
        return (unsigned char *)(lpBuffer + sizeof(WAVEFILEHDR) + sizeof(WAVEFMT) + sizeof(WAVEDATAHDR));
    }
     
    CWaveStream::~CWaveStream()
    {
        if (lpBuffer != NULL)
            delete [] lpBuffer;
    }
     
    int FileSize(ifstream & f)
    {
        ifstream::pos_type cur_pos = f.tellg();
     
        f.seekg(0, ios_base::beg);
        ifstream::pos_type beg_pos = f.tellg();
     
        f.seekg(0, ios_base::end);
        ifstream::pos_type end_pos = f.tellg();
     
        f.seekg(cur_pos, ios_base::beg);
     
        return int(end_pos - beg_pos);
    }
    Exemple d'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    #include <iostream>
    #include "wave.h"
     
    using namespace std;
     
    int main()
    {
        char FileName[260];
        cout << "Tapez le nom du fichier a ouvrir : ";
        cin.getline(FileName, sizeof(FileName));
     
        cout << endl;
     
        CWaveStream w(FileName);
        const WAVEFILEHDR * lpFileHeader = w.FileHeader();
     
        if (lpFileHeader != NULL)
        {
            const WAVEFMT * lpFormat = w.Format();
            const WAVEDATAHDR * lpDataHeader = w.DataHeader();
     
            int i;
     
            cout << "File Header" << endl;
            cout << "-----------" << endl;
            cout << "Signature : ";
            for(i = 0; i < 4; i++)
                cout << lpFileHeader->Signature[i];
            cout << endl;
            cout << "Format    : ";
            for(i = 0; i < 4; i++)
                cout << lpFileHeader->Format[i];
            cout << endl << endl;
     
            cout << "Wave Format" << endl;
            cout << "-----------" << endl;
            cout << "Signature : ";
            for(i = 0; i < 4; i++)
                cout << lpFormat->Signature[i];
            cout << endl << endl;
     
            cout << "Data Header" << endl;
            cout << "-----------" << endl;
            cout << "Signature : ";
            for(i = 0; i < 4; i++)
                cout << lpDataHeader->Signature[i];
            cout << endl << endl;
        }
        else
            cerr << "Le fichier '" << FileName << "' n'a pas pu etre ouvert." << endl;
     
        return 0;
    }
    Attention ! Le constructeur de la classe CWaveStream ne teste pas si le fichier est réellement un fichier wave (c'est-à-dire qu'il commence par 'RIFF', etc.). Ce code n'est donc pas encore tout à fait au point. Tu devras ajouter toi-même les contrôles d'erreur.

    Voilà.

    A+ .

Discussions similaires

  1. Réponses: 18
    Dernier message: 29/10/2003, 16h34
  2. erreur sql loader et performance
    Par mobisky dans le forum SQL*Loader
    Réponses: 14
    Dernier message: 20/08/2003, 12h27
  3. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43
  4. Existe t'il un composant permettant de jouer un son wav?
    Par scorpiwolf dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/06/2002, 14h10
  5. [Kylix] jouer un fichier wav avec kilyx
    Par JlouisI dans le forum EDI
    Réponses: 1
    Dernier message: 14/06/2002, 02h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo