From 96f9a8d60977d1285e57b5cc8cb21424f3e4fa5a Mon Sep 17 00:00:00 2001 From: Ove Kaaven Date: Thu, 21 Dec 2000 20:20:34 +0000 Subject: [PATCH] Enable the DirectSound HAL for sound drivers that do not report DSP_CAP_REALTIME. Set precision of these to 256 bytes (about 3ms). --- dlls/winmm/wineoss/audio.c | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/dlls/winmm/wineoss/audio.c b/dlls/winmm/wineoss/audio.c index ec04d254b6e..3beb71b024f 100644 --- a/dlls/winmm/wineoss/audio.c +++ b/dlls/winmm/wineoss/audio.c @@ -253,11 +253,11 @@ LONG OSS_WaveInit(void) TRACE("OSS dsp out caps=%08X\n", caps); if ((caps & DSP_CAP_REALTIME) && !(caps & DSP_CAP_BATCH)) { WOutDev[0].caps.dwSupport |= WAVECAPS_SAMPLEACCURATE; - - /* well, might as well use the DirectSound cap flag for something */ - if ((caps & DSP_CAP_TRIGGER) && (caps & DSP_CAP_MMAP)) - WOutDev[0].caps.dwSupport |= WAVECAPS_DIRECTSOUND; } + /* well, might as well use the DirectSound cap flag for something */ + if ((caps & DSP_CAP_TRIGGER) && (caps & DSP_CAP_MMAP) && + !(caps & DSP_CAP_BATCH)) + WOutDev[0].caps.dwSupport |= WAVECAPS_DIRECTSOUND; } close(audio); TRACE("out dwFormats = %08lX, dwSupport = %08lX\n", @@ -821,9 +821,14 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) } if (dwFlags & WAVE_DIRECTSOUND) { - /* with DirectSound, fragments are irrelevant, but a large buffer isn't... - * so let's choose a full 64KB (32 * 2^11) for DirectSound */ - audio_fragment = 0x0020000B; + if (wwo->caps.dwSupport & WAVECAPS_SAMPLEACCURATE) + /* we have realtime DirectSound, fragments just waste our time, + * but a large buffer is good, so choose 64KB (32 * 2^11) */ + audio_fragment = 0x0020000B; + else + /* to approximate realtime, we must use small fragments, + * let's try to fragment the above 64KB (256 * 2^8) */ + audio_fragment = 0x01000008; } else { /* shockwave player uses only 4 1k-fragments at a rate of 22050 bytes/sec * thus leading to 46ms per fragment, and a turnaround time of 185ms @@ -1415,12 +1420,15 @@ static HRESULT WINAPI IDsDriverBufferImpl_GetPosition(PIDSDRIVERBUFFER iface, if (lpdwPlay) *lpdwPlay = ptr; if (lpdwWrite) { /* add some safety margin (not strictly necessary, but...) */ - *lpdwWrite = ptr + 32; + if (WOutDev[This->drv->wDevID].caps.dwSupport & WAVECAPS_SAMPLEACCURATE) + *lpdwWrite = ptr + 32; + else + *lpdwWrite = ptr + WOutDev[This->drv->wDevID].dwFragmentSize; while (*lpdwWrite > This->buflen) *lpdwWrite -= This->buflen; } TRACE("playpos=%ld, writepos=%ld\n", lpdwPlay?*lpdwPlay:0, lpdwWrite?*lpdwWrite:0); - return DSERR_UNSUPPORTED; + return DS_OK; } static HRESULT WINAPI IDsDriverBufferImpl_Play(PIDSDRIVERBUFFER iface, DWORD dwRes1, DWORD dwRes2, DWORD dwFlags) @@ -1567,6 +1575,7 @@ static HRESULT WINAPI IDsDriverImpl_CreateSoundBuffer(PIDSDRIVER iface, IDsDriverBufferImpl** ippdsdb = (IDsDriverBufferImpl**)ppvObj; HRESULT err; audio_buf_info info; + int enable = 0; TRACE("(%p,%p,%lx,%lx)\n",iface,pwfx,dwFlags,dwCardAddress); /* we only support primary buffers */ @@ -1605,6 +1614,12 @@ static HRESULT WINAPI IDsDriverImpl_CreateSoundBuffer(PIDSDRIVER iface, *pdwcbBufferSize = WOutDev[This->wDevID].maplen; *ppbBuffer = WOutDev[This->wDevID].mapping; + /* some drivers need some extra nudging after mapping */ + if (ioctl(WOutDev[This->wDevID].unixdev, SNDCTL_DSP_SETTRIGGER, &enable) < 0) { + ERR("ioctl failed (%d)\n", errno); + return DSERR_GENERIC; + } + This->primary = *ippdsdb; return DS_OK; -- 2.11.4.GIT