Andrew Eikum wrote:
Before this patch, the chain is secondary format =(Resample)=> float =(Reformat)=> device format =(Mix)=> float =(Reformat)=> device format
Now it's secondary format =(Resample)=> float =(Mix)=> float =(Reformat)=> device format
Overall, this looks like a good cleanup. However, the chart above uses the word "(Mix)" for a combination of two operations: 1) apply volume to each sample, 2) calculate sum of samples corresponding to all playing buffers. I'd like you to resend this patch with these two steps shown separately (this also applies to the copy in the comments in mixer.c).
Some notes about the code:
The planned optimization that groups secondary buffers by sample rate before resampling the mix of them depends on having the volume applied before resampling, not after. So these operations have to be reordered in a later patch.
void put_mono2stereo(const IDirectSoundBufferImpl *dsb, DWORD pos, DWORD channel, float value) { dsb->put_aux(dsb, pos, 0, value); dsb->put_aux(dsb, pos, 1, value); }
...
- dsb->put_aux = putbpp[dsb->device->pwfx->wBitsPerSample/8 - 1];
dsb->put_aux = putieee32;
dsb->get = dsb->get_aux; dsb->put = dsb->put_aux;
... and then dsb-> put and dsb->get are possibly overwritten
Here it looks like we can also remove put_aux by always using put_ieee32 in put_mono2stereo().
- vLeft = dsb->volpan.dwTotalLeftAmpFactor / ((float)0xFFFF);
- vRight = dsb->volpan.dwTotalRightAmpFactor / ((float)0xFFFF);
If dwTotal{Left,Right}AmpFactor is not something public, then we can as well store it as a float.
All of the above can, of course, be addressed later.