diff options
-rw-r--r-- | doc/html/changelog.html | 1 | ||||
-rw-r--r-- | doc/html/documentation.html | 9 | ||||
-rw-r--r-- | include/share/grabbag/replaygain.h | 5 | ||||
-rw-r--r-- | man/metaflac.sgml | 8 | ||||
-rw-r--r-- | src/metaflac/options.c | 15 | ||||
-rw-r--r-- | src/metaflac/usage.c | 1 | ||||
-rw-r--r-- | src/share/grabbag/replaygain.c | 29 | ||||
-rwxr-xr-x | test/test_metaflac.sh | 8 |
8 files changed, 62 insertions, 14 deletions
diff --git a/doc/html/changelog.html b/doc/html/changelog.html index 93cb4154..d154b2cc 100644 --- a/doc/html/changelog.html +++ b/doc/html/changelog.html @@ -94,6 +94,7 @@ <li> metaflac: <ul> + <li>Added shorthand operation <a href="documentation.html#metaflac_shorthand_remove_replay_gain"><span class="argument">--remove-replay-gain</span></a> for removing ReplayGain tags.</li> <li>Importing of non-CDDA-compliant cuesheets now issues a warning.</li> </ul> </li> diff --git a/doc/html/documentation.html b/doc/html/documentation.html index 6631a2b5..df12b16b 100644 --- a/doc/html/documentation.html +++ b/doc/html/documentation.html @@ -1166,6 +1166,15 @@ </tr> <tr> <td nowrap="nowrap" align="right" valign="top" bgcolor="#F4F4CC"> + <a name="metaflac_shorthand_remove_replay_gain" /> + <span class="argument">--remove-replay-gain</span> + </td> + <td> + Removes the ReplayGain tags. + </td> + </tr> + <tr> + <td nowrap="nowrap" align="right" valign="top" bgcolor="#F4F4CC"> <a name="metaflac_shorthand_add_seekpoint" /> <span class="argument">--add-seekpoint={#|X|#x|#s}</span> </td> diff --git a/include/share/grabbag/replaygain.h b/include/share/grabbag/replaygain.h index 2d1111ce..e8af2d01 100644 --- a/include/share/grabbag/replaygain.h +++ b/include/share/grabbag/replaygain.h @@ -35,6 +35,11 @@ extern "C" { extern const unsigned GRABBAG__REPLAYGAIN_MAX_TAG_SPACE_REQUIRED; +extern const FLAC__byte * const GRABBAG__REPLAYGAIN_TAG_TITLE_GAIN; /* = "REPLAYGAIN_TRACK_GAIN" */ +extern const FLAC__byte * const GRABBAG__REPLAYGAIN_TAG_TITLE_PEAK; /* = "REPLAYGAIN_TRACK_PEAK" */ +extern const FLAC__byte * const GRABBAG__REPLAYGAIN_TAG_ALBUM_GAIN; /* = "REPLAYGAIN_ALBUM_GAIN" */ +extern const FLAC__byte * const GRABBAG__REPLAYGAIN_TAG_ALBUM_PEAK; /* = "REPLAYGAIN_ALBUM_PEAK" */ + FLAC__bool grabbag__replaygain_is_valid_sample_frequency(unsigned sample_frequency); FLAC__bool grabbag__replaygain_init(unsigned sample_frequency); diff --git a/man/metaflac.sgml b/man/metaflac.sgml index 04236466..b2177e86 100644 --- a/man/metaflac.sgml +++ b/man/metaflac.sgml @@ -304,6 +304,14 @@ manpage.1: manpage.sgml </listitem> </varlistentry> <varlistentry> + <term><option>--remove-replay-gain</option></term> + <listitem> + <para> + Removes the ReplayGain tags. + </para> + </listitem> + </varlistentry> + <varlistentry> <term><option>--add-seekpoint</option>={<replaceable>#</replaceable>|<replaceable>X</replaceable>|<replaceable>#x</replaceable>|<replaceable>#s</replaceable>}</term> <listitem> <para> diff --git a/src/metaflac/options.c b/src/metaflac/options.c index dd6f3878..0f38b6f1 100644 --- a/src/metaflac/options.c +++ b/src/metaflac/options.c @@ -20,6 +20,7 @@ #include "usage.h" #include "utils.h" #include "FLAC/assert.h" +#include "share/grabbag/replaygain.h" #include <ctype.h> #include <stdio.h> #include <stdlib.h> @@ -76,6 +77,7 @@ struct share__option long_options_[] = { { "export-cuesheet-to", 1, 0, 0 }, { "add-seekpoint", 1, 0, 0 }, { "add-replay-gain", 0, 0, 0 }, + { "remove-replay-gain", 0, 0, 0 }, { "add-padding", 1, 0, 0 }, /* major operations */ { "help", 0, 0, 0 }, @@ -568,6 +570,19 @@ FLAC__bool parse_option(int option_index, const char *option_argument, CommandLi else if(0 == strcmp(opt, "add-replay-gain")) { (void) append_shorthand_operation(options, OP__ADD_REPLAY_GAIN); } + else if(0 == strcmp(opt, "remove-replay-gain")) { + const FLAC__byte * const tags[4] = { + GRABBAG__REPLAYGAIN_TAG_TITLE_GAIN, + GRABBAG__REPLAYGAIN_TAG_TITLE_PEAK, + GRABBAG__REPLAYGAIN_TAG_ALBUM_GAIN, + GRABBAG__REPLAYGAIN_TAG_ALBUM_PEAK + }; + size_t i; + for(i = 0; i < sizeof(tags)/sizeof(tags[0]); i++) { + op = append_shorthand_operation(options, OP__REMOVE_VC_FIELD); + op->argument.vc_field_name.value = local_strdup((const char *)tags[i]); + } + } else if(0 == strcmp(opt, "add-padding")) { op = append_shorthand_operation(options, OP__ADD_PADDING); FLAC__ASSERT(0 != option_argument); diff --git a/src/metaflac/usage.c b/src/metaflac/usage.c index 7f92e0b1..aa9ff426 100644 --- a/src/metaflac/usage.c +++ b/src/metaflac/usage.c @@ -149,6 +149,7 @@ int long_usage(const char *message, ...) fprintf(out, " must have the same resolution, sample rate, and number\n"); fprintf(out, " of channels. The sample rate must be one of 8, 11.025,\n"); fprintf(out, " 12, 16, 22.05, 24, 32, 44.1, or 48 kHz.\n"); + fprintf(out, "--remove-replay-gain Removes the ReplayGain tags.\n"); fprintf(out, "--add-seekpoint={#|X|#x|#s} Add seek points to a SEEKTABLE block\n"); fprintf(out, " # : a specific sample number for a seek point\n"); fprintf(out, " X : a placeholder point (always goes at the end of the SEEKTABLE)\n"); diff --git a/src/share/grabbag/replaygain.c b/src/share/grabbag/replaygain.c index f209769c..251e0e6d 100644 --- a/src/share/grabbag/replaygain.c +++ b/src/share/grabbag/replaygain.c @@ -41,10 +41,6 @@ #endif #define local_max(a,b) ((a)>(b)?(a):(b)) -static const FLAC__byte * const tag_title_gain_ = (const FLAC__byte * const)"REPLAYGAIN_TRACK_GAIN"; -static const FLAC__byte * const tag_title_peak_ = (const FLAC__byte * const)"REPLAYGAIN_TRACK_PEAK"; -static const FLAC__byte * const tag_album_gain_ = (const FLAC__byte * const)"REPLAYGAIN_ALBUM_GAIN"; -static const FLAC__byte * const tag_album_peak_ = (const FLAC__byte * const)"REPLAYGAIN_ALBUM_PEAK"; static const char *peak_format_ = "%s=%1.8f"; static const char *gain_format_ = "%s=%+2.2f dB"; @@ -58,6 +54,11 @@ const unsigned GRABBAG__REPLAYGAIN_MAX_TAG_SPACE_REQUIRED = 148; FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN/8 + 21 + 1 + 12 */ +const FLAC__byte * const GRABBAG__REPLAYGAIN_TAG_TITLE_GAIN = (const FLAC__byte * const)"REPLAYGAIN_TRACK_GAIN"; +const FLAC__byte * const GRABBAG__REPLAYGAIN_TAG_TITLE_PEAK = (const FLAC__byte * const)"REPLAYGAIN_TRACK_PEAK"; +const FLAC__byte * const GRABBAG__REPLAYGAIN_TAG_ALBUM_GAIN = (const FLAC__byte * const)"REPLAYGAIN_ALBUM_GAIN"; +const FLAC__byte * const GRABBAG__REPLAYGAIN_TAG_ALBUM_PEAK = (const FLAC__byte * const)"REPLAYGAIN_ALBUM_PEAK"; + static FLAC__bool get_file_stats_(const char *filename, struct stat *stats) { @@ -384,14 +385,14 @@ const char *grabbag__replaygain_store_to_vorbiscomment_album(FLAC__StreamMetadat FLAC__ASSERT(block->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); if( - FLAC__metadata_object_vorbiscomment_remove_entries_matching(block, (const char *)tag_album_gain_) < 0 || - FLAC__metadata_object_vorbiscomment_remove_entries_matching(block, (const char *)tag_album_peak_) < 0 + FLAC__metadata_object_vorbiscomment_remove_entries_matching(block, (const char *)GRABBAG__REPLAYGAIN_TAG_ALBUM_GAIN) < 0 || + FLAC__metadata_object_vorbiscomment_remove_entries_matching(block, (const char *)GRABBAG__REPLAYGAIN_TAG_ALBUM_PEAK) < 0 ) return "memory allocation error"; if( - !append_tag_(block, peak_format_, tag_album_peak_, album_peak) || - !append_tag_(block, gain_format_, tag_album_gain_, album_gain) + !append_tag_(block, peak_format_, GRABBAG__REPLAYGAIN_TAG_ALBUM_PEAK, album_peak) || + !append_tag_(block, gain_format_, GRABBAG__REPLAYGAIN_TAG_ALBUM_GAIN, album_gain) ) return "memory allocation error"; @@ -404,14 +405,14 @@ const char *grabbag__replaygain_store_to_vorbiscomment_title(FLAC__StreamMetadat FLAC__ASSERT(block->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); if( - FLAC__metadata_object_vorbiscomment_remove_entries_matching(block, (const char *)tag_title_gain_) < 0 || - FLAC__metadata_object_vorbiscomment_remove_entries_matching(block, (const char *)tag_title_peak_) < 0 + FLAC__metadata_object_vorbiscomment_remove_entries_matching(block, (const char *)GRABBAG__REPLAYGAIN_TAG_TITLE_GAIN) < 0 || + FLAC__metadata_object_vorbiscomment_remove_entries_matching(block, (const char *)GRABBAG__REPLAYGAIN_TAG_TITLE_PEAK) < 0 ) return "memory allocation error"; if( - !append_tag_(block, peak_format_, tag_title_peak_, title_peak) || - !append_tag_(block, gain_format_, tag_title_gain_, title_gain) + !append_tag_(block, peak_format_, GRABBAG__REPLAYGAIN_TAG_TITLE_PEAK, title_peak) || + !append_tag_(block, gain_format_, GRABBAG__REPLAYGAIN_TAG_TITLE_GAIN, title_gain) ) return "memory allocation error"; @@ -587,9 +588,9 @@ FLAC__bool grabbag__replaygain_load_from_vorbiscomment(const FLAC__StreamMetadat FLAC__ASSERT(0 != block); FLAC__ASSERT(block->type == FLAC__METADATA_TYPE_VORBIS_COMMENT); - if(0 > (gain_offset = FLAC__metadata_object_vorbiscomment_find_entry_from(block, /*offset=*/0, (const char *)(album_mode? tag_album_gain_ : tag_title_gain_)))) + if(0 > (gain_offset = FLAC__metadata_object_vorbiscomment_find_entry_from(block, /*offset=*/0, (const char *)(album_mode? GRABBAG__REPLAYGAIN_TAG_ALBUM_GAIN : GRABBAG__REPLAYGAIN_TAG_TITLE_GAIN)))) return false; - if(0 > (peak_offset = FLAC__metadata_object_vorbiscomment_find_entry_from(block, /*offset=*/0, (const char *)(album_mode? tag_album_peak_ : tag_title_peak_)))) + if(0 > (peak_offset = FLAC__metadata_object_vorbiscomment_find_entry_from(block, /*offset=*/0, (const char *)(album_mode? GRABBAG__REPLAYGAIN_TAG_ALBUM_PEAK : GRABBAG__REPLAYGAIN_TAG_TITLE_PEAK)))) return false; if(!parse_double_(block->data.vorbis_comment.comments + gain_offset, gain)) diff --git a/test/test_metaflac.sh b/test/test_metaflac.sh index 26ab690a..744199f8 100755 --- a/test/test_metaflac.sh +++ b/test/test_metaflac.sh @@ -324,6 +324,14 @@ rm -f $cs_out $cs_out2 (set -x && run_metaflac --add-replay-gain $flacfile) check_exit check_flac +(set -x && run_metaflac --list --block-type=VORBIS_COMMENT $flacfile) +check_exit + +(set -x && run_metaflac --remove-replay-gain $flacfile) +check_exit +check_flac +(set -x && run_metaflac --list --block-type=VORBIS_COMMENT $flacfile) +check_exit echo -n "Testing FLAC file with unknown metadata... " cp -p metaflac.flac.in $flacfile |