IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Audio Discussion :

SDL pour l'audio - Crossfade


Sujet :

Audio

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 21
    Points
    21
    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 : 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
    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

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    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 : 21
    Points
    21
    Par défaut
    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

Discussions similaires

  1. Quel langage pour lecteur audio/video web ?
    Par Dayren dans le forum Général Conception Web
    Réponses: 4
    Dernier message: 26/06/2007, 11h45
  2. Réponses: 2
    Dernier message: 05/06/2007, 14h49
  3. [DirectX-DotNet] - Besoin d'info pour l'audio
    Par JFKen dans le forum DirectX
    Réponses: 4
    Dernier message: 29/06/2006, 18h59
  4. Création de pochettes et jaquettes pour CDs audio, DVDs, etc
    Par aliasjcdenton dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 26/03/2005, 18h34
  5. SDL pour dev C++
    Par Hyoga dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 29/12/2004, 18h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo