Module: wine Branch: master Commit: a2bc634eaaf43a9e199f20d621b7b1a3fcf63752 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a2bc634eaaf43a9e199f20d621...
Author: Michael Stefaniuc mstefani@redhat.de Date: Wed Aug 31 01:17:04 2011 +0200
dsound: Handle primary buffers in IDirectSoundBufferImpl_SetFormat.
---
dlls/dsound/buffer.c | 19 ++++++++++++++----- dlls/dsound/dsound_private.h | 1 + dlls/dsound/primary.c | 7 ++++--- 3 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/dlls/dsound/buffer.c b/dlls/dsound/buffer.c index 5c8fbba..7f1d005 100644 --- a/dlls/dsound/buffer.c +++ b/dlls/dsound/buffer.c @@ -187,15 +187,24 @@ static inline IDirectSoundBufferImpl *impl_from_IDirectSoundBuffer8(IDirectSound return CONTAINING_RECORD(iface, IDirectSoundBufferImpl, IDirectSoundBuffer8_iface); }
+static inline BOOL is_primary_buffer(IDirectSoundBufferImpl *This) +{ + return This->dsbd.dwFlags & DSBCAPS_PRIMARYBUFFER ? TRUE : FALSE; +} + static HRESULT WINAPI IDirectSoundBufferImpl_SetFormat(IDirectSoundBuffer8 *iface, LPCWAVEFORMATEX wfex) { - IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer8(iface); + IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer8(iface); + + TRACE("(%p,%p)\n", iface, wfex);
- TRACE("(%p,%p)\n",This,wfex); - /* This method is not available on secondary buffers */ - WARN("invalid call\n"); - return DSERR_INVALIDCALL; + if (is_primary_buffer(This)) + return primarybuffer_SetFormat(This->device, wfex); + else { + WARN("not available for secondary buffers.\n"); + return DSERR_INVALIDCALL; + } }
static HRESULT WINAPI IDirectSoundBufferImpl_SetVolume(IDirectSoundBuffer8 *iface, LONG vol) diff --git a/dlls/dsound/dsound_private.h b/dlls/dsound/dsound_private.h index ed13b71..61c8b0d 100644 --- a/dlls/dsound/dsound_private.h +++ b/dlls/dsound/dsound_private.h @@ -336,6 +336,7 @@ HRESULT DSOUND_ReopenDevice(DirectSoundDevice *device, BOOL forcewave) DECLSPEC_ HRESULT primarybuffer_create(DirectSoundDevice *device, IDirectSoundBufferImpl **ppdsb, const DSBUFFERDESC *dsbd) DECLSPEC_HIDDEN; void primarybuffer_destroy(IDirectSoundBufferImpl *This) DECLSPEC_HIDDEN; +HRESULT primarybuffer_SetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX wfex) DECLSPEC_HIDDEN;
/* duplex.c */
diff --git a/dlls/dsound/primary.c b/dlls/dsound/primary.c index b3d1517..c726edf 100644 --- a/dlls/dsound/primary.c +++ b/dlls/dsound/primary.c @@ -472,12 +472,14 @@ LPWAVEFORMATEX DSOUND_CopyFormat(LPCWAVEFORMATEX wfex) return pwfx; }
-static HRESULT DSOUND_PrimarySetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX wfex, BOOL forced) +HRESULT primarybuffer_SetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX wfex) { HRESULT err = DSERR_BUFFERLOST; int i; DWORD nSamplesPerSec, bpp, chans; LPWAVEFORMATEX oldpwfx; + BOOL forced = device->priolevel == DSSCL_WRITEPRIMARY; + TRACE("(%p,%p)\n", device, wfex);
if (device->priolevel == DSSCL_NORMAL) { @@ -628,9 +630,8 @@ static HRESULT WINAPI PrimaryBufferImpl_SetFormat( LPCWAVEFORMATEX wfex) { IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface); - DirectSoundDevice *device = This->device; TRACE("(%p,%p)\n", iface, wfex); - return DSOUND_PrimarySetFormat(device, wfex, device->priolevel == DSSCL_WRITEPRIMARY); + return primarybuffer_SetFormat(This->device, wfex); }
static HRESULT WINAPI PrimaryBufferImpl_SetVolume(