dsound: Pipe audio data through DMOs.

This commit is contained in:
Mark Harmstone 2015-03-10 23:51:35 +00:00 committed by Alexandre Julliard
parent 18b3f4cadd
commit 55ed98cb88
2 changed files with 19 additions and 0 deletions

View File

@ -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);
/* **** */

View File

@ -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)