Пример #1
0
 /// <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);
 }
Пример #2
0
        /// <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);
        }
Пример #3
0
        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));
            }
        }