diff --git a/dlls/dsound/buffer.c b/dlls/dsound/buffer.c index 92849a657ca..e581c5a9b47 100644 --- a/dlls/dsound/buffer.c +++ b/dlls/dsound/buffer.c @@ -293,6 +293,7 @@ static HRESULT WINAPI IDirectSoundBufferImpl_Play(IDirectSoundBuffer8 *iface, DW { IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer8(iface); HRESULT hres = DS_OK; + int i; TRACE("(%p,%08x,%08x,%08x)\n",This,reserved1,reserved2,flags); @@ -306,6 +307,10 @@ static HRESULT WINAPI IDirectSoundBufferImpl_Play(IDirectSoundBuffer8 *iface, DW } else if (This->state == STATE_STOPPING) This->state = STATE_PLAYING; + for (i = 0; i < This->num_filters; i++) { + IMediaObject_Discontinuity(This->filters[i].obj, 0); + } + RtlReleaseResource(&This->lock); /* **** */ diff --git a/dlls/dsound/mixer.c b/dlls/dsound/mixer.c index 973a65e60f0..db1152ce1a3 100644 --- a/dlls/dsound/mixer.c +++ b/dlls/dsound/mixer.c @@ -398,6 +398,8 @@ static inline DWORD DSOUND_BufPtrDiff(DWORD buflen, DWORD ptr1, DWORD ptr2) static void DSOUND_MixToTemporary(IDirectSoundBufferImpl *dsb, DWORD frames) { UINT size_bytes = frames * sizeof(float) * dsb->device->pwfx->nChannels; + HRESULT hr; + int i; if (dsb->device->tmp_buffer_len < size_bytes || !dsb->device->tmp_buffer) { @@ -409,6 +411,18 @@ static void DSOUND_MixToTemporary(IDirectSoundBufferImpl *dsb, DWORD frames) } cp_fields(dsb, frames, &dsb->freqAccNum); + + if (size_bytes > 0) { + for (i = 0; i < dsb->num_filters; i++) { + if (dsb->filters[i].inplace) { + hr = IMediaObjectInPlace_Process(dsb->filters[i].inplace, size_bytes, (BYTE*)dsb->device->tmp_buffer, 0, DMO_INPLACE_NORMAL); + + if (FAILED(hr)) + WARN("IMediaObjectInPlace_Process failed for filter %u\n", i); + } else + WARN("filter %u has no inplace object - unsupported\n", i); + } + } } static void DSOUND_MixerVol(const IDirectSoundBufferImpl *dsb, INT frames)