http://bugs.winehq.org/show_bug.cgi?id=14717
--- Comment #115 from Krzysztof Nikiel zzdz2@yahoo.pl 2011-01-02 10:56:28 CST --- (In reply to comment #112)
Clicks for resampled sound are indeed gone. However, they appeared for the case when there is no change in the sample rate. I guess that the resampling delay should be added to the write lead, not used instead of it. Could you please change the patch?
OK, the initial modification was too quick. This should make it better:
diff --git a/dlls/dsound/buffer.c b/dlls/dsound/buffer.c index 3148502..10e68c8 100644 --- a/dlls/dsound/buffer.c +++ b/dlls/dsound/buffer.c @@ -500,6 +500,7 @@ static HRESULT WINAPI IDirectSoundBufferImpl_Lock( ) { HRESULT hres = DS_OK; IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface; + INT firspace;
TRACE("(%p,%d,%d,%p,%p,%p,%p,0x%08x) at %d\n", This, @@ -542,9 +543,11 @@ static HRESULT WINAPI IDirectSoundBufferImpl_Lock( return DSERR_INVALIDPARAM; }
- writebytes -= This->firdelay; - if ((INT)writebytes < 0) - writebytes = 0; + firspace = This->inpos - This->firdelay - writecursor; + while (firspace < 0) + firspace += This->buflen; + if (writebytes > firspace) + writebytes = firspace;
/* **** */ RtlAcquireResourceShared(&This->lock, TRUE); diff --git a/dlls/dsound/resample.c b/dlls/dsound/resample.c index d2bbda2..3204a2b 100644 --- a/dlls/dsound/resample.c +++ b/dlls/dsound/resample.c @@ -47,7 +47,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(dsound); #define SAMPLE24(p) (*((BYTE*)p)|*((BYTE*)p+1)<<8|*((CHAR*)p+2)<<16) #ifdef WORDS_BIGENDIAN #define SAMPLE16(p) (*((BYTE*)p)|*((CHAR*)p+1)<<8) -#define PUT16(p) (*((BYTE*)p)|*((CHAR*)p+1)<<8) +#define PUT16(p,s) *((BYTE*)p)=s;*((BYTE*)p+1)=(s>>8) #else #define SAMPLE16(p) (*((SHORT*)p)) #define PUT16(p,s) *((SHORT*)p)=s @@ -364,13 +364,12 @@ void DSOUND_RecalcFormat(IDirectSoundBufferImpl * dsb) if (dsb->freq == dsb->outfreq) { dsb->firstep = 1; - dsb->firdelay = 0; + dsb->firdelay = 1; } else - { dsb->firdelay = (2 * g_fir[dsb->quality]->size / dsb->firstep) + 1; - dsb->firdelay *= dsb->pwfx->nBlockAlign; - } + + dsb->firdelay *= dsb->pwfx->nBlockAlign;
TRACE("resample quality: %d\n", dsb->quality); TRACE("resample firstep %d\n", dsb->firstep);