diff --git a/src/decoder/plugins/MadDecoderPlugin.cxx b/src/decoder/plugins/MadDecoderPlugin.cxx index 4ad0efc0d..b422178d2 100644 --- a/src/decoder/plugins/MadDecoderPlugin.cxx +++ b/src/decoder/plugins/MadDecoderPlugin.cxx @@ -23,6 +23,7 @@ #include "input/InputStream.hxx" #include "config/Block.hxx" #include "tag/Id3Scan.hxx" +#include "tag/Id3ReplayGain.hxx" #include "tag/Rva2.hxx" #include "tag/Handler.hxx" #include "tag/ReplayGain.hxx" @@ -254,40 +255,6 @@ MadDecoder::FillBuffer() return true; } -#ifdef ENABLE_ID3TAG -static bool -parse_id3_replay_gain_info(ReplayGainInfo &rgi, - struct id3_tag *tag) -{ - bool found = false; - - rgi.Clear(); - - struct id3_frame *frame; - for (unsigned i = 0; (frame = id3_tag_findframe(tag, "TXXX", i)); i++) { - if (frame->nfields < 3) - continue; - - char *const key = (char *) - id3_ucs4_latin1duplicate(id3_field_getstring - (&frame->fields[1])); - char *const value = (char *) - id3_ucs4_latin1duplicate(id3_field_getstring - (&frame->fields[2])); - - if (ParseReplayGainTag(rgi, key, value)) - found = true; - - free(key); - free(value); - } - - return found || - /* fall back on RVA2 if no replaygain tags found */ - tag_rva2_parse(tag, rgi); -} -#endif - #ifdef ENABLE_ID3TAG gcc_pure static MixRampInfo @@ -358,7 +325,7 @@ MadDecoder::ParseId3(size_t tagsize, Tag **mpd_tag) if (client != nullptr) { ReplayGainInfo rgi; - if (parse_id3_replay_gain_info(rgi, id3_tag)) { + if (Id3ToReplayGainInfo(rgi, id3_tag)) { client->SubmitReplayGain(&rgi); found_replay_gain = true; } diff --git a/src/tag/Id3ReplayGain.cxx b/src/tag/Id3ReplayGain.cxx new file mode 100644 index 000000000..94a5a0bc4 --- /dev/null +++ b/src/tag/Id3ReplayGain.cxx @@ -0,0 +1,59 @@ +/* + * Copyright 2003-2018 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "config.h" +#include "Id3ReplayGain.hxx" +#include "Rva2.hxx" +#include "ReplayGain.hxx" +#include "ReplayGainInfo.hxx" + +#include + +#include + +bool +Id3ToReplayGainInfo(ReplayGainInfo &rgi, const struct id3_tag *tag) noexcept +{ + bool found = false; + + rgi.Clear(); + + struct id3_frame *frame; + for (unsigned i = 0; (frame = id3_tag_findframe(tag, "TXXX", i)); i++) { + if (frame->nfields < 3) + continue; + + char *const key = (char *) + id3_ucs4_latin1duplicate(id3_field_getstring + (&frame->fields[1])); + char *const value = (char *) + id3_ucs4_latin1duplicate(id3_field_getstring + (&frame->fields[2])); + + if (ParseReplayGainTag(rgi, key, value)) + found = true; + + free(key); + free(value); + } + + return found || + /* fall back on RVA2 if no replaygain tags found */ + tag_rva2_parse(tag, rgi); +} diff --git a/src/tag/Id3ReplayGain.hxx b/src/tag/Id3ReplayGain.hxx new file mode 100644 index 000000000..642b7ce7b --- /dev/null +++ b/src/tag/Id3ReplayGain.hxx @@ -0,0 +1,31 @@ +/* + * Copyright 2003-2018 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef MPD_TAG_ID3_REPLAY_GAIN_HXX +#define MPD_TAG_ID3_REPLAY_GAIN_HXX + +#include "check.h" + +struct id3_tag; +struct ReplayGainInfo; + +bool +Id3ToReplayGainInfo(ReplayGainInfo &rgi, const struct id3_tag *tag) noexcept; + +#endif diff --git a/src/tag/meson.build b/src/tag/meson.build index 8e23c879c..b0121a71d 100644 --- a/src/tag/meson.build +++ b/src/tag/meson.build @@ -27,6 +27,7 @@ if libid3tag_dep.found() tag_sources += [ 'Id3Load.cxx', 'Id3Scan.cxx', + 'Id3ReplayGain.cxx', 'Rva2.cxx', 'Riff.cxx', 'Aiff.cxx',