- audio_mixer_getsamples( pcf, sys->source, cursor, sys->ch );
-
- avgvol += fabs( pcf[0] * sys->vol );
- avgvol += fabs( pcf[1] * sys->vol );
+ u32 samples_this_run = vg_min( frames_write, sys->end - cursor );
+
+ for( u32 j = 0; j < samples_this_run; j ++ )
+ {
+ audio_mixer_getsamples( pcf, sys->source, cursor, sys->ch );
+
+ avgvol += fabs( pcf[0] * sys->vol );
+ avgvol += fabs( pcf[1] * sys->vol );
+
+ pOut32F[ bpos*2+0 ] += pcf[0] * sys->vol;
+ pOut32F[ bpos*2+1 ] += pcf[1] * sys->vol;
+
+ // Blend the fadeout cursor in to prevent popping
+ if( sys->fadeout )
+ {
+ if( sys->fadeout_cursor < sys->end )
+ {
+ audio_mixer_getsamples( pcf, sys->source, sys->fadeout_cursor, sys->ch );
+
+ float mul = (float)sys->fadeout * FADEOUT_DIVISOR;
+
+ pOut32F[ bpos*2+0 ] += pcf[0] * sys->vol * mul;
+ pOut32F[ bpos*2+1 ] += pcf[1] * sys->vol * mul;
+
+ sys->fadeout_cursor ++;
+ sys->fadeout --;
+ }
+ else
+ sys->fadeout = 0;
+ }
+
+ cursor ++;
+ bpos ++;
+ }