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 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:
{
spinzero
Messages postés16Date d'inscriptionsamedi 4 novembre 2000StatutMembreDernière intervention21 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 ..?