From 83b8d28f9d807e7cf12e4441d1a03305e16e5f3a Mon Sep 17 00:00:00 2001 From: Josh Coalson Date: Wed, 31 Aug 2005 00:30:41 +0000 Subject: [PATCH] add shorthand option --remove-replay-gain to metaflac --- doc/html/changelog.html | 1 + doc/html/documentation.html | 9 +++++++++ include/share/grabbag/replaygain.h | 5 +++++ man/metaflac.sgml | 8 ++++++++ src/metaflac/options.c | 15 +++++++++++++++ src/metaflac/usage.c | 1 + src/share/grabbag/replaygain.c | 29 +++++++++++++++-------------- 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 @@
  • metaflac:
  • 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 @@ -1164,6 +1164,15 @@ Calculates the title and album gains/peaks of the given FLAC files as if all the files were part of one album, then stores them in the VORBIS_COMMENT block. The tags are the same as those used by vorbisgain. Existing ReplayGain tags will be replaced. If only one FLAC file is given, the album and title gains will be the same. Since this operation requires two passes, it is always executed last, after all other operations have been completed and written to disk. All FLAC files specified must have the same resolution, sample rate, and number of channels. The sample rate must be one of 8, 11.025, 12, 16, 22.05, 24, 32, 44.1, or 48 kHz. + + + + --remove-replay-gain + + + Removes the ReplayGain tags. + + 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 @@ -303,6 +303,14 @@ manpage.1: manpage.sgml + + + + + Removes the ReplayGain tags. + + + ={#|X|#x|#s} 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 #include #include @@ -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