dsound: Correct the dsound fraglen calculations.

This commit is contained in:
Reece Dunn 2008-12-22 13:33:43 +00:00 committed by Alexandre Julliard
parent f9e0e5198f
commit ce06de4208
1 changed files with 14 additions and 9 deletions

View File

@ -46,19 +46,24 @@ WINE_DEFAULT_DEBUG_CHANNEL(dsound);
*/
DWORD DSOUND_fraglen(DWORD nSamplesPerSec, DWORD nBlockAlign)
{
DWORD fraglen = 256 * nBlockAlign;
/* Given a timer delay of 10ms, the fragment size is approximately:
* fraglen = (nSamplesPerSec * 10 / 1000) * nBlockAlign
* ==> fraglen = (nSamplesPerSec / 100) * nBlockSize
*
* ALSA uses buffers that are powers of 2. Because of this, fraglen
* is rounded up to the nearest power of 2:
*/
/* Compensate for only being roughly accurate */
if (nSamplesPerSec <= 26000)
fraglen /= 2;
if (nSamplesPerSec <= 12800)
return 128 * nBlockAlign;
if (nSamplesPerSec <= 10000)
fraglen /= 2;
if (nSamplesPerSec <= 25600)
return 256 * nBlockAlign;
if (nSamplesPerSec >= 80000)
fraglen *= 2;
if (nSamplesPerSec <= 51200)
return 512 * nBlockAlign;
return fraglen;
return 1024 * nBlockAlign;
}
static void DSOUND_RecalcPrimary(DirectSoundDevice *device)