winegstreamer: Ensure that the source reports both PCM and floating point audio formats.

The patch is originally by Derek Lesho, with some changes by
Giovanni Mascellani and Nikolay Sivov.

Signed-off-by: Giovanni Mascellani <gmascellani@codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Derek Lesho 2021-05-13 15:53:47 +02:00 committed by Alexandre Julliard
parent cdd24b1d9f
commit 865bbff0d9
2 changed files with 25 additions and 3 deletions

View File

@ -752,9 +752,6 @@ static void test_source_reader(void)
if (SUCCEEDED(hr))
IMFMediaType_Release(mediatype);
hr = IMFSourceReader_GetNativeMediaType(reader, MF_SOURCE_READER_FIRST_AUDIO_STREAM, 1, &mediatype);
ok(hr == MF_E_NO_MORE_TYPES, "Unexpected hr %#x.\n", hr);
/* Current media type. */
hr = IMFSourceReader_GetCurrentMediaType(reader, MF_SOURCE_READER_FIRST_VIDEO_STREAM, &mediatype);
ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#x.\n", hr);

View File

@ -806,6 +806,31 @@ static HRESULT media_stream_init_desc(struct media_stream *stream)
goto done;
}
}
else if (format.major_type == WG_MAJOR_TYPE_AUDIO)
{
/* Expose at least one PCM and one floating point type for the
consumer to pick from. */
static const enum wg_audio_format audio_types[] =
{
WG_AUDIO_FORMAT_S16LE,
WG_AUDIO_FORMAT_F32LE,
};
stream_types = malloc( sizeof(IMFMediaType *) * (ARRAY_SIZE(audio_types) + 1) );
stream_types[0] = mf_media_type_from_wg_format(&format);
type_count = 1;
for (i = 0; i < ARRAY_SIZE(audio_types); i++)
{
struct wg_format new_format;
if (format.u.audio.format == audio_types[i])
continue;
new_format = format;
new_format.u.audio.format = audio_types[i];
stream_types[type_count++] = mf_media_type_from_wg_format(&new_format);
}
}
else
{
stream_type = mf_media_type_from_wg_format(&format);