IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> [C] Allegro et fonctions sons, Un petit problème pour arrêter ma boucle
Options
le jeune bidouil...
posté 30 Mar 2011, 20:51
Message #1


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 194
Inscrit : 1 Aug 2005
Lieu : Tahiti
Membre no 43 294



Bonjour, voilà je suis entrain de coder un petit jeu comme Project avec allegro.

J'ai crée des fonctions pour géré le son factilement, mais voilà j'arrive pas à arrêter ma boucle infinie qui joue le son de mon choix.
CODE


void play(char*nomSon)
{
SAMPLE*sample=load_sample(nomSon);

if (!sample)
{
allegro_message("pas pu trouver le fichier son %s",nomSon);
exit(EXIT_FAILURE);
}
play_sample(sample, 255, 0, 1000, 0);//0 pas de loop



Fonctionne parfaitement et me permet de faire plusieurs sons en même temps.

CODE

SAMPLE* playloop(char*nomSon)
{
SAMPLE*sample=load_sample(nomSon);
if (sample == NULL)
{
allegro_message("pas pu trouver le fichier son %s",nomSon);
exit(EXIT_FAILURE);
}
play_sample(sample, 100, 0, 1000, 1);//1 loop
return sample;
}

Je récupère un pointer SAMPLE* dans le main. La fonction lance bien un son, jusqu'à ce que je l'arrête donc en boucle
Mais mon problème c'est que j'arrive pas à l'arreter
CODE

void stoploop(SAMPLE* sample)
{
stop_sample(sample);

}


Je lui envoi le pointeur récupérer dans le main, mais ça ne fonctionne pas. Vous avez une idée?

Merci d'avance


--------------------
Imac Alu 24" 2.4Ghz 2Go 10.5.4
Dual-core Intel® Atom™- 1 Tb 10.5.6 Serveur
iPhone 8Go 2.1
www.dedimac.com
Go to the top of the page
 
+Quote Post
chombier
posté 1 Apr 2011, 19:04
Message #2


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 6 580
Inscrit : 20 Mar 2003
Membre no 6 765



Citation (le jeune bidouilleur @ 30 Mar 2011, 20:51) *
Je récupère un pointer SAMPLE* dans le main. La fonction lance bien un son, jusqu'à ce que je l'arrête donc en boucle
Mais mon problème c'est que j'arrive pas à l'arreter

La fonction play_sample() est-elle synchrone (elle attend la fin du sample avant de ressortir) ?


--------------------
késtananafout' (:
Go to the top of the page
 
+Quote Post
le jeune bidouil...
posté 1 Apr 2011, 21:49
Message #3


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 194
Inscrit : 1 Aug 2005
Lieu : Tahiti
Membre no 43 294



euh, je ne sais pas trop.
Si j'appel mon fonction play("nondu.wav") 2 deux son, j'arrive à les jouer en même temps.

J'ai essayé de tout mettre dans le main, sans les sous programmes et donc sans faire passer de pointeur. Et ça fonctionne si je lance une lecture en boucle et l'arrête avec stop_sample. Ce qui confirme que l'erreur viens de mes sous programme. Je pense que c'est au moment ou je retourne le pointeur un main que ça plante.

Merci


--------------------
Imac Alu 24" 2.4Ghz 2Go 10.5.4
Dual-core Intel® Atom™- 1 Tb 10.5.6 Serveur
iPhone 8Go 2.1
www.dedimac.com
Go to the top of the page
 
+Quote Post
chombier
posté 1 Apr 2011, 22:34
Message #4


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 6 580
Inscrit : 20 Mar 2003
Membre no 6 765



Citation (le jeune bidouilleur @ 1 Apr 2011, 21:49) *
euh, je ne sais pas trop.

Pour le vérifier, ce n'est pas bien compliqué: tu choisis un sample assez long, et tu ajoutes un printf avant et après l'appel à la fonction. si le printf après l'appel s'affiche avant la fin du sample, ta fonction est asynchrone.
Citation (le jeune bidouilleur @ 1 Apr 2011, 21:49) *
Si j'appel mon fonction play("nondu.wav") 2 deux son, j'arrive à les jouer en même temps.

Donc, à priori, elle est asynchrone.
Citation (le jeune bidouilleur @ 1 Apr 2011, 21:49) *
J'ai essayé de tout mettre dans le main, sans les sous programmes et donc sans faire passer de pointeur. Et ça fonctionne si je lance une lecture en boucle et l'arrête avec stop_sample. Ce qui confirme que l'erreur viens de mes sous programme. Je pense que c'est au moment ou je retourne le pointeur un main que ça plante.

Et si tu postais ton code ?
Ou un bout de code qui démontre que ce que tu veux faire ne fonctionne pas ? (cf: tests unitaires du cycle en V)


--------------------
késtananafout' (:
Go to the top of the page
 
+Quote Post
darenzana
posté 2 Apr 2011, 02:23
Message #5


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 1 745
Inscrit : 13 Nov 2006
Membre no 72 823



sinon utilise un débugueur (ou des printf...), pour vérifier que la valeur de sample que tu passes à stoploop est bien celle renvoyée par playloop.


--------------------
Macbook Pro 15" Core 2 Duo 2.33GHz, 3Go RAM, Mac OS X 10.6.8 | Macbook Air 13" mi-2011 Core i5, Mac OS X 10.8
NAS Synology DS-110+
iPhone 6 silver 64Go - forfait SFR Red 3Go
Go to the top of the page
 
+Quote Post
le jeune bidouil...
posté 11 Apr 2011, 15:52
Message #6


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 194
Inscrit : 1 Aug 2005
Lieu : Tahiti
Membre no 43 294



Je reviens vers vous pour un autre problème j'ai réussi à utiliser mes fonctions son; mais maintenant je voudrais ajuster le son

J'ai donc créé 2 fonctions qui s'appellent, je vous expliquer avec le code:-)

Dans le main
CODE
muet=dessinerMuet(page,speaker,speakeroff,forest,muet);


Avec muet initialisé à 1

Mes sous-programmes
CODE

int dessinerMuet(BITMAP*page,BITMAP*speaker,BITMAP*speakeroff,char*nomSon,int muet)// muet=0=> Muet
{
muet=mute(nomSon,muet);

if(muet==0)
{
masked_blit(speakeroff,page,0,0,100,100,speaker->w,speaker->h);
}//Fonctionne jusqu'à la
if(muet==1)
{
masked_blit(speaker,page,0,0,100,100,speaker->w,speaker->h);
}


return muet;


}


Pour géré l'affichage en fonction de l'état de muet
CODE
int mute(char* nomSon,int muet)
{
// On utilise 1 pour avoir du son et 0 pour muet

if(mouse_x>100&&mouse_x<120&&mouse_y>100&&mouse_y<120&&(muet==0)&&mouse_b&1)
{
muet=1;

adjust_sample(nomSon,255, 128,1000,1);


}
if(mouse_x>100&&mouse_x<120&&mouse_y>100&&mouse_y<120&&muet==1&&mouse_b&1)
{

muet=0;
adjust_sample(nomSon,0, 128,1000,1);

}

return muet;
}


Ici on ajuste le son.

Cela fonctionne lors du premier click, l'image change et le son est coupé. Par contre après quand je click la valeur de muet ne repasse pas à 1.

Merci d'avance, j'ai cherché longuement autour, mais je ne vous vraiment pas

Ce message a été modifié par le jeune bidouilleur - 11 Apr 2011, 15:53.


--------------------
Imac Alu 24" 2.4Ghz 2Go 10.5.4
Dual-core Intel® Atom™- 1 Tb 10.5.6 Serveur
iPhone 8Go 2.1
www.dedimac.com
Go to the top of the page
 
+Quote Post
darenzana
posté 11 Apr 2011, 21:18
Message #7


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 1 745
Inscrit : 13 Nov 2006
Membre no 72 823



Si on appelle mute avec muet à 0 (et des valeurs de x & y qui correspondent aux test), on va passer dans les 2 if, vu que le corps du premier passe muet à 1.
Je suppose que ce n'est pas le comportement voulu...
ça ne serait pas plus lisible comme ça?
Code
int mute(char* nomSon,int muet)
{
    // On utilise 1 pour avoir du son et 0 pour muet

    if( 100 < mouse_x && mouse_x < 120 &&  100 < mouse_y && mouse_y < 120 && mouse_b&1 )
    {
             adjust_sample(nomSon, muet ? 0 : 255, 128, 1000, 1);
             muet = ! muet;
    }

    return muet;
}


Ce message a été modifié par darenzana - 11 Apr 2011, 21:39.


--------------------
Macbook Pro 15" Core 2 Duo 2.33GHz, 3Go RAM, Mac OS X 10.6.8 | Macbook Air 13" mi-2011 Core i5, Mac OS X 10.8
NAS Synology DS-110+
iPhone 6 silver 64Go - forfait SFR Red 3Go
Go to the top of the page
 
+Quote Post
le jeune bidouil...
posté 12 Apr 2011, 09:54
Message #8


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 194
Inscrit : 1 Aug 2005
Lieu : Tahiti
Membre no 43 294



Merci ça fonctionne parfaitement:)
Je comprend pas trop le muet = ! muet;

merci


--------------------
Imac Alu 24" 2.4Ghz 2Go 10.5.4
Dual-core Intel® Atom™- 1 Tb 10.5.6 Serveur
iPhone 8Go 2.1
www.dedimac.com
Go to the top of the page
 
+Quote Post
darenzana
posté 12 Apr 2011, 18:42
Message #9


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 1 745
Inscrit : 13 Nov 2006
Membre no 72 823



! est l'opérateur de négation logique, défini comme suit:

! 0 = 1
! n'importe quelle valeur différent de 0 = 0

quand j'ecris muet = ! muet, c'est pour inverser sa valeur.

c'est équivalent à muet = muet ? 0 : 1 ;
ou à if (muet == 0) { muet = 1 } else { muet = 0 }
ou à if (muet != 0) { muet = 0 } else { muet = 1 }
ou à if (muet) { muet = 0 } else { muet = 1}


--------------------
Macbook Pro 15" Core 2 Duo 2.33GHz, 3Go RAM, Mac OS X 10.6.8 | Macbook Air 13" mi-2011 Core i5, Mac OS X 10.8
NAS Synology DS-110+
iPhone 6 silver 64Go - forfait SFR Red 3Go
Go to the top of the page
 
+Quote Post
le jeune bidouil...
posté 13 Apr 2011, 08:54
Message #10


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 194
Inscrit : 1 Aug 2005
Lieu : Tahiti
Membre no 43 294



Merci pour ton aide précieuse


--------------------
Imac Alu 24" 2.4Ghz 2Go 10.5.4
Dual-core Intel® Atom™- 1 Tb 10.5.6 Serveur
iPhone 8Go 2.1
www.dedimac.com
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 23rd April 2024 - 10:36