Programmation multimedia (wave) avec API windows [Résolu]

Signaler
Messages postés
18
Date d'inscription
mardi 29 avril 2008
Statut
Membre
Dernière intervention
17 janvier 2009
-
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
-
Bonjour,

Pour suivre les contraintes d'un projet je dois développer une petite application permettant de lire/enregistrer, afficher et faire quelques effets sur les fichiers wave. Je ne connais pas encore l'API windows, et je dois travailler sous C++ Builder 6 (BCB6, soit BCB, pour les intimes ?). J'ai récupéré le tutoriel de très bonne qualité de cette adresse : http://www.planet-source-code.com/vb...=4422&lngWId=3 ; et tout fonctionne sauf la compilation finale : voici ma ligne erronée et l'erreur qui va avec :
Code :

if((buffer HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, totalBufferSize)) NULL)

Erreur :

[C++ Error] source_base_projet_bizare1.cpp(77): E2034 Cannot convert 'void *' to 'unsigned char *'

A première vu tout semble normal dans l'utilisation des paramètres... Quelqu'un a-t-il l'expérience de cette erreur ? Si oui que faut-il faire ?

Indice : en double cliquant sur l'erreur, le curseur se place après le signe égal, la fonction HeapAlloc retourne un type ' LPVOID WINAPI ', buffer est un unsigned char* ...

Merci !

Colin

13 réponses

Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
1
Salut, et en essayant ceci ?if((buffer (char*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, totalBufferSize)) NULL)

Cordialement, uaip.
Messages postés
18
Date d'inscription
mardi 29 avril 2008
Statut
Membre
Dernière intervention
17 janvier 2009

Ok uaip (lol),

Pas de pb, il me manquait juste ça :
#ifndef _CSP
#define _CSP

...
#endif

Merci !
Messages postés
18
Date d'inscription
mardi 29 avril 2008
Statut
Membre
Dernière intervention
17 janvier 2009

Ok, merci pour cette précision, j'ai trouvé la solution ! Je poste une dernière fois histoire d'afficher la réponse, qui était tout simplement...

... de retirer le passage par référence du projectWaveHandle pour que ceci :
Res = waveOutWrite(&projectWaveHandle, &projectWaveHeader, sizeof(WAVEHDR));
devienne :
Res = waveOutWrite(projectWaveHandle, &projectWaveHeader, sizeof(WAVEHDR));

Voilà !

Je tacherai de créer un topic à chaque fois, au debut je pensais utiliser ce topic pr la foule des petits pb que j'allais rencontrer, mais ça ne fonctionne pas comme ça...
Messages postés
18
Date d'inscription
mardi 29 avril 2008
Statut
Membre
Dernière intervention
17 janvier 2009

Salut uaip,

Bien sûr, je te remercie, je dois être fatigué...
Messages postés
18
Date d'inscription
mardi 29 avril 2008
Statut
Membre
Dernière intervention
17 janvier 2009

Bonjour,

J'ai maintenant un petit problème de déclaration de classe. J'utilise un classe trouvée sur http://www.cppfrance.com//code.aspx?ID=35447 ; dans mon programme principal j'inclus les entêtes comme suit :
Code :

#include "csound\\Mutex.h"
#include "csound\\Sem.h"
#include "csound\\Sound.h"
#include "csound\\SoundListener.h"
#include "csound\\SoundProcessing.h"
#include "csound\\Str.h"
#include "csound\\Tab.h"

Dans chacun de ces fichiers, la classe est définie comme ceci (lignes entre parenthèses):
Code :

(9 ) class CMutex
(10){
(11)private:
(12) HANDLE m_hMutex;
(13)
(14)public:
(15) CMutex(void);
(16) virtual ~CMutex(void);
(17)
(18) BOOL Lock(DWORD dwTimeOut = INFINITE);
(19) void Unlock(void);
(20)};

J'obtiens le message suivant à la compilation : (pour chaque classe)
[C++ Error] Mutex.h(10): E2238 Multiple declaration for 'CMutex'
[C++ Error] Mutex.h(9): E2344 Earlier declaration of 'CMutex'
[C++ Error] Mutex.h(10): E2238 Multiple declaration for 'CMutex'
[C++ Error] Mutex.h(9): E2344 Earlier declaration of 'CMutex'

Le .cpp est bien dans le même dossier, pourquoi le compilateur voit-il une redéclaration ici ?

Gracias !
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
1
Ben si tu définis la même classe dans plusieurs fichiers, c'est normal qu'il te dises que tu redéclares ^^
#include est une directive pour le pré-processeur.
"Avant" la compilation, dis toi qu'à chaque ligne contenant #include "fichier.h", le pré-processeur va insérer le texte contenu dans le fichier.h.
Pour faire plus court (et donner moins de lignes à mon exemple), remplaçons ta classe CMutex par une bête variable A de type entier (int). Si tu la déclares dans chaque header, voilà ce que tu auras dans chacun de tes 9 headers :
int A;
Et voilà ce que tu obtiendras dans ton fichier .cpp après le boulot effectué par le pré-processeur (qui remplaces les lignes contenant #include) :
int A;
int A;
int A;

int A;
int A;

int A;
int A;

int A;
int A;
Ce qui revient donc à déclarer plusieurs fois la même variable (ou la même classe dans ton cas), ce qui n'est pas bon.
Par contre, es-tu sûr de ne pas avoir déclaré la classe avant d'inclure Mutex.h ? Parce-que même pour ce fichier il te signale un redéclaration, or d'après ce que tu écris, c'est ton premier header inclus.

Sinon, pour rester propre, déclare ta classe dans un header spécifique genre CMutex.h et ajoute un .cpp contenant les définitions des méthodes de la classe. (ou mets-les directement dans le header, mais c'est soit-disant moins rigoureux).
Je n'ai pas été hors-sujet ? ^^

Cordialement, uaip.
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
1
Désolé pour le double-posting.
Je viens d'aller voir la source de ton lien. La classe CMutex est bien définie uniquement dans le fichier Mutex.h
Les autres fichiers contiennent d'autres classes.

Cordialement, uaip.
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
1
Oui.
Mais ça revient à ce que je disais
En gros les 3 directives que tu cites signifient "si la classe décrite ci dessous n'est pas déjà déclarée, alors la déclarer, sinon ne rien faire".
Donc pour dans le 1er header, n'étant pas déclarée, ça l'a fait, mais pas dans les autres fichiers.
Mais euh.. tu te compliques grandement la vie. Ça ne sert à rien de déclarer 40 variables identiques en vérifiant chaque fois si elles ont été déclarées. Non seulement ça te rajoute des lignes de code pour rien, mais en plus tu perds en lisibilité, puis... ça sert à rien (dans ce cas là) ^^

Cordialement, uaip.
Messages postés
18
Date d'inscription
mardi 29 avril 2008
Statut
Membre
Dernière intervention
17 janvier 2009

Bonjour !

Suite du sujet...

J'ai maintenant pas mal avancé, je suis presque au bout du compte...
En lisant de la doc sur le MSDN, et les sites suivant :
http://bcbjournal.org/articles/vol2/...io__Part_I.htm
http://bcbjournal.org/articles/vol2/...io__part_2.htm
http://juhara.com/article-en-14-Play...-Wave-API.html

Je suis parvenu a écrire un joli programme... La compilation fonctionne, l'exécution aussi sauf au moment de lancer la lecture du wav, à ce moment, en utilisant :
Code :

// read file !
Res = waveOutWrite(&projectWaveHandle, &projectWaveHeader, sizeof(WAVEHDR));
CheckWaveError(Res);
Memo1->Lines->Add("Playback started " + String(Res));

Je peux lire dans mon Mémo ( je code sous C++ Builder ) l'erreur 5, qui correspond à MMSYSERR_INVALHANDLE.

Je recherche sur internet mais pour le moment je ne trouve pas ma réponse.
Quelqu'un a-t-il une idée ?

Je cherche encore...
Messages postés
18
Date d'inscription
mardi 29 avril 2008
Statut
Membre
Dernière intervention
17 janvier 2009

Bonjour !

Suite du sujet...

J'ai maintenant pas mal avancé, je suis presque au bout du compte...
En lisant de la doc sur le MSDN, et les sites suivant :
http://bcbjournal.org/articles/vol2/9807/Low-level_wave_audio__Part_I.htm
http://bcbjournal.org/articles/vol2/9808/Low-level_wave_audio__part_2.htm
http://juhara.com/article-en-14-Playing-WAV-with-Wave-API.html

Je suis parvenu a écrire un joli programme... La compilation fonctionne, l'exécution aussi sauf au moment de lancer la lecture du wav, à ce moment, en utilisant :
Code :

// read file !
Res = waveOutWrite(&projectWaveHandle, &projectWaveHeader, sizeof(WAVEHDR));
CheckWaveError(Res);
Memo1->Lines->Add("Playback started " + String(Res));

Je peux lire dans mon Mémo ( je code sous C++ Builder ) l'erreur 5, qui correspond à MMSYSERR_INVALHANDLE.

Je recherche sur internet mais pour le moment je ne trouve pas ma réponse.
Quelqu'un a-t-il une idée ?

Je cherche encore...
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
1
Salut,
Personnellement je ne sais pas, et ayant de gros problèmes avec mon PC, je ne peux pas faire de recherches.
Mais je pense que personne d'autre que moi ne viendra lire ton topic. Je m'explique :
A moins de décocher la checkbox "<label for="m_CPH1_UCForumHome1_Message_UCForumMessage1_FrmAjout_ctl00_MessageAdd_ChkAlerte">M'envoyer un mail lorsqu'il y a une réponse à cette discussion."</label>, dès qu'on a répondu au moins une fois sur un topic, on est prévenu par mail à chaque nouveau commentaire. Or je suis le seul (avec toi) à avoir répondu, donc je suis le seul au courant de tes 2 nouveaux problèmes que tu as eu
De plus, tu as mis 2 commentaires en "réponse acceptée", ce qui veut dire que dans le sommaire du forum, les gens verront que ton problème est résolu et ne prendront pas la peine de venir voir (logique).
Si tu veux plus d'aide, enlève les réponses acceptées ou fais carrément un nouveau topic parce-que je ne pense pas pouvoir t'aider.
Bonne chance.

Cordialement, uaip.
Messages postés
42
Date d'inscription
vendredi 21 décembre 2007
Statut
Membre
Dernière intervention
12 janvier 2009

aide moi s-v-p
le probleme c'est:
ecrire un programme en c++ de ecran de veille acondition que
nous avans crier e timer et avec mot de passe.
merci d'avance.
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011
1
salna, si tu as un soucis, créé ton topic, et ne va pas pouiller celui des autres.
J'hallucine...
De plus, apparemment tu demandes un code tout fait, or ce n'est pas le but de ce forum.
A bon entendeur.

Cordialement, uaip.