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
552433cf
Commit
552433cf
authored
Apr 02, 2012
by
Andrew Eikum
Committed by
Alexandre Julliard
Apr 02, 2012
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dsound: Validate and correct wValidBitsPerSample in primary buffer SetFormat.
parent
f9c875dd
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
67 additions
and
1 deletion
+67
-1
primary.c
dlls/dsound/primary.c
+27
-1
dsound.c
dlls/dsound/tests/dsound.c
+40
-0
No files found.
dlls/dsound/primary.c
View file @
552433cf
...
...
@@ -353,7 +353,7 @@ HRESULT primarybuffer_SetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX passe
HRESULT
err
=
DSERR_BUFFERLOST
;
int
i
;
WAVEFORMATEX
*
old_fmt
;
WAVEFORMATEXTENSIBLE
*
fmtex
;
WAVEFORMATEXTENSIBLE
*
fmtex
,
*
passed_fmtex
=
(
WAVEFORMATEXTENSIBLE
*
)
passed_fmt
;
BOOL
forced
=
(
device
->
priolevel
==
DSSCL_WRITEPRIMARY
);
TRACE
(
"(%p,%p)
\n
"
,
device
,
passed_fmt
);
...
...
@@ -380,6 +380,11 @@ HRESULT primarybuffer_SetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX passe
passed_fmt
->
nBlockAlign
!=
passed_fmt
->
nChannels
*
passed_fmt
->
wBitsPerSample
/
8
)
return
DSERR_INVALIDPARAM
;
if
(
passed_fmt
->
wFormatTag
==
WAVE_FORMAT_EXTENSIBLE
){
if
(
passed_fmtex
->
Samples
.
wValidBitsPerSample
>
passed_fmtex
->
Format
.
wBitsPerSample
)
return
DSERR_INVALIDPARAM
;
}
/* **** */
RtlAcquireResourceExclusive
(
&
(
device
->
buffer_list_lock
),
TRUE
);
EnterCriticalSection
(
&
(
device
->
mixlock
));
...
...
@@ -394,6 +399,13 @@ HRESULT primarybuffer_SetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX passe
goto
done
;
}
if
(
device
->
pwfx
->
wFormatTag
==
WAVE_FORMAT_EXTENSIBLE
){
if
(
fmtex
->
Samples
.
wValidBitsPerSample
==
0
){
TRACE
(
"Correcting 0 valid bits per sample
\n
"
);
fmtex
->
Samples
.
wValidBitsPerSample
=
fmtex
->
Format
.
wBitsPerSample
;
}
}
DSOUND_PrimaryClose
(
device
);
err
=
DSOUND_ReopenDevice
(
device
,
FALSE
);
...
...
@@ -427,6 +439,8 @@ HRESULT primarybuffer_SetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX passe
device
->
pwfx
->
wBitsPerSample
=
32
;
device
->
pwfx
->
nAvgBytesPerSec
=
passed_fmt
->
nSamplesPerSec
*
device
->
pwfx
->
nBlockAlign
;
device
->
pwfx
->
nBlockAlign
=
passed_fmt
->
nChannels
*
(
device
->
pwfx
->
wBitsPerSample
/
8
);
if
(
device
->
pwfx
->
wFormatTag
==
WAVE_FORMAT_EXTENSIBLE
)
fmtex
->
Samples
.
wValidBitsPerSample
=
device
->
pwfx
->
wBitsPerSample
;
err
=
DSOUND_ReopenDevice
(
device
,
FALSE
);
if
(
SUCCEEDED
(
err
))
goto
opened
;
...
...
@@ -434,6 +448,8 @@ HRESULT primarybuffer_SetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX passe
device
->
pwfx
->
wBitsPerSample
=
16
;
device
->
pwfx
->
nAvgBytesPerSec
=
passed_fmt
->
nSamplesPerSec
*
device
->
pwfx
->
nBlockAlign
;
device
->
pwfx
->
nBlockAlign
=
passed_fmt
->
nChannels
*
(
device
->
pwfx
->
wBitsPerSample
/
8
);
if
(
device
->
pwfx
->
wFormatTag
==
WAVE_FORMAT_EXTENSIBLE
)
fmtex
->
Samples
.
wValidBitsPerSample
=
device
->
pwfx
->
wBitsPerSample
;
err
=
DSOUND_ReopenDevice
(
device
,
FALSE
);
if
(
SUCCEEDED
(
err
))
goto
opened
;
...
...
@@ -441,6 +457,8 @@ HRESULT primarybuffer_SetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX passe
device
->
pwfx
->
wBitsPerSample
=
8
;
device
->
pwfx
->
nAvgBytesPerSec
=
passed_fmt
->
nSamplesPerSec
*
device
->
pwfx
->
nBlockAlign
;
device
->
pwfx
->
nBlockAlign
=
passed_fmt
->
nChannels
*
(
device
->
pwfx
->
wBitsPerSample
/
8
);
if
(
device
->
pwfx
->
wFormatTag
==
WAVE_FORMAT_EXTENSIBLE
)
fmtex
->
Samples
.
wValidBitsPerSample
=
device
->
pwfx
->
wBitsPerSample
;
err
=
DSOUND_ReopenDevice
(
device
,
FALSE
);
if
(
SUCCEEDED
(
err
))
goto
opened
;
...
...
@@ -449,6 +467,8 @@ HRESULT primarybuffer_SetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX passe
device
->
pwfx
->
wBitsPerSample
=
passed_fmt
->
wBitsPerSample
;
device
->
pwfx
->
nAvgBytesPerSec
=
passed_fmt
->
nSamplesPerSec
*
device
->
pwfx
->
nBlockAlign
;
device
->
pwfx
->
nBlockAlign
=
passed_fmt
->
nChannels
*
(
device
->
pwfx
->
wBitsPerSample
/
8
);
if
(
device
->
pwfx
->
wFormatTag
==
WAVE_FORMAT_EXTENSIBLE
)
fmtex
->
Samples
.
wValidBitsPerSample
=
device
->
pwfx
->
wBitsPerSample
;
err
=
DSOUND_ReopenDevice
(
device
,
FALSE
);
if
(
SUCCEEDED
(
err
))
goto
opened
;
...
...
@@ -456,6 +476,8 @@ HRESULT primarybuffer_SetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX passe
device
->
pwfx
->
wBitsPerSample
=
32
;
device
->
pwfx
->
nAvgBytesPerSec
=
passed_fmt
->
nSamplesPerSec
*
device
->
pwfx
->
nBlockAlign
;
device
->
pwfx
->
nBlockAlign
=
passed_fmt
->
nChannels
*
(
device
->
pwfx
->
wBitsPerSample
/
8
);
if
(
device
->
pwfx
->
wFormatTag
==
WAVE_FORMAT_EXTENSIBLE
)
fmtex
->
Samples
.
wValidBitsPerSample
=
device
->
pwfx
->
wBitsPerSample
;
err
=
DSOUND_ReopenDevice
(
device
,
FALSE
);
if
(
SUCCEEDED
(
err
))
goto
opened
;
...
...
@@ -463,6 +485,8 @@ HRESULT primarybuffer_SetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX passe
device
->
pwfx
->
wBitsPerSample
=
16
;
device
->
pwfx
->
nAvgBytesPerSec
=
passed_fmt
->
nSamplesPerSec
*
device
->
pwfx
->
nBlockAlign
;
device
->
pwfx
->
nBlockAlign
=
passed_fmt
->
nChannels
*
(
device
->
pwfx
->
wBitsPerSample
/
8
);
if
(
device
->
pwfx
->
wFormatTag
==
WAVE_FORMAT_EXTENSIBLE
)
fmtex
->
Samples
.
wValidBitsPerSample
=
device
->
pwfx
->
wBitsPerSample
;
err
=
DSOUND_ReopenDevice
(
device
,
FALSE
);
if
(
SUCCEEDED
(
err
))
goto
opened
;
...
...
@@ -470,6 +494,8 @@ HRESULT primarybuffer_SetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX passe
device
->
pwfx
->
wBitsPerSample
=
8
;
device
->
pwfx
->
nAvgBytesPerSec
=
passed_fmt
->
nSamplesPerSec
*
device
->
pwfx
->
nBlockAlign
;
device
->
pwfx
->
nBlockAlign
=
passed_fmt
->
nChannels
*
(
device
->
pwfx
->
wBitsPerSample
/
8
);
if
(
device
->
pwfx
->
wFormatTag
==
WAVE_FORMAT_EXTENSIBLE
)
fmtex
->
Samples
.
wValidBitsPerSample
=
device
->
pwfx
->
wBitsPerSample
;
err
=
DSOUND_ReopenDevice
(
device
,
FALSE
);
if
(
SUCCEEDED
(
err
))
goto
opened
;
...
...
dlls/dsound/tests/dsound.c
View file @
552433cf
...
...
@@ -1253,6 +1253,7 @@ static HRESULT test_invalid_fmts(LPGUID lpGuid)
if
(
rc
==
DS_OK
&&
primary
!=
NULL
)
{
WAVEFORMATEX
wfx
;
WAVEFORMATEXTENSIBLE
fmtex
;
wfx
.
wFormatTag
=
WAVE_FORMAT_PCM
;
wfx
.
nChannels
=
0
;
...
...
@@ -1351,6 +1352,45 @@ static HRESULT test_invalid_fmts(LPGUID lpGuid)
rc
=
IDirectSoundBuffer_SetFormat
(
primary
,
&
wfx
);
ok
(
rc
==
S_OK
,
"SetFormat: %08x
\n
"
,
rc
);
fmtex
.
Format
.
cbSize
=
sizeof
(
WAVEFORMATEXTENSIBLE
)
-
sizeof
(
WAVEFORMATEX
);
fmtex
.
Format
.
wFormatTag
=
WAVE_FORMAT_EXTENSIBLE
;
fmtex
.
Format
.
nChannels
=
2
;
fmtex
.
Format
.
nSamplesPerSec
=
44100
;
fmtex
.
Format
.
wBitsPerSample
=
16
;
fmtex
.
Format
.
nBlockAlign
=
fmtex
.
Format
.
nChannels
*
fmtex
.
Format
.
wBitsPerSample
/
8
;
fmtex
.
Format
.
nAvgBytesPerSec
=
fmtex
.
Format
.
nSamplesPerSec
*
fmtex
.
Format
.
nBlockAlign
;
fmtex
.
Samples
.
wValidBitsPerSample
=
0
;
fmtex
.
dwChannelMask
=
SPEAKER_FRONT_LEFT
|
SPEAKER_FRONT_RIGHT
;
fmtex
.
SubFormat
=
KSDATAFORMAT_SUBTYPE_PCM
;
rc
=
IDirectSoundBuffer_SetFormat
(
primary
,
(
WAVEFORMATEX
*
)
&
fmtex
);
ok
(
rc
==
S_OK
,
"SetFormat: %08x
\n
"
,
rc
);
fmtex
.
Format
.
cbSize
=
sizeof
(
WAVEFORMATEXTENSIBLE
)
-
sizeof
(
WAVEFORMATEX
);
fmtex
.
Format
.
wFormatTag
=
WAVE_FORMAT_EXTENSIBLE
;
fmtex
.
Format
.
nChannels
=
2
;
fmtex
.
Format
.
nSamplesPerSec
=
44100
;
fmtex
.
Format
.
wBitsPerSample
=
24
;
fmtex
.
Format
.
nBlockAlign
=
fmtex
.
Format
.
nChannels
*
fmtex
.
Format
.
wBitsPerSample
/
8
;
fmtex
.
Format
.
nAvgBytesPerSec
=
fmtex
.
Format
.
nSamplesPerSec
*
fmtex
.
Format
.
nBlockAlign
;
fmtex
.
Samples
.
wValidBitsPerSample
=
20
;
fmtex
.
dwChannelMask
=
SPEAKER_FRONT_LEFT
|
SPEAKER_FRONT_RIGHT
;
fmtex
.
SubFormat
=
KSDATAFORMAT_SUBTYPE_PCM
;
rc
=
IDirectSoundBuffer_SetFormat
(
primary
,
(
WAVEFORMATEX
*
)
&
fmtex
);
ok
(
rc
==
S_OK
,
"SetFormat: %08x
\n
"
,
rc
);
fmtex
.
Format
.
cbSize
=
sizeof
(
WAVEFORMATEXTENSIBLE
)
-
sizeof
(
WAVEFORMATEX
);
fmtex
.
Format
.
wFormatTag
=
WAVE_FORMAT_EXTENSIBLE
;
fmtex
.
Format
.
nChannels
=
2
;
fmtex
.
Format
.
nSamplesPerSec
=
44100
;
fmtex
.
Format
.
wBitsPerSample
=
24
;
fmtex
.
Format
.
nBlockAlign
=
fmtex
.
Format
.
nChannels
*
fmtex
.
Format
.
wBitsPerSample
/
8
;
fmtex
.
Format
.
nAvgBytesPerSec
=
fmtex
.
Format
.
nSamplesPerSec
*
fmtex
.
Format
.
nBlockAlign
;
fmtex
.
Samples
.
wValidBitsPerSample
=
32
;
fmtex
.
dwChannelMask
=
SPEAKER_FRONT_LEFT
|
SPEAKER_FRONT_RIGHT
;
fmtex
.
SubFormat
=
KSDATAFORMAT_SUBTYPE_PCM
;
rc
=
IDirectSoundBuffer_SetFormat
(
primary
,
(
WAVEFORMATEX
*
)
&
fmtex
);
ok
(
rc
==
E_INVALIDARG
,
"SetFormat: %08x
\n
"
,
rc
);
IDirectSoundBuffer_Release
(
primary
);
}
...
...
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