|
From: <sv...@op...> - 2026-10-23 16:53:03
|
Author: manx Date: Fri Oct 23 18:52:56 2026 New Revision: 25797 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=25797 Log: [Imp] openmpt/streamencoder/StreamEncoderMP3.cpp: Support writing ID3v2.4 tags with LAME API. [Imp] Stream Encoder: Add new hidden setting [Export]MP3LameID3v2Version=4 to select ID3v2 version (2.3 or 2.4) when using LAME API. Modified: trunk/OpenMPT/mptrack/StreamEncoderSettings.cpp trunk/OpenMPT/mptrack/StreamEncoderSettings.h trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoder.hpp trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoderMP3.cpp Modified: trunk/OpenMPT/mptrack/StreamEncoderSettings.cpp ============================================================================== --- trunk/OpenMPT/mptrack/StreamEncoderSettings.cpp Fri Oct 23 18:48:22 2026 (r25796) +++ trunk/OpenMPT/mptrack/StreamEncoderSettings.cpp Fri Oct 23 18:52:56 2026 (r25797) @@ -76,6 +76,7 @@ , MP3ID3v2WriteReplayGainTXXX(conf, section, U_("MP3ID3v2WriteReplayGainTXXX"), Encoder::StreamSettings().MP3ID3v2WriteReplayGainTXXX) , MP3LameQuality(conf, section, U_("MP3LameQuality"), Encoder::StreamSettings().MP3LameQuality) , MP3LameID3v2UseLame(conf, section, U_("MP3LameID3v2UseLame"), Encoder::StreamSettings().MP3LameID3v2UseLame) + , MP3LameID3v2Version(conf, section, U_("MP3LameID3v2Version"), Encoder::StreamSettings().MP3LameID3v2Version) , MP3LameCalculateReplayGain(conf, section, U_("MP3LameCalculateReplayGain"), Encoder::StreamSettings().MP3LameCalculateReplayGain) , MP3LameCalculatePeakSample(conf, section, U_("MP3LameCalculatePeakSample"), Encoder::StreamSettings().MP3LameCalculatePeakSample) , OpusComplexity(conf, section, U_("OpusComplexity"), Encoder::StreamSettings().OpusComplexity) @@ -95,6 +96,7 @@ result.MP3ID3v2WriteReplayGainTXXX = MP3ID3v2WriteReplayGainTXXX; result.MP3LameQuality = MP3LameQuality; result.MP3LameID3v2UseLame = MP3LameID3v2UseLame; + result.MP3LameID3v2Version = MP3LameID3v2Version; result.MP3LameCalculateReplayGain = MP3LameCalculateReplayGain; result.MP3LameCalculatePeakSample = MP3LameCalculatePeakSample; result.OpusComplexity = OpusComplexity; Modified: trunk/OpenMPT/mptrack/StreamEncoderSettings.h ============================================================================== --- trunk/OpenMPT/mptrack/StreamEncoderSettings.h Fri Oct 23 18:48:22 2026 (r25796) +++ trunk/OpenMPT/mptrack/StreamEncoderSettings.h Fri Oct 23 18:52:56 2026 (r25797) @@ -103,6 +103,7 @@ Setting<bool> MP3ID3v2WriteReplayGainTXXX; Setting<int32> MP3LameQuality; Setting<bool> MP3LameID3v2UseLame; + Setting<uint8> MP3LameID3v2Version; Setting<bool> MP3LameCalculateReplayGain; Setting<bool> MP3LameCalculatePeakSample; Setting<int32> OpusComplexity; Modified: trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoder.hpp ============================================================================== --- trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoder.hpp Fri Oct 23 18:48:22 2026 (r25796) +++ trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoder.hpp Fri Oct 23 18:52:56 2026 (r25797) @@ -220,6 +220,7 @@ bool MP3ID3v2WriteReplayGainTXXX = true; int32 MP3LameQuality = 3; // 0 bool MP3LameID3v2UseLame = false; + uint8 MP3LameID3v2Version = 4; bool MP3LameCalculateReplayGain = true; bool MP3LameCalculatePeakSample = true; int32 OpusComplexity = -1; // 10 Modified: trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoderMP3.cpp ============================================================================== --- trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoderMP3.cpp Fri Oct 23 18:48:22 2026 (r25796) +++ trunk/OpenMPT/src/openmpt/streamencoder/StreamEncoderMP3.cpp Fri Oct 23 18:52:56 2026 (r25797) @@ -414,7 +414,8 @@ { ID3None, ID3v1, - ID3v2Lame, + ID3v2Lamev23, + ID3v2Lamev24, ID3v2OpenMPT, }; ID3Type id3type; @@ -442,7 +443,7 @@ Mode = Encoder::ModeInvalid; gfp_inited = false; gfp = lame_t(); - id3type = ID3v2Lame; + id3type = ID3v2Lamev23; id3v2Size = 0; if(!gfp) @@ -457,9 +458,12 @@ if(compatible) { id3type = ID3v1; - } else if(settings.Details.MP3LameID3v2UseLame) + } else if(settings.Details.MP3LameID3v2UseLame && (settings.Details.MP3LameID3v2Version <= 3)) { - id3type = ID3v2Lame; + id3type = ID3v2Lamev23; + } else if(settings.Details.MP3LameID3v2UseLame && (settings.Details.MP3LameID3v2Version >= 4)) + { + id3type = ID3v2Lamev24; } else { id3type = ID3v2OpenMPT; @@ -549,12 +553,18 @@ id3tag_init(gfp); id3tag_v1_only(gfp); break; - case ID3v2Lame: + case ID3v2Lamev23: id3tag_init(gfp); id3tag_add_v2(gfp); id3tag_v2_only(gfp); id3tag_set_pad(gfp, settings.Details.MP3ID3v2MinPadding); break; + case ID3v2Lamev24: + id3tag_init(gfp); + id3tag_add_v2_4_UTF8(gfp); + id3tag_v2_4_UTF8_only(gfp); + id3tag_set_pad(gfp, settings.Details.MP3ID3v2MinPadding); + break; case ID3v2OpenMPT: lame_set_write_id3tag_automatic(gfp, 0); break; @@ -574,7 +584,7 @@ if(!tags.comments.empty()) id3tag_set_comment(gfp, mpt::transcode<std::string>(mpt::common_encoding::iso8859_1, tags.comments).c_str()); if(!tags.trackno.empty()) id3tag_set_track(gfp, mpt::transcode<std::string>(mpt::common_encoding::iso8859_1, tags.trackno).c_str()); if(!tags.genre.empty()) id3tag_set_genre(gfp, mpt::transcode<std::string>(mpt::common_encoding::iso8859_1, tags.genre).c_str()); - } else if(id3type == ID3v2Lame) + } else if(id3type == ID3v2Lamev23) { if(!tags.title.empty()) id3tag_set_textinfo_utf16(gfp, "TIT2", ToUTF16BOMvector(mpt::transcode<std::u16string>(tags.title)).data()); if(!tags.artist.empty()) id3tag_set_textinfo_utf16(gfp, "TPE1", ToUTF16BOMvector(mpt::transcode<std::u16string>(tags.artist)).data()); @@ -583,6 +593,15 @@ if(!tags.comments.empty()) id3tag_set_textinfo_utf16(gfp, "COMM", ToUTF16BOMvector(mpt::transcode<std::u16string>(tags.comments)).data()); if(!tags.trackno.empty()) id3tag_set_textinfo_utf16(gfp, "TRCK", ToUTF16BOMvector(mpt::transcode<std::u16string>(tags.trackno)).data()); if(!tags.genre.empty()) id3tag_set_textinfo_utf16(gfp, "TCON", ToUTF16BOMvector(mpt::transcode<std::u16string>(tags.genre)).data()); + } else if(id3type == ID3v2Lamev24) + { + if(!tags.title.empty()) id3tag_set_textinfo_utf8(gfp, "TIT2", mpt::transcode<std::string>(mpt::common_encoding::utf8, tags.title).c_str()); + if(!tags.artist.empty()) id3tag_set_textinfo_utf8(gfp, "TPE1", mpt::transcode<std::string>(mpt::common_encoding::utf8, tags.artist).c_str()); + if(!tags.album.empty()) id3tag_set_textinfo_utf8(gfp, "TALB", mpt::transcode<std::string>(mpt::common_encoding::utf8, tags.album).c_str()); + if(!tags.year.empty()) id3tag_set_textinfo_utf8(gfp, "TYER", mpt::transcode<std::string>(mpt::common_encoding::utf8, tags.year).c_str()); + if(!tags.comments.empty()) id3tag_set_textinfo_utf8(gfp, "COMM", mpt::transcode<std::string>(mpt::common_encoding::utf8, tags.comments).c_str()); + if(!tags.trackno.empty()) id3tag_set_textinfo_utf8(gfp, "TRCK", mpt::transcode<std::string>(mpt::common_encoding::utf8, tags.trackno).c_str()); + if(!tags.genre.empty()) id3tag_set_textinfo_utf8(gfp, "TCON", mpt::transcode<std::string>(mpt::common_encoding::utf8, tags.genre).c_str()); } else if(id3type == ID3v2OpenMPT) { Tags = tags; @@ -662,7 +681,10 @@ tagger.WriteID3v2Tags(f, Tags, replayGain); mpt::IO::SeekAbsolute(f, endPos); } - if(id3type == ID3v2Lame) + if(id3type == ID3v2Lamev23) + { + id3v2Size = lame_get_id3v2_tag(gfp, nullptr, 0); + } else if(id3type == ID3v2Lamev24) { id3v2Size = lame_get_id3v2_tag(gfp, nullptr, 0); } else if(id3type == ID3v2OpenMPT) |