OpenGl bloqué par une Thread !?

spinzero Messages postés 16 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 21 mars 2009 - 19 mars 2009 à 11:15
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Derniè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):



attack.cpp:

int Attack::tick( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
         double streamTime, RtAudioStreamStatus status, void *dataPointer )
{
  SineWave *sine = (SineWave *) dataPointer;
  register StkFloat *samples = (StkFloat *) outputBuffer;



  for ( unsigned int i=0; i<nBufferFrames; i++ )
    *samples++ = sine->tick();



  return 1;
}
//---------------------------------------------------------
bool Attack::play()
{


   SineWave sine;



  //- 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
       );
}
 
  catch ( RtError &error ) {
    error.printMessage();
    goto cleanup;
  }



  sine.setFrequency( _o_->frequency );



  //--2) START STREAM
  try {
    dac.startStream();
}
  catch ( RtError &error ) {
    error.printMessage();
   goto cleanup;
}



// Block waiting here.
/*char keyhit;
  cout << "\nPlaying ... press <enter> to quit.\n";
  cin.get( keyhit );





  -> QUOI METTRE A LA PLACE (ci-dessus) ?? 



****************************************/



 cleanup:



 dac.closeStream();
 //delete dac;
 //_o_->func_killFM(_o_->id); 
}

... qui semble utiliser une thread , concept que je n'avais pas encore abordé


Je suis donc parti d'un exemple de Callback, dont une portion du code est en partie responsable du problème:

  // Block waiting here.
 char keyhit;
  cout << "\nPlaying ... press <enter> to quit.\n";
  cin.get( keyhit );


J'ai remplacé cette partie par

return 1;

... pensant que le son continuerait à jouer mais cela provoque une erreur (error.printMessage() ) -que je n'arrive pas à afficher- puisque

goto cleanup

...est aussitôt appelé !


Auriez-vous une solution 
merci

ps: On m'a suggéré de mettre un
return 1;

juste après startStream() , ou dans tick()
... ou encore de m'intéresser au concept de concurrence !??  mais je n'ai rien trouvé


 

23 réponses

Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
21 mars 2009 à 12:15
Salut
Il marche très bien ton prog.
Mais tu as oublié 1 chose ici: quand ton thread principale fini, ton programme finie. Ici, dans ton main, tu crées ton thread et tu finies immédiatement ton prog...
Il faut mettre une synchronisation ou une boucle infinie:
dans ton main:
{

  CreateThread(0,0,StartOpenGL,0,0,&ThreadId);
  while(1)Sleep(1);

 return 0;


____________________________________________________________________________
Mon site internet :  
http://ImAnalyse.free.fr
0
spinzero Messages postés 16 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 21 mars 2009
21 mars 2009 à 23:40
Ah bé voui
Ca va bcp mieux maintenant !
je croyais que le while de ta source ne concernait que des retours de messages propre à l'exemple... le sleep, c'est nouveau.

Du coup ma boucle graphique est bien dans une thread, youpi tout fonctionne comme avant, mais la thread qui génère le son bloque toujours le processus graphique. Depuis j'ai cru comprendre qu'il fallait gèrer le Stream (open/start/close) du STK plus ou moins au début et à la fin du programme et non à chaque fois que l'on génère un son, donc dans mon cas je devrais le faire via ma classe générale (statique) tandis que les multiples instances d'une classe dynamique, représentant un son singulier avec ses propriétés, n'enverrais que des données audio à un seul buffer circulaire ...

Si c'est cohérent, je vais essayer de revoir ça comme ça ..?
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
22 mars 2009 à 20:17
Juste un dernier petit truc: on dit UN thread. C'est masculin...
A+ et bonne continuation

____________________________________________________________________________
Mon site internet :  
http://ImAnalyse.free.fr
0
Rejoignez-nous