Some programs (quake2 et al) do check for DSCAPS_EMULDRIVER and stop to work. 'Adjust' caps flags accordingly.
diff --git a/multimedia/dsound.c b/multimedia/dsound.c index 9f53374..bfb24a7 100644 --- a/multimedia/dsound.c +++ b/multimedia/dsound.c
@@ -369,7 +369,7 @@ ) { caps->dwSize = sizeof(*caps); caps->dwFlags = DSBCAPS_PRIMARYBUFFER|DSBCAPS_STATIC|DSBCAPS_CTRLALL|DSBCAPS_LOCSOFTWARE; - caps->dwBufferBytes = 0; + caps->dwBufferBytes = 65536; caps->dwUnlockTransferRate = 0; caps->dwPlayCpuOverhead = 0; return DS_OK; @@ -493,7 +493,7 @@ TRACE(dsound,"(flags=0x%08lx)\n",caps->dwFlags); caps->dwSize = sizeof(*caps); - caps->dwFlags = DSCAPS_PRIMARYSTEREO|DSCAPS_PRIMARY16BIT|DSCAPS_EMULDRIVER|DSCAPS_SECONDARYSTEREO|DSCAPS_SECONDARY16BIT; + caps->dwFlags = DSCAPS_PRIMARYSTEREO|DSCAPS_PRIMARY16BIT|DSCAPS_SECONDARYSTEREO|DSCAPS_SECONDARY16BIT; /* FIXME: query OSS */ caps->dwMinSecondarySampleRate = 22050; caps->dwMaxSecondarySampleRate = 48000; @@ -503,10 +503,12 @@ } static ULONG WINAPI IDirectSound_AddRef(LPDIRECTSOUND this) { + TRACE(dsound,"(%p), ref was %d\n",this,this->ref); return ++(this->ref); } static ULONG WINAPI IDirectSound_Release(LPDIRECTSOUND this) { + TRACE(dsound,"(%p), ref was %d\n",this,this->ref); if (!--(this->ref)) { HeapFree(GetProcessHeap(),0,this); dsound = NULL; @@ -922,11 +924,11 @@ if (!dsound->nrofbuffers) { /* no soundbuffer yet... wait. */ Sleep(1000); + dsound->lpvtbl->fnRelease(dsound); continue; } memset(playbuf,0,sizeof(playbuf)); playing = 0; - dsound->lpvtbl->fnAddRef(dsound); haveprimary = 0; for (i=dsound->nrofbuffers;i--;) { IDirectSoundBuffer *dsb = dsound->buffers[i];