ao/wasapi: check full GUID of KSDATAFORMAT to determine float

This commit is contained in:
Kevin Mitchell 2014-11-28 06:02:26 -08:00
parent 239c880fe2
commit 4f208e6f68
2 changed files with 9 additions and 8 deletions

View File

@ -182,7 +182,7 @@ static void set_format(WAVEFORMATEXTENSIBLE *wformat, WORD bytepersample,
wformat->dwChannelMask = chanmask;
}
static int format_set_bits(int old_format, int bits, int fp)
static int format_set_bits(int old_format, int bits, bool fp)
{
if (fp) {
switch (bits) {
@ -199,15 +199,15 @@ static int set_ao_format(struct ao *ao,
WAVEFORMATEXTENSIBLE wformat)
{
struct wasapi_state *state = (struct wasapi_state *)ao->priv;
if (wformat.SubFormat.Data1 != 1 && wformat.SubFormat.Data1 != 3) {
MP_ERR(ao, "Unknown SubFormat %"PRIu32"\n",
(uint32_t)wformat.SubFormat.Data1);
bool is_float =
!mp_GUID_compare(&mp_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, &wformat.SubFormat);
if ( !is_float &&
mp_GUID_compare(&mp_KSDATAFORMAT_SUBTYPE_PCM, &wformat.SubFormat) ) {
MP_ERR(ao, "Unknown SubFormat %s\n", mp_GUID_to_str(&wformat.SubFormat));
return 0;
}
// .Data1 == 1 is PCM, .Data1 == 3 is IEEE_FLOAT
int format = format_set_bits(ao->format,
wformat.Format.wBitsPerSample, wformat.SubFormat.Data1 == 3);
int format = format_set_bits(ao->format, wformat.Format.wBitsPerSample, is_float);
if (!format)
return 0;

View File

@ -31,6 +31,7 @@ int mp_GUID_compare(const GUID *l, const GUID *r);
int mp_PKEY_compare(const PROPERTYKEY *l, const PROPERTYKEY *r);
char *mp_GUID_to_str_buf(char *buf, size_t buf_size, const GUID *guid);
char *mp_PKEY_to_str_buf(char *buf, size_t buf_size, const PROPERTYKEY *pkey);
#define mp_GUID_to_str(guid) mp_GUID_to_str_buf((char[40]){0}, 40, (guid))
#define mp_PKEY_to_str(pkey) mp_PKEY_to_str_buf((char[42]){0}, 42, (pkey))
int wasapi_fill_VistaBlob(wasapi_state *state);