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
395dc0f2
Commit
395dc0f2
authored
Sep 08, 2015
by
Andrew Eikum
Committed by
Alexandre Julliard
Sep 09, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
xaudio2: Add stub implementation of AudioVolumeMeter.
parent
8f98d4e6
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
321 additions
and
2 deletions
+321
-2
xaudio2.c
dlls/xaudio2_7/tests/xaudio2.c
+33
-2
xaudio_classes.idl
dlls/xaudio2_7/xaudio_classes.idl
+7
-0
xaudio_dll.c
dlls/xaudio2_7/xaudio_dll.c
+245
-0
xaudio2_8.spec
dlls/xaudio2_8/xaudio2_8.spec
+1
-0
xaudio_dll.c
dlls/xaudio2_8/xaudio_dll.c
+8
-0
Makefile.in
include/Makefile.in
+1
-0
xaudio2fx.idl
include/xaudio2fx.idl
+26
-0
No files found.
dlls/xaudio2_7/tests/xaudio2.c
View file @
395dc0f2
...
...
@@ -23,11 +23,14 @@
#include "wine/test.h"
#include "initguid.h"
#include "xaudio2.h"
#include "xaudio2fx.h"
#include "xapo.h"
#include "mmsystem.h"
static
BOOL
xaudio27
;
static
HRESULT
(
WINAPI
*
pXAudio2Create
)(
IXAudio2
**
,
UINT32
,
XAUDIO2_PROCESSOR
)
=
NULL
;
static
HRESULT
(
WINAPI
*
pCreateAudioVolumeMeter
)(
IUnknown
**
)
=
NULL
;
#define XA2CALL_0(method) if(xaudio27) hr = IXAudio27_##method((IXAudio27*)xa); else hr = IXAudio2_##method(xa);
#define XA2CALL_0V(method) if(xaudio27) IXAudio27_##method((IXAudio27*)xa); else IXAudio2_##method(xa);
...
...
@@ -165,9 +168,12 @@ static void test_simple_streaming(IXAudio2 *xa)
HRESULT
hr
;
IXAudio2MasteringVoice
*
master
;
IXAudio2SourceVoice
*
src
,
*
src2
;
IUnknown
*
vumeter
;
WAVEFORMATEX
fmt
;
XAUDIO2_BUFFER
buf
,
buf2
;
XAUDIO2_VOICE_STATE
state
;
XAUDIO2_EFFECT_DESCRIPTOR
effect
;
XAUDIO2_EFFECT_CHAIN
chain
;
memset
(
&
ecb_state
,
0
,
sizeof
(
ecb_state
));
memset
(
&
src1_state
,
0
,
sizeof
(
src1_state
));
...
...
@@ -190,6 +196,7 @@ static void test_simple_streaming(IXAudio2 *xa)
hr
=
IXAudio2_CreateMasteringVoice
(
xa
,
&
master
,
2
,
44100
,
0
,
NULL
,
NULL
,
AudioCategory_GameEffects
);
ok
(
hr
==
S_OK
,
"CreateMasteringVoice failed: %08x
\n
"
,
hr
);
/* create first source voice */
fmt
.
wFormatTag
=
WAVE_FORMAT_IEEE_FLOAT
;
fmt
.
nChannels
=
2
;
fmt
.
nSamplesPerSec
=
44100
;
...
...
@@ -212,7 +219,7 @@ static void test_simple_streaming(IXAudio2 *xa)
hr
=
IXAudio2SourceVoice_Start
(
src
,
0
,
XAUDIO2_COMMIT_NOW
);
ok
(
hr
==
S_OK
,
"Start failed: %08x
\n
"
,
hr
);
/* create second source voice */
XA2CALL
(
CreateSourceVoice
,
&
src2
,
&
fmt
,
0
,
1
.
f
,
&
vcb2
,
NULL
,
NULL
);
ok
(
hr
==
S_OK
,
"CreateSourceVoice failed: %08x
\n
"
,
hr
);
...
...
@@ -230,6 +237,28 @@ static void test_simple_streaming(IXAudio2 *xa)
XA2CALL_0
(
StartEngine
);
ok
(
hr
==
S_OK
,
"StartEngine failed: %08x
\n
"
,
hr
);
/* hook up volume meter */
if
(
xaudio27
){
hr
=
CoCreateInstance
(
&
CLSID_AudioVolumeMeter
,
NULL
,
CLSCTX_INPROC_SERVER
,
&
IID_IUnknown
,
(
void
**
)
&
vumeter
);
ok
(
hr
==
S_OK
,
"CoCreateInstance(AudioVolumeMeter) failed: %08x
\n
"
,
hr
);
}
else
{
hr
=
pCreateAudioVolumeMeter
(
&
vumeter
);
ok
(
hr
==
S_OK
,
"CreateAudioVolumeMeter failed: %08x
\n
"
,
hr
);
}
effect
.
InitialState
=
TRUE
;
effect
.
OutputChannels
=
2
;
effect
.
pEffect
=
vumeter
;
chain
.
EffectCount
=
1
;
chain
.
pEffectDescriptors
=
&
effect
;
hr
=
IXAudio2MasteringVoice_SetEffectChain
(
master
,
&
chain
);
ok
(
hr
==
S_OK
,
"SetEffectchain failed: %08x
\n
"
,
hr
);
IUnknown_Release
(
vumeter
);
while
(
1
){
if
(
xaudio27
)
IXAudio27SourceVoice_GetState
((
IXAudio27SourceVoice
*
)
src
,
&
state
);
...
...
@@ -471,8 +500,10 @@ START_TEST(xaudio2)
CoInitialize
(
NULL
);
xa28dll
=
LoadLibraryA
(
"xaudio2_8.dll"
);
if
(
xa28dll
)
if
(
xa28dll
)
{
pXAudio2Create
=
(
void
*
)
GetProcAddress
(
xa28dll
,
"XAudio2Create"
);
pCreateAudioVolumeMeter
=
(
void
*
)
GetProcAddress
(
xa28dll
,
"CreateAudioVolumeMeter"
);
}
/* XAudio 2.7 (Jun 2010 DirectX) */
hr
=
CoCreateInstance
(
&
CLSID_XAudio2
,
NULL
,
CLSCTX_INPROC_SERVER
,
...
...
dlls/xaudio2_7/xaudio_classes.idl
View file @
395dc0f2
...
...
@@ -26,3 +26,10 @@
uuid
(
5
a508685
-
a254
-
4
fba
-
9b82
-
9
a24b00306af
)
]
coclass
XAudio2
{
interface
IXAudio2
; }
[
helpstring
(
"XAudio2 Volume Meter Class"
),
threading
(
both
),
uuid
(
cac1105f
-
619b
-
4
d04
-
831
a
-
44
e1cbf12d57
)
]
coclass
AudioVolumeMeter
{
interface
IUnknown
; }
dlls/xaudio2_7/xaudio_dll.c
View file @
395dc0f2
...
...
@@ -36,6 +36,8 @@
#include "mmsystem.h"
#include "xaudio2.h"
#include "xaudio2fx.h"
#include "xapo.h"
#include "devpkey.h"
#include "mmdeviceapi.h"
#include "audioclient.h"
...
...
@@ -2231,6 +2233,208 @@ static const IXAudio27Vtbl XAudio27_Vtbl = {
XA27_SetDebugConfiguration
};
typedef
struct
_VUMeterImpl
{
IXAPO
IXAPO_iface
;
IXAPOParameters
IXAPOParameters_iface
;
LONG
ref
;
}
VUMeterImpl
;
static
VUMeterImpl
*
VUMeterImpl_from_IXAPO
(
IXAPO
*
iface
)
{
return
CONTAINING_RECORD
(
iface
,
VUMeterImpl
,
IXAPO_iface
);
}
static
VUMeterImpl
*
VUMeterImpl_from_IXAPOParameters
(
IXAPOParameters
*
iface
)
{
return
CONTAINING_RECORD
(
iface
,
VUMeterImpl
,
IXAPOParameters_iface
);
}
static
HRESULT
WINAPI
VUMXAPO_QueryInterface
(
IXAPO
*
iface
,
REFIID
riid
,
void
**
ppvObject
)
{
VUMeterImpl
*
This
=
VUMeterImpl_from_IXAPO
(
iface
);
TRACE
(
"%p, %s, %p
\n
"
,
This
,
wine_dbgstr_guid
(
riid
),
ppvObject
);
if
(
IsEqualGUID
(
riid
,
&
IID_IUnknown
)
||
IsEqualGUID
(
riid
,
&
IID_IXAPO
)
||
IsEqualGUID
(
riid
,
&
IID_IXAPO27
))
*
ppvObject
=
&
This
->
IXAPO_iface
;
else
if
(
IsEqualGUID
(
riid
,
&
IID_IXAPOParameters
))
*
ppvObject
=
&
This
->
IXAPOParameters_iface
;
else
*
ppvObject
=
NULL
;
if
(
*
ppvObject
){
IUnknown_AddRef
((
IUnknown
*
)
*
ppvObject
);
return
S_OK
;
}
return
E_NOINTERFACE
;
}
static
ULONG
WINAPI
VUMXAPO_AddRef
(
IXAPO
*
iface
)
{
VUMeterImpl
*
This
=
VUMeterImpl_from_IXAPO
(
iface
);
ULONG
ref
=
InterlockedIncrement
(
&
This
->
ref
);
TRACE
(
"(%p)->(): Refcount now %u
\n
"
,
This
,
ref
);
return
ref
;
}
static
ULONG
WINAPI
VUMXAPO_Release
(
IXAPO
*
iface
)
{
VUMeterImpl
*
This
=
VUMeterImpl_from_IXAPO
(
iface
);
ULONG
ref
=
InterlockedDecrement
(
&
This
->
ref
);
TRACE
(
"(%p)->(): Refcount now %u
\n
"
,
This
,
ref
);
if
(
!
ref
)
HeapFree
(
GetProcessHeap
(),
0
,
This
);
return
ref
;
}
static
HRESULT
WINAPI
VUMXAPO_GetRegistrationProperties
(
IXAPO
*
iface
,
XAPO_REGISTRATION_PROPERTIES
**
props
)
{
VUMeterImpl
*
This
=
VUMeterImpl_from_IXAPO
(
iface
);
TRACE
(
"%p, %p
\n
"
,
This
,
props
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
VUMXAPO_IsInputFormatSupported
(
IXAPO
*
iface
,
const
WAVEFORMATEX
*
output_fmt
,
const
WAVEFORMATEX
*
input_fmt
,
WAVEFORMATEX
**
supported_fmt
)
{
VUMeterImpl
*
This
=
VUMeterImpl_from_IXAPO
(
iface
);
TRACE
(
"%p, %p, %p, %p
\n
"
,
This
,
output_fmt
,
input_fmt
,
supported_fmt
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
VUMXAPO_IsOutputFormatSupported
(
IXAPO
*
iface
,
const
WAVEFORMATEX
*
input_fmt
,
const
WAVEFORMATEX
*
output_fmt
,
WAVEFORMATEX
**
supported_fmt
)
{
VUMeterImpl
*
This
=
VUMeterImpl_from_IXAPO
(
iface
);
TRACE
(
"%p, %p, %p, %p
\n
"
,
This
,
input_fmt
,
output_fmt
,
supported_fmt
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
VUMXAPO_Initialize
(
IXAPO
*
iface
,
const
void
*
data
,
UINT32
data_len
)
{
VUMeterImpl
*
This
=
VUMeterImpl_from_IXAPO
(
iface
);
TRACE
(
"%p, %p, %u
\n
"
,
This
,
data
,
data_len
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
VUMXAPO_Reset
(
IXAPO
*
iface
)
{
VUMeterImpl
*
This
=
VUMeterImpl_from_IXAPO
(
iface
);
TRACE
(
"%p
\n
"
,
This
);
return
E_NOTIMPL
;
}
static
HRESULT
WINAPI
VUMXAPO_LockForProcess
(
IXAPO
*
iface
,
UINT32
in_params_count
,
const
XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS
*
in_params
,
UINT32
out_params_count
,
const
XAPO_LOCKFORPROCESS_BUFFER_PARAMETERS
*
out_params
)
{
VUMeterImpl
*
This
=
VUMeterImpl_from_IXAPO
(
iface
);
TRACE
(
"%p, %u, %p, %u, %p
\n
"
,
This
,
in_params_count
,
in_params
,
out_params_count
,
out_params
);
return
E_NOTIMPL
;
}
static
void
WINAPI
VUMXAPO_UnlockForProcess
(
IXAPO
*
iface
)
{
VUMeterImpl
*
This
=
VUMeterImpl_from_IXAPO
(
iface
);
TRACE
(
"%p
\n
"
,
This
);
}
static
void
WINAPI
VUMXAPO_Process
(
IXAPO
*
iface
,
UINT32
in_params_count
,
const
XAPO_PROCESS_BUFFER_PARAMETERS
*
in_params
,
UINT32
out_params_count
,
const
XAPO_PROCESS_BUFFER_PARAMETERS
*
out_params
,
BOOL
enabled
)
{
VUMeterImpl
*
This
=
VUMeterImpl_from_IXAPO
(
iface
);
TRACE
(
"%p, %u, %p, %u, %p, %u
\n
"
,
This
,
in_params_count
,
in_params
,
out_params_count
,
out_params
,
enabled
);
}
static
UINT32
WINAPI
VUMXAPO_CalcInputFrames
(
IXAPO
*
iface
,
UINT32
output_frames
)
{
VUMeterImpl
*
This
=
VUMeterImpl_from_IXAPO
(
iface
);
TRACE
(
"%p, %u
\n
"
,
This
,
output_frames
);
return
0
;
}
static
UINT32
WINAPI
VUMXAPO_CalcOutputFrames
(
IXAPO
*
iface
,
UINT32
input_frames
)
{
VUMeterImpl
*
This
=
VUMeterImpl_from_IXAPO
(
iface
);
TRACE
(
"%p, %u
\n
"
,
This
,
input_frames
);
return
0
;
}
static
const
IXAPOVtbl
VUMXAPO_Vtbl
=
{
VUMXAPO_QueryInterface
,
VUMXAPO_AddRef
,
VUMXAPO_Release
,
VUMXAPO_GetRegistrationProperties
,
VUMXAPO_IsInputFormatSupported
,
VUMXAPO_IsOutputFormatSupported
,
VUMXAPO_Initialize
,
VUMXAPO_Reset
,
VUMXAPO_LockForProcess
,
VUMXAPO_UnlockForProcess
,
VUMXAPO_Process
,
VUMXAPO_CalcInputFrames
,
VUMXAPO_CalcOutputFrames
};
static
HRESULT
WINAPI
VUMXAPOParams_QueryInterface
(
IXAPOParameters
*
iface
,
REFIID
riid
,
void
**
ppvObject
)
{
VUMeterImpl
*
This
=
VUMeterImpl_from_IXAPOParameters
(
iface
);
return
VUMXAPO_QueryInterface
(
&
This
->
IXAPO_iface
,
riid
,
ppvObject
);
}
static
ULONG
WINAPI
VUMXAPOParams_AddRef
(
IXAPOParameters
*
iface
)
{
VUMeterImpl
*
This
=
VUMeterImpl_from_IXAPOParameters
(
iface
);
return
VUMXAPO_AddRef
(
&
This
->
IXAPO_iface
);
}
static
ULONG
WINAPI
VUMXAPOParams_Release
(
IXAPOParameters
*
iface
)
{
VUMeterImpl
*
This
=
VUMeterImpl_from_IXAPOParameters
(
iface
);
return
VUMXAPO_Release
(
&
This
->
IXAPO_iface
);
}
static
void
WINAPI
VUMXAPOParams_SetParameters
(
IXAPOParameters
*
iface
,
const
void
*
params
,
UINT32
params_len
)
{
VUMeterImpl
*
This
=
VUMeterImpl_from_IXAPOParameters
(
iface
);
TRACE
(
"%p, %p, %u
\n
"
,
This
,
params
,
params_len
);
}
static
void
WINAPI
VUMXAPOParams_GetParameters
(
IXAPOParameters
*
iface
,
void
*
params
,
UINT32
params_len
)
{
VUMeterImpl
*
This
=
VUMeterImpl_from_IXAPOParameters
(
iface
);
TRACE
(
"%p, %p, %u
\n
"
,
This
,
params
,
params_len
);
}
static
const
IXAPOParametersVtbl
VUMXAPOParameters_Vtbl
=
{
VUMXAPOParams_QueryInterface
,
VUMXAPOParams_AddRef
,
VUMXAPOParams_Release
,
VUMXAPOParams_SetParameters
,
VUMXAPOParams_GetParameters
};
static
HRESULT
WINAPI
XAudio2CF_QueryInterface
(
IClassFactory
*
iface
,
REFIID
riid
,
void
**
ppobj
)
{
if
(
IsEqualGUID
(
riid
,
&
IID_IUnknown
)
...
...
@@ -2382,6 +2586,35 @@ static HRESULT WINAPI XAudio2CF_CreateInstance(IClassFactory *iface, IUnknown *p
return
hr
;
}
static
HRESULT
WINAPI
VUMeterCF_CreateInstance
(
IClassFactory
*
iface
,
IUnknown
*
pOuter
,
REFIID
riid
,
void
**
ppobj
)
{
HRESULT
hr
;
VUMeterImpl
*
object
;
TRACE
(
"(static)->(%p,%s,%p)
\n
"
,
pOuter
,
debugstr_guid
(
riid
),
ppobj
);
*
ppobj
=
NULL
;
if
(
pOuter
)
return
CLASS_E_NOAGGREGATION
;
object
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
*
object
));
if
(
!
object
)
return
E_OUTOFMEMORY
;
object
->
IXAPO_iface
.
lpVtbl
=
&
VUMXAPO_Vtbl
;
object
->
IXAPOParameters_iface
.
lpVtbl
=
&
VUMXAPOParameters_Vtbl
;
hr
=
IXAPO_QueryInterface
(
&
object
->
IXAPO_iface
,
riid
,
ppobj
);
if
(
FAILED
(
hr
)){
HeapFree
(
GetProcessHeap
(),
0
,
object
);
return
hr
;
}
return
S_OK
;
}
static
HRESULT
WINAPI
XAudio2CF_LockServer
(
IClassFactory
*
iface
,
BOOL
dolock
)
{
FIXME
(
"(static)->(%d): stub!
\n
"
,
dolock
);
...
...
@@ -2397,7 +2630,17 @@ static const IClassFactoryVtbl XAudio2CF_Vtbl =
XAudio2CF_LockServer
};
static
const
IClassFactoryVtbl
VUMeterCF_Vtbl
=
{
XAudio2CF_QueryInterface
,
XAudio2CF_AddRef
,
XAudio2CF_Release
,
VUMeterCF_CreateInstance
,
XAudio2CF_LockServer
};
static
IClassFactory
xaudio2_cf
=
{
&
XAudio2CF_Vtbl
};
static
IClassFactory
vumeter_cf
=
{
&
VUMeterCF_Vtbl
};
HRESULT
WINAPI
DllGetClassObject
(
REFCLSID
rclsid
,
REFIID
riid
,
void
**
ppv
)
{
...
...
@@ -2407,6 +2650,8 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
if
(
IsEqualGUID
(
rclsid
,
&
CLSID_XAudio2
))
{
factory
=
&
xaudio2_cf
;
}
else
if
(
IsEqualGUID
(
rclsid
,
&
CLSID_AudioVolumeMeter
))
{
factory
=
&
vumeter_cf
;
}
if
(
!
factory
)
return
CLASS_E_CLASSNOTAVAILABLE
;
...
...
dlls/xaudio2_8/xaudio2_8.spec
View file @
395dc0f2
@ stdcall XAudio2Create(ptr long long)
@ stdcall CreateAudioVolumeMeter(ptr)
dlls/xaudio2_8/xaudio_dll.c
View file @
395dc0f2
...
...
@@ -26,6 +26,8 @@
#include "initguid.h"
#include "xaudio2.h"
#include "xaudio2fx.h"
#include "xapo.h"
BOOL
WINAPI
DllMain
(
HINSTANCE
hinstDLL
,
DWORD
fdwReason
,
LPVOID
lpvReserved
)
{
...
...
@@ -71,3 +73,9 @@ HRESULT WINAPI XAudio2Create(IXAudio2 **ppxa2, UINT32 flags, XAUDIO2_PROCESSOR p
return
S_OK
;
}
HRESULT
WINAPI
CreateAudioVolumeMeter
(
IUnknown
**
out
)
{
return
CoCreateInstance
(
&
CLSID_AudioVolumeMeter
,
NULL
,
CLSCTX_INPROC_SERVER
,
&
IID_IUnknown
,
(
void
**
)
out
);
}
include/Makefile.in
View file @
395dc0f2
...
...
@@ -147,6 +147,7 @@ PUBLIC_IDL_H_SRCS = \
wuapi.idl
\
xapo.idl
\
xaudio2.idl
\
xaudio2fx.idl
\
xmllite.idl
IDL_TLB_SRCS
=
\
...
...
include/xaudio2fx.idl
0 → 100644
View file @
395dc0f2
/*
*
Copyright
(
c
)
2015
Andrew
Eikum
*
*
This
library
is
free
software
; you can redistribute it and/or
*
modify
it
under
the
terms
of
the
GNU
Lesser
General
Public
*
License
as
published
by
the
Free
Software
Foundation
; either
*
version
2.1
of
the
License
,
or
(
at
your
option
)
any
later
version
.
*
*
This
library
is
distributed
in
the
hope
that
it
will
be
useful
,
*
but
WITHOUT
ANY
WARRANTY
; without even the implied warranty of
*
MERCHANTABILITY
or
FITNESS
FOR
A
PARTICULAR
PURPOSE
.
See
the
GNU
*
Lesser
General
Public
License
for
more
details
.
*
*
You
should
have
received
a
copy
of
the
GNU
Lesser
General
Public
*
License
along
with
this
library
; if not, write to the Free Software
*
Foundation
,
Inc
.
,
51
Franklin
St
,
Fifth
Floor
,
Boston
,
MA
02110
-
1301
,
USA
*/
import
"unknwn.idl"
;
[
uuid
(
cac1105f
-
619b
-
4
d04
-
831
a
-
44
e1cbf12d57
)
]
coclass
AudioVolumeMeter
{
interface
IUnknown
;
}
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