Author: janderwald
Date: Wed Nov 4 03:16:49 2009
New Revision: 43946
URL:
http://svn.reactos.org/svn/reactos?rev=43946&view=rev
Log:
- Add sanity checks
- Implement IDirectSoundCaptureBuffer8::Stop
- Implement changing the stream format for secondary buffers
- Silence debug flood
Modified:
trunk/reactos/dll/directx/dsound_new/capturebuffer.c
trunk/reactos/dll/directx/dsound_new/misc.c
trunk/reactos/dll/directx/dsound_new/precomp.h
trunk/reactos/dll/directx/dsound_new/primary.c
trunk/reactos/dll/directx/dsound_new/secondary.c
Modified: trunk/reactos/dll/directx/dsound_new/capturebuffer.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/dsound_new/cap…
==============================================================================
--- trunk/reactos/dll/directx/dsound_new/capturebuffer.c [iso-8859-1] (original)
+++ trunk/reactos/dll/directx/dsound_new/capturebuffer.c [iso-8859-1] Wed Nov 4 03:16:49
2009
@@ -335,8 +335,10 @@
if (This->State == KSSTATE_RUN)
return DS_OK;
- /* sanity check */
- ASSERT(This->hPin);
+
+ /* check if there is a pin instance */
+ if (!This->hPin)
+ return DSERR_GENERIC;
/* setup request */
Property.Set = KSPROPSETID_Connection;
@@ -385,8 +387,42 @@
WINAPI
IDirectSoundCaptureBufferImpl_Stop( LPDIRECTSOUNDCAPTUREBUFFER8 iface )
{
- UNIMPLEMENTED
- return DSERR_INVALIDPARAM;
+ KSPROPERTY Property;
+ DWORD Result;
+ KSSTATE State;
+
+ LPCDirectSoundCaptureBufferImpl This =
(LPCDirectSoundCaptureBufferImpl)CONTAINING_RECORD(iface, CDirectSoundCaptureBufferImpl,
lpVtbl);
+
+ if (This->State == KSSTATE_STOP)
+ {
+ /* stream has already been stopped */
+ return DS_OK;
+ }
+
+ if (!This->hPin)
+ return DSERR_GENERIC;
+
+ /* setup request */
+ Property.Set = KSPROPSETID_Connection;
+ Property.Id = KSPROPERTY_CONNECTION_STATE;
+ Property.Flags = KSPROPERTY_TYPE_SET;
+ State = KSSTATE_STOP;
+
+
+ /* set pin to stop */
+ Result = SyncOverlappedDeviceIoControl(This->hPin, IOCTL_KS_PROPERTY,
(PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&State, sizeof(KSSTATE), NULL);
+
+ ASSERT(Result == ERROR_SUCCESS);
+
+ if (Result == ERROR_SUCCESS)
+ {
+ /* store result */
+ This->State = State;
+ return DS_OK;
+ }
+
+ DPRINT("Failed to stop pin\n");
+ return DSERR_GENERIC;
}
HRESULT
Modified: trunk/reactos/dll/directx/dsound_new/misc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/dsound_new/mis…
==============================================================================
--- trunk/reactos/dll/directx/dsound_new/misc.c [iso-8859-1] (original)
+++ trunk/reactos/dll/directx/dsound_new/misc.c [iso-8859-1] Wed Nov 4 03:16:49 2009
@@ -12,6 +12,45 @@
const GUID KSPROPSETID_Pin = {0x8C134960L, 0x51AD, 0x11CF, {0x87,
0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}};
const GUID KSPROPSETID_Topology = {0x720D4AC0L, 0x7533, 0x11D0, {0xA5,
0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
const GUID KSPROPSETID_Audio = {0x45FFAAA0L, 0x6E1B, 0x11D0, {0xBC, 0xF2, 0x44, 0x45,
0x53, 0x54, 0x00, 0x00}};
+
+BOOL
+SetPinFormat(
+ IN HANDLE hPin,
+ IN LPWAVEFORMATEX WaveFormatEx)
+{
+ DWORD dwResult;
+ KSPROPERTY Property;
+ KSDATAFORMAT_WAVEFORMATEX DataFormat;
+
+ /* setup connection request */
+ Property.Id = KSPROPERTY_CONNECTION_DATAFORMAT;
+ Property.Set = KSPROPSETID_Connection;
+ Property.Flags = KSPROPERTY_TYPE_SET;
+
+ /* setup data format */
+ DataFormat.WaveFormatEx.wFormatTag = WaveFormatEx->wFormatTag;
+ DataFormat.WaveFormatEx.nSamplesPerSec = WaveFormatEx->nSamplesPerSec;
+ DataFormat.WaveFormatEx.nBlockAlign = WaveFormatEx->nBlockAlign;
+ DataFormat.WaveFormatEx.cbSize = 0;
+ DataFormat.DataFormat.FormatSize = sizeof(KSDATAFORMAT) + sizeof(WAVEFORMATEX);
+ DataFormat.DataFormat.Flags = 0;
+ DataFormat.DataFormat.Reserved = 0;
+ DataFormat.DataFormat.MajorFormat = KSDATAFORMAT_TYPE_AUDIO;
+ DataFormat.DataFormat.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
+ DataFormat.DataFormat.Specifier = KSDATAFORMAT_SPECIFIER_WAVEFORMATEX;
+ DataFormat.DataFormat.SampleSize = 4;
+ DataFormat.WaveFormatEx.nChannels = WaveFormatEx->nChannels;
+ DataFormat.WaveFormatEx.nAvgBytesPerSec = WaveFormatEx->nAvgBytesPerSec;
+ DataFormat.WaveFormatEx.wBitsPerSample = WaveFormatEx->wBitsPerSample;
+
+ dwResult = SyncOverlappedDeviceIoControl(hPin, IOCTL_KS_PROPERTY,
(LPVOID)&Property, sizeof(KSPROPERTY),(LPVOID)&DataFormat,
sizeof(KSDATAFORMAT_WAVEFORMATEX), NULL);
+
+ if (dwResult == ERROR_SUCCESS)
+ return TRUE;
+ else
+ return FALSE;
+}
+
BOOL
DoDataIntersection(
Modified: trunk/reactos/dll/directx/dsound_new/precomp.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/dsound_new/pre…
==============================================================================
--- trunk/reactos/dll/directx/dsound_new/precomp.h [iso-8859-1] (original)
+++ trunk/reactos/dll/directx/dsound_new/precomp.h [iso-8859-1] Wed Nov 4 03:16:49 2009
@@ -15,7 +15,7 @@
#include <dsconf.h>
#include <vfwmsgs.h>
#include <setupapi.h>
-#define YDEBUG
+#define NDEBUG
#include <debug.h>
#include <ks.h>
#include <ksmedia.h>
@@ -111,6 +111,11 @@
/* misc.c */
BOOL
+SetPinFormat(
+ IN HANDLE hPin,
+ IN LPWAVEFORMATEX WaveFormatEx);
+
+BOOL
CreateCompatiblePin(
IN HANDLE hFilter,
IN DWORD PinId,
Modified: trunk/reactos/dll/directx/dsound_new/primary.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/dsound_new/pri…
==============================================================================
--- trunk/reactos/dll/directx/dsound_new/primary.c [iso-8859-1] (original)
+++ trunk/reactos/dll/directx/dsound_new/primary.c [iso-8859-1] Wed Nov 4 03:16:49 2009
@@ -519,8 +519,14 @@
if (This->hPin)
{
- /* fixme change format */
- ASSERT(0);
+ // FIXME
+ // check if multiple buffers are active
+ // in that case need mixing
+
+ if (SetPinFormat(This->hPin, pcfxFormat))
+ return DS_OK;
+ else
+ return DSERR_GENERIC;
}
do
Modified: trunk/reactos/dll/directx/dsound_new/secondary.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/dsound_new/sec…
==============================================================================
--- trunk/reactos/dll/directx/dsound_new/secondary.c [iso-8859-1] (original)
+++ trunk/reactos/dll/directx/dsound_new/secondary.c [iso-8859-1] Wed Nov 4 03:16:49
2009
@@ -294,25 +294,29 @@
return DSERR_INVALIDPARAM;
}
- DPRINT("SecondaryDirectSoundBuffer8Impl_fnPlay dwPriority %x dwFlags %x\n",
dwPriority, dwFlags);
- hResult = PrimaryDirectSoundBuffer_SetFormat(This->PrimaryBuffer, This->Format,
(dwFlags & DSBPLAY_LOOPING));
-
- DPRINT("Result %x\n", hResult);
+ /* sanity check */
+ ASSERT(dwFlags & DSBPLAY_LOOPING);
+
+ /* set dataformat */
+ hResult = PrimaryDirectSoundBuffer_SetFormat(This->PrimaryBuffer, This->Format,
TRUE);
+
if (!SUCCEEDED(hResult))
{
/* failed */
+ DPRINT1("Failed to set format Tag %u Samples %u Bytes %u nChannels
%u\n", This->Format->wFormatTag, This->Format->nSamplesPerSec,
This->Format->wBitsPerSample, This->Format->nChannels);
return hResult;
}
+ /* start primary buffer */
PrimaryDirectSoundBuffer_SetState(This->PrimaryBuffer, KSSTATE_RUN);
-
-
+ /* acquire primary buffer */
PrimaryDirectSoundBuffer_AcquireLock(This->PrimaryBuffer);
-
+ /* HACK write buffer */
PrimaryDirectSoundBuffer_Write(This->PrimaryBuffer, This->Buffer,
This->BufferSize);
-
+ /* release primary buffer */
PrimaryDirectSoundBuffer_ReleaseLock(This->PrimaryBuffer);
+ DPRINT1("SetFormatSuccess PrimaryBuffer %p\n", This->PrimaryBuffer);
return DS_OK;
}