From 4fb4ae2c86beb3c5b7b1b91e9ba7b50a8c056d3c Mon Sep 17 00:00:00 2001 From: Ahmed Abdelhameed Date: Tue, 5 Sep 2017 13:18:26 +0200 Subject: [PATCH] Fix different behavior between Win7 and Win10. --- .../Wave/WaveStreams/MediaFoundationReader.cs | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/NAudio/Wave/WaveStreams/MediaFoundationReader.cs b/NAudio/Wave/WaveStreams/MediaFoundationReader.cs index a2d7d06e..8836698e 100644 --- a/NAudio/Wave/WaveStreams/MediaFoundationReader.cs +++ b/NAudio/Wave/WaveStreams/MediaFoundationReader.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; @@ -150,34 +150,26 @@ protected virtual IMFSourceReader CreateReader(MediaFoundationReaderSettings set var currentMediaType = GetCurrentMediaType(reader); - // HE-AAC (and v2) seems to halve the samplerate - bool sampleRateMultiplied = false; - if (currentMediaType.SubType == AudioSubtypes.MFAudioFormat_AAC && currentMediaType.ChannelCount == 1) - { - sampleRateMultiplied = true; - currentMediaType.SampleRate *= 2; - currentMediaType.ChannelCount *= 2; - } - // mono, low sample rate files can go wrong on Windows 10 unless we specify here partialMediaType.ChannelCount = currentMediaType.ChannelCount; partialMediaType.SampleRate = currentMediaType.SampleRate; - // set the media type - // can return MF_E_INVALIDMEDIATYPE if not supported try { + // set the media type + // can return MF_E_INVALIDMEDIATYPE if not supported reader.SetCurrentMediaType(MediaFoundationInterop.MF_SOURCE_READER_FIRST_AUDIO_STREAM, IntPtr.Zero, partialMediaType.MediaFoundationObject); } - catch - { - // revert SampleRate & ChannelCount multiplication (not needed for aac_lc mono) - if (sampleRateMultiplied) + catch (COMException ex) when (ex.GetHResult() == MediaFoundationErrors.MF_E_INVALIDMEDIATYPE) + { + // HE-AAC (and v2) seems to halve the samplerate + if (currentMediaType.SubType == AudioSubtypes.MFAudioFormat_AAC && currentMediaType.ChannelCount == 1) { - partialMediaType.SampleRate /= 2; - partialMediaType.ChannelCount /= 2; + partialMediaType.SampleRate = currentMediaType.SampleRate *= 2; + partialMediaType.ChannelCount = currentMediaType.ChannelCount *= 2; reader.SetCurrentMediaType(MediaFoundationInterop.MF_SOURCE_READER_FIRST_AUDIO_STREAM, IntPtr.Zero, partialMediaType.MediaFoundationObject); } + else { throw; } } Marshal.ReleaseComObject(currentMediaType.MediaFoundationObject);