Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

FMOD Discussion :

FMOD Channel GetSpectrum


Sujet :

FMOD

  1. #1
    Nouveau membre du Club
    FMOD Channel GetSpectrum
    Bonjour

    J'aimerai utilisé la fonction FMOD_Channel_GetSpectrum pour afficher une visualisation du spectre sonore comme le font la plupart des lecteur audio, cependant après avoir lu et relu la doc de FMOD à ce sujet je ne vois toujours pas où il peut bien y avoir une erreur..

    Je vous donne la partie de mon code qui nous intéressent :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    FMOD_System_GetMasterChannelGroup(system, &allChannel);
    	FMOD_System_CreateSound(system, "musique.mp3", FMOD_SOFTWARE | FMOD_2D | FMOD_CREATESTREAM | FMOD_LOOP_NORMAL, 0, &musique);
    	FMOD_Sound_SetLoopCount(musique, -1);
    	FMOD_System_PlaySound(system, FMOD_CHANNEL_FREE, musique, 0, NULL);
    	FMOD_System_GetChannel(system, FMOD_CHANNEL_FREE, &channel);
     
    	ecran = SDL_SetVideoMode(1024, 400, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    	SDL_WM_SetCaption("Lecteur Audio", NULL);
     
    	coordonee.y = coordonee.x = 0;
     
    	while (continuer)
    	{
    		tempsPrecedent = SDL_GetTicks ();
     
    		while(SDL_PollEvent(&myEvent))
    		{
    			switch(myEvent.type)
    			{
    				case SDL_QUIT: continuer = 0;
    					break;
     
    				case SDL_KEYDOWN:
    					switch(myEvent.key.keysym.sym)
    					{
    						case SDLK_ESCAPE: continuer = 0;
    							break;
     
    						case SDLK_SPACE: 
    							FMOD_ChannelGroup_GetPaused(allChannel, &pause);
    							FMOD_ChannelGroup_SetPaused(allChannel, !pause);
    							break;
    					}
    			}
    		}
     
    		FMOD_Channel_GetSpectrum(channel, frequenceMusique, NBFREQUENCE, 0,  FMOD_DSP_FFT_WINDOW_RECT);
     
    		for(iFrequence = 0; iFrequence < NBFREQUENCE; iFrequence ++)
    		{
    			fprintf(stderr,"%f\n", frequenceMusique[iFrequence]);
    		}
     
    		for( iFrequence = 0, coordonee.x = 0; iFrequence < NBFREQUENCE; iFrequence ++, coordonee.x ++ )
    		{
    			barreVerticale = SDL_CreateRGBSurface(SDL_HWSURFACE, 1, (frequenceMusique[iFrequence] * 400), 32, 0, 0, 0, 0);
    			SDL_FillRect(barreVerticale, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
    			SDL_BlitSurface(barreVerticale, NULL, ecran, &coordonee);
    			SDL_Flip(ecran);
    		}
     
    		tempsActuel = SDL_GetTicks ();
     
    		if(tempsActuel - tempsPrecedent < 30)
    		{
    			SDL_Delay(30 - (tempsActuel - tempsPrecedent));
    		}


    Enfaite lorsque je regarde la variable barreVerticale->h je trouve un nombre négatif incompréhensible, j'ai donc enregistrer les valeurs du tableau frequenceMusique et lorsque je vais voir je trouve ceci:

    0.000000
    -107374176.000000
    -107374176.000000
    -107374176.000000
    -107374176.000000
    -107374176.000000
    -107374176.000000
    ...

    Et ainsi de suite.

    Et, mon canal à été déclarer comme ceci :
    FMOD_CHANNEL* channel;

    Et NBFREQUENCE correspond à 1024.

    Merci d'avance !

  2. #2
    Responsable 2D/3D/Jeux

    Bonjour,

    Je pense qu'il manque un appel à la méthode Update. Normalement, dans cette version, si je me rappelle bien, son nom est : FMOD_System_Update(). En effet, c'est cette fonction qui met à jour les données liées au son joué et notamment, rempli le spectrum des données adéquates.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Nouveau membre du Club
    Bonjour et merci de la réponse, je débute avec FMOD et je ne connaissais pas cette fonction.. J'ai donc voulu l'intégrer à mon code mais je ne vois pas où je dois la placer enfaite :/

    J'ai essayer de la mettre au début du while (continuer), au début du for, juste après le ou juste avant getSpectrum, mais ça me donne toujours la même erreur :/

    J'ai été voir dans la doc et je ne vois rien qui puisse m'éclairer :/

    Merci d'avance :/

  4. #4
    Responsable 2D/3D/Jeux

    Il faut l'appeler dans la boucle (dans le plus grand while).
    Normalement, cela suffit.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Nouveau membre du Club
    Si c'est quelques choses comme ça :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while (continuer)
    	{
    		tempsPrecedent = SDL_GetTicks ();
    		FMOD_System_Update(system);
     
    		while(SDL_PollEvent(&myEvent))
    		{


    Je retombe sur la même erreur avec les même chiffre négatif :/

  6. #6
    Responsable 2D/3D/Jeux

    Je regardais le code d'une de mes vieilles applications et je me demandais si la cause n'était pas l'utilisation de FMOD_System_CreateSound() au lieu de FMOD_System_CreateStream. Car, il se peut que le GetSpectrum ne fasse que fonctionner sur les streams (musique) et non les "sons" (sons courts).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.