static void composite_line_yuv_float( uint8_t *dest, uint8_t *src, int width, uint8_t *alpha_b, uint8_t *alpha_a, float weight ) { register int j = 0; float mix_a, mix_b; for ( ; j < width; j ++ ) { mix_a = calculate_mix( 1.0f - weight, alpha_a? *alpha_a : 255 ); mix_b = calculate_mix( weight, alpha_b? *alpha_b : 255 ); if (alpha_a) { float mix2 = mix_b + mix_a - mix_b * mix_a; *alpha_a = 255 * mix2; if (mix2 != 0.f) mix_b /= mix2; } *dest = sample_mix( *dest, *src++, mix_b ); dest++; *dest = sample_mix( *dest, *src++, mix_b ); dest++; if ( alpha_a ) alpha_a ++; if ( alpha_b ) alpha_b ++; } }
void mixaudio(void * userData, Uint8 * stream, int len) { int i = 0,j; Uint32 nbSamples = len / sizeof(Sint16); for(;i<nbCurrentAudio;i++){ Audio* a = currentAudios[i]; if(a->play){ if(a->fadeOut) { a->currentVolume -= a->fadeOut; if(a->currentVolume<=0){ a->currentVolume = 0; a->fadeOut = 0; a->play = 0; int j=i; nbCurrentAudio--; for(;j<nbCurrentAudio;j++){ currentAudios[j] = currentAudios[j+1]; } a = currentAudios[i]; } } else if(a->fadeIn) { a->currentVolume += a->fadeIn; if(a->currentVolume>=a->maxVolume){ a->currentVolume = a->maxVolume; a->fadeIn = 0; } } for (j = 0; j < nbSamples; j++) { Sint16 mix = ((Sint16 *)stream)[j]; Sint16 sample = a->soundpos < a->soundlength ? (*((Sint16 *)(a->sounddata + a->soundpos))) : 0; sample = sample_volume(sample,a->currentVolume); sample = sample_mix(sample, mix); ((Sint16 *)stream)[j] = sample; a->soundpos += sizeof(Sint16); } if(a->soundpos>a->soundlength){ if(!a->repeat){ a->play = 0; } a->soundpos = 0; } } } }