Mark Harmstone : dsound: Pipe audio data through DMOs.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Mar 11 10:00:42 CDT 2015
Module: wine
Branch: master
Commit: 55ed98cb882f5a1cd78f045807c7da8ea8ee29ff
URL: http://source.winehq.org/git/wine.git/?a=commit;h=55ed98cb882f5a1cd78f045807c7da8ea8ee29ff
Author: Mark Harmstone <hellas at 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)
More information about the wine-cvs
mailing list