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
17056b9f
Commit
17056b9f
authored
Mar 03, 2015
by
Mark Harmstone
Committed by
Alexandre Julliard
Mar 10, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dsound: Implement SetFX.
parent
e6ae7335
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
140 additions
and
2 deletions
+140
-2
buffer.c
dlls/dsound/buffer.c
+129
-2
dsound_main.c
dlls/dsound/dsound_main.c
+1
-0
dsound_private.h
dlls/dsound/dsound_private.h
+10
-0
No files found.
dlls/dsound/buffer.c
View file @
17056b9f
...
...
@@ -21,6 +21,8 @@
#include <stdarg.h>
#define COBJMACROS
#define NONAMELESSSTRUCT
#define NONAMELESSUNION
#include "windef.h"
...
...
@@ -697,14 +699,129 @@ static HRESULT WINAPI IDirectSoundBufferImpl_SetFX(IDirectSoundBuffer8 *iface, D
{
IDirectSoundBufferImpl
*
This
=
impl_from_IDirectSoundBuffer8
(
iface
);
DWORD
u
;
DSFilter
*
filters
;
HRESULT
hr
,
hr2
;
DMO_MEDIA_TYPE
dmt
;
WAVEFORMATEX
wfx
;
FIXME
(
"(%p,%u,%p,%p): stub
\n
"
,
This
,
dwEffectsCount
,
pDSFXDesc
,
pdwResultCodes
);
TRACE
(
"(%p,%u,%p,%p)
\n
"
,
This
,
dwEffectsCount
,
pDSFXDesc
,
pdwResultCodes
);
if
(
pdwResultCodes
)
for
(
u
=
0
;
u
<
dwEffectsCount
;
u
++
)
pdwResultCodes
[
u
]
=
DSFXR_UNKNOWN
;
WARN
(
"control unavailable
\n
"
);
if
((
dwEffectsCount
>
0
&&
!
pDSFXDesc
)
||
(
dwEffectsCount
==
0
&&
(
pDSFXDesc
||
pdwResultCodes
))
)
return
E_INVALIDARG
;
if
(
!
(
This
->
dsbd
.
dwFlags
&
DSBCAPS_CTRLFX
))
{
WARN
(
"attempted to call SetFX on buffer without DSBCAPS_CTRLFX
\n
"
);
return
DSERR_CONTROLUNAVAIL
;
}
if
(
This
->
state
!=
STATE_STOPPED
)
return
DSERR_INVALIDCALL
;
if
(
This
->
buffer
->
lockedbytes
>
0
)
return
DSERR_INVALIDCALL
;
if
(
dwEffectsCount
==
0
)
{
if
(
This
->
num_filters
>
0
)
{
for
(
u
=
0
;
u
<
This
->
num_filters
;
u
++
)
{
IMediaObject_Release
(
This
->
filters
[
u
].
obj
);
}
HeapFree
(
GetProcessHeap
(),
0
,
This
->
filters
);
This
->
filters
=
NULL
;
This
->
num_filters
=
0
;
}
return
DS_OK
;
}
filters
=
HeapAlloc
(
GetProcessHeap
(),
0
,
dwEffectsCount
*
sizeof
(
DSFilter
));
if
(
!
filters
)
{
WARN
(
"out of memory
\n
"
);
return
DSERR_OUTOFMEMORY
;
}
hr
=
DS_OK
;
wfx
.
wFormatTag
=
WAVE_FORMAT_IEEE_FLOAT
;
wfx
.
nChannels
=
This
->
pwfx
->
nChannels
;
wfx
.
nSamplesPerSec
=
This
->
pwfx
->
nSamplesPerSec
;
wfx
.
wBitsPerSample
=
sizeof
(
float
)
*
8
;
wfx
.
nBlockAlign
=
(
wfx
.
nChannels
*
wfx
.
wBitsPerSample
)
/
8
;
wfx
.
nAvgBytesPerSec
=
wfx
.
nSamplesPerSec
*
wfx
.
nBlockAlign
;
wfx
.
cbSize
=
sizeof
(
wfx
);
dmt
.
majortype
=
KSDATAFORMAT_TYPE_AUDIO
;
dmt
.
subtype
=
KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
;
dmt
.
bFixedSizeSamples
=
TRUE
;
dmt
.
bTemporalCompression
=
FALSE
;
dmt
.
lSampleSize
=
sizeof
(
float
)
*
This
->
pwfx
->
nChannels
/
8
;
dmt
.
formattype
=
FORMAT_WaveFormatEx
;
dmt
.
pUnk
=
NULL
;
dmt
.
cbFormat
=
sizeof
(
WAVEFORMATEX
);
dmt
.
pbFormat
=
(
BYTE
*
)
&
wfx
;
for
(
u
=
0
;
u
<
dwEffectsCount
;
u
++
)
{
hr2
=
CoCreateInstance
(
&
pDSFXDesc
[
u
].
guidDSFXClass
,
NULL
,
CLSCTX_INPROC_SERVER
,
&
IID_IMediaObject
,
(
LPVOID
*
)
&
filters
[
u
].
obj
);
if
(
SUCCEEDED
(
hr2
))
{
hr2
=
IMediaObject_SetInputType
(
filters
[
u
].
obj
,
0
,
&
dmt
,
0
);
if
(
FAILED
(
hr2
))
WARN
(
"Could not set DMO input type
\n
"
);
}
if
(
SUCCEEDED
(
hr2
))
{
hr2
=
IMediaObject_SetOutputType
(
filters
[
u
].
obj
,
0
,
&
dmt
,
0
);
if
(
FAILED
(
hr2
))
WARN
(
"Could not set DMO output type
\n
"
);
}
if
(
FAILED
(
hr2
))
{
if
(
hr
==
DS_OK
)
hr
=
hr2
;
if
(
pdwResultCodes
)
pdwResultCodes
[
u
]
=
(
hr2
==
REGDB_E_CLASSNOTREG
)
?
DSFXR_UNKNOWN
:
DSFXR_FAILED
;
}
else
{
if
(
pdwResultCodes
)
pdwResultCodes
[
u
]
=
DSFXR_LOCSOFTWARE
;
}
}
if
(
FAILED
(
hr
))
{
for
(
u
=
0
;
u
<
dwEffectsCount
;
u
++
)
{
if
(
pdwResultCodes
)
pdwResultCodes
[
u
]
=
(
pdwResultCodes
[
u
]
!=
DSFXR_UNKNOWN
)
?
DSFXR_PRESENT
:
DSFXR_UNKNOWN
;
if
(
filters
[
u
].
obj
)
IMediaObject_Release
(
filters
[
u
].
obj
);
}
HeapFree
(
GetProcessHeap
(),
0
,
filters
);
}
else
{
if
(
This
->
num_filters
>
0
)
{
for
(
u
=
0
;
u
<
This
->
num_filters
;
u
++
)
{
IMediaObject_Release
(
This
->
filters
[
u
].
obj
);
if
(
This
->
filters
[
u
].
inplace
)
IMediaObjectInPlace_Release
(
This
->
filters
[
u
].
inplace
);
}
HeapFree
(
GetProcessHeap
(),
0
,
This
->
filters
);
}
for
(
u
=
0
;
u
<
dwEffectsCount
;
u
++
)
{
memcpy
(
&
filters
[
u
].
guid
,
&
pDSFXDesc
[
u
].
guidDSFXClass
,
sizeof
(
GUID
));
if
(
FAILED
(
IMediaObject_QueryInterface
(
filters
[
u
].
obj
,
&
IID_IMediaObjectInPlace
,
(
void
*
)
&
filters
[
u
].
inplace
)))
filters
[
u
].
inplace
=
NULL
;
}
This
->
filters
=
filters
;
This
->
num_filters
=
dwEffectsCount
;
}
return
hr
;
}
static
HRESULT
WINAPI
IDirectSoundBufferImpl_AcquireResources
(
IDirectSoundBuffer8
*
iface
,
...
...
@@ -1024,6 +1141,16 @@ void secondarybuffer_destroy(IDirectSoundBufferImpl *This)
HeapFree
(
GetProcessHeap
(),
0
,
This
->
notifies
);
HeapFree
(
GetProcessHeap
(),
0
,
This
->
pwfx
);
if
(
This
->
filters
)
{
int
i
;
for
(
i
=
0
;
i
<
This
->
num_filters
;
i
++
)
{
IMediaObject_Release
(
This
->
filters
[
i
].
obj
);
if
(
This
->
filters
[
i
].
inplace
)
IMediaObjectInPlace_Release
(
This
->
filters
[
i
].
inplace
);
}
HeapFree
(
GetProcessHeap
(),
0
,
This
->
filters
);
}
HeapFree
(
GetProcessHeap
(),
0
,
This
);
TRACE
(
"(%p) released
\n
"
,
This
);
...
...
dlls/dsound/dsound_main.c
View file @
17056b9f
...
...
@@ -55,6 +55,7 @@
#include "unknwn.h"
#include "oleidl.h"
#include "shobjidl.h"
#include "strmif.h"
#include "initguid.h"
#include "ksmedia.h"
...
...
dlls/dsound/dsound_private.h
View file @
17056b9f
...
...
@@ -26,7 +26,9 @@
#include "wingdi.h"
#include "mmdeviceapi.h"
#include "audioclient.h"
#include "mediaobj.h"
#include "mmsystem.h"
#include "uuids.h"
#include "wine/list.h"
...
...
@@ -57,6 +59,12 @@ typedef struct _DSVOLUMEPAN
LONG
lPan
;
}
DSVOLUMEPAN
,
*
PDSVOLUMEPAN
;
typedef
struct
DSFilter
{
GUID
guid
;
IMediaObject
*
obj
;
IMediaObjectInPlace
*
inplace
;
}
DSFilter
;
/*****************************************************************************
* IDirectSoundDevice implementation structure
*/
...
...
@@ -160,6 +168,8 @@ struct IDirectSoundBufferImpl
int
mix_channels
;
bitsgetfunc
get
,
get_aux
;
bitsputfunc
put
,
put_aux
;
int
num_filters
;
DSFilter
*
filters
;
struct
list
entry
;
};
...
...
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