Précédent   Forum du club des développeurs et IT Pro > Applications > Développement 2D, 3D et Jeux > Audio
Audio Forum d'entraide sur les API et bibliothèques audio
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 11/05/2012, 08h36   #1
kenzoshin
Invité régulier
 
Homme
Étudiant
Inscription : juin 2011
Messages : 29
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Chine

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 29
Points : 6
Points : 6
Par défaut SDL pour l'audio - Crossfade

Bonjour,

J'ai un petit probleme que je n'arrive pas resoudre par moi meme.
Je suis en train de faire un petit programme et dans la partie audio, je voudrais faire un fondu ( crossfade ) entre deux sons.

Voici mon code de ma fonction de rappel :

Code :
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
58
59
60
int i, j;
 
/* Parcours de tous les slots audio, à la recherche de ceux qui sont utilisés */
   for (i = 0; i < NBR_OF_AUDIO_SLOTS; i++) {
     if (soundplayer_isplaying(&audio_slots[i])) {
       soundplayer * player = &audio_slots[i];
       sound * toplay = player->played_sound;
 
       /* Le nombre d echantillons que nous allons produire */
       Uint32 nbSamples = len/sizeof(Sint16);
 
       for (j = 0; j < nbSamples; j++) {
 
         Sint16 sound1 = ((Sint16 *)stream)[j];
 
	 /* Récupération de l'échantillon courant, ou de la valeur 0 si nous 
	    avons fini de jouer le son */
         Sint16 sound2 = (player->pos < toplay->length) ?
                                    (*(Sint16 *)(toplay->data + player->pos)) : 0;
 
	 /* x est le nombre d echantillon necessaire pour faire le crossfade, il est remis a zero lorsque on appuie sur une touche pour fiare un son*/
	 if (x < 8191 )
	 { 
 
         /* utilisation d'un fonction de cosinus pour faire le crossfade */
	 double fadeout =  cos( (x * M_PI) / ((nbSamples-1) *2)  );
	 double fadein = 1 -   cos( (x * M_PI) / ((nbSamples-1) *2)  );
 
         /* Reglage du volume pour le son 1 avec un fade out*/
	 Uint8 volume = (double)((double)global_volume * fadeout); 
	 sound1 = sample_volume(sound1, volume);
 
         /* reglage du volume pour le son 2 avec un fade in*/
	 volume = (double)((double)global_volume * fadein);
	 sample = sample_volume(sample, volume);
 
 
         /* Addition des deux son  */
         sample = sample_mix(sample, mix);
  	 x++;
	 }
	 else
	 {
	 /* Une fois le crossfade termine, on ne garde que le son 2 avec le reglage de volume adequat */
         sample = sample_volume(sample, 255);
         }
 
         /* Ecriture du nouveau son mixé */
         ((Sint16 *)stream)[j] = sample;
 
         player->pos += sizeof(Sint16);
 
 
       }
       /* Mise à jour du lecteur */
       soundplayer_update(player);
     }
  }
 
 }
Et voici mon probleme :
Lorsque j'appuie une touche cela lance un son et si le son n'est pas termine et que touche est appuye ca doit faire un crosse fade ( dans mon cas c'est des morceaux de son qui dure 5 - 7 sec ) et mon probleme c est que lorsque je lance le deuxieme son, ca coupe le premier son et j'ai un fondu que sur le deuxieme son ( un fade in sur le deuxieme ) et je ne trouve pas d erreur dans mon code :S

Dans ma fonction de rappel, si on lance le deuxieme son, il devrait avoir un fadeout sur le premier son et un fade in sur le deuxieme son. Pourtant je n ai que le fade in et jai un stop brusque du son 1 :S

Si quelqu un peut m eclaircir mon probleme j en serai ravi !!

Merci d avance
kenzoshin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/05/2012, 07h16   #2
kenzoshin
Invité régulier
 
Homme
Étudiant
Inscription : juin 2011
Messages : 29
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Chine

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 29
Points : 6
Points : 6
je n'ai pas fait attention quand j ai voulu changer mon code je ne l'ai fait que partiellement

sample = sound2
mix = sound1

Si quelqu un pouvait m eclairer
kenzoshin est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h52.


 
 
 
 
Partenaires

Hébergement Web