/// <summary>
        /// Constructor
        /// </summary>
        /// <param name="stream">Stream to access in-memory data to be parsed</param>
        /// <param name="mimeType">the file's mime type.</param>
        /// <param name="readEmbeddedPictures">Embedded pictures will be read if true; ignored if false</param>
        /// <param name="readAllMetaFrames">All metadata frames (including unmapped ones) will be read if true; ignored if false</param>
        public AudioFileIo(Stream stream, String mimeType, Boolean readEmbeddedPictures, Boolean readAllMetaFrames = false)
        {
            Byte alternate = 0;
            var  found     = false;

            _audioData = AudioDataIoFactory.GetInstance().GetFromMimeType(mimeType, "In-memory", alternate);

            _audioManager = new AudioDataManager(_audioData, stream);
            found         = _audioManager.ReadFromFile(readEmbeddedPictures, readAllMetaFrames);

            while (!found && alternate < AudioDataIoFactory.MaxAlternates)
            {
                alternate++;
                _audioData    = AudioDataIoFactory.GetInstance().GetFromMimeType(mimeType, "In-memory", alternate);
                _audioManager = new AudioDataManager(_audioData, stream);
                found         = _audioManager.ReadFromFile(readEmbeddedPictures, readAllMetaFrames);
            }

            _metaData = MetaDataIOFactory.GetInstance().GetMetaReader(_audioManager);

            if (_metaData is DummyTag && (0 == _audioManager.getAvailableMetas().Count))
            {
                LogDelegator.GetLogDelegate()(Log.LV_WARNING, "Could not find any metadata");
            }
        }
        // ------------------------------------------------------------------------------------------

        /// <summary>
        /// Gets the instance of this factory (Singleton pattern)
        /// </summary>
        /// <returns>Instance of the AudioReaderFactory of the application</returns>
        public static AudioDataIoFactory GetInstance()
        {
            if (!BitConverter.IsLittleEndian)
            {
                throw new PlatformNotSupportedException("Big-endian based platforms are not supported by ModifiedAtl");
            }

            if (null != _theFactory)
            {
                return(_theFactory);
            }
            _theFactory = new AudioDataIoFactory
            {
                formatListByExt  = new Dictionary <String, IList <Format> >(),
                formatListByMime = new Dictionary <String, IList <Format> >()
            };


            var tempFmt = new Format("MPEG Audio Layer")
            {
                ID = CidMp3
            };

            tempFmt.AddMimeType("audio/mp3");
            tempFmt.AddMimeType("audio/mpeg");
            tempFmt.AddMimeType("audio/x-mpeg");
            tempFmt.AddExtension(".mp1");
            tempFmt.AddExtension(".mp2");
            tempFmt.AddExtension(".mp3");
            _theFactory.addFormat(tempFmt);

            tempFmt = new Format("OGG : Vorbis, Opus")
            {
                ID = CidOgg
            };
            tempFmt.AddMimeType("audio/ogg");
            tempFmt.AddMimeType("audio/vorbis");
            tempFmt.AddMimeType("audio/opus");
            tempFmt.AddMimeType("audio/ogg;codecs=opus");
            tempFmt.AddExtension(".ogg");
            tempFmt.AddExtension(".opus");
            _theFactory.addFormat(tempFmt);

            tempFmt = new Format("Musepack / MPEGplus")
            {
                ID = CidMpc
            };
            tempFmt.AddMimeType("audio/x-musepack");
            tempFmt.AddMimeType("audio/musepack");
            tempFmt.AddExtension(".mp+");
            tempFmt.AddExtension(".mpc");
            _theFactory.addFormat(tempFmt);

            tempFmt = new Format("Windows Media Audio")
            {
                ID = CidWma
            };
            tempFmt.AddMimeType("audio/x-ms-wma");
            tempFmt.AddMimeType("video/x-ms-asf");
            tempFmt.AddExtension(".asf");
            tempFmt.AddExtension(".wma");
            _theFactory.addFormat(tempFmt);

            tempFmt = new Format("Advanced Audio Coding")
            {
                ID = CidAac
            };
            tempFmt.AddMimeType("audio/mp4");
            tempFmt.AddMimeType("audio/aac");
            tempFmt.AddMimeType("audio/mp4a-latm");
            tempFmt.AddExtension(".aac");
            tempFmt.AddExtension(".mp4");
            tempFmt.AddExtension(".m4a");
            tempFmt.AddExtension(".m4v");
            _theFactory.addFormat(tempFmt);

            tempFmt = new Format("Dolby Digital")
            {
                ID = CidAc3
            };
            tempFmt.AddMimeType("audio/ac3");
            tempFmt.AddExtension(".ac3");
            _theFactory.addFormat(tempFmt);

            tempFmt = new Format("Digital Theatre System")
            {
                ID = CidDts
            };
            tempFmt.AddMimeType("audio/vnd.dts");
            tempFmt.AddMimeType("audio/vnd.dts.hd");
            tempFmt.AddExtension(".dts");
            tempFmt.Readable = false;
            _theFactory.addFormat(tempFmt);

            tempFmt = new Format("TwinVQ")
            {
                ID = CidVqf
            };
            tempFmt.AddExtension(".vqf");
            tempFmt.AddMimeType("audio/x-twinvq");
            tempFmt.Readable = false;
            _theFactory.addFormat(tempFmt);

            tempFmt = new Format("Free Lossless Audio Codec")
            {
                ID = CidFlac
            };
            tempFmt.AddMimeType("audio/x-flac");
            tempFmt.AddExtension(".flac");
            _theFactory.addFormat(tempFmt);

            tempFmt = new Format("Monkey's Audio")
            {
                ID = CidApe
            };
            tempFmt.AddMimeType("audio/ape");
            tempFmt.AddMimeType("audio/x-ape");
            tempFmt.AddExtension(".ape");
            _theFactory.addFormat(tempFmt);

            tempFmt = new Format("OptimFROG")
            {
                ID = CidOfr
            };
            tempFmt.AddMimeType("audio/ofr");
            tempFmt.AddMimeType("audio/x-ofr");
            tempFmt.AddExtension(".ofr");
            tempFmt.AddExtension(".ofs");
            _theFactory.addFormat(tempFmt);

            tempFmt = new Format("WAVPack")
            {
                ID = CidWavpack
            };
            tempFmt.AddMimeType("audio/x-wavpack");
            tempFmt.AddMimeType("audio/wavpack");
            tempFmt.AddExtension(".wv");
            _theFactory.addFormat(tempFmt);

            tempFmt = new Format("PCM (uncompressed audio)")
            {
                ID = CidWav
            };
            tempFmt.AddMimeType("audio/x-wav");
            tempFmt.AddMimeType("audio/wav");
            tempFmt.AddExtension(".wav");
            tempFmt.AddExtension(".bwf");
            tempFmt.AddExtension(".bwav");
            _theFactory.addFormat(tempFmt);

            tempFmt = new Format("Musical Instruments Digital Interface")
            {
                ID = CidMidi
            };
            tempFmt.AddMimeType("audio/mid");
            tempFmt.AddExtension(".mid");
            tempFmt.AddExtension(".midi");
            _theFactory.addFormat(tempFmt);

            tempFmt = new Format("Direct Stream Digital")
            {
                ID = CidDsf
            };
            tempFmt.AddMimeType("audio/dsf");
            tempFmt.AddMimeType("audio/x-dsf");
            tempFmt.AddMimeType("audio/dsd");
            tempFmt.AddMimeType("audio/x-dsd");
            tempFmt.AddExtension(".dsf");
            tempFmt.AddExtension(".dsd");
            _theFactory.addFormat(tempFmt);

            tempFmt = new Format("Portable Sound Format")
            {
                ID = CidPsf
            };
            tempFmt.AddMimeType("audio/psf");   // Unofficial
            tempFmt.AddMimeType("audio/x-psf"); // Unofficial
            tempFmt.AddExtension(".psf");
            tempFmt.AddExtension(".psf1");
            tempFmt.AddExtension(".minipsf");
            tempFmt.AddExtension(".minipsf1");
            tempFmt.AddExtension(".psf2");
            tempFmt.AddExtension(".minipsf2");
            tempFmt.AddExtension(".ssf");
            tempFmt.AddExtension(".minissf");
            tempFmt.AddExtension(".dsf");
            tempFmt.AddExtension(".minidsf");
            tempFmt.AddExtension(".gsf");
            tempFmt.AddExtension(".minigsf");
            tempFmt.AddExtension(".qsf");
            tempFmt.AddExtension(".miniqsf");
            _theFactory.addFormat(tempFmt);

            tempFmt = new Format("SPC700 Sound Files")
            {
                ID = CidSpc
            };
            tempFmt.AddMimeType("audio/spc");   // Unofficial
            tempFmt.AddMimeType("audio/x-spc"); // Unofficial
            tempFmt.AddExtension(".spc");
            _theFactory.addFormat(tempFmt);

            tempFmt = new Format("True Audio")
            {
                ID = CidTta
            };
            tempFmt.AddMimeType("audio/tta");
            tempFmt.AddMimeType("audio/x-tta");
            tempFmt.AddExtension(".tta");
            _theFactory.addFormat(tempFmt);

            tempFmt = new Format("Tom's lossless Audio Kompressor (TAK)")
            {
                ID = CidTak
            };
            tempFmt.AddMimeType("audio/tak");   // Unofficial
            tempFmt.AddMimeType("audio/x-tak"); // Unofficial
            tempFmt.AddExtension(".tak");
            _theFactory.addFormat(tempFmt);

            tempFmt    = new Format("Noisetracker/Soundtracker/Protracker Module");
            tempFmt.ID = CidMod;
            tempFmt.AddMimeType("audio/x-mod");
            tempFmt.AddExtension(".mod");
            _theFactory.addFormat(tempFmt);

            tempFmt    = new Format("ScreamTracker Module");
            tempFmt.ID = CidS3M;
            tempFmt.AddMimeType("audio/s3m");
            tempFmt.AddMimeType("audio/x-s3m");
            tempFmt.AddExtension(".s3m");
            _theFactory.addFormat(tempFmt);

            tempFmt    = new Format("Extended Module");
            tempFmt.ID = CidXm;
            tempFmt.AddMimeType("audio/xm");
            tempFmt.AddMimeType("audio/x-xm");
            tempFmt.AddExtension(".xm");
            _theFactory.addFormat(tempFmt);

            tempFmt    = new Format("Impulse Tracker");
            tempFmt.ID = CidIt;
            tempFmt.AddMimeType("audio/it");
            tempFmt.AddExtension(".it");
            _theFactory.addFormat(tempFmt);

            tempFmt    = new Format("Audio Interchange File Format: (Audio IFF)");
            tempFmt.ID = CidAiff;
            tempFmt.AddMimeType("audio/x-aiff");
            tempFmt.AddExtension(".aif");
            tempFmt.AddExtension(".aiff");
            tempFmt.AddExtension(".aifc");
            tempFmt.AddExtension(".snd");
            _theFactory.addFormat(tempFmt);

            tempFmt    = new Format("Video Game Music");
            tempFmt.ID = CidVgm;
            tempFmt.AddMimeType("audio/vgm");   // Unofficial
            tempFmt.AddMimeType("audio/x-vgm"); // Unofficial
            tempFmt.AddExtension(".vgm");
            tempFmt.AddExtension(".vgz");
            _theFactory.addFormat(tempFmt);

            tempFmt    = new Format("Genesis YM2612");
            tempFmt.ID = CidGym;
            tempFmt.AddMimeType("audio/gym");   // Unofficial
            tempFmt.AddMimeType("audio/x-gym"); // Unofficial
            tempFmt.AddExtension(".gym");
            _theFactory.addFormat(tempFmt);

            return(_theFactory);
        }