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);
}
}
} |
Partager