예제 #1
0
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 ++;
	}
}
예제 #2
0
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;
            }
        }
    }
}