Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
5c8fb168
Commit
5c8fb168
authored
Jun 04, 2005
by
Robert Reif
Committed by
Alexandre Julliard
Jun 04, 2005
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Finish DirectSoundCapture/DirectSoundCapture8 split.
Add tests to verify split.
parent
cb6e4a12
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
446 additions
and
248 deletions
+446
-248
capture.c
dlls/dsound/capture.c
+420
-242
dsound.spec
dlls/dsound/dsound.spec
+1
-1
dsound_main.c
dlls/dsound/dsound_main.c
+1
-0
dsound_private.h
dlls/dsound/dsound_private.h
+20
-1
propset.c
dlls/dsound/propset.c
+3
-3
dsound.h
include/dsound.h
+1
-1
No files found.
dlls/dsound/capture.c
View file @
5c8fb168
...
...
@@ -21,6 +21,8 @@
/*
* TODO:
* Implement FX support.
* Implement both IDirectSoundCaptureBuffer and IDirectSoundCaptureBuffer8
* Make DirectSoundCaptureCreate and DirectSoundCaptureCreate8 behave differently
*/
#include <stdarg.h>
...
...
@@ -56,7 +58,7 @@ static HRESULT DSOUND_CreateDirectSoundCaptureBuffer(
static
const
IDirectSoundCaptureVtbl
dscvt
;
static
const
IDirectSoundCaptureBuffer8Vtbl
dscbvt
;
static
IDirectSoundCaptureImpl
*
dsound_capture
=
NULL
;
DirectSoundCaptureDevice
*
DSOUND_capture
[
MAXWAVEDRIVERS
]
;
static
const
char
*
captureStateString
[]
=
{
"STATE_STOPPED"
,
...
...
@@ -65,6 +67,76 @@ static const char * captureStateString[] = {
"STATE_STOPPING"
};
HRESULT
WINAPI
IDirectSoundCaptureImpl_Create
(
LPDIRECTSOUNDCAPTURE8
*
ppDSC
)
{
IDirectSoundCaptureImpl
*
pDSC
;
TRACE
(
"(%p)
\n
"
,
ppDSC
);
/* Allocate memory */
pDSC
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
IDirectSoundCaptureImpl
));
if
(
pDSC
==
NULL
)
{
WARN
(
"out of memory
\n
"
);
*
ppDSC
=
NULL
;
return
DSERR_OUTOFMEMORY
;
}
pDSC
->
lpVtbl
=
&
dscvt
;
pDSC
->
ref
=
0
;
pDSC
->
device
=
NULL
;
*
ppDSC
=
(
LPDIRECTSOUNDCAPTURE8
)
pDSC
;
return
DS_OK
;
}
HRESULT
WINAPI
DSOUND_CaptureCreate
(
LPDIRECTSOUNDCAPTURE
*
ppDSC
,
IUnknown
*
pUnkOuter
)
{
LPDIRECTSOUNDCAPTURE
pDSC
;
HRESULT
hr
;
TRACE
(
"(%p,%p)
\n
"
,
ppDSC
,
pUnkOuter
);
/* Get dsound configuration */
setup_dsound_options
();
hr
=
IDirectSoundCaptureImpl_Create
(
&
pDSC
);
if
(
hr
==
DS_OK
)
{
IDirectSoundCapture_AddRef
(
pDSC
);
*
ppDSC
=
pDSC
;
}
else
{
WARN
(
"IDirectSoundCaptureImpl_Create failed
\n
"
);
*
ppDSC
=
0
;
}
return
hr
;
}
HRESULT
WINAPI
DSOUND_CaptureCreate8
(
LPDIRECTSOUNDCAPTURE8
*
ppDSC8
,
IUnknown
*
pUnkOuter
)
{
LPDIRECTSOUNDCAPTURE8
pDSC8
;
HRESULT
hr
;
TRACE
(
"(%p,%p)
\n
"
,
ppDSC8
,
pUnkOuter
);
/* Get dsound configuration */
setup_dsound_options
();
hr
=
IDirectSoundCaptureImpl_Create
(
&
pDSC8
);
if
(
hr
==
DS_OK
)
{
IDirectSoundCapture_AddRef
(
pDSC8
);
*
ppDSC8
=
pDSC8
;
}
else
{
WARN
(
"IDirectSoundCaptureImpl_Create failed
\n
"
);
*
ppDSC8
=
0
;
}
return
hr
;
}
/***************************************************************************
* DirectSoundCaptureCreate [DSOUND.6]
*
...
...
@@ -87,57 +159,119 @@ static const char * captureStateString[] = {
*
* DSERR_ALLOCATED is returned for sound devices that do not support full duplex.
*/
HRESULT
WINAPI
DirectSoundCaptureCreate8
(
HRESULT
WINAPI
DirectSoundCaptureCreate
(
LPCGUID
lpcGUID
,
LPDIRECTSOUNDCAPTURE
*
lpl
pDSC
,
LPUNKNOWN
pUnkOuter
)
LPDIRECTSOUNDCAPTURE
*
p
pDSC
,
LPUNKNOWN
pUnkOuter
)
{
IDirectSoundCaptureImpl
**
ippDSC
=
(
IDirectSoundCaptureImpl
**
)
lplpDSC
;
TRACE
(
"(%s,%p,%p)
\n
"
,
debugstr_guid
(
lpcGUID
),
lplpDSC
,
pUnkOuter
);
HRESULT
hr
;
LPDIRECTSOUNDCAPTURE
pDSC
;
TRACE
(
"(%s,%p,%p)
\n
"
,
debugstr_guid
(
lpcGUID
),
ppDSC
,
pUnkOuter
);
if
(
ppDSC
==
NULL
)
{
WARN
(
"invalid parameter: ppDSC == NULL
\n
"
);
return
DSERR_INVALIDPARAM
;
}
if
(
pUnkOuter
)
{
if
(
pUnkOuter
)
{
WARN
(
"invalid parameter: pUnkOuter != NULL
\n
"
);
*
ppDSC
=
NULL
;
return
DSERR_NOAGGREGATION
;
}
if
(
!
lplpDSC
)
{
WARN
(
"invalid parameter: lplpDSC == NULL
\n
"
);
hr
=
DSOUND_CaptureCreate
(
&
pDSC
,
(
IUnknown
*
)
pUnkOuter
);
if
(
hr
==
DS_OK
)
{
hr
=
IDirectSoundCapture_Initialize
(
pDSC
,
lpcGUID
);
if
(
hr
!=
DS_OK
)
{
IDirectSoundCapture_Release
(
pDSC
);
pDSC
=
0
;
}
}
*
ppDSC
=
pDSC
;
return
hr
;
}
/***************************************************************************
* DirectSoundCaptureCreate8 [DSOUND.12]
*
* Create and initialize a DirectSoundCapture interface.
*
* PARAMS
* lpcGUID [I] Address of the GUID that identifies the sound capture device.
* lplpDSC [O] Address of a variable to receive the interface pointer.
* pUnkOuter [I] Must be NULL.
*
* RETURNS
* Success: DS_OK
* Failure: DSERR_NOAGGREGATION, DSERR_ALLOCATED, DSERR_INVALIDPARAM,
* DSERR_OUTOFMEMORY
*
* NOTES
* lpcGUID must be one of the values returned from DirectSoundCaptureEnumerate
* or NULL for the default device or DSDEVID_DefaultCapture or
* DSDEVID_DefaultVoiceCapture.
*
* DSERR_ALLOCATED is returned for sound devices that do not support full duplex.
*/
HRESULT
WINAPI
DirectSoundCaptureCreate8
(
LPCGUID
lpcGUID
,
LPDIRECTSOUNDCAPTURE8
*
ppDSC8
,
LPUNKNOWN
pUnkOuter
)
{
HRESULT
hr
;
LPDIRECTSOUNDCAPTURE8
pDSC8
;
TRACE
(
"(%s,%p,%p)
\n
"
,
debugstr_guid
(
lpcGUID
),
ppDSC8
,
pUnkOuter
);
if
(
ppDSC8
==
NULL
)
{
WARN
(
"invalid parameter: ppDSC8 == NULL
\n
"
);
return
DSERR_INVALIDPARAM
;
}
/* Default device? */
if
(
!
lpcGUID
||
IsEqualGUID
(
lpcGUID
,
&
GUID_NULL
)
)
lpcGUID
=
&
DSDEVID_DefaultCapture
;
if
(
pUnkOuter
)
{
WARN
(
"invalid parameter: pUnkOuter != NULL
\n
"
);
*
ppDSC8
=
NULL
;
return
DSERR_NOAGGREGATION
;
}
hr
=
DSOUND_CaptureCreate8
(
&
pDSC8
,
(
IUnknown
*
)
pUnkOuter
);
if
(
hr
==
DS_OK
)
{
hr
=
IDirectSoundCapture_Initialize
(
pDSC8
,
lpcGUID
);
if
(
hr
!=
DS_OK
)
{
IDirectSoundCapture_Release
(
pDSC8
);
pDSC8
=
0
;
}
}
*
ppDSC8
=
pDSC8
;
*
ippDSC
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
IDirectSoundCaptureImpl
));
return
hr
;
}
static
HRESULT
DirectSoundCaptureDevice_Create
(
DirectSoundCaptureDevice
**
ppDevice
)
{
DirectSoundCaptureDevice
*
device
;
TRACE
(
"(%p)
\n
"
,
ppDevice
);
/* Allocate memory */
device
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
DirectSoundCaptureDevice
));
if
(
*
ippDSC
==
NULL
)
{
if
(
device
==
NULL
)
{
WARN
(
"out of memory
\n
"
);
return
DSERR_OUTOFMEMORY
;
}
else
{
IDirectSoundCaptureImpl
*
This
=
(
IDirectSoundCaptureImpl
*
)
*
ippDSC
;
}
This
->
ref
=
1
;
This
->
state
=
STATE_STOPPED
;
device
->
ref
=
1
;
device
->
state
=
STATE_STOPPED
;
InitializeCriticalSection
(
&
(
This
->
lock
)
);
This
->
lock
.
DebugInfo
->
Spare
[
1
]
=
(
DWORD
)
"DSCAPTURE_lock"
;
InitializeCriticalSection
(
&
(
device
->
lock
)
);
device
->
lock
.
DebugInfo
->
Spare
[
1
]
=
(
DWORD
)
"DSCAPTURE_lock"
;
This
->
lpVtbl
=
&
dscvt
;
dsound_capture
=
This
;
*
ppDevice
=
device
;
if
(
GetDeviceID
(
lpcGUID
,
&
This
->
guid
)
==
DS_OK
)
{
HRESULT
hres
;
hres
=
IDirectSoundCaptureImpl_Initialize
(
(
LPDIRECTSOUNDCAPTURE
)
This
,
&
This
->
guid
);
if
(
hres
!=
DS_OK
)
WARN
(
"IDirectSoundCaptureImpl_Initialize failed
\n
"
);
return
hres
;
}
}
WARN
(
"invalid GUID: %s
\n
"
,
debugstr_guid
(
lpcGUID
));
return
DSERR_INVALIDPARAM
;
return
DS_OK
;
}
/***************************************************************************
...
...
@@ -278,7 +412,7 @@ DSOUND_capture_callback(
DWORD
dw1
,
DWORD
dw2
)
{
IDirectSoundCaptureImpl
*
This
=
(
IDirectSoundCaptureImpl
*
)
dwUser
;
DirectSoundCaptureDevice
*
This
=
(
DirectSoundCaptureDevice
*
)
dwUser
;
TRACE
(
"(%p,%08x(%s),%08lx,%08lx,%08lx) entering at %ld
\n
"
,
hwi
,
msg
,
msg
==
MM_WIM_OPEN
?
"MM_WIM_OPEN"
:
msg
==
MM_WIM_CLOSE
?
"MM_WIM_CLOSE"
:
msg
==
MM_WIM_DATA
?
"MM_WIM_DATA"
:
"UNKNOWN"
,
dwUser
,
dw1
,
dw2
,
GetTickCount
());
...
...
@@ -323,7 +457,7 @@ IDirectSoundCaptureImpl_QueryInterface(
REFIID
riid
,
LPVOID
*
ppobj
)
{
IDirectSoundCaptureImpl
*
This
=
(
IDirectSoundCaptureImpl
*
)
ifa
ce
;
DirectSoundCaptureDevice
*
This
=
((
IDirectSoundCaptureImpl
*
)
iface
)
->
devi
ce
;
TRACE
(
"(%p,%s,%p)
\n
"
,
This
,
debugstr_guid
(
riid
),
ppobj
);
if
(
ppobj
==
NULL
)
{
...
...
@@ -354,6 +488,36 @@ IDirectSoundCaptureImpl_AddRef( LPDIRECTSOUNDCAPTURE iface )
return
ref
;
}
static
ULONG
DirectSoundCaptureDevice_Release
(
DirectSoundCaptureDevice
*
device
)
{
ULONG
ref
;
TRACE
(
"(%p) ref was %lu
\n
"
,
device
,
device
->
ref
);
device
->
ref
--
;
ref
=
device
->
ref
;
if
(
device
->
ref
==
0
)
{
TRACE
(
"deleting object
\n
"
);
if
(
device
->
capture_buffer
)
IDirectSoundCaptureBufferImpl_Release
(
(
LPDIRECTSOUNDCAPTUREBUFFER8
)
device
->
capture_buffer
);
if
(
device
->
driver
)
{
IDsCaptureDriver_Close
(
device
->
driver
);
IDsCaptureDriver_Release
(
device
->
driver
);
}
HeapFree
(
GetProcessHeap
(),
0
,
device
->
pwfx
);
device
->
lock
.
DebugInfo
->
Spare
[
1
]
=
0
;
DeleteCriticalSection
(
&
(
device
->
lock
)
);
DSOUND_capture
[
device
->
drvdesc
.
dnDevNode
]
=
NULL
;
HeapFree
(
GetProcessHeap
(),
0
,
device
);
TRACE
(
"(%p) released
\n
"
,
device
);
}
return
ref
;
}
static
ULONG
WINAPI
IDirectSoundCaptureImpl_Release
(
LPDIRECTSOUNDCAPTURE
iface
)
{
...
...
@@ -362,21 +526,10 @@ IDirectSoundCaptureImpl_Release( LPDIRECTSOUNDCAPTURE iface )
TRACE
(
"(%p) ref was %ld
\n
"
,
This
,
ref
+
1
);
if
(
!
ref
)
{
TRACE
(
"deleting object
\n
"
);
if
(
This
->
capture_buffer
)
IDirectSoundCaptureBufferImpl_Release
(
(
LPDIRECTSOUNDCAPTUREBUFFER8
)
This
->
capture_buffer
);
if
(
This
->
driver
)
{
IDsCaptureDriver_Close
(
This
->
driver
);
IDsCaptureDriver_Release
(
This
->
driver
);
}
if
(
This
->
device
)
DirectSoundCaptureDevice_Release
(
This
->
device
);
HeapFree
(
GetProcessHeap
(),
0
,
This
->
pwfx
);
This
->
lock
.
DebugInfo
->
Spare
[
1
]
=
0
;
DeleteCriticalSection
(
&
(
This
->
lock
)
);
HeapFree
(
GetProcessHeap
(),
0
,
This
);
dsound_capture
=
NULL
;
TRACE
(
"(%p) released
\n
"
,
This
);
}
return
ref
;
...
...
@@ -392,7 +545,7 @@ IDirectSoundCaptureImpl_CreateCaptureBuffer(
HRESULT
hr
;
IDirectSoundCaptureImpl
*
This
=
(
IDirectSoundCaptureImpl
*
)
iface
;
TRACE
(
"(%p,%p,%p,%p)
\n
"
,
This
,
lpcDSCBufferDesc
,
lplpDSCaptureBuffer
,
pUnk
);
TRACE
(
"(%p,%p,%p,%p)
\n
"
,
iface
,
lpcDSCBufferDesc
,
lplpDSCaptureBuffer
,
pUnk
);
if
(
This
==
NULL
)
{
WARN
(
"invalid parameter: This == NULL
\n
"
);
...
...
@@ -415,12 +568,12 @@ IDirectSoundCaptureImpl_CreateCaptureBuffer(
}
/* FIXME: We can only have one buffer so what do we do here? */
if
(
This
->
capture_buffer
)
{
if
(
This
->
device
->
capture_buffer
)
{
WARN
(
"lnvalid parameter: already has buffer
\n
"
);
return
DSERR_INVALIDPARAM
;
/* DSERR_GENERIC ? */
}
hr
=
DSOUND_CreateDirectSoundCaptureBuffer
(
This
,
lpcDSCBufferDesc
,
hr
=
DSOUND_CreateDirectSoundCaptureBuffer
(
This
,
lpcDSCBufferDesc
,
(
LPVOID
*
)
lplpDSCaptureBuffer
);
if
(
hr
!=
DS_OK
)
...
...
@@ -448,14 +601,14 @@ IDirectSoundCaptureImpl_GetCaps(
return
DSERR_INVALIDPARAM
;
}
if
(
!
(
This
->
initialized
)
)
{
if
(
!
(
This
->
device
)
)
{
WARN
(
"not initialized
\n
"
);
return
DSERR_UNINITIALIZED
;
}
lpDSCCaps
->
dwFlags
=
This
->
drvcaps
.
dwFlags
;
lpDSCCaps
->
dwFormats
=
This
->
drvcaps
.
dwFormats
;
lpDSCCaps
->
dwChannels
=
This
->
drvcaps
.
dwChannels
;
lpDSCCaps
->
dwFlags
=
This
->
d
evice
->
d
rvcaps
.
dwFlags
;
lpDSCCaps
->
dwFormats
=
This
->
d
evice
->
d
rvcaps
.
dwFormats
;
lpDSCCaps
->
dwChannels
=
This
->
d
evice
->
d
rvcaps
.
dwChannels
;
TRACE
(
"(flags=0x%08lx,format=0x%08lx,channels=%ld)
\n
"
,
lpDSCCaps
->
dwFlags
,
lpDSCCaps
->
dwFormats
,
lpDSCCaps
->
dwChannels
);
...
...
@@ -470,7 +623,10 @@ IDirectSoundCaptureImpl_Initialize(
{
HRESULT
err
=
DSERR_INVALIDPARAM
;
unsigned
wid
,
widn
;
BOOLEAN
found
=
FALSE
;
GUID
devGUID
;
IDirectSoundCaptureImpl
*
This
=
(
IDirectSoundCaptureImpl
*
)
iface
;
DirectSoundCaptureDevice
*
device
=
This
->
device
;
TRACE
(
"(%p)
\n
"
,
This
);
if
(
!
This
)
{
...
...
@@ -478,35 +634,54 @@ IDirectSoundCaptureImpl_Initialize(
return
DSERR_INVALIDPARAM
;
}
if
(
This
->
initialized
)
{
if
(
device
!=
NULL
)
{
WARN
(
"already initialized
\n
"
);
return
DSERR_ALREADYINITIALIZED
;
}
widn
=
waveInGetNumDevs
();
/* Default device? */
if
(
!
lpcGUID
||
IsEqualGUID
(
lpcGUID
,
&
GUID_NULL
)
)
lpcGUID
=
&
DSDEVID_DefaultCapture
;
if
(
GetDeviceID
(
lpcGUID
,
&
devGUID
)
!=
DS_OK
)
{
WARN
(
"invalid parameter: lpcGUID
\n
"
);
return
DSERR_INVALIDPARAM
;
}
widn
=
waveInGetNumDevs
();
if
(
!
widn
)
{
WARN
(
"no audio devices found
\n
"
);
return
DSERR_NODRIVER
;
}
/* Get dsound configuration */
setup_dsound_options
();
/* enumerate WINMM audio devices and find the one we want */
for
(
wid
=
0
;
wid
<
widn
;
wid
++
)
{
if
(
IsEqualGUID
(
lpc
GUID
,
&
DSOUND_capture_guids
[
wid
])
)
{
err
=
DS_OK
;
if
(
IsEqualGUID
(
&
dev
GUID
,
&
DSOUND_capture_guids
[
wid
])
)
{
found
=
TRUE
;
break
;
}
}
if
(
found
==
FALSE
)
{
WARN
(
"No device found matching given ID!
\n
"
);
return
DSERR_NODRIVER
;
}
if
(
DSOUND_capture
[
wid
])
{
WARN
(
"already in use
\n
"
);
return
DSERR_ALLOCATED
;
}
err
=
DirectSoundCaptureDevice_Create
(
&
(
device
));
if
(
err
!=
DS_OK
)
{
WARN
(
"invalid parameter
\n
"
);
return
DSERR_INVALIDPARAM
;
WARN
(
"DirectSoundCaptureDevice_Create failed
\n
"
);
return
err
;
}
This
->
device
=
device
;
device
->
guid
=
devGUID
;
err
=
mmErr
(
waveInMessage
((
HWAVEIN
)
wid
,
DRV_QUERYDSOUNDIFACE
,(
DWORD
)
&
(
This
->
driver
),
0
));
err
=
mmErr
(
waveInMessage
((
HWAVEIN
)
wid
,
DRV_QUERYDSOUNDIFACE
,(
DWORD
)
&
(
This
->
d
evice
->
d
river
),
0
));
if
(
(
err
!=
DS_OK
)
&&
(
err
!=
DSERR_UNSUPPORTED
)
)
{
WARN
(
"waveInMessage failed; err=%lx
\n
"
,
err
);
return
err
;
...
...
@@ -515,12 +690,12 @@ IDirectSoundCaptureImpl_Initialize(
/* Disable the direct sound driver to force emulation if requested. */
if
(
ds_hw_accel
==
DS_HW_ACCEL_EMULATION
)
This
->
driver
=
NULL
;
This
->
d
evice
->
d
river
=
NULL
;
/* Get driver description */
if
(
This
->
driver
)
{
if
(
This
->
d
evice
->
d
river
)
{
TRACE
(
"using DirectSound driver
\n
"
);
err
=
IDsCaptureDriver_GetDriverDesc
(
This
->
d
river
,
&
(
This
->
drvdesc
));
err
=
IDsCaptureDriver_GetDriverDesc
(
This
->
d
evice
->
driver
,
&
(
This
->
device
->
drvdesc
));
if
(
err
!=
DS_OK
)
{
WARN
(
"IDsCaptureDriver_GetDriverDesc failed
\n
"
);
return
err
;
...
...
@@ -528,39 +703,39 @@ IDirectSoundCaptureImpl_Initialize(
}
else
{
TRACE
(
"using WINMM
\n
"
);
/* if no DirectSound interface available, use WINMM API instead */
This
->
drvdesc
.
dwFlags
=
DSDDESC_DOMMSYSTEMOPEN
|
This
->
d
evice
->
d
rvdesc
.
dwFlags
=
DSDDESC_DOMMSYSTEMOPEN
|
DSDDESC_DOMMSYSTEMSETFORMAT
;
}
This
->
drvdesc
.
dnDevNode
=
wid
;
This
->
d
evice
->
d
rvdesc
.
dnDevNode
=
wid
;
/* open the DirectSound driver if available */
if
(
This
->
driver
&&
(
err
==
DS_OK
))
err
=
IDsCaptureDriver_Open
(
This
->
driver
);
if
(
This
->
d
evice
->
d
river
&&
(
err
==
DS_OK
))
err
=
IDsCaptureDriver_Open
(
This
->
d
evice
->
d
river
);
if
(
err
==
DS_OK
)
{
This
->
initialized
=
TRUE
;
This
->
device
=
device
;
/* the driver is now open, so it's now allowed to call GetCaps */
if
(
This
->
driver
)
{
This
->
d
rvcaps
.
dwSize
=
sizeof
(
This
->
drvcaps
);
err
=
IDsCaptureDriver_GetCaps
(
This
->
d
river
,
&
(
This
->
drvcaps
));
if
(
This
->
d
evice
->
d
river
)
{
This
->
d
evice
->
drvcaps
.
dwSize
=
sizeof
(
This
->
device
->
drvcaps
);
err
=
IDsCaptureDriver_GetCaps
(
This
->
d
evice
->
driver
,
&
(
This
->
device
->
drvcaps
));
if
(
err
!=
DS_OK
)
{
WARN
(
"IDsCaptureDriver_GetCaps failed
\n
"
);
return
err
;
}
}
else
/*if (This->hwi)*/
{
WAVEINCAPSA
wic
;
err
=
mmErr
(
waveInGetDevCapsA
((
UINT
)
This
->
drvdesc
.
dnDevNode
,
&
wic
,
sizeof
(
wic
)));
err
=
mmErr
(
waveInGetDevCapsA
((
UINT
)
This
->
d
evice
->
d
rvdesc
.
dnDevNode
,
&
wic
,
sizeof
(
wic
)));
if
(
err
==
DS_OK
)
{
This
->
drvcaps
.
dwFlags
=
0
;
lstrcpynA
(
This
->
drvdesc
.
szDrvname
,
wic
.
szPname
,
sizeof
(
This
->
drvdesc
.
szDrvname
));
This
->
d
evice
->
d
rvcaps
.
dwFlags
=
0
;
lstrcpynA
(
This
->
d
evice
->
d
rvdesc
.
szDrvname
,
wic
.
szPname
,
sizeof
(
This
->
d
evice
->
d
rvdesc
.
szDrvname
));
This
->
drvcaps
.
dwFlags
|=
DSCCAPS_EMULDRIVER
;
This
->
drvcaps
.
dwFormats
=
wic
.
dwFormats
;
This
->
drvcaps
.
dwChannels
=
wic
.
wChannels
;
This
->
d
evice
->
d
rvcaps
.
dwFlags
|=
DSCCAPS_EMULDRIVER
;
This
->
d
evice
->
d
rvcaps
.
dwFormats
=
wic
.
dwFormats
;
This
->
d
evice
->
d
rvcaps
.
dwChannels
=
wic
.
wChannels
;
}
}
}
...
...
@@ -614,7 +789,7 @@ DSOUND_CreateDirectSoundCaptureBuffer(
return
DSERR_INVALIDPARAM
;
}
if
(
!
ipDSC
->
initialized
)
{
if
(
!
ipDSC
->
device
)
{
WARN
(
"not initialized
\n
"
);
*
ppobj
=
NULL
;
return
DSERR_UNINITIALIZED
;
...
...
@@ -630,12 +805,12 @@ DSOUND_CreateDirectSoundCaptureBuffer(
wfex
->
wBitsPerSample
,
wfex
->
cbSize
);
if
(
wfex
->
wFormatTag
==
WAVE_FORMAT_PCM
)
{
ipDSC
->
pwfx
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
WAVEFORMATEX
));
CopyMemory
(
ipDSC
->
pwfx
,
wfex
,
sizeof
(
WAVEFORMATEX
));
ipDSC
->
pwfx
->
cbSize
=
0
;
ipDSC
->
device
->
pwfx
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
WAVEFORMATEX
));
CopyMemory
(
ipDSC
->
device
->
pwfx
,
wfex
,
sizeof
(
WAVEFORMATEX
));
ipDSC
->
device
->
pwfx
->
cbSize
=
0
;
}
else
{
ipDSC
->
pwfx
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
WAVEFORMATEX
)
+
wfex
->
cbSize
);
CopyMemory
(
ipDSC
->
pwfx
,
wfex
,
sizeof
(
WAVEFORMATEX
)
+
wfex
->
cbSize
);
ipDSC
->
device
->
pwfx
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
WAVEFORMATEX
)
+
wfex
->
cbSize
);
CopyMemory
(
ipDSC
->
device
->
pwfx
,
wfex
,
sizeof
(
WAVEFORMATEX
)
+
wfex
->
cbSize
);
}
}
else
{
WARN
(
"lpcDSCBufferDesc->lpwfxFormat == 0
\n
"
);
...
...
@@ -658,7 +833,7 @@ DSOUND_CreateDirectSoundCaptureBuffer(
This
->
ref
=
1
;
This
->
dsound
=
ipDSC
;
This
->
dsound
->
capture_buffer
=
This
;
This
->
dsound
->
device
->
capture_buffer
=
This
;
This
->
notify
=
NULL
;
This
->
nrofnotifies
=
0
;
This
->
hwnotify
=
NULL
;
...
...
@@ -669,7 +844,7 @@ DSOUND_CreateDirectSoundCaptureBuffer(
CopyMemory
(
This
->
pdscbd
,
lpcDSCBufferDesc
,
lpcDSCBufferDesc
->
dwSize
);
else
{
WARN
(
"no memory
\n
"
);
This
->
dsound
->
capture_buffer
=
0
;
This
->
dsound
->
device
->
capture_buffer
=
0
;
HeapFree
(
GetProcessHeap
(),
0
,
This
);
*
ppobj
=
NULL
;
return
DSERR_OUTOFMEMORY
;
...
...
@@ -677,16 +852,16 @@ DSOUND_CreateDirectSoundCaptureBuffer(
This
->
lpVtbl
=
&
dscbvt
;
if
(
ipDSC
->
driver
)
{
if
(
This
->
dsound
->
drvdesc
.
dwFlags
&
DSDDESC_DOMMSYSTEMOPEN
)
if
(
ipDSC
->
d
evice
->
d
river
)
{
if
(
This
->
dsound
->
d
evice
->
d
rvdesc
.
dwFlags
&
DSDDESC_DOMMSYSTEMOPEN
)
FIXME
(
"DSDDESC_DOMMSYSTEMOPEN not supported
\n
"
);
if
(
This
->
dsound
->
drvdesc
.
dwFlags
&
DSDDESC_USESYSTEMMEMORY
)
{
if
(
This
->
dsound
->
d
evice
->
d
rvdesc
.
dwFlags
&
DSDDESC_USESYSTEMMEMORY
)
{
/* allocate buffer from system memory */
buflen
=
lpcDSCBufferDesc
->
dwBufferBytes
;
TRACE
(
"desired buflen=%ld, old buffer=%p
\n
"
,
buflen
,
ipDSC
->
buffer
);
if
(
ipDSC
->
buffer
)
newbuf
=
HeapReAlloc
(
GetProcessHeap
(),
0
,
ipDSC
->
buffer
,
buflen
);
TRACE
(
"desired buflen=%ld, old buffer=%p
\n
"
,
buflen
,
ipDSC
->
device
->
buffer
);
if
(
ipDSC
->
device
->
buffer
)
newbuf
=
HeapReAlloc
(
GetProcessHeap
(),
0
,
ipDSC
->
device
->
buffer
,
buflen
);
else
newbuf
=
HeapAlloc
(
GetProcessHeap
(),
0
,
buflen
);
...
...
@@ -695,22 +870,22 @@ DSOUND_CreateDirectSoundCaptureBuffer(
err
=
DSERR_OUTOFMEMORY
;
/* but the old buffer might still exist and must be re-prepared */
}
else
{
ipDSC
->
buffer
=
newbuf
;
ipDSC
->
buflen
=
buflen
;
ipDSC
->
device
->
buffer
=
newbuf
;
ipDSC
->
device
->
buflen
=
buflen
;
}
}
else
{
/* let driver allocate memory */
ipDSC
->
buflen
=
lpcDSCBufferDesc
->
dwBufferBytes
;
ipDSC
->
device
->
buflen
=
lpcDSCBufferDesc
->
dwBufferBytes
;
/* FIXME: */
HeapFree
(
GetProcessHeap
(),
0
,
ipDSC
->
buffer
);
ipDSC
->
buffer
=
NULL
;
HeapFree
(
GetProcessHeap
(),
0
,
ipDSC
->
device
->
buffer
);
ipDSC
->
device
->
buffer
=
NULL
;
}
err
=
IDsCaptureDriver_CreateCaptureBuffer
(
ipDSC
->
driver
,
ipDSC
->
pwfx
,
0
,
0
,
&
(
ipDSC
->
buflen
),
&
(
ipDSC
->
buffer
),(
LPVOID
*
)
&
(
ipDSC
->
hwbuf
));
err
=
IDsCaptureDriver_CreateCaptureBuffer
(
ipDSC
->
d
evice
->
d
river
,
ipDSC
->
device
->
pwfx
,
0
,
0
,
&
(
ipDSC
->
device
->
buflen
),
&
(
ipDSC
->
device
->
buffer
),(
LPVOID
*
)
&
(
ipDSC
->
device
->
hwbuf
));
if
(
err
!=
DS_OK
)
{
WARN
(
"IDsCaptureDriver_CreateCaptureBuffer failed
\n
"
);
This
->
dsound
->
capture_buffer
=
0
;
This
->
dsound
->
device
->
capture_buffer
=
0
;
HeapFree
(
GetProcessHeap
(),
0
,
This
);
*
ppobj
=
NULL
;
return
err
;
...
...
@@ -719,21 +894,21 @@ DSOUND_CreateDirectSoundCaptureBuffer(
DWORD
flags
=
CALLBACK_FUNCTION
;
if
(
ds_hw_accel
!=
DS_HW_ACCEL_EMULATION
)
flags
|=
WAVE_DIRECTSOUND
;
err
=
mmErr
(
waveInOpen
(
&
(
ipDSC
->
hwi
),
ipDSC
->
d
rvdesc
.
dnDevNode
,
ipDSC
->
pwfx
,
(
DWORD
)
DSOUND_capture_callback
,
(
DWORD
)
ipDSC
,
flags
));
err
=
mmErr
(
waveInOpen
(
&
(
ipDSC
->
device
->
hwi
),
ipDSC
->
d
evice
->
drvdesc
.
dnDevNode
,
ipDSC
->
device
->
pwfx
,
(
DWORD
)
DSOUND_capture_callback
,
(
DWORD
)
ipDSC
->
device
,
flags
));
if
(
err
!=
DS_OK
)
{
WARN
(
"waveInOpen failed
\n
"
);
This
->
dsound
->
capture_buffer
=
0
;
This
->
dsound
->
device
->
capture_buffer
=
0
;
HeapFree
(
GetProcessHeap
(),
0
,
This
);
*
ppobj
=
NULL
;
return
err
;
}
buflen
=
lpcDSCBufferDesc
->
dwBufferBytes
;
TRACE
(
"desired buflen=%ld, old buffer=%p
\n
"
,
buflen
,
ipDSC
->
buffer
);
if
(
ipDSC
->
buffer
)
newbuf
=
HeapReAlloc
(
GetProcessHeap
(),
0
,
ipDSC
->
buffer
,
buflen
);
TRACE
(
"desired buflen=%ld, old buffer=%p
\n
"
,
buflen
,
ipDSC
->
device
->
buffer
);
if
(
ipDSC
->
device
->
buffer
)
newbuf
=
HeapReAlloc
(
GetProcessHeap
(),
0
,
ipDSC
->
device
->
buffer
,
buflen
);
else
newbuf
=
HeapAlloc
(
GetProcessHeap
(),
0
,
buflen
);
if
(
newbuf
==
NULL
)
{
...
...
@@ -741,8 +916,8 @@ DSOUND_CreateDirectSoundCaptureBuffer(
err
=
DSERR_OUTOFMEMORY
;
/* but the old buffer might still exist and must be re-prepared */
}
else
{
ipDSC
->
buffer
=
newbuf
;
ipDSC
->
buflen
=
buflen
;
ipDSC
->
device
->
buffer
=
newbuf
;
ipDSC
->
device
->
buflen
=
buflen
;
}
}
}
...
...
@@ -902,8 +1077,8 @@ IDirectSoundCaptureBufferImpl_QueryInterface(
if
(
!
This
->
notify
)
hres
=
IDirectSoundCaptureNotifyImpl_Create
(
This
,
&
This
->
notify
);
if
(
This
->
notify
)
{
if
(
This
->
dsound
->
hwbuf
)
{
hres
=
IDsCaptureDriverBuffer_QueryInterface
(
This
->
dsound
->
hwbuf
,
if
(
This
->
dsound
->
device
->
hwbuf
)
{
hres
=
IDsCaptureDriverBuffer_QueryInterface
(
This
->
dsound
->
device
->
hwbuf
,
&
IID_IDsDriverNotify
,
(
LPVOID
*
)
&
(
This
->
hwnotify
));
if
(
hres
!=
DS_OK
)
{
WARN
(
"IDsCaptureDriverBuffer_QueryInterface failed
\n
"
);
...
...
@@ -950,25 +1125,25 @@ IDirectSoundCaptureBufferImpl_Release( LPDIRECTSOUNDCAPTUREBUFFER8 iface )
if
(
!
ref
)
{
TRACE
(
"deleting object
\n
"
);
if
(
This
->
dsound
->
state
==
STATE_CAPTURING
)
This
->
dsound
->
state
=
STATE_STOPPING
;
if
(
This
->
dsound
->
device
->
state
==
STATE_CAPTURING
)
This
->
dsound
->
device
->
state
=
STATE_STOPPING
;
HeapFree
(
GetProcessHeap
(),
0
,
This
->
pdscbd
);
if
(
This
->
dsound
->
hwi
)
{
waveInReset
(
This
->
dsound
->
hwi
);
waveInClose
(
This
->
dsound
->
hwi
);
HeapFree
(
GetProcessHeap
(),
0
,
This
->
dsound
->
pwave
);
This
->
dsound
->
pwave
=
0
;
This
->
dsound
->
hwi
=
0
;
if
(
This
->
dsound
->
device
->
hwi
)
{
waveInReset
(
This
->
dsound
->
device
->
hwi
);
waveInClose
(
This
->
dsound
->
device
->
hwi
);
HeapFree
(
GetProcessHeap
(),
0
,
This
->
dsound
->
device
->
pwave
);
This
->
dsound
->
device
->
pwave
=
0
;
This
->
dsound
->
device
->
hwi
=
0
;
}
if
(
This
->
dsound
->
hwbuf
)
IDsCaptureDriverBuffer_Release
(
This
->
dsound
->
hwbuf
);
if
(
This
->
dsound
->
device
->
hwbuf
)
IDsCaptureDriverBuffer_Release
(
This
->
dsound
->
device
->
hwbuf
);
/* remove from IDirectSoundCaptureImpl */
if
(
This
->
dsound
)
This
->
dsound
->
capture_buffer
=
NULL
;
This
->
dsound
->
device
->
capture_buffer
=
NULL
;
else
ERR
(
"does not reference dsound
\n
"
);
...
...
@@ -1040,33 +1215,33 @@ IDirectSoundCaptureBufferImpl_GetCurrentPosition(
return
DSERR_INVALIDPARAM
;
}
if
(
This
->
dsound
->
driver
)
{
hres
=
IDsCaptureDriverBuffer_GetPosition
(
This
->
dsound
->
hwbuf
,
lpdwCapturePosition
,
lpdwReadPosition
);
if
(
This
->
dsound
->
d
evice
->
d
river
)
{
hres
=
IDsCaptureDriverBuffer_GetPosition
(
This
->
dsound
->
device
->
hwbuf
,
lpdwCapturePosition
,
lpdwReadPosition
);
if
(
hres
!=
DS_OK
)
WARN
(
"IDsCaptureDriverBuffer_GetPosition failed
\n
"
);
}
else
if
(
This
->
dsound
->
hwi
)
{
EnterCriticalSection
(
&
(
This
->
dsound
->
lock
));
TRACE
(
"old This->dsound->
state=%s
\n
"
,
captureStateString
[
This
->
dsound
->
state
]);
}
else
if
(
This
->
dsound
->
device
->
hwi
)
{
EnterCriticalSection
(
&
(
This
->
dsound
->
device
->
lock
));
TRACE
(
"old This->dsound->
device->state=%s
\n
"
,
captureStateString
[
This
->
dsound
->
device
->
state
]);
if
(
lpdwCapturePosition
)
{
MMTIME
mtime
;
mtime
.
wType
=
TIME_BYTES
;
waveInGetPosition
(
This
->
dsound
->
hwi
,
&
mtime
,
sizeof
(
mtime
));
TRACE
(
"mtime.u.cb=%ld,This->dsound->buflen=%ld
\n
"
,
mtime
.
u
.
cb
,
This
->
dsound
->
buflen
);
mtime
.
u
.
cb
=
mtime
.
u
.
cb
%
This
->
dsound
->
buflen
;
waveInGetPosition
(
This
->
dsound
->
device
->
hwi
,
&
mtime
,
sizeof
(
mtime
));
TRACE
(
"mtime.u.cb=%ld,This->dsound->
device->
buflen=%ld
\n
"
,
mtime
.
u
.
cb
,
This
->
dsound
->
device
->
buflen
);
mtime
.
u
.
cb
=
mtime
.
u
.
cb
%
This
->
dsound
->
device
->
buflen
;
*
lpdwCapturePosition
=
mtime
.
u
.
cb
;
}
if
(
lpdwReadPosition
)
{
if
(
This
->
dsound
->
state
==
STATE_STARTING
)
{
if
(
This
->
dsound
->
device
->
state
==
STATE_STARTING
)
{
if
(
lpdwCapturePosition
)
This
->
dsound
->
read_position
=
*
lpdwCapturePosition
;
This
->
dsound
->
state
=
STATE_CAPTURING
;
This
->
dsound
->
device
->
read_position
=
*
lpdwCapturePosition
;
This
->
dsound
->
device
->
state
=
STATE_CAPTURING
;
}
*
lpdwReadPosition
=
This
->
dsound
->
read_position
;
*
lpdwReadPosition
=
This
->
dsound
->
device
->
read_position
;
}
TRACE
(
"new This->dsound->
state=%s
\n
"
,
captureStateString
[
This
->
dsound
->
state
]);
LeaveCriticalSection
(
&
(
This
->
dsound
->
lock
));
TRACE
(
"new This->dsound->
device->state=%s
\n
"
,
captureStateString
[
This
->
dsound
->
device
->
state
]);
LeaveCriticalSection
(
&
(
This
->
dsound
->
device
->
lock
));
if
(
lpdwCapturePosition
)
TRACE
(
"*lpdwCapturePosition=%ld
\n
"
,
*
lpdwCapturePosition
);
if
(
lpdwReadPosition
)
TRACE
(
"*lpdwReadPosition=%ld
\n
"
,
*
lpdwReadPosition
);
}
else
{
...
...
@@ -1100,16 +1275,16 @@ IDirectSoundCaptureBufferImpl_GetFormat(
return
DSERR_INVALIDPARAM
;
}
if
(
dwSizeAllocated
>
(
sizeof
(
WAVEFORMATEX
)
+
This
->
dsound
->
pwfx
->
cbSize
))
dwSizeAllocated
=
sizeof
(
WAVEFORMATEX
)
+
This
->
dsound
->
pwfx
->
cbSize
;
if
(
dwSizeAllocated
>
(
sizeof
(
WAVEFORMATEX
)
+
This
->
dsound
->
device
->
pwfx
->
cbSize
))
dwSizeAllocated
=
sizeof
(
WAVEFORMATEX
)
+
This
->
dsound
->
device
->
pwfx
->
cbSize
;
if
(
lpwfxFormat
)
{
/* NULL is valid (just want size) */
CopyMemory
(
lpwfxFormat
,
This
->
dsound
->
pwfx
,
dwSizeAllocated
);
CopyMemory
(
lpwfxFormat
,
This
->
dsound
->
device
->
pwfx
,
dwSizeAllocated
);
if
(
lpdwSizeWritten
)
*
lpdwSizeWritten
=
dwSizeAllocated
;
}
else
{
if
(
lpdwSizeWritten
)
*
lpdwSizeWritten
=
sizeof
(
WAVEFORMATEX
)
+
This
->
dsound
->
pwfx
->
cbSize
;
*
lpdwSizeWritten
=
sizeof
(
WAVEFORMATEX
)
+
This
->
dsound
->
device
->
pwfx
->
cbSize
;
else
{
TRACE
(
"invalid parameter: lpdwSizeWritten = NULL
\n
"
);
hres
=
DSERR_INVALIDPARAM
;
...
...
@@ -1144,19 +1319,19 @@ IDirectSoundCaptureBufferImpl_GetStatus(
}
*
lpdwStatus
=
0
;
EnterCriticalSection
(
&
(
This
->
dsound
->
lock
));
EnterCriticalSection
(
&
(
This
->
dsound
->
device
->
lock
));
TRACE
(
"old This->dsound->state=%s, old lpdwStatus=%08lx
\n
"
,
captureStateString
[
This
->
dsound
->
state
],
*
lpdwStatus
);
if
((
This
->
dsound
->
state
==
STATE_STARTING
)
||
(
This
->
dsound
->
state
==
STATE_CAPTURING
))
{
captureStateString
[
This
->
dsound
->
device
->
state
],
*
lpdwStatus
);
if
((
This
->
dsound
->
device
->
state
==
STATE_STARTING
)
||
(
This
->
dsound
->
device
->
state
==
STATE_CAPTURING
))
{
*
lpdwStatus
|=
DSCBSTATUS_CAPTURING
;
if
(
This
->
flags
&
DSCBSTART_LOOPING
)
*
lpdwStatus
|=
DSCBSTATUS_LOOPING
;
}
TRACE
(
"new This->dsound->state=%s, new lpdwStatus=%08lx
\n
"
,
captureStateString
[
This
->
dsound
->
state
],
*
lpdwStatus
);
LeaveCriticalSection
(
&
(
This
->
dsound
->
lock
));
captureStateString
[
This
->
dsound
->
device
->
state
],
*
lpdwStatus
);
LeaveCriticalSection
(
&
(
This
->
dsound
->
device
->
lock
));
TRACE
(
"status=%lx
\n
"
,
*
lpdwStatus
);
TRACE
(
"returning DS_OK
\n
"
);
...
...
@@ -1213,21 +1388,21 @@ IDirectSoundCaptureBufferImpl_Lock(
return
DSERR_INVALIDPARAM
;
}
EnterCriticalSection
(
&
(
This
->
dsound
->
lock
));
EnterCriticalSection
(
&
(
This
->
dsound
->
device
->
lock
));
if
(
This
->
dsound
->
driver
)
{
hres
=
IDsCaptureDriverBuffer_Lock
(
This
->
dsound
->
hwbuf
,
lplpvAudioPtr1
,
if
(
This
->
dsound
->
d
evice
->
d
river
)
{
hres
=
IDsCaptureDriverBuffer_Lock
(
This
->
dsound
->
device
->
hwbuf
,
lplpvAudioPtr1
,
lpdwAudioBytes1
,
lplpvAudioPtr2
,
lpdwAudioBytes2
,
dwReadCusor
,
dwReadBytes
,
dwFlags
);
if
(
hres
!=
DS_OK
)
WARN
(
"IDsCaptureDriverBuffer_Lock failed
\n
"
);
}
else
if
(
This
->
dsound
->
hwi
)
{
*
lplpvAudioPtr1
=
This
->
dsound
->
buffer
+
dwReadCusor
;
if
(
(
dwReadCusor
+
dwReadBytes
)
>
This
->
dsound
->
buflen
)
{
*
lpdwAudioBytes1
=
This
->
dsound
->
buflen
-
dwReadCusor
;
}
else
if
(
This
->
dsound
->
device
->
hwi
)
{
*
lplpvAudioPtr1
=
This
->
dsound
->
device
->
buffer
+
dwReadCusor
;
if
(
(
dwReadCusor
+
dwReadBytes
)
>
This
->
dsound
->
device
->
buflen
)
{
*
lpdwAudioBytes1
=
This
->
dsound
->
device
->
buflen
-
dwReadCusor
;
if
(
lplpvAudioPtr2
)
*
lplpvAudioPtr2
=
This
->
dsound
->
buffer
;
*
lplpvAudioPtr2
=
This
->
dsound
->
device
->
buffer
;
if
(
lpdwAudioBytes2
)
*
lpdwAudioBytes2
=
dwReadBytes
-
*
lpdwAudioBytes1
;
}
else
{
...
...
@@ -1242,7 +1417,7 @@ IDirectSoundCaptureBufferImpl_Lock(
hres
=
DSERR_INVALIDCALL
;
/* DSERR_NODRIVER ? */
}
LeaveCriticalSection
(
&
(
This
->
dsound
->
lock
));
LeaveCriticalSection
(
&
(
This
->
dsound
->
device
->
lock
));
TRACE
(
"returning %08lx
\n
"
,
hres
);
return
hres
;
...
...
@@ -1267,136 +1442,136 @@ IDirectSoundCaptureBufferImpl_Start(
return
DSERR_INVALIDPARAM
;
}
if
(
(
This
->
dsound
->
d
river
==
0
)
&&
(
This
->
dsound
->
hwi
==
0
)
)
{
if
(
(
This
->
dsound
->
d
evice
->
driver
==
0
)
&&
(
This
->
dsound
->
device
->
hwi
==
0
)
)
{
WARN
(
"no driver
\n
"
);
return
DSERR_NODRIVER
;
}
EnterCriticalSection
(
&
(
This
->
dsound
->
lock
));
EnterCriticalSection
(
&
(
This
->
dsound
->
device
->
lock
));
This
->
flags
=
dwFlags
;
TRACE
(
"old This->dsound->state=%s
\n
"
,
captureStateString
[
This
->
dsound
->
state
]);
if
(
This
->
dsound
->
state
==
STATE_STOPPED
)
This
->
dsound
->
state
=
STATE_STARTING
;
else
if
(
This
->
dsound
->
state
==
STATE_STOPPING
)
This
->
dsound
->
state
=
STATE_CAPTURING
;
TRACE
(
"new This->dsound->
state=%s
\n
"
,
captureStateString
[
This
->
dsound
->
state
]);
TRACE
(
"old This->dsound->state=%s
\n
"
,
captureStateString
[
This
->
dsound
->
device
->
state
]);
if
(
This
->
dsound
->
device
->
state
==
STATE_STOPPED
)
This
->
dsound
->
device
->
state
=
STATE_STARTING
;
else
if
(
This
->
dsound
->
device
->
state
==
STATE_STOPPING
)
This
->
dsound
->
device
->
state
=
STATE_CAPTURING
;
TRACE
(
"new This->dsound->
device->state=%s
\n
"
,
captureStateString
[
This
->
dsound
->
device
->
state
]);
LeaveCriticalSection
(
&
(
This
->
dsound
->
lock
));
LeaveCriticalSection
(
&
(
This
->
dsound
->
device
->
lock
));
if
(
This
->
dsound
->
driver
)
{
hres
=
IDsCaptureDriverBuffer_Start
(
This
->
dsound
->
hwbuf
,
dwFlags
);
if
(
This
->
dsound
->
d
evice
->
d
river
)
{
hres
=
IDsCaptureDriverBuffer_Start
(
This
->
dsound
->
device
->
hwbuf
,
dwFlags
);
if
(
hres
!=
DS_OK
)
WARN
(
"IDsCaptureDriverBuffer_Start failed
\n
"
);
}
else
if
(
This
->
dsound
->
hwi
)
{
}
else
if
(
This
->
dsound
->
device
->
hwi
)
{
IDirectSoundCaptureImpl
*
ipDSC
=
This
->
dsound
;
if
(
ipDSC
->
buffer
)
{
if
(
ipDSC
->
device
->
buffer
)
{
if
(
This
->
nrofnotifies
)
{
int
c
;
ipDSC
->
nrofpwaves
=
This
->
nrofnotifies
;
ipDSC
->
device
->
nrofpwaves
=
This
->
nrofnotifies
;
TRACE
(
"nrofnotifies=%d
\n
"
,
This
->
nrofnotifies
);
/* prepare headers */
if
(
ipDSC
->
pwave
)
ipDSC
->
pwave
=
HeapReAlloc
(
GetProcessHeap
(),
0
,
ipDSC
->
pwave
,
ipDSC
->
nrofpwaves
*
sizeof
(
WAVEHDR
));
if
(
ipDSC
->
device
->
pwave
)
ipDSC
->
device
->
pwave
=
HeapReAlloc
(
GetProcessHeap
(),
0
,
ipDSC
->
device
->
pwave
,
ipDSC
->
device
->
nrofpwaves
*
sizeof
(
WAVEHDR
));
else
ipDSC
->
pwave
=
HeapAlloc
(
GetProcessHeap
(),
0
,
ipDSC
->
nrofpwaves
*
sizeof
(
WAVEHDR
));
ipDSC
->
device
->
pwave
=
HeapAlloc
(
GetProcessHeap
(),
0
,
ipDSC
->
device
->
nrofpwaves
*
sizeof
(
WAVEHDR
));
for
(
c
=
0
;
c
<
ipDSC
->
nrofpwaves
;
c
++
)
{
for
(
c
=
0
;
c
<
ipDSC
->
device
->
nrofpwaves
;
c
++
)
{
if
(
This
->
notifies
[
c
].
dwOffset
==
DSBPN_OFFSETSTOP
)
{
TRACE
(
"got DSBPN_OFFSETSTOP
\n
"
);
ipDSC
->
nrofpwaves
=
c
;
ipDSC
->
device
->
nrofpwaves
=
c
;
break
;
}
if
(
c
==
0
)
{
ipDSC
->
pwave
[
0
].
lpData
=
ipDSC
->
buffer
;
ipDSC
->
pwave
[
0
].
dwBufferLength
=
ipDSC
->
device
->
pwave
[
0
].
lpData
=
ipDSC
->
device
->
buffer
;
ipDSC
->
device
->
pwave
[
0
].
dwBufferLength
=
This
->
notifies
[
0
].
dwOffset
+
1
;
}
else
{
ipDSC
->
pwave
[
c
].
lpData
=
ipDSC
->
buffer
+
ipDSC
->
device
->
pwave
[
c
].
lpData
=
ipDSC
->
device
->
buffer
+
This
->
notifies
[
c
-
1
].
dwOffset
+
1
;
ipDSC
->
pwave
[
c
].
dwBufferLength
=
ipDSC
->
device
->
pwave
[
c
].
dwBufferLength
=
This
->
notifies
[
c
].
dwOffset
-
This
->
notifies
[
c
-
1
].
dwOffset
;
}
ipDSC
->
pwave
[
c
].
dwBytesRecorded
=
0
;
ipDSC
->
pwave
[
c
].
dwUser
=
(
DWORD
)
ipDSC
;
ipDSC
->
pwave
[
c
].
dwFlags
=
0
;
ipDSC
->
pwave
[
c
].
dwLoops
=
0
;
hres
=
mmErr
(
waveInPrepareHeader
(
ipDSC
->
hwi
,
&
(
ipDSC
->
pwave
[
c
]),
sizeof
(
WAVEHDR
)));
ipDSC
->
device
->
pwave
[
c
].
dwBytesRecorded
=
0
;
ipDSC
->
device
->
pwave
[
c
].
dwUser
=
(
DWORD
)
ipDSC
;
ipDSC
->
device
->
pwave
[
c
].
dwFlags
=
0
;
ipDSC
->
device
->
pwave
[
c
].
dwLoops
=
0
;
hres
=
mmErr
(
waveInPrepareHeader
(
ipDSC
->
device
->
hwi
,
&
(
ipDSC
->
device
->
pwave
[
c
]),
sizeof
(
WAVEHDR
)));
if
(
hres
!=
DS_OK
)
{
WARN
(
"waveInPrepareHeader failed
\n
"
);
while
(
c
--
)
waveInUnprepareHeader
(
ipDSC
->
hwi
,
&
(
ipDSC
->
pwave
[
c
]),
sizeof
(
WAVEHDR
));
waveInUnprepareHeader
(
ipDSC
->
device
->
hwi
,
&
(
ipDSC
->
device
->
pwave
[
c
]),
sizeof
(
WAVEHDR
));
break
;
}
hres
=
mmErr
(
waveInAddBuffer
(
ipDSC
->
hwi
,
&
(
ipDSC
->
pwave
[
c
]),
sizeof
(
WAVEHDR
)));
hres
=
mmErr
(
waveInAddBuffer
(
ipDSC
->
device
->
hwi
,
&
(
ipDSC
->
device
->
pwave
[
c
]),
sizeof
(
WAVEHDR
)));
if
(
hres
!=
DS_OK
)
{
WARN
(
"waveInAddBuffer failed
\n
"
);
while
(
c
--
)
waveInUnprepareHeader
(
ipDSC
->
hwi
,
&
(
ipDSC
->
pwave
[
c
]),
sizeof
(
WAVEHDR
));
waveInUnprepareHeader
(
ipDSC
->
device
->
hwi
,
&
(
ipDSC
->
device
->
pwave
[
c
]),
sizeof
(
WAVEHDR
));
break
;
}
}
FillMemory
(
ipDSC
->
buffer
,
ipDSC
->
buflen
,
(
ipDSC
->
pwfx
->
wBitsPerSample
==
8
)
?
128
:
0
);
FillMemory
(
ipDSC
->
device
->
buffer
,
ipDSC
->
device
->
buflen
,
(
ipDSC
->
device
->
pwfx
->
wBitsPerSample
==
8
)
?
128
:
0
);
}
else
{
TRACE
(
"no notifiers specified
\n
"
);
/* no notifiers specified so just create a single default header */
ipDSC
->
nrofpwaves
=
1
;
if
(
ipDSC
->
pwave
)
ipDSC
->
pwave
=
HeapReAlloc
(
GetProcessHeap
(),
0
,
ipDSC
->
pwave
,
sizeof
(
WAVEHDR
));
ipDSC
->
device
->
nrofpwaves
=
1
;
if
(
ipDSC
->
device
->
pwave
)
ipDSC
->
device
->
pwave
=
HeapReAlloc
(
GetProcessHeap
(),
0
,
ipDSC
->
device
->
pwave
,
sizeof
(
WAVEHDR
));
else
ipDSC
->
pwave
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
WAVEHDR
));
ipDSC
->
device
->
pwave
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
WAVEHDR
));
ipDSC
->
pwave
[
0
].
lpData
=
ipDSC
->
buffer
;
ipDSC
->
pwave
[
0
].
dwBufferLength
=
ipDSC
->
buflen
;
ipDSC
->
pwave
[
0
].
dwBytesRecorded
=
0
;
ipDSC
->
pwave
[
0
].
dwUser
=
(
DWORD
)
ipDSC
;
ipDSC
->
pwave
[
0
].
dwFlags
=
0
;
ipDSC
->
pwave
[
0
].
dwLoops
=
0
;
ipDSC
->
device
->
pwave
[
0
].
lpData
=
ipDSC
->
device
->
buffer
;
ipDSC
->
device
->
pwave
[
0
].
dwBufferLength
=
ipDSC
->
device
->
buflen
;
ipDSC
->
device
->
pwave
[
0
].
dwBytesRecorded
=
0
;
ipDSC
->
device
->
pwave
[
0
].
dwUser
=
(
DWORD
)
ipDSC
;
ipDSC
->
device
->
pwave
[
0
].
dwFlags
=
0
;
ipDSC
->
device
->
pwave
[
0
].
dwLoops
=
0
;
hres
=
mmErr
(
waveInPrepareHeader
(
ipDSC
->
hwi
,
&
(
ipDSC
->
pwave
[
0
]),
sizeof
(
WAVEHDR
)));
hres
=
mmErr
(
waveInPrepareHeader
(
ipDSC
->
device
->
hwi
,
&
(
ipDSC
->
device
->
pwave
[
0
]),
sizeof
(
WAVEHDR
)));
if
(
hres
!=
DS_OK
)
{
WARN
(
"waveInPrepareHeader failed
\n
"
);
waveInUnprepareHeader
(
ipDSC
->
hwi
,
&
(
ipDSC
->
pwave
[
0
]),
sizeof
(
WAVEHDR
));
waveInUnprepareHeader
(
ipDSC
->
device
->
hwi
,
&
(
ipDSC
->
device
->
pwave
[
0
]),
sizeof
(
WAVEHDR
));
}
hres
=
mmErr
(
waveInAddBuffer
(
ipDSC
->
hwi
,
&
(
ipDSC
->
pwave
[
0
]),
sizeof
(
WAVEHDR
)));
hres
=
mmErr
(
waveInAddBuffer
(
ipDSC
->
device
->
hwi
,
&
(
ipDSC
->
device
->
pwave
[
0
]),
sizeof
(
WAVEHDR
)));
if
(
hres
!=
DS_OK
)
{
WARN
(
"waveInAddBuffer failed
\n
"
);
waveInUnprepareHeader
(
ipDSC
->
hwi
,
&
(
ipDSC
->
pwave
[
0
]),
sizeof
(
WAVEHDR
));
waveInUnprepareHeader
(
ipDSC
->
device
->
hwi
,
&
(
ipDSC
->
device
->
pwave
[
0
]),
sizeof
(
WAVEHDR
));
}
}
}
ipDSC
->
index
=
0
;
ipDSC
->
read_position
=
0
;
ipDSC
->
device
->
index
=
0
;
ipDSC
->
device
->
read_position
=
0
;
if
(
hres
==
DS_OK
)
{
/* start filling the first buffer */
hres
=
mmErr
(
waveInStart
(
ipDSC
->
hwi
));
hres
=
mmErr
(
waveInStart
(
ipDSC
->
device
->
hwi
));
if
(
hres
!=
DS_OK
)
WARN
(
"waveInStart failed
\n
"
);
}
if
(
hres
!=
DS_OK
)
{
WARN
(
"calling waveInClose because of error
\n
"
);
waveInClose
(
This
->
dsound
->
hwi
);
This
->
dsound
->
hwi
=
0
;
waveInClose
(
This
->
dsound
->
device
->
hwi
);
This
->
dsound
->
device
->
hwi
=
0
;
}
}
else
{
WARN
(
"no driver
\n
"
);
...
...
@@ -1424,23 +1599,23 @@ IDirectSoundCaptureBufferImpl_Stop( LPDIRECTSOUNDCAPTUREBUFFER8 iface )
return
DSERR_INVALIDPARAM
;
}
EnterCriticalSection
(
&
(
This
->
dsound
->
lock
));
EnterCriticalSection
(
&
(
This
->
dsound
->
device
->
lock
));
TRACE
(
"old This->dsound->state=%s
\n
"
,
captureStateString
[
This
->
dsound
->
state
]);
if
(
This
->
dsound
->
state
==
STATE_CAPTURING
)
This
->
dsound
->
state
=
STATE_STOPPING
;
else
if
(
This
->
dsound
->
state
==
STATE_STARTING
)
This
->
dsound
->
state
=
STATE_STOPPED
;
TRACE
(
"new This->dsound->
state=%s
\n
"
,
captureStateString
[
This
->
dsound
->
state
]);
TRACE
(
"old This->dsound->state=%s
\n
"
,
captureStateString
[
This
->
dsound
->
device
->
state
]);
if
(
This
->
dsound
->
device
->
state
==
STATE_CAPTURING
)
This
->
dsound
->
device
->
state
=
STATE_STOPPING
;
else
if
(
This
->
dsound
->
device
->
state
==
STATE_STARTING
)
This
->
dsound
->
device
->
state
=
STATE_STOPPED
;
TRACE
(
"new This->dsound->
device->state=%s
\n
"
,
captureStateString
[
This
->
dsound
->
device
->
state
]);
LeaveCriticalSection
(
&
(
This
->
dsound
->
lock
));
LeaveCriticalSection
(
&
(
This
->
dsound
->
device
->
lock
));
if
(
This
->
dsound
->
driver
)
{
hres
=
IDsCaptureDriverBuffer_Stop
(
This
->
dsound
->
hwbuf
);
if
(
This
->
dsound
->
d
evice
->
d
river
)
{
hres
=
IDsCaptureDriverBuffer_Stop
(
This
->
dsound
->
device
->
hwbuf
);
if
(
hres
!=
DS_OK
)
WARN
(
"IDsCaptureDriverBuffer_Stop() failed
\n
"
);
}
else
if
(
This
->
dsound
->
hwi
)
{
hres
=
mmErr
(
waveInReset
(
This
->
dsound
->
hwi
));
}
else
if
(
This
->
dsound
->
device
->
hwi
)
{
hres
=
mmErr
(
waveInReset
(
This
->
dsound
->
device
->
hwi
));
if
(
hres
!=
DS_OK
)
WARN
(
"waveInReset() failed
\n
"
);
}
else
{
...
...
@@ -1475,14 +1650,14 @@ IDirectSoundCaptureBufferImpl_Unlock(
return
DSERR_INVALIDPARAM
;
}
if
(
This
->
dsound
->
driver
)
{
hres
=
IDsCaptureDriverBuffer_Unlock
(
This
->
dsound
->
hwbuf
,
lpvAudioPtr1
,
if
(
This
->
dsound
->
d
evice
->
d
river
)
{
hres
=
IDsCaptureDriverBuffer_Unlock
(
This
->
dsound
->
device
->
hwbuf
,
lpvAudioPtr1
,
dwAudioBytes1
,
lpvAudioPtr2
,
dwAudioBytes2
);
if
(
hres
!=
DS_OK
)
WARN
(
"IDsCaptureDriverBuffer_Unlock failed
\n
"
);
}
else
if
(
This
->
dsound
->
hwi
)
{
This
->
dsound
->
read_position
=
(
This
->
dsound
->
read_position
+
(
dwAudioBytes1
+
dwAudioBytes2
))
%
This
->
dsound
->
buflen
;
}
else
if
(
This
->
dsound
->
device
->
hwi
)
{
This
->
dsound
->
device
->
read_position
=
(
This
->
dsound
->
device
->
read_position
+
(
dwAudioBytes1
+
dwAudioBytes2
))
%
This
->
dsound
->
device
->
buflen
;
}
else
{
WARN
(
"invalid call
\n
"
);
hres
=
DSERR_INVALIDCALL
;
...
...
@@ -1595,8 +1770,11 @@ DSCCF_CreateInstance(
*
ppobj
=
NULL
;
if
(
IsEqualGUID
(
&
IID_IDirectSoundCapture
,
riid
)
)
return
DSOUND_CaptureCreate
((
LPDIRECTSOUNDCAPTURE
*
)
ppobj
,
pOuter
);
if
(
IsEqualGUID
(
&
IID_IDirectSoundCapture8
,
riid
)
)
return
D
irectSoundCaptureCreate8
(
0
,
(
LPDIRECTSOUNDCAPTURE8
*
)
ppobj
,
pOuter
);
return
D
SOUND_CaptureCreate8
(
(
LPDIRECTSOUNDCAPTURE8
*
)
ppobj
,
pOuter
);
WARN
(
"(%p,%p,%s,%p) Interface not found!
\n
"
,
This
,
pOuter
,
debugstr_guid
(
riid
),
ppobj
);
return
E_NOINTERFACE
;
...
...
dlls/dsound/dsound.spec
View file @
5c8fb168
1 stdcall DirectSoundCreate(ptr ptr ptr)
2 stdcall DirectSoundEnumerateA(ptr ptr)
3 stdcall DirectSoundEnumerateW(ptr ptr)
6 stdcall DirectSoundCaptureCreate(ptr ptr ptr)
DirectSoundCaptureCreate8
6 stdcall DirectSoundCaptureCreate(ptr ptr ptr)
7 stdcall DirectSoundCaptureEnumerateA(ptr ptr)
8 stdcall DirectSoundCaptureEnumerateW(ptr ptr)
9 stdcall GetDeviceID(ptr ptr)
...
...
dlls/dsound/dsound_main.c
View file @
5c8fb168
...
...
@@ -665,6 +665,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
TRACE
(
"DLL_PROCESS_ATTACH
\n
"
);
for
(
i
=
0
;
i
<
MAXWAVEDRIVERS
;
i
++
)
{
DSOUND_renderer
[
i
]
=
NULL
;
DSOUND_capture
[
i
]
=
NULL
;
INIT_GUID
(
DSOUND_renderer_guids
[
i
],
0xbd6dd71a
,
0x3deb
,
0x11d1
,
0xb1
,
0x71
,
0x00
,
0xc0
,
0x4f
,
0xc2
,
0x00
,
0x00
+
i
);
INIT_GUID
(
DSOUND_capture_guids
[
i
],
0xbd6dd71b
,
0x3deb
,
0x11d1
,
0xb1
,
0x71
,
0x00
,
0xc0
,
0x4f
,
0xc2
,
0x00
,
0x00
+
i
);
}
...
...
dlls/dsound/dsound_private.h
View file @
5c8fb168
...
...
@@ -64,6 +64,7 @@ typedef struct PrimaryBufferImpl PrimaryBufferImpl;
typedef
struct
SecondaryBufferImpl
SecondaryBufferImpl
;
typedef
struct
IClassFactoryImpl
IClassFactoryImpl
;
typedef
struct
DirectSoundDevice
DirectSoundDevice
;
typedef
struct
DirectSoundCaptureDevice
DirectSoundCaptureDevice
;
/*****************************************************************************
* IDirectSound implementation structure
...
...
@@ -280,9 +281,14 @@ struct IDirectSoundCaptureImpl
const
IDirectSoundCaptureVtbl
*
lpVtbl
;
DWORD
ref
;
DirectSoundCaptureDevice
*
device
;
};
struct
DirectSoundCaptureDevice
{
/* IDirectSoundCaptureImpl fields */
GUID
guid
;
BOOL
initialized
;
DWORD
ref
;
/* DirectSound driver stuff */
PIDSCDRIVER
driver
;
...
...
@@ -308,6 +314,17 @@ struct IDirectSoundCaptureImpl
CRITICAL_SECTION
lock
;
};
HRESULT
WINAPI
IDirectSoundCaptureImpl_Create
(
LPDIRECTSOUNDCAPTURE8
*
ppds
);
HRESULT
WINAPI
DSOUND_CaptureCreate
(
LPDIRECTSOUNDCAPTURE
*
ppDSC
,
IUnknown
*
pUnkOuter
);
HRESULT
WINAPI
DSOUND_CaptureCreate8
(
LPDIRECTSOUNDCAPTURE8
*
ppDSC8
,
IUnknown
*
pUnkOuter
);
/*****************************************************************************
* IDirectSoundCaptureBuffer implementation structure
*/
...
...
@@ -498,6 +515,8 @@ void DSOUND_Calc3DBuffer(IDirectSoundBufferImpl *dsb);
extern
DirectSoundDevice
*
DSOUND_renderer
[
MAXWAVEDRIVERS
];
extern
GUID
DSOUND_renderer_guids
[
MAXWAVEDRIVERS
];
extern
DirectSoundCaptureDevice
*
DSOUND_capture
[
MAXWAVEDRIVERS
];
extern
GUID
DSOUND_capture_guids
[
MAXWAVEDRIVERS
];
extern
HRESULT
mmErr
(
UINT
err
);
...
...
dlls/dsound/propset.c
View file @
5c8fb168
...
...
@@ -688,7 +688,7 @@ static HRESULT WINAPI DSPROPERTY_DescriptionA(
if
(
err
==
DS_OK
&&
drv
)
ppd
->
Type
=
DIRECTSOUNDDEVICE_TYPE_VXD
;
else
WARN
(
"wave
Out
Message(DRV_QUERYDSOUNDIFACE) failed
\n
"
);
WARN
(
"wave
In
Message(DRV_QUERYDSOUNDIFACE) failed
\n
"
);
break
;
}
else
{
WARN
(
"no memory
\n
"
);
...
...
@@ -784,7 +784,7 @@ static HRESULT WINAPI DSPROPERTY_DescriptionA(
if
(
err
==
DS_OK
&&
drv
)
ppd
->
Type
=
DIRECTSOUNDDEVICE_TYPE_VXD
;
else
WARN
(
"wave
Out
Message(DRV_QUERYDSOUNDIFACE) failed
\n
"
);
WARN
(
"wave
In
Message(DRV_QUERYDSOUNDIFACE) failed
\n
"
);
found
=
TRUE
;
break
;
}
else
{
...
...
@@ -1508,7 +1508,7 @@ HRESULT WINAPI IKsPrivatePropertySetImpl_Create(
IKsPrivatePropertySetImpl
*
iks
;
iks
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
*
iks
));
iks
->
ref
=
0
;
iks
->
ref
=
1
;
iks
->
lpVtbl
=
&
ikspvt
;
*
piks
=
iks
;
...
...
include/dsound.h
View file @
5c8fb168
...
...
@@ -401,7 +401,7 @@ extern HRESULT WINAPI DirectSoundCaptureEnumerateA(LPDSENUMCALLBACKA, LPVOID);
extern
HRESULT
WINAPI
DirectSoundCaptureEnumerateW
(
LPDSENUMCALLBACKW
,
LPVOID
);
extern
HRESULT
WINAPI
DirectSoundCreate8
(
LPCGUID
lpGUID
,
LPDIRECTSOUND8
*
ppDS8
,
LPUNKNOWN
pUnkOuter
);
extern
HRESULT
WINAPI
DirectSoundCaptureCreate8
(
LPCGUID
lpGUID
,
LPDIRECTSOUNDCAPTURE
*
ppDSC8
,
LPUNKNOWN
pUnkOuter
);
extern
HRESULT
WINAPI
DirectSoundCaptureCreate8
(
LPCGUID
lpGUID
,
LPDIRECTSOUNDCAPTURE
8
*
ppDSC8
,
LPUNKNOWN
pUnkOuter
);
extern
HRESULT
WINAPI
DirectSoundFullDuplexCreate
(
LPCGUID
pcGuidCaptureDevice
,
LPCGUID
pcGuidRenderDevice
,
LPCDSCBUFFERDESC
pcDSCBufferDesc
,
LPCDSBUFFERDESC
pcDSBufferDesc
,
HWND
hWnd
,
DWORD
dwLevel
,
LPDIRECTSOUNDFULLDUPLEX
*
ppDSFD
,
LPDIRECTSOUNDCAPTUREBUFFER8
*
ppDSCBuffer8
,
LPDIRECTSOUNDBUFFER8
*
ppDSBuffer8
,
LPUNKNOWN
pUnkOuter
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment