spinzero
Messages postés16Date d'inscriptionsamedi 4 novembre 2000StatutMembreDernière intervention21 mars 2009
-
19 mars 2009 à 11:15
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 2013
-
22 mars 2009 à 20:17
Bonjour
J'ai une animation (win32) OpenGL à laquelle j'essaie d'intégrer de la synthese sonore avec la lib STK.(...au passage, si vous en connaissez d'autres, tournant sous windows )
Alors, mon problème vient du fait que le rendu graphique via une fonction glut:
main.cpp :
int main()
{
...
glutReshapeFunc(ReshapeCallback_1);
glutDisplayFunc(RenderCallback_1);
...
}
...est bloqué pendant le calcul du son, lancé par une classe Attack (pouvant avoir de multiples instances):
//- Figure out how many bytes in an StkFloat and setup the RtAudio stream.
RtAudio::StreamParameters p;
p.deviceId = dac.getDefaultOutputDevice();
p.nChannels = 1;//_o_->channel; RtAudioFormat format ( sizeof(StkFloat) 8 ) ? RTAUDIO_FLOAT64 : RTAUDIO_FLOAT32;
//-The bufferFrames argument is an API-dependent buffering parameter (see RtAudio for further information).
unsigned int bufferFrames = RT_BUFFER_SIZE;//defined in Stk.h.
//--1) OPEN STREAM
try {
dac.openStream( &p, //RtAudio::StreamParameters *outputParameters,
NULL, //RtAudio::StreamParameters *inputParameters,
format, // RtAudioFormat format, unsigned int sampleRate
(unsigned int)Stk::sampleRate(), //unsigned int *bufferFrames
&bufferFrames, //RtAudioCallback callback, void *userData
&Attack::tick, //RtAudio::StreamOptions *options
(void *)&sine
);
}
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 19 mars 2009 à 11:30
Salut
La solution est simple, il faut créer ta fenêtre open GL dans un autre thread. Pendant le calcul du son, cela ne bloquera plus l'affichage.
Regarde la fonction CreateThread()
A+
____________________________________________________________________________
Mon site internet :
http://ImAnalyse.free.fr
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 19 mars 2009 à 13:16
En fait, ils disent qu'il faut que tous les appels aux fonctions d'OpenGL ne se fasse que dans un seul thread. Cela signifie que tu peux sans problème créer un thread pour OpenGL et un thread pour pour le son...
A+
____________________________________________________________________________
Mon site internet :
http://ImAnalyse.free.fr
...mais un autre problème se pose, que j'aurais sans doute du préciser :
RenderCallback_1() fait aussi appel aux fonctions d'un moteur de physique, dont son timer RunPhysic() ...
J'obtiens alors cette erreur :
f:\scvista\experimental\PhysX_2.8.1\novodex...etc
invlid paramter: Scene::simulation is still processing last simulate call, you should call fetchResults() !
Il me propose d'apeller une fonction fetchResults() mais peut être qu'il faut revoir l'approche de la thread ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 19 mars 2009 à 15:57
Je n'aurai pas fait du tout comme ca: la, a chaque fois que tu veux afficher qqchose avec OpenGL, tu va créer un thread...
dans ton main, tu devrais faire;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int show)
{
CreateThread(0,0,StartOpenGL,0,0,&ThreadId);
....
// Initialize physics scene and start the application main loop if scene was created
if (InitNx())//engine.init())//
{
glutMainLoop();
}
else
{
engine.~Engine();
ReleaseNx();
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int show)
{
PrintControls();
//---Initialisation du moteur
if(engine.init())
{//--passing Function through Struct in arg
usrIn_o* o = new usrIn_o;
o->getPhyxTM = *getPhysxTime;//timeGetTime;//
engine.setPROP_o( o );
}
else
{
return EXIT_FAILURE;
}
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 20 mars 2009 à 13:21
Ta première erreur etait qu'il ne trouvais pas le point d'entré de ton programme soit la fonction main...
Si tu es en programmation console, il faut mettre :
main(
int
argc,
char
** argv)
Si window:
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine, int show)
ca donne:
DWORD WINAPI StartOpenGL(LPVOID Param)
{
...
}
int main(
int
argc,
char
** argv)
{
CreateThread(0,0,StartOpenGL,0,0,&ThreadId);
return
0;
A+
____________________________________________________________________________
Mon site internet :
http://ImAnalyse.free.fr
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 20 mars 2009 à 13:51
Je laisse toujours les options de debug par default, je ne touche que les options du compilo pour le mode release.
Pour ton erreur essaie de localiser précisément de quelle ligne provient l'erreur. Regarde la pile des appelants en mode debug. Tu dois écrire dans un emplacement mémoire invalide.
A+
____________________________________________________________________________
Mon site internet :
http://ImAnalyse.free.fr
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 20 mars 2009 à 16:06
Je suis pas sure que ce soit mieux comme erreur...
Met des break point un peu partout dans ton prog et essaie de savoir à quel moment ton programme s'arrète. Quand tu auras localisé la ligne ce sera facile de corriger l'erreur.
A+
____________________________________________________________________________
Mon site internet :
http://ImAnalyse.free.fr
spinzero
Messages postés16Date d'inscriptionsamedi 4 novembre 2000StatutMembreDernière intervention21 mars 2009 21 mars 2009 à 10:33
J'ai recréé un projet simplifié n'affichant qu'un cube, tjrs en mode console et ...
Paf ! pareil, fermeture instantanée !
Et les breakpoints ne fonctionnent pas tjrs
Alors ça vient soi de l'écriture de la thread soi de mon prog !!?