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
8f76035d
Commit
8f76035d
authored
Feb 21, 2010
by
Maarten Lankhorst
Committed by
Alexandre Julliard
Feb 22, 2010
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mmdevapi: Add tests for renderclient.
parent
87b712be
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
250 additions
and
1 deletion
+250
-1
Makefile.in
dlls/mmdevapi/tests/Makefile.in
+2
-1
mmdevenum.c
dlls/mmdevapi/tests/mmdevenum.c
+1
-0
render.c
dlls/mmdevapi/tests/render.c
+247
-0
No files found.
dlls/mmdevapi/tests/Makefile.in
View file @
8f76035d
...
...
@@ -8,7 +8,8 @@ IMPORTS = ole32 version user32 kernel32
C_SRCS
=
\
dependency.c
\
mmdevenum.c
\
propstore.c
propstore.c
\
render.c
@MAKE_TEST_RULES@
...
...
dlls/mmdevapi/tests/mmdevenum.c
View file @
8f76035d
...
...
@@ -23,6 +23,7 @@
#include "initguid.h"
#include "mmdeviceapi.h"
#include "audioclient.h"
#include "dshow.h"
#include "dsound.h"
...
...
dlls/mmdevapi/tests/render.c
0 → 100644
View file @
8f76035d
/*
* Copyright 2010 Maarten Lankhorst for Codeweavers
*
* 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
*/
/* This test is for audio playback specific mechanisms
* Tests:
* - IAudioClient with eRender and IAudioRenderClient
*/
#include "wine/test.h"
#define CINTERFACE
#define COBJMACROS
#ifdef STANDALONE
#include "initguid.h"
#endif
#include "unknwn.h"
#include "uuids.h"
#include "mmdeviceapi.h"
#include "audioclient.h"
static
void
test_uninitialized
(
IAudioClient
*
ac
)
{
HRESULT
hr
;
UINT32
num
;
REFERENCE_TIME
t1
;
HANDLE
handle
=
CreateEventW
(
NULL
,
FALSE
,
FALSE
,
NULL
);
IUnknown
*
unk
;
hr
=
IAudioClient_GetBufferSize
(
ac
,
&
num
);
ok
(
hr
==
AUDCLNT_E_NOT_INITIALIZED
,
"Uninitialized GetBufferSize call returns %08x
\n
"
,
hr
);
hr
=
IAudioClient_GetStreamLatency
(
ac
,
&
t1
);
ok
(
hr
==
AUDCLNT_E_NOT_INITIALIZED
,
"Uninitialized GetStreamLatency call returns %08x
\n
"
,
hr
);
hr
=
IAudioClient_GetCurrentPadding
(
ac
,
&
num
);
ok
(
hr
==
AUDCLNT_E_NOT_INITIALIZED
,
"Uninitialized GetCurrentPadding call returns %08x
\n
"
,
hr
);
hr
=
IAudioClient_Start
(
ac
);
ok
(
hr
==
AUDCLNT_E_NOT_INITIALIZED
,
"Uninitialized Start call returns %08x
\n
"
,
hr
);
hr
=
IAudioClient_Stop
(
ac
);
ok
(
hr
==
AUDCLNT_E_NOT_INITIALIZED
,
"Uninitialized Stop call returns %08x
\n
"
,
hr
);
hr
=
IAudioClient_Reset
(
ac
);
ok
(
hr
==
AUDCLNT_E_NOT_INITIALIZED
,
"Uninitialized Reset call returns %08x
\n
"
,
hr
);
hr
=
IAudioClient_SetEventHandle
(
ac
,
handle
);
ok
(
hr
==
AUDCLNT_E_NOT_INITIALIZED
,
"Uninitialized SetEventHandle call returns %08x
\n
"
,
hr
);
hr
=
IAudioClient_GetService
(
ac
,
&
IID_IAudioStreamVolume
,
(
void
**
)
&
unk
);
ok
(
hr
==
AUDCLNT_E_NOT_INITIALIZED
,
"Uninitialized GetService call returns %08x
\n
"
,
hr
);
CloseHandle
(
handle
);
}
static
void
test_audioclient
(
IAudioClient
*
ac
)
{
IUnknown
*
unk
;
HRESULT
hr
;
ULONG
ref
;
WAVEFORMATEX
*
pwfx
,
*
pwfx2
;
REFERENCE_TIME
t1
,
t2
;
HANDLE
handle
=
CreateEventW
(
NULL
,
FALSE
,
FALSE
,
NULL
);
hr
=
IAudioClient_QueryInterface
(
ac
,
&
IID_IUnknown
,
NULL
);
ok
(
hr
==
E_POINTER
,
"QueryInterface(NULL) returned %08x
\n
"
,
hr
);
unk
=
(
void
*
)(
LONG_PTR
)
0x12345678
;
hr
=
IAudioClient_QueryInterface
(
ac
,
&
IID_NULL
,
(
void
**
)
&
unk
);
ok
(
hr
==
E_NOINTERFACE
,
"QueryInterface(IID_NULL) returned %08x
\n
"
,
hr
);
ok
(
!
unk
,
"QueryInterface(IID_NULL) returned non-null pointer %p
\n
"
,
unk
);
hr
=
IAudioClient_QueryInterface
(
ac
,
&
IID_IUnknown
,
(
void
**
)
&
unk
);
ok
(
hr
==
S_OK
,
"QueryInterface(IID_IUnknown) returned %08x
\n
"
,
hr
);
if
(
unk
)
{
ref
=
IUnknown_Release
(
unk
);
ok
(
ref
==
1
,
"Released count is %u
\n
"
,
ref
);
}
hr
=
IAudioClient_QueryInterface
(
ac
,
&
IID_IAudioClient
,
(
void
**
)
&
unk
);
ok
(
hr
==
S_OK
,
"QueryInterface(IID_IAudioClient) returned %08x
\n
"
,
hr
);
if
(
unk
)
{
ref
=
IUnknown_Release
(
unk
);
ok
(
ref
==
1
,
"Released count is %u
\n
"
,
ref
);
}
hr
=
IAudioClient_GetDevicePeriod
(
ac
,
NULL
,
NULL
);
ok
(
hr
==
E_POINTER
,
"Invalid GetDevicePeriod call returns %08x
\n
"
,
hr
);
hr
=
IAudioClient_GetDevicePeriod
(
ac
,
&
t1
,
NULL
);
ok
(
hr
==
S_OK
,
"Valid GetDevicePeriod call returns %08x
\n
"
,
hr
);
hr
=
IAudioClient_GetDevicePeriod
(
ac
,
NULL
,
&
t2
);
ok
(
hr
==
S_OK
,
"Valid GetDevicePeriod call returns %08x
\n
"
,
hr
);
hr
=
IAudioClient_GetDevicePeriod
(
ac
,
&
t1
,
&
t2
);
ok
(
hr
==
S_OK
,
"Valid GetDevicePeriod call returns %08x
\n
"
,
hr
);
trace
(
"Returned periods: %u.%05u ms %u.%05u ms
\n
"
,
(
UINT
)(
t1
/
10000
),
(
UINT
)(
t1
%
10000
),
(
UINT
)(
t2
/
10000
),
(
UINT
)(
t2
%
10000
));
hr
=
IAudioClient_GetMixFormat
(
ac
,
NULL
);
ok
(
hr
==
E_POINTER
,
"GetMixFormat returns %08x
\n
"
,
hr
);
hr
=
IAudioClient_GetMixFormat
(
ac
,
&
pwfx
);
ok
(
hr
==
S_OK
,
"Valid GetMixFormat returns %08x
\n
"
,
hr
);
trace
(
"Tag: %04x
\n
"
,
pwfx
->
wFormatTag
);
trace
(
"bits: %u
\n
"
,
pwfx
->
wBitsPerSample
);
trace
(
"chan: %u
\n
"
,
pwfx
->
nChannels
);
trace
(
"rate: %u
\n
"
,
pwfx
->
nSamplesPerSec
);
trace
(
"align: %u
\n
"
,
pwfx
->
nBlockAlign
);
trace
(
"extra: %u
\n
"
,
pwfx
->
cbSize
);
ok
(
pwfx
->
wFormatTag
==
WAVE_FORMAT_EXTENSIBLE
,
"wFormatTag is %x
\n
"
,
pwfx
->
wFormatTag
);
if
(
pwfx
->
wFormatTag
==
WAVE_FORMAT_EXTENSIBLE
)
{
WAVEFORMATEXTENSIBLE
*
pwfxe
=
(
void
*
)
pwfx
;
trace
(
"Res: %u
\n
"
,
pwfxe
->
Samples
.
wReserved
);
trace
(
"Mask: %x
\n
"
,
pwfxe
->
dwChannelMask
);
trace
(
"Alg: %s
\n
"
,
IsEqualGUID
(
&
pwfxe
->
SubFormat
,
&
KSDATAFORMAT_SUBTYPE_PCM
)
?
"PCM"
:
(
IsEqualGUID
(
&
pwfxe
->
SubFormat
,
&
KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
)
?
"FLOAT"
:
"Other"
));
}
if
(
hr
==
S_OK
)
{
hr
=
IAudioClient_IsFormatSupported
(
ac
,
AUDCLNT_SHAREMODE_SHARED
,
pwfx
,
&
pwfx2
);
ok
(
hr
==
S_OK
,
"Valid IsFormatSupported(Shared) call returns %08x
\n
"
,
hr
);
ok
(
pwfx2
==
NULL
,
"pwfx2 is non-null
\n
"
);
CoTaskMemFree
(
pwfx2
);
hr
=
IAudioClient_IsFormatSupported
(
ac
,
AUDCLNT_SHAREMODE_SHARED
,
NULL
,
NULL
);
ok
(
hr
==
E_POINTER
,
"IsFormatSupported(NULL) call returns %08x
\n
"
,
hr
);
hr
=
IAudioClient_IsFormatSupported
(
ac
,
AUDCLNT_SHAREMODE_SHARED
,
pwfx
,
NULL
);
ok
(
hr
==
E_POINTER
,
"IsFormatSupported(Shared,NULL) call returns %08x
\n
"
,
hr
);
hr
=
IAudioClient_IsFormatSupported
(
ac
,
AUDCLNT_SHAREMODE_EXCLUSIVE
,
pwfx
,
NULL
);
ok
(
hr
==
S_OK
||
hr
==
AUDCLNT_E_UNSUPPORTED_FORMAT
,
"IsFormatSupported(Exclusive) call returns %08x
\n
"
,
hr
);
hr
=
IAudioClient_IsFormatSupported
(
ac
,
AUDCLNT_SHAREMODE_EXCLUSIVE
,
pwfx
,
&
pwfx2
);
ok
(
hr
==
S_OK
||
hr
==
AUDCLNT_E_UNSUPPORTED_FORMAT
,
"IsFormatSupported(Exclusive) call returns %08x
\n
"
,
hr
);
ok
(
pwfx2
==
NULL
,
"pwfx2 non-null on exclusive IsFormatSupported
\n
"
);
hr
=
IAudioClient_IsFormatSupported
(
ac
,
0xffffffff
,
pwfx
,
NULL
);
ok
(
hr
==
E_INVALIDARG
,
"IsFormatSupported(0xffffffff) call returns %08x
\n
"
,
hr
);
}
test_uninitialized
(
ac
);
hr
=
IAudioClient_Initialize
(
ac
,
3
,
0
,
5000000
,
0
,
pwfx
,
NULL
);
ok
(
hr
==
AUDCLNT_E_NOT_INITIALIZED
,
"Initialize with invalid sharemode returns %08x
\n
"
,
hr
);
hr
=
IAudioClient_Initialize
(
ac
,
AUDCLNT_SHAREMODE_SHARED
,
0xffffffff
,
5000000
,
0
,
pwfx
,
NULL
);
ok
(
hr
==
E_INVALIDARG
,
"Initialize with invalid flags returns %08x
\n
"
,
hr
);
/* It seems that if length > 2s or periodicity != 0 the length is ignored and call succeeds
* Since we can only initialize succesfully once skip those tests
*/
hr
=
IAudioClient_Initialize
(
ac
,
AUDCLNT_SHAREMODE_SHARED
,
0
,
5000000
,
0
,
NULL
,
NULL
);
ok
(
hr
==
E_POINTER
,
"Initialize with null format returns %08x
\n
"
,
hr
);
hr
=
IAudioClient_Initialize
(
ac
,
AUDCLNT_SHAREMODE_SHARED
,
0
,
5000000
,
0
,
pwfx
,
NULL
);
ok
(
hr
==
S_OK
,
"Valid Initialize returns %08x
\n
"
,
hr
);
if
(
hr
!=
S_OK
)
{
skip
(
"Cannot initialize %08x, remainder of tests is useless
\n
"
,
hr
);
CoTaskMemFree
(
pwfx
);
return
;
}
hr
=
IAudioClient_Initialize
(
ac
,
AUDCLNT_SHAREMODE_SHARED
,
0
,
5000000
,
0
,
pwfx
,
NULL
);
ok
(
hr
==
AUDCLNT_E_ALREADY_INITIALIZED
,
"Calling Initialize twice returns %08x
\n
"
,
hr
);
hr
=
IAudioClient_SetEventHandle
(
ac
,
NULL
);
ok
(
hr
==
E_INVALIDARG
,
"SetEventHandle(NULL) returns %08x
\n
"
,
hr
);
hr
=
IAudioClient_SetEventHandle
(
ac
,
handle
);
ok
(
hr
==
AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED
,
"SetEventHandle returns %08x
\n
"
,
hr
);
CloseHandle
(
handle
);
CoTaskMemFree
(
pwfx
);
}
START_TEST
(
render
)
{
HRESULT
hr
;
IMMDeviceEnumerator
*
mme
=
NULL
;
IMMDevice
*
dev
=
NULL
;
IAudioClient
*
ac
=
NULL
;
CoInitializeEx
(
NULL
,
COINIT_MULTITHREADED
);
hr
=
CoCreateInstance
(
&
CLSID_MMDeviceEnumerator
,
NULL
,
CLSCTX_INPROC_SERVER
,
&
IID_IMMDeviceEnumerator
,
(
void
**
)
&
mme
);
if
(
FAILED
(
hr
))
{
skip
(
"mmdevapi not available: 0x%08x
\n
"
,
hr
);
goto
cleanup
;
}
hr
=
IMMDeviceEnumerator_GetDefaultAudioEndpoint
(
mme
,
eRender
,
eMultimedia
,
&
dev
);
ok
(
hr
==
S_OK
||
hr
==
E_NOTFOUND
,
"GetDefaultAudioEndpoint failed: 0x%08x
\n
"
,
hr
);
if
(
hr
!=
S_OK
||
!
dev
)
{
if
(
hr
==
E_NOTFOUND
)
skip
(
"No sound card available
\n
"
);
else
skip
(
"GetDefaultAudioEndpoint returns 0x%08x
\n
"
,
hr
);
goto
cleanup
;
}
hr
=
IMMDevice_Activate
(
dev
,
&
IID_IAudioClient
,
CLSCTX_INPROC_SERVER
,
NULL
,
(
void
**
)
&
ac
);
ok
(
hr
==
S_OK
,
"Activation failed with %08x
\n
"
,
hr
);
if
(
ac
)
{
test_audioclient
(
ac
);
IAudioClient_Release
(
ac
);
}
IMMDevice_Release
(
dev
);
cleanup
:
if
(
mme
)
IMMDeviceEnumerator_Release
(
mme
);
CoUninitialize
();
}
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