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