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 :

problème écrire wave avec libsndfile, part2.


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 63
    Par défaut problème écrire wave avec libsndfile, part2.
    Bon,


    j'ai un petit problème avec mon prog qui est censé lire un fichier wav et le ré-écrire dans un autre dossier (je me suis inspiré de http://loulou.developpez.com/tutorie...al/capture/#L2) :

    mon Track.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
     
    class Track{
     
    	public:
    		Track ();
    		sf_count_t  frames;
    		int samplerate;
    		int channels;
    		int format;
    		int sections ;
    		int seekable ;
    		int SizeOfWav;
    		const char* path;
    		SF_INFO FileInfos;
    		SNDFILE * File;
    		vector<float> Samples();
     
    Track::Track(const char* INPUT);
    };

    mon Track.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
    67
     
     
    Track::Track(const char* INPUT){
     
    	SF_INFO FileInfos;
    	SNDFILE * File;
     
    //ouverture et lecture infos Wav
     
    	File = sf_open(INPUT, SFM_READ, &FileInfos);
     
        if (!File)
    		cout << "pas de fichier" <<  endl;
     
    	int *psamplerate=&samplerate;
    	int *pformat=&format;
    	int *pchannels=&channels;
    	sf_count_t  *pframes=&frames;
     
    	*psamplerate=FileInfos.samplerate;	
    	*pformat=FileInfos.format;
    	*pchannels=FileInfos.channels;
    	*pframes=FileInfos.frames;
     
     
    //vecteurs de samples
     
    	int SizeOfWav = *pframes-1;	
    	vector<float> Samples(SizeOfWav); 
    	sf_read_float(File, &Samples[0], SizeOfWav);
     
    	sf_close(File);
    }
     
     
    void Track::WriteFile(Track INPUT){
     
     
    	sf_count_t   z;
    	const char* path= "/Users/chercheur/Desktop/Projets/Soundlab/test/testout.wav";
     
    	int *psamplerate=&samplerate;
    	int *pformat=&format;
    	int *pchannels=&channels;
    	sf_count_t *pframes=&frames;
     
    	FileInfos.samplerate = *psamplerate;
    	FileInfos.format = *pformat;
    	FileInfos.frames = *pframes-1;
    	FileInfos.channels = *pchannels;
     
     
    	SNDFILE*  FileOut = sf_open(path, SFM_WRITE, &FileInfos);
        if (!FileOut)
            return;
     
    	FileInfos.samplerate = *psamplerate;
    	FileInfos.format = *pformat;
    	FileInfos.frames = *pframes-1;
    	FileInfos.channels = *pchannels;
     
    // écriture wave
     
    	int SizeOfWavout = *pframes);	
    	z=sf_write_float(FileOut, &INPUT.Samples[0], SizeOfWavout);
        sf_close(File);
    }
    mon main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int main ()
    {
     
    	Track Wav("/blablat/test2.wav");
    );
     
    WavOut("/blablabla/testout.wav");
    	WavOut.WriteFile(Wav);
     
    return 0;
    }
    résultat, j'ai une erreure (pour la partie écriture, la lecture fonctionne) :


    162: error: invalid types '<unknown type>[int]' for array subscript

    sur la ligne : z=sf_write_float(FileOut, &INPUT.Samples[0],SizeOfWavout);

  2. #2
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Citation Envoyé par ostralo Voir le message
    résultat, j'ai une erreure
    Mon dieu... ca fait mal ??

    Bon et si tu essaye comme ça : &(INPUT.Samples[0]) ?

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 63
    Par défaut
    Citation Envoyé par NiamorH Voir le message

    Bon et si tu essaye comme ça : &(INPUT.Samples[0]) ?
    pas mieux mais, en fait en déclarant

    vector<float> Samples;
    au lieu de:

    vector<float> Samples();
    ça compile, par contre, toujours pas de fichier ré-écrit correctement.

    sur quelques points :

    int i;
    for (i=5000; i<5005; i++)
    cout << i << ": " << INPUT.Samples[i]<< endl;
    donne :

    5000: 0
    5001: 0
    5002: 0
    5003: 0
    5004: 0

    normalement : ça devrait (fichier source):

    5000: -0.00341797
    5001: -0.00338745
    5002: -0.00177002
    5003: -0.00170898
    5004: -0.000640869
    donc forcement, fichier vide en sortie...

    Une idée?

  4. #4
    Invité
    Invité(e)
    Par défaut
    ostralo,

    Regarde bien ton constructeur: ton tableau Samples qui reçoit les données sources est une variable locale, qui disparaît aussi tôt ton constructeur fini. Perdu les samples, il est normal que tu ne réécrives que des zéros dans le fichier résultat.

    Ce qu'il te faut faire, c'est dimensionner Samples correctement, pas le redéclarer localement.

    Par contre, à titre d'exercice, explique-moi à quoi servent tous ces pointeurs int* que tu utilises par batteries entières.

    Cheers,

    Carl

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 63
    Par défaut
    ...pour les pointeurs, je voulais juste tester mais ça n'a pas forcement d'utilité ( je débute !). Pour le vecteur de Samples, je comprends le problème mais j'avoue que je ne vois pas trop comment faire pour avoir accés à ces données partout dans mon programme?

    Citation Envoyé par 5hdumatin Voir le message

    Ce qu'il te faut faire, c'est dimensionner Samples correctement, pas le redéclarer localement.

    Carl
    je comprends pas trop la manip?

    merci par avance!

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Tu devrais peut-être utiliser le wrapper C++ pour libsndfile, soit SndfileHandle ?
    (cf. sndfile.hh)

    MAT.

Discussions similaires

  1. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 10h11
  2. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33
  3. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02
  4. [Kylix] problème compilation kylix3 avec redhat 9.0
    Par madininaoursa dans le forum EDI
    Réponses: 1
    Dernier message: 02/07/2003, 16h21
  5. Problèmes de versions avec Xalan, Xerces et Java
    Par honeyz dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 05/06/2003, 10h18

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