Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2821 connectés 

 


Dernière réponse
Sujet : [C++] problème avec des classes
madVinz j'ai lu les MSDN sur sprintf/snprintf, et j'ai pas compris comment marchait le 2eme argument, la  "format-control string" :(  
si vous pouviez m'aider à comprendre  ...
 
sinon, les constructeurs/destructeurs marchent bien :)
 
mais la classe DSoundBuffer marche toujours pas ...
je vous mets le code de la classe en entier :
la fonction Load a l'air de marcher, mais PlayAsMusic et Stop ne fonctionnent pas (le prog sarrete sans rien)
les classes Log et GetError sont pour ecrire un log avec le n° des erreurs (pour le dégogage)
ExitApp( true ); quitte le prog en affichant un mess d'erreur
 
#include <Windows.h>
#include <dsound.h>
 
HRESULT CreateStaticBuffer( LPDIRECTSOUNDBUFFER DSBuffer );
bool LoadWaveFile( TCHAR* strFileName );
HRESULT RestoreBuffer(LPDIRECTSOUNDBUFFER DSBuffer);
 
extern CLog* Log;
extern CError* GetError;
void ExitApp( bool Err );
 
LONG SoundVol;
LONG MusicVol;
 
#define SafeRelease(p) { if(p) { (p)->Release(); (p)=NULL; } }
#define SAFE_DELETE(p)  { if(p) { delete (p);     (p)=NULL; } }
 
class CDSoundBuffer
{
public:
 void Load( TCHAR* strFileName );
 ~CDSoundBuffer();
 void Play();
 void PlayAsMusic();
 void Stop();
 bool IsPlaying();
private:
 IDirectSoundBuffer* DSB;
};
 
void CDSoundBuffer::Load( TCHAR* strFileName )
{
 HRESULT hRet;
 char* logBuf;
 
 logBuf = new char[ strlen( strFileName ) + 46 ];
 wsprintf( logBuf, "(DirectSound.cpp) Create a new SoundBuffer (%s)", strFileName );
 Log->NewAction( logBuf );
 
 if( !LoadWaveFile( strFileName ) )
 {
  Log->Failed();  
  ExitApp( true );
 }
 
 hRet=CreateStaticBuffer( DSB );
 if ( hRet!=DS_OK )
 {
  Log->Error( GetError->GetDXErr( hRet ) );
  ExitApp( true );
 }
 
 Log->Success();
 
}
 
CDSoundBuffer::~CDSoundBuffer()
{
 Log->NewAction( "(DirectSound.cpp) Close a SoundBuffer" );
 SafeRelease( DSB );
 Log->Success();
}
 
bool CDSoundBuffer::IsPlaying()
{
    if( DSB )
    {  
        DWORD dwStatus = 0;
        DSB->GetStatus( &dwStatus );
        return( ( dwStatus & DSBSTATUS_PLAYING ) != 0 );
    }
    else
    {
        return true;
    }
}
 
void CDSoundBuffer::Play()
{
 DSB->SetVolume( SoundVol );
 DSB->Play( 0, 0, 0 );
}
 
void CDSoundBuffer::PlayAsMusic()
{
 DSB->SetVolume( MusicVol );
 DSB->Play( 0, 0, DSBPLAY_LOOPING );
}
 
void CDSoundBuffer::Stop()
{
 DSB->Stop();
}
 
voila, c'est pas tres pratique de n'envoyer qu'un bout de prog pour que vous compreniez, dites moi si vous comprenez pas ...
 
en tout cas vraiment merci beaucoup de me répondre, j'etais bien embêté :)
@+ ;)

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
madVinz j'ai lu les MSDN sur sprintf/snprintf, et j'ai pas compris comment marchait le 2eme argument, la  "format-control string" :(  
si vous pouviez m'aider à comprendre  ...
 
sinon, les constructeurs/destructeurs marchent bien :)
 
mais la classe DSoundBuffer marche toujours pas ...
je vous mets le code de la classe en entier :
la fonction Load a l'air de marcher, mais PlayAsMusic et Stop ne fonctionnent pas (le prog sarrete sans rien)
les classes Log et GetError sont pour ecrire un log avec le n° des erreurs (pour le dégogage)
ExitApp( true ); quitte le prog en affichant un mess d'erreur
 
#include <Windows.h>
#include <dsound.h>
 
HRESULT CreateStaticBuffer( LPDIRECTSOUNDBUFFER DSBuffer );
bool LoadWaveFile( TCHAR* strFileName );
HRESULT RestoreBuffer(LPDIRECTSOUNDBUFFER DSBuffer);
 
extern CLog* Log;
extern CError* GetError;
void ExitApp( bool Err );
 
LONG SoundVol;
LONG MusicVol;
 
#define SafeRelease(p) { if(p) { (p)->Release(); (p)=NULL; } }
#define SAFE_DELETE(p)  { if(p) { delete (p);     (p)=NULL; } }
 
class CDSoundBuffer
{
public:
 void Load( TCHAR* strFileName );
 ~CDSoundBuffer();
 void Play();
 void PlayAsMusic();
 void Stop();
 bool IsPlaying();
private:
 IDirectSoundBuffer* DSB;
};
 
void CDSoundBuffer::Load( TCHAR* strFileName )
{
 HRESULT hRet;
 char* logBuf;
 
 logBuf = new char[ strlen( strFileName ) + 46 ];
 wsprintf( logBuf, "(DirectSound.cpp) Create a new SoundBuffer (%s)", strFileName );
 Log->NewAction( logBuf );
 
 if( !LoadWaveFile( strFileName ) )
 {
  Log->Failed();  
  ExitApp( true );
 }
 
 hRet=CreateStaticBuffer( DSB );
 if ( hRet!=DS_OK )
 {
  Log->Error( GetError->GetDXErr( hRet ) );
  ExitApp( true );
 }
 
 Log->Success();
 
}
 
CDSoundBuffer::~CDSoundBuffer()
{
 Log->NewAction( "(DirectSound.cpp) Close a SoundBuffer" );
 SafeRelease( DSB );
 Log->Success();
}
 
bool CDSoundBuffer::IsPlaying()
{
    if( DSB )
    {  
        DWORD dwStatus = 0;
        DSB->GetStatus( &dwStatus );
        return( ( dwStatus & DSBSTATUS_PLAYING ) != 0 );
    }
    else
    {
        return true;
    }
}
 
void CDSoundBuffer::Play()
{
 DSB->SetVolume( SoundVol );
 DSB->Play( 0, 0, 0 );
}
 
void CDSoundBuffer::PlayAsMusic()
{
 DSB->SetVolume( MusicVol );
 DSB->Play( 0, 0, DSBPLAY_LOOPING );
}
 
void CDSoundBuffer::Stop()
{
 DSB->Stop();
}
 
voila, c'est pas tres pratique de n'envoyer qu'un bout de prog pour que vous compreniez, dites moi si vous comprenez pas ...
 
en tout cas vraiment merci beaucoup de me répondre, j'etais bien embêté :)
@+ ;)
chrisbk wsprintf c pas pour le support de unicode ?

 

[edtdd]--Message édité par chrisbk--[/edtdd]

Kristoph Pour wnsprintf, ca ressemble a ca. Mais si ca fais pas partie des lib standard sous VC++, je comprend qu'ils y aie tellement de failles de sécuritée chez Microsoft :/
 
Tu ne pourrais pas utiliser sprintf/snprintf à la place ? J'ai l'impression que wsprintf/wsnprintf sont des trucs proprio Microsoft.
chrisbk pour detruire une classe alloué avec new tu fais delete  
 
ex :
 
CMaClasse *truc = new CMaClasse;
...
delete truc;
 
 
 
si jamais t'as alloué un tableau de classe la manip est !=  
 
CMaClasse *truc = new CMaClasse[12];
...
delete []truc;
 
 
si t'as fais ca de facon standart:
 
CMaClasse truc;
 
alors t'as pas a t'occuper de la destruction, le compilo s'en charge pour toi
madVinz sinon, j'avais des problèmes avec les constructeurs d'une classe, je suppose que ce sera résolu avec la mm chose que la haut :)
Mais par contre pour détruire une classe (et en meme temps executer le destructeur) comment je dois faire ?
madVinz a la place de wsprintf j'ai trouvé cette fonction :
 
int wnsprintf(
    LPTSTR lpOut,
    int cchLimitIn
    LPCTSTR pszFmt,
    ...
);
 
mais elle fait appelle a des lib et des dll que j'avais jms vu :
 
Version 5.00 and later of Shlwapi.dll
 
  Windows NT/2000: Requires Windows 2000 (or Windows NT 4.0 with Internet Explorer 5.0 or later).  
  Windows 95/98: Requires Windows 98 (or Windows 95 with Internet Explorer 5.0 or later).  
  Header: Declared in shlwapi.h.  
  Import Library: shlwapi.lib.
 
qu'en pensez vous ?
madVinz apparement c'etait ca qui foirait : DBSplash = new CDSoundBuffer();
(que j'avais pas mis)
Merci beaucoup :)
chrisbk Ouaip !
madVinz bin ... euh ... oui, mais j'ai rien a retourner, je fais comment ??
 
void Close();
 
comme ca ?
chrisbk

Kristoph a écrit a écrit :

Chut, j'essaye de montrer la bonne facon de faire moi :)
 
Et puis ca devrai au moins déclencher un Warning parceque la norme Iso C++ interdit ca.  




clair que c trop crade de pas specifier le retour  :D

 

[edtdd]--Message édité par chrisbk--[/edtdd]

Kristoph Chut, j'essaye de montrer la bonne facon de faire moi :)
 
Et puis ca devrai au moins déclencher un Warning parceque la norme Iso C++ interdit ca.
chrisbk

Kristoph a écrit a écrit :

Je ne vois pas ce qui ne vas pas dans ton code et je dirais même que tout va bien. Sinon, tu ne devrais pas mettre de fonctions sans paramètres de retour. C'est un miracle que VC++ ne te guelle pas dessus pour ca :
 
Load( TCHAR* strFileName );
Close();
Play();
PlayAsMusic();
Stop();  




 
non c normal qu'il gueule pas, le C indique que pas de param de retour = retourne un int

Kristoph Bon alors, je sais pas si c'est ca le probleme, mais on ne sais jamais.
 
D'abord un peu de morale, évite à tout pris les fonction printf ( sauf printf elle meme ) qui écrivent dans un tampon. Utilise les nprintf à la place, celles qui vérifient qu'elles ont la place d'écrire.
 
Sinon, je pense qu'il y a une erreur dans ton code, quand tu réserve la place pour SndName, tu a oublié d'allouer un octet pour mettre le char \0 final =>  SndName = new char[ strlen( AppPath ) + strlen( DATAREP ) + strlen( SPLASHSND ) + 1 ];  
 
Sinon, une autre erreur peut-etre beaucoup plus probable :
 
CDSoundBuffer* DSBSplash;
 
Tu a penser à faire quelque part DBSplash = new CDSoundBuffer(); ou un truc comme ca ?
madVinz quand mon prog fait plouf, il revient sous windows (il était en FullScreen avec DDraw) et ne fait aucune erreur...
 
sinon, voila un endroit ou j'appelle la classe :
 
 
extern LPCSTR AppPath; // repertoire d'ou on lance le prog
 
#define DATAREP "Data\\"
#define SPLASHSND "Load.WAV"
 
CDSoundBuffer* DSBSplash;
 
CMenus::LoadSplash()
{
 char* SndName;
 SndName = new char[ strlen( AppPath ) + strlen( DATAREP ) + strlen( SPLASHSND ) ];
 wsprintf( SndName, "%s%s%s", AppPath, DATAREP, SPLASHSND );
 DSBSplash->Load( SndName );
 LocalFree( SndName );
}
Kristoph Je ne vois pas ce qui ne vas pas dans ton code et je dirais même que tout va bien. Sinon, tu ne devrais pas mettre de fonctions sans paramètres de retour. C'est un miracle que VC++ ne te guelle pas dessus pour ca :
 
Load( TCHAR* strFileName );
Close();
Play();
PlayAsMusic();
Stop();
chrisbk tagada tsointsoin !
 
quand tu dis ca s'arrete, j'imagine que ton prog fait plouf, autrement dit t'as la chtit machine "ce programme a effectué une operation non conforme" blablabla ?
 
Bon pis avec le code que tu nous a donner on peut pas faire grand chose, donne nous plutot le code ou tu appelle les fonction de ta CDSoundBuffer stp
madVinz Bonjour, voici mon problème, répondez moi svp !
(j'utilise VC++ 6.0 et DirectX SDK 7)
 
voila mon code
 
#include <Windows.h>
#include <dsound.h>
 
class CDSoundBuffer
{
public:
 Load( TCHAR* strFileName );
 Close();
 Play();
 PlayAsMusic();
 Stop();
 bool IsPlaying();
private:
 LPDIRECTSOUNDBUFFER DSB;
};
 
CDSoundBuffer::Load( TCHAR* strFileName )
{
//    et la, dès que je touche à DSB, le programme s'arrete ...
//    par exemple  :
    DSB=NULL;
//    et hop, ca s'arrete
}
 
voilà ...
merci d'avance  ;)  
@+

Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR