From 772539a84a0d68c953319076d3aae0a8ba342018 Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Fri, 2 May 2003 21:23:16 +0000 Subject: [PATCH] Move all tests to outside the loop when setting volume. Add traces to functions. --- dlls/dsound/mixer.c | 78 +++++++++++++++++++++++++++++++------------ dlls/dsound/primary.c | 22 ++++++++++-- 2 files changed, 77 insertions(+), 23 deletions(-) diff --git a/dlls/dsound/mixer.c b/dlls/dsound/mixer.c index 27bcc57294f..76d325c44ab 100644 --- a/dlls/dsound/mixer.c +++ b/dlls/dsound/mixer.c @@ -256,12 +256,14 @@ static INT DSOUND_MixerNorm(IDirectSoundBufferImpl *dsb, BYTE *buf, INT len) static void DSOUND_MixerVol(IDirectSoundBufferImpl *dsb, BYTE *buf, INT len) { - INT i, inc = dsb->dsound->wfx.wBitsPerSample >> 3; + INT i; BYTE *bpc = buf; INT16 *bps = (INT16 *) buf; - TRACE("(%p) left = %lx, right = %lx\n", dsb, - dsb->cvolpan.dwTotalLeftAmpFactor, dsb->cvolpan.dwTotalRightAmpFactor); + TRACE("(%p,%p,%d)\n",dsb,buf,len); + TRACE("left = %lx, right = %lx\n", dsb->cvolpan.dwTotalLeftAmpFactor, + dsb->cvolpan.dwTotalRightAmpFactor); + if ((!(dsb->dsbd.dwFlags & DSBCAPS_CTRLPAN) || (dsb->cvolpan.lPan == 0)) && (!(dsb->dsbd.dwFlags & DSBCAPS_CTRLVOLUME) || (dsb->cvolpan.lVolume == 0)) && !(dsb->dsbd.dwFlags & DSBCAPS_CTRL3D)) @@ -271,30 +273,60 @@ static void DSOUND_MixerVol(IDirectSoundBufferImpl *dsb, BYTE *buf, INT len) /* with a mono primary buffer, it could sound very weird using */ /* this method. Oh well, tough patooties. */ - for (i = 0; i < len; i += inc) { - INT val; - - switch (inc) { - + switch (dsb->dsound->wfx.wBitsPerSample) { + case 8: + /* 8-bit WAV is unsigned, but we need to operate */ + /* on signed data for this to work properly */ + switch (dsb->dsound->wfx.nChannels) { case 1: - /* 8-bit WAV is unsigned, but we need to operate */ - /* on signed data for this to work properly */ - val = *bpc - 128; - val = ((val * (i & inc ? dsb->cvolpan.dwTotalRightAmpFactor : dsb->cvolpan.dwTotalLeftAmpFactor)) >> 16); - *bpc = val + 128; - bpc++; + for (i = 0; i < len; i++) { + INT val = *bpc - 128; + val = (val * dsb->cvolpan.dwTotalLeftAmpFactor) >> 16; + *bpc = val + 128; + bpc++; + } break; case 2: - /* 16-bit WAV is signed -- much better */ - val = *bps; - val = ((val * ((i & inc) ? dsb->cvolpan.dwTotalRightAmpFactor : dsb->cvolpan.dwTotalLeftAmpFactor)) >> 16); - *bps = val; - bps++; + for (i = 0; i < len; i+=2) { + INT val = *bpc - 128; + val = (val * dsb->cvolpan.dwTotalLeftAmpFactor) >> 16; + *bpc++ = val + 128; + val = *bpc - 128; + val = (val * dsb->cvolpan.dwTotalRightAmpFactor) >> 16; + *bpc = val + 128; + bpc++; + } break; default: - /* Very ugly! */ - FIXME("MixerVol had a nasty error\n"); + FIXME("doesn't support %d channels\n", dsb->dsound->wfx.nChannels); + break; } + break; + case 16: + /* 16-bit WAV is signed -- much better */ + switch (dsb->dsound->wfx.nChannels) { + case 1: + for (i = 0; i < len; i += 2) { + *bps = (*bps * dsb->cvolpan.dwTotalLeftAmpFactor) >> 16; + bps++; + } + break; + case 2: + for (i = 0; i < len; i += 4) { + *bps = (*bps * dsb->cvolpan.dwTotalLeftAmpFactor) >> 16; + bps++; + *bps = (*bps * dsb->cvolpan.dwTotalRightAmpFactor) >> 16; + bps++; + } + break; + default: + FIXME("doesn't support %d channels\n", dsb->dsound->wfx.nChannels); + break; + } + break; + default: + FIXME("doesn't support %d bit samples\n", dsb->dsound->wfx.wBitsPerSample); + break; } } @@ -321,6 +353,8 @@ static DWORD DSOUND_MixInBuffer(IDirectSoundBufferImpl *dsb, DWORD writepos, DWO BYTE *buf, *ibuf, *obuf; INT16 *ibufs, *obufs; + TRACE("%p,%ld,%ld)\n",dsb,writepos,fraglen); + len = fraglen; if (!(dsb->playflags & DSBPLAY_LOOPING)) { temp = MulDiv(dsb->dsound->wfx.nAvgBytesPerSec, dsb->buflen, @@ -808,6 +842,8 @@ void DSOUND_PerformMix(void) BOOL forced; HRESULT hres; + TRACE("()\n"); + RtlAcquireResourceShared(&(dsound->lock), TRUE); if (!dsound || !dsound->ref) { diff --git a/dlls/dsound/primary.c b/dlls/dsound/primary.c index f5424b6adbf..fe79c216314 100644 --- a/dlls/dsound/primary.c +++ b/dlls/dsound/primary.c @@ -50,6 +50,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(dsound); void DSOUND_RecalcPrimary(IDirectSoundImpl *This) { DWORD sw; + TRACE("(%p)\n",This); sw = This->wfx.nChannels * (This->wfx.wBitsPerSample / 8); if (This->hwbuf) { @@ -69,6 +70,7 @@ void DSOUND_RecalcPrimary(IDirectSoundImpl *This) static HRESULT DSOUND_PrimaryOpen(IDirectSoundImpl *This) { HRESULT err = DS_OK; + TRACE("(%p)\n",This); /* are we using waveOut stuff? */ if (!This->hwbuf) { @@ -129,6 +131,8 @@ static HRESULT DSOUND_PrimaryOpen(IDirectSoundImpl *This) static void DSOUND_PrimaryClose(IDirectSoundImpl *This) { + TRACE("(%p)\n",This); + /* are we using waveOut stuff? */ if (!This->hwbuf) { unsigned c; @@ -144,6 +148,7 @@ static void DSOUND_PrimaryClose(IDirectSoundImpl *This) HRESULT DSOUND_PrimaryCreate(IDirectSoundImpl *This) { HRESULT err = DS_OK; + TRACE("(%p)\n",This); This->buflen = This->wfx.nAvgBytesPerSec; @@ -182,6 +187,8 @@ HRESULT DSOUND_PrimaryCreate(IDirectSoundImpl *This) HRESULT DSOUND_PrimaryDestroy(IDirectSoundImpl *This) { + TRACE("(%p)\n",This); + DSOUND_PrimaryClose(This); if (This->hwbuf) { if (IDsDriverBuffer_Release(This->hwbuf) == 0) @@ -198,6 +205,8 @@ HRESULT DSOUND_PrimaryDestroy(IDirectSoundImpl *This) HRESULT DSOUND_PrimaryPlay(IDirectSoundImpl *This) { HRESULT err = DS_OK; + TRACE("(%p)\n",This); + if (This->hwbuf) err = IDsDriverBuffer_Play(This->hwbuf, 0, 0, DSBPLAY_LOOPING); else @@ -208,8 +217,7 @@ HRESULT DSOUND_PrimaryPlay(IDirectSoundImpl *This) HRESULT DSOUND_PrimaryStop(IDirectSoundImpl *This) { HRESULT err = DS_OK; - - TRACE("\n"); + TRACE("(%p)\n",This); if (This->hwbuf) { err = IDsDriverBuffer_Stop(This->hwbuf); @@ -239,6 +247,8 @@ HRESULT DSOUND_PrimaryStop(IDirectSoundImpl *This) HRESULT DSOUND_PrimaryGetPosition(IDirectSoundImpl *This, LPDWORD playpos, LPDWORD writepos) { + TRACE("(%p,%p,%p)\n",This,playpos,writepos); + if (This->hwbuf) { HRESULT err=IDsDriverBuffer_GetPosition(This->hwbuf,playpos,writepos); if (err) return err; @@ -277,6 +287,7 @@ static HRESULT WINAPI PrimaryBufferImpl_SetFormat( IDirectSoundBufferImpl** dsb; HRESULT err = DS_OK; int i; + TRACE("(%p,%p)\n",This,wfex); if (This->dsound->priolevel == DSSCL_NORMAL) { TRACE("failed priority check!\n"); @@ -874,6 +885,8 @@ HRESULT WINAPI PrimaryBuffer_Create( { PrimaryBufferImpl *dsb; + TRACE("%p,%p,%p)\n",This,pdsb,dsbd); + if (dsbd->lpwfxFormat) return DSERR_INVALIDPARAM; @@ -885,6 +898,11 @@ HRESULT WINAPI PrimaryBuffer_Create( memcpy(&dsb->dsbd, dsbd, sizeof(*dsbd)); TRACE("Created primary buffer at %p\n", dsb); + TRACE("(formattag=0x%04x,chans=%d,samplerate=%ld," + "bytespersec=%ld,blockalign=%d,bitspersamp=%d,cbSize=%d)\n", + This->wfx.wFormatTag, This->wfx.nChannels, This->wfx.nSamplesPerSec, + This->wfx.nAvgBytesPerSec, This->wfx.nBlockAlign, + This->wfx.wBitsPerSample, This->wfx.cbSize); if (dsbd->dwFlags & DSBCAPS_CTRL3D) { /* FIXME: IDirectSound3DListener */