示例#1
0
        private LamePreset GuessForVersion(LameVersionGroup AVersionGroup, byte ABitrate, byte AQuality, byte AEncodingMethod, byte ANoiseShaping, byte AStereoMode, byte AATHType, byte ALowpassDiv100, out bool ANonBitrate)
        {
            LamePreset preset1 = LamePreset.Unknown;
            LamePreset preset2 = LamePreset.Unknown;

            ANonBitrate = false;
            foreach (PresetGuessRow row1 in PresetGuesser.m_PresetGuessTable)
            {
                if (((row1.HasVersionGroup(AVersionGroup) && (row1.TVs[1] == AQuality)) && ((row1.TVs[2] == AEncodingMethod) && (row1.TVs[3] == ANoiseShaping))) && (((row1.TVs[4] == AStereoMode) && (row1.TVs[5] == AATHType)) && (row1.TVs[6] == ALowpassDiv100)))
                {
                    if (row1.TVs[0] == ABitrate)
                    {
                        preset1 = row1.Res;
                        break;
                    }
                    if ((AEncodingMethod == 3) || (AEncodingMethod == 4))
                    {
                        preset2 = row1.Res;
                    }
                }
            }
            if ((preset1 == LamePreset.Unknown) && (preset2 != LamePreset.Unknown))
            {
                ANonBitrate = true;
                preset1     = preset2;
            }
            return(preset1);
        }
示例#2
0
        public LamePreset GuessPreset(string AVersionString, byte ABitrate, byte AQuality, byte AEncodingMethod, byte ANoiseShaping, byte AStereoMode, byte AATHType, byte ALowpassDiv100, out bool ANonBitrate)
        {
            string text1 = AVersionString.Substring(0, 4);
            string text2 = AVersionString.Substring(0, 5);

            if (((text1 == "3.90") && (text2 != "3.90.")) || (text1 == "3.92"))
            {
                return(this.GuessForVersion(LameVersionGroup.lvg390_3901_392, ABitrate, AQuality, AEncodingMethod, ANoiseShaping, AStereoMode, AATHType, ALowpassDiv100, out ANonBitrate));
            }
            if (text2 == "3.90.")
            {
                return(this.BestGuessTwoVersions(LameVersionGroup.lvg3902_391, LameVersionGroup.lvg3931_3903up, ABitrate, AQuality, AEncodingMethod, ANoiseShaping, AStereoMode, AATHType, ALowpassDiv100, out ANonBitrate));
            }
            switch (text1)
            {
            case "3.91":
                return(this.GuessForVersion(LameVersionGroup.lvg3902_391, ABitrate, AQuality, AEncodingMethod, ANoiseShaping, AStereoMode, AATHType, ALowpassDiv100, out ANonBitrate));

            case "3.93":
                return(this.BestGuessTwoVersions(LameVersionGroup.lvg3931_3903up, LameVersionGroup.lvg393, ABitrate, AQuality, AEncodingMethod, ANoiseShaping, AStereoMode, AATHType, ALowpassDiv100, out ANonBitrate));
            }
            if (string.Compare(text1, "3.94") >= 0)
            {
                return(this.GuessForVersion(LameVersionGroup.lvg394up, ABitrate, AQuality, AEncodingMethod, ANoiseShaping, AStereoMode, AATHType, ALowpassDiv100, out ANonBitrate));
            }
            LamePreset preset1 = LamePreset.Unknown;

            ANonBitrate = false;
            return(preset1);
        }
示例#3
0
 private void Initialize(LameVersionGroup vg1, LameVersionGroup vg2, LameVersionGroup vg3,
                         Byte tv1, Byte tv2, Byte tv3, Byte tv4, Byte tv5, Byte tv6, Byte tv7,
                         LamePreset result)
 {
     VGs[0] = vg1; VGs[1] = vg2; VGs[2] = vg3;
     TVs[0] = tv1; TVs[1] = tv2; TVs[2] = tv3; TVs[3] = tv4; TVs[4] = tv5; TVs[5] = tv6; TVs[6] = tv7;
     Res    = result;
 }
示例#4
0
 private void Initialize(LameVersionGroup vg1, LameVersionGroup vg2, LameVersionGroup vg3,
     Byte tv1, Byte tv2, Byte tv3, Byte tv4, Byte tv5, Byte tv6, Byte tv7,
     LamePreset result)
 {
     VGs[0] = vg1; VGs[1] = vg2; VGs[2] = vg3;
     TVs[0] = tv1; TVs[1] = tv2; TVs[2] = tv3; TVs[3] = tv4; TVs[4] = tv5; TVs[5] = tv6; TVs[6] = tv7;
     Res = result;
 }
示例#5
0
 private void Initialize(LameVersionGroup vg1, LameVersionGroup vg2, LameVersionGroup vg3, byte tv1, byte tv2, byte tv3, byte tv4, byte tv5, byte tv6, byte tv7, LamePreset result)
 {
     this.VGs[0] = vg1;
     this.VGs[1] = vg2;
     this.VGs[2] = vg3;
     this.TVs[0] = tv1;
     this.TVs[1] = tv2;
     this.TVs[2] = tv3;
     this.TVs[3] = tv4;
     this.TVs[4] = tv5;
     this.TVs[5] = tv6;
     this.TVs[6] = tv7;
     this.Res = result;
 }
示例#6
0
        private LamePreset BestGuessTwoVersions(LameVersionGroup AGroup1, LameVersionGroup AGroup2, byte ABitrate, byte AQuality, byte AEncodingMethod, byte ANoiseShaping, byte AStereoMode, byte AATHType, byte ALowpassDiv100, out bool ANonBitrate)
        {
            LamePreset preset1;
            LamePreset preset2 = this.GuessForVersion(AGroup1, ABitrate, AQuality, AEncodingMethod, ANoiseShaping, AStereoMode, AATHType, ALowpassDiv100, out ANonBitrate);
            bool       flag1   = ANonBitrate;
            LamePreset preset3 = this.GuessForVersion(AGroup2, ABitrate, AQuality, AEncodingMethod, ANoiseShaping, AStereoMode, AATHType, ALowpassDiv100, out ANonBitrate);
            bool       flag2   = ANonBitrate;

            if ((preset2 == LamePreset.Unknown) || (flag1 && (preset3 != LamePreset.Unknown)))
            {
                preset1     = preset3;
                ANonBitrate = flag2;
                return(preset1);
            }
            preset1     = preset2;
            ANonBitrate = flag1;
            return(preset1);
        }
示例#7
0
        private LamePreset GuessForVersion(LameVersionGroup AVersionGroup, Byte ABitrate, Byte AQuality,
                                           Byte AEncodingMethod, Byte ANoiseShaping, Byte AStereoMode,
                                           Byte AATHType, Byte ALowpassDiv100, out bool ANonBitrate)
        {
            LamePreset Result = LamePreset.Unknown;

            LamePreset NonBitrateResult = LamePreset.Unknown;

            ANonBitrate = false;

            foreach (PresetGuessRow row in _presetGuessTable)
            {
                if
                ((row.HasVersionGroup(AVersionGroup)) &&
                 (row.TVs[1] == AQuality) &&
                 (row.TVs[2] == AEncodingMethod) &&
                 (row.TVs[3] == ANoiseShaping) &&
                 (row.TVs[4] == AStereoMode) &&
                 (row.TVs[5] == AATHType) &&
                 (row.TVs[6] == ALowpassDiv100))
                {
                    if (row.TVs[0] == ABitrate)
                    {
                        Result = row.Res;
                        break;
                    }
                    // Non-bitrate based guessing is only relevant to the VBR presets.
                    else if (AEncodingMethod == 3 || AEncodingMethod == 4)
                    {
                        NonBitrateResult = row.Res;
                    }
                }
            }

            if (Result == LamePreset.Unknown && NonBitrateResult != LamePreset.Unknown)
            {
                ANonBitrate = true;
                Result      = NonBitrateResult;
            }

            return(Result);
        }
        public void Encode(Stream source, string outputPath, SongTags tags, byte[] reusedBuffer)
        {
            WaveFileReader    reader = null;
            LameMP3FileWriter writer = null;

            try             //Idk if using captures the original instance - clearer to just use try-finally
            {
                reader = new WaveFileReader(source);

                var id3 = new ID3TagData()
                {
                    Artist = tags.Artist,
                    Title  = tags.Title,
                };

                if (LamePreset != null)
                {
                    writer = new LameMP3FileWriter(outputPath, reader.WaveFormat, LamePreset.GetValueOrDefault(), id3);
                }
                else if (BitRate != null)
                {
                    writer = new LameMP3FileWriter(outputPath, reader.WaveFormat, BitRate.GetValueOrDefault(), id3);
                }
                else
                {
                    writer = new LameMP3FileWriter(outputPath, reader.WaveFormat, LAMEPreset.STANDARD, id3);
                }

                while (reader.Position < reader.Length)
                {
                    int bytesRead = reader.Read(reusedBuffer, 0, reusedBuffer.Length);
                    writer.Write(reusedBuffer, 0, bytesRead);
                }
            }
            finally
            {
                reader?.Dispose();
                writer?.Dispose();
            }
        }
示例#9
0
 public PresetGuessRow(LameVersionGroup vg1, byte tv1, byte tv2, byte tv3, byte tv4, byte tv5, byte tv6, byte tv7, LamePreset result)
 {
     this.VGs = new LameVersionGroup[3];
     this.TVs = new byte[7];
     this.Initialize(vg1, LameVersionGroup.None, LameVersionGroup.None, tv1, tv2, tv3, tv4, tv5, tv6, tv7, result);
 }
示例#10
0
 private void Initialize(LameVersionGroup vg1, LameVersionGroup vg2, LameVersionGroup vg3, byte tv1, byte tv2, byte tv3, byte tv4, byte tv5, byte tv6, byte tv7, LamePreset result)
 {
     this.VGs[0] = vg1;
     this.VGs[1] = vg2;
     this.VGs[2] = vg3;
     this.TVs[0] = tv1;
     this.TVs[1] = tv2;
     this.TVs[2] = tv3;
     this.TVs[3] = tv4;
     this.TVs[4] = tv5;
     this.TVs[5] = tv6;
     this.TVs[6] = tv7;
     this.Res    = result;
 }
示例#11
0
 public PresetGuessRow(LameVersionGroup vg1, LameVersionGroup vg2, LameVersionGroup vg3,
                       Byte tv1, Byte tv2, Byte tv3, Byte tv4, Byte tv5, Byte tv6, Byte tv7,
                       LamePreset result)
 {
     Initialize(vg1, vg2, vg3, tv1, tv2, tv3, tv4, tv5, tv6, tv7, result);
 }
示例#12
0
 public PresetGuessRow(LameVersionGroup vg1, LameVersionGroup vg2, LameVersionGroup vg3,
     Byte tv1, Byte tv2, Byte tv3, Byte tv4, Byte tv5, Byte tv6, Byte tv7,
     LamePreset result)
 {
     Initialize(vg1, vg2, vg3, tv1, tv2, tv3, tv4, tv5, tv6, tv7, result);
 }
示例#13
0
 public PresetGuessRow(LameVersionGroup vg1, byte tv1, byte tv2, byte tv3, byte tv4, byte tv5, byte tv6, byte tv7, LamePreset result)
 {
     this.VGs = new LameVersionGroup[3];
     this.TVs = new byte[7];
     this.Initialize(vg1, LameVersionGroup.None, LameVersionGroup.None, tv1, tv2, tv3, tv4, tv5, tv6, tv7, result);
 }
示例#14
0
        /// <summary>
        /// Initializes a new instance of the <see cref="BasicLameTagReader"/> class.
        /// </summary>
        /// <param name="path">The path.</param>
        public BasicLameTagReader(string path)
        {
            if (string.IsNullOrEmpty(path))
                throw new ArgumentNullException("path");

            // Initialize
            _isLameTagFound = true;

            _tag = new LameTag();

            using (BinaryReader br = new BinaryReader(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)))
            {
                int startPos = ID3v2.GetTagSize(br.BaseStream);

                // Seek past ID3v2 tag
                br.BaseStream.Seek(startPos, SeekOrigin.Begin);

                // Get StartOfFile structure
                StartOfFile startOfFile = StartOfFile.FromBinaryReader(br);

                // Seek past ID3v2 tag
                br.BaseStream.Seek(startPos, SeekOrigin.Begin);

                string info1 = Encoding.ASCII.GetString(startOfFile.Info1);
                string info2 = Encoding.ASCII.GetString(startOfFile.Info2);
                string info3 = Encoding.ASCII.GetString(startOfFile.Info3);

                if (info1 == "Xing" || info1 == "Info")
                {
                    br.BaseStream.Seek(Info1Offset, SeekOrigin.Current);
                }
                else if (info2 == "Xing" || info2 == "Info")
                {
                    br.BaseStream.Seek(Info2Offset, SeekOrigin.Current);
                }
                else if (info3 == "Xing" || info3 == "Info")
                {
                    br.BaseStream.Seek(Info3Offset, SeekOrigin.Current);
                }
                else
                {
                    _isLameTagFound = true;
                }

                // Read LAME tag structure
                br.BaseStream.Seek(LAMETagOffset, SeekOrigin.Current);
                _tag = LameTag.FromBinaryReader(br);

                // Read old LAME header
                br.BaseStream.Seek(0 - Marshal.SizeOf(typeof(LameTag)), SeekOrigin.Current);
                OldLameHeader oldLameHeader = OldLameHeader.FromBinaryReader(br);
                _versionStringNonLameTag = Encoding.ASCII.GetString(oldLameHeader.VersionString);
            }

            // Set version string
            if (_tag.VersionString[1] == '.')
            {
                byte[] versionString = new byte[6];
                int i;
                for (i = 0; i < 4 || (i == 4 && _tag.VersionString[i] == 'b'); i++)
                    versionString[i] = _tag.VersionString[i];
                Array.Resize(ref versionString, i);
                _versionString = Encoding.ASCII.GetString(versionString);
            }
            else
            {
                _versionString = "";
            }

            // If encoder is not LAME, set IsLameTagFound to false
            // TODO : How about other encoders that use the LAME tag?
            if (Encoding.ASCII.GetString(_tag.Encoder) != "LAME")
            {
                _isLameTagFound = false;
            }

            // Set preset WORD
            _preset = (ushort)(((_tag.Surround_Preset[0] << 8) + _tag.Surround_Preset[1]) & 0x07FF);

            // Guess preset
            _presetGuess = (new PresetGuesser()).GuessPreset(
                VersionStringNonLameTag, /*m_Tag.VersionString*/
                _tag.Bitrate,
                _tag.Quality,
                _tag.TagRevision_EncodingMethod,
                _tag.NoiseShaping,
                _tag.StereoMode,
                _tag.EncodingFlags_ATHType,
                _tag.Lowpass,
                out _isPresetGuessNonBitrate);
        }
示例#15
0
        /// <summary>
        /// Initializes a new instance of the <see cref="BasicLameTagReader"/> class.
        /// </summary>
        /// <param name="path">The path.</param>
        public BasicLameTagReader(string path)
        {
            if (string.IsNullOrEmpty(path))
            {
                throw new ArgumentNullException("path");
            }

            // Initialize
            _isLameTagFound = true;

            _tag = new LameTag();

            using (BinaryReader br = new BinaryReader(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)))
            {
                int startPos = ID3v2.GetTagSize(br.BaseStream);

                // Seek past ID3v2 tag
                br.BaseStream.Seek(startPos, SeekOrigin.Begin);

                // Get StartOfFile structure
                StartOfFile startOfFile = StartOfFile.FromBinaryReader(br);

                // Seek past ID3v2 tag
                br.BaseStream.Seek(startPos, SeekOrigin.Begin);

                string info1 = Encoding.ASCII.GetString(startOfFile.Info1);
                string info2 = Encoding.ASCII.GetString(startOfFile.Info2);
                string info3 = Encoding.ASCII.GetString(startOfFile.Info3);

                if (info1 == "Xing" || info1 == "Info")
                {
                    br.BaseStream.Seek(Info1Offset, SeekOrigin.Current);
                }
                else if (info2 == "Xing" || info2 == "Info")
                {
                    br.BaseStream.Seek(Info2Offset, SeekOrigin.Current);
                }
                else if (info3 == "Xing" || info3 == "Info")
                {
                    br.BaseStream.Seek(Info3Offset, SeekOrigin.Current);
                }
                else
                {
                    _isLameTagFound = true;
                }

                // Read LAME tag structure
                br.BaseStream.Seek(LAMETagOffset, SeekOrigin.Current);
                _tag = LameTag.FromBinaryReader(br);

                // Read old LAME header
                br.BaseStream.Seek(0 - Marshal.SizeOf(typeof(LameTag)), SeekOrigin.Current);
                OldLameHeader oldLameHeader = OldLameHeader.FromBinaryReader(br);
                _versionStringNonLameTag = Encoding.ASCII.GetString(oldLameHeader.VersionString);
            }

            // Set version string
            if (_tag.VersionString[1] == '.')
            {
                byte[] versionString = new byte[6];
                int    i;
                for (i = 0; i < 4 || (i == 4 && _tag.VersionString[i] == 'b'); i++)
                {
                    versionString[i] = _tag.VersionString[i];
                }
                Array.Resize(ref versionString, i);
                _versionString = Encoding.ASCII.GetString(versionString);
            }
            else
            {
                _versionString = "";
            }

            // If encoder is not LAME, set IsLameTagFound to false
            // TODO : How about other encoders that use the LAME tag?
            if (Encoding.ASCII.GetString(_tag.Encoder) != "LAME")
            {
                _isLameTagFound = false;
            }

            // Set preset WORD
            _preset = (ushort)(((_tag.Surround_Preset[0] << 8) + _tag.Surround_Preset[1]) & 0x07FF);

            // Guess preset
            _presetGuess = (new PresetGuesser()).GuessPreset(
                VersionStringNonLameTag, /*m_Tag.VersionString*/
                _tag.Bitrate,
                _tag.Quality,
                _tag.TagRevision_EncodingMethod,
                _tag.NoiseShaping,
                _tag.StereoMode,
                _tag.EncodingFlags_ATHType,
                _tag.Lowpass,
                out _isPresetGuessNonBitrate);
        }