/// <summary> /// Initializes a new instance of AudioFileReader /// </summary> /// <param name="stream">The file to open</param> public AudioDataReader(Stream stream, SelectDecoder format, PreferredDecoder preferredDecoder) { readerStream = CreateReaderStream(stream, format, preferredDecoder); sourceBytesPerSample = (readerStream.WaveFormat.BitsPerSample / 8) * readerStream.WaveFormat.Channels; sampleChannel = new SampleChannel(readerStream, false); destBytesPerSample = 4 * sampleChannel.WaveFormat.Channels; length = SourceToDest(readerStream.Length); }
/// <summary> /// Creates the reader stream, supporting all filetypes in the core NAudio library, /// and ensuring we are in PCM format /// </summary> /// <param name="stream">File Name</param> WaveStream CreateReaderStream(Stream stream, SelectDecoder format, PreferredDecoder preferredDecoder) { WaveStream readerStream = null; switch (format) { case SelectDecoder.WAV: readerStream = new WaveFileReader(stream); if (readerStream.WaveFormat.Encoding != WaveFormatEncoding.Pcm && readerStream.WaveFormat.Encoding != WaveFormatEncoding.IeeeFloat) { readerStream = WaveFormatConversionStream.CreatePcmStream(readerStream); readerStream = new BlockAlignReductionStream(readerStream); } break; case SelectDecoder.MP3: readerStream = new Mp3FileReader(stream, waveFormat => CreateMp3FrameDecoder(waveFormat, preferredDecoder)); break; case SelectDecoder.AIFF: readerStream = new AiffFileReader(stream); break; case SelectDecoder.Ogg: readerStream = new NVorbis.NAudioSupport.VorbisWaveReader(stream); break; case SelectDecoder.AutoDetect: UsedDecoder = UsedDecoder.None; // try to create reader for all formats foreach (var tryFormat in autoDetectFormatOrder) { stream.Seek(0, SeekOrigin.Begin); try { readerStream = CreateReaderStream(stream, tryFormat, preferredDecoder); } catch { } if (readerStream != null) { UsedDecoder = (UsedDecoder)tryFormat; break; } } if (readerStream == null) { throw new Exception("Failed to figure out " + typeof(SelectDecoder) + "."); } break; } return(readerStream); }
public static IMp3FrameDecompressor CreateMp3FrameDecoder(WaveFormat waveFormat, PreferredDecoder preferredDecoder) { var useMannaged = false; if (IsNativeMp3DecoderAvailable && IsManagedMp3DecoderAvailable) { useMannaged = preferredDecoder == PreferredDecoder.PreferManaged; } else if (IsNativeMp3DecoderAvailable) { useMannaged = false; } else if (IsManagedMp3DecoderAvailable) { useMannaged = true; } else { throw new Exception("Nor native nor mannager MP3 decoder is available."); } if (useMannaged) { //return new NLayer.NAudioSupport.Mp3FrameDecompressor(waveFormat); // compiler might not know the type if NLAyer is disabled return((IMp3FrameDecompressor)Activator.CreateInstance(managedMp3DecoderType, waveFormat)); } else { return(new AcmMp3FrameDecompressor(waveFormat)); } }