From: Derek Lesho dlesho@codeweavers.com
The patch is originally by Derek Lesho, with some changes by Giovanni Mascellani and Nikolay Sivov.
Signed-off-by: Giovanni Mascellani gmascellani@codeweavers.com --- dlls/mfreadwrite/tests/mfplat.c | 3 --- dlls/winegstreamer/media_source.c | 25 +++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c index ded45afe771..e3ff7f6e7aa 100644 --- a/dlls/mfreadwrite/tests/mfplat.c +++ b/dlls/mfreadwrite/tests/mfplat.c @@ -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); diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index eb5b9e366ec..5249bc9c41d 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -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_F64LE, + }; + + 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);
On 5/12/21 6:37 PM, Giovanni Mascellani wrote:
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index eb5b9e366ec..5249bc9c41d 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -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_F64LE,
};
Is F64LE correct? I thought before you used an equivalent of F32LE, if that's what (Float, MF_MT_AUDIO_BITS_PER_SAMPLE=32) means.
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);
Thanks, that looks fine to me. It could be reduced a bit more still, by removing 'new_format' for example, but that's minor. Now we need someone who knows gstreamer to comment, specifically if resampling PCM -> PCM/float -> float would work. Or maybe you can test that yourself with some sin wave data with rate not matching output device rate.