Mark Harmstone : dsound: Pipe audio data through DMOs.
Module: wine Branch: master Commit: 55ed98cb882f5a1cd78f045807c7da8ea8ee29ff URL: http://source.winehq.org/git/wine.git/?a=commit;h=55ed98cb882f5a1cd78f045807... Author: Mark Harmstone <hellas(a)burntcomma.com> Date: Tue Mar 10 23:51:35 2015 +0000 dsound: Pipe audio data through DMOs. --- dlls/dsound/buffer.c | 5 +++++ dlls/dsound/mixer.c | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/dlls/dsound/buffer.c b/dlls/dsound/buffer.c index 92849a6..e581c5a 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 973a65e..db1152c 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)
participants (1)
-
Alexandre Julliard