diff options
author | Chris Robinson <[email protected]> | 2008-11-21 07:48:03 -0800 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2008-11-21 07:48:03 -0800 |
commit | 3dad17c26344ffa4e58f168ede68d32cf8f29b02 (patch) | |
tree | 6105ff43ef59940577b92a39e1b21c652548114e | |
parent | eefc18170da11f545390921385ecf2c9a7588d04 (diff) |
Make the DSound emulated fragment count configurable
-rw-r--r-- | Alc/dsound.c | 13 | ||||
-rw-r--r-- | alsoftrc.sample | 2 |
2 files changed, 9 insertions, 6 deletions
diff --git a/Alc/dsound.c b/Alc/dsound.c index 7e5ea2cc..38410861 100644 --- a/Alc/dsound.c +++ b/Alc/dsound.c @@ -39,8 +39,8 @@ DEFINE_GUID(KSDATAFORMAT_SUBTYPE_PCM, 0x00000001, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71); -// Since DSound doesn't report the fragment size, just assume 4 fragments -#define DS_FRAGS 4 +// Since DSound doesn't report the fragment size, emulate it +static int num_frags; typedef struct { // DirectSound Playback Device @@ -72,7 +72,7 @@ static ALuint DSoundProc(ALvoid *ptr) DWORD avail; HRESULT err; - BufferSize = pDevice->UpdateSize * DS_FRAGS * + BufferSize = pDevice->UpdateSize * num_frags * aluBytesFromFormat(pDevice->Format) * aluChannelsFromFormat(pDevice->Format); @@ -258,7 +258,7 @@ static ALCboolean DSoundOpenPlayback(ALCdevice *device, const ALCchar *deviceNam OutputType.Format.nAvgBytesPerSec = OutputType.Format.nSamplesPerSec*OutputType.Format.nBlockAlign; OutputType.Format.cbSize = 0; - device->UpdateSize /= DS_FRAGS; + device->UpdateSize /= num_frags; } if(OutputType.Format.nChannels > 2) @@ -286,7 +286,7 @@ static ALCboolean DSoundOpenPlayback(ALCdevice *device, const ALCchar *deviceNam memset(&DSBDescription,0,sizeof(DSBUFFERDESC)); DSBDescription.dwSize=sizeof(DSBUFFERDESC); DSBDescription.dwFlags=DSBCAPS_GLOBALFOCUS|DSBCAPS_GETCURRENTPOSITION2; - DSBDescription.dwBufferBytes=device->UpdateSize * DS_FRAGS * frameSize; + DSBDescription.dwBufferBytes=device->UpdateSize * num_frags * frameSize; DSBDescription.lpwfxFormat=&OutputType.Format; hr = IDirectSound_CreateSoundBuffer(pData->lpDS, &DSBDescription, &pData->DSsbuffer, NULL); } @@ -411,6 +411,9 @@ void alcDSoundInit(BackendFuncs *FuncList) *FuncList = DSoundFuncs; + num_frags = GetConfigValueInt("dsound", "periods", 4); + if(num_frags < 2) num_frags = 2; + hr = DirectSoundEnumerate(DSoundEnumDevices, &iter); if(FAILED(hr)) AL_PRINT("Error enumerating DirectSound devices (%#x)!\n", (unsigned int)hr); diff --git a/alsoftrc.sample b/alsoftrc.sample index 87cb88b6..0974a41c 100644 --- a/alsoftrc.sample +++ b/alsoftrc.sample @@ -95,7 +95,7 @@ device = /dev/audio # Sets the device name for Solaris output. Default is # /dev/audio [dsound] # DirectSound backend stuff - # Nothing yet... +periods = 4 # Sets the number of updates for the output buffer. Default is 4 [winmm] # Windows Multimedia backend stuff # Nothing yet... |