diff options
Diffstat (limited to '')
-rw-r--r-- | src/decoder/_flac_common.c | 52 |
1 files changed, 24 insertions, 28 deletions
diff --git a/src/decoder/_flac_common.c b/src/decoder/_flac_common.c index 9b3272cf2..7516a7ae5 100644 --- a/src/decoder/_flac_common.c +++ b/src/decoder/_flac_common.c @@ -54,9 +54,9 @@ flac_data_deinit(struct flac_data *data) tag_free(data->tag); } -static void +static bool flac_find_float_comment(const FLAC__StreamMetadata *block, - const char *cmnt, float *fl, bool *found_r) + const char *cmnt, float *fl) { int offset; size_t pos; @@ -66,12 +66,12 @@ flac_find_float_comment(const FLAC__StreamMetadata *block, offset = FLAC__metadata_object_vorbiscomment_find_entry_from(block, 0, cmnt); if (offset < 0) - return; + return false; pos = strlen(cmnt) + 1; /* 1 is for '=' */ len = block->data.vorbis_comment.comments[offset].length - pos; if (len <= 0) - return; + return false; p = &block->data.vorbis_comment.comments[offset].entry[pos]; tmp = p[len]; @@ -79,37 +79,31 @@ flac_find_float_comment(const FLAC__StreamMetadata *block, *fl = (float)atof((char *)p); p[len] = tmp; - *found_r = true; + return true; } -static void -flac_parse_replay_gain(const FLAC__StreamMetadata *block, - struct flac_data *data) +static struct replay_gain_info * +flac_parse_replay_gain(const FLAC__StreamMetadata *block) { + struct replay_gain_info *rgi; bool found = false; - if (data->replay_gain_info) - replay_gain_info_free(data->replay_gain_info); - - data->replay_gain_info = replay_gain_info_new(); - - flac_find_float_comment(block, "replaygain_album_gain", - &data->replay_gain_info->tuples[REPLAY_GAIN_ALBUM].gain, - &found); - flac_find_float_comment(block, "replaygain_album_peak", - &data->replay_gain_info->tuples[REPLAY_GAIN_ALBUM].peak, - &found); - flac_find_float_comment(block, "replaygain_track_gain", - &data->replay_gain_info->tuples[REPLAY_GAIN_TRACK].gain, - &found); - flac_find_float_comment(block, "replaygain_track_peak", - &data->replay_gain_info->tuples[REPLAY_GAIN_TRACK].peak, - &found); + rgi = replay_gain_info_new(); + found = flac_find_float_comment(block, "replaygain_album_gain", + &rgi->tuples[REPLAY_GAIN_ALBUM].gain) || + flac_find_float_comment(block, "replaygain_album_peak", + &rgi->tuples[REPLAY_GAIN_ALBUM].peak) || + flac_find_float_comment(block, "replaygain_track_gain", + &rgi->tuples[REPLAY_GAIN_TRACK].gain) || + flac_find_float_comment(block, "replaygain_track_peak", + &rgi->tuples[REPLAY_GAIN_TRACK].peak); if (!found) { - replay_gain_info_free(data->replay_gain_info); - data->replay_gain_info = NULL; + replay_gain_info_free(rgi); + rgi = NULL; } + + return rgi; } /** @@ -236,7 +230,9 @@ void flac_metadata_common_cb(const FLAC__StreamMetadata * block, data->total_time = ((float)si->total_samples) / (si->sample_rate); break; case FLAC__METADATA_TYPE_VORBIS_COMMENT: - flac_parse_replay_gain(block, data); + if (data->replay_gain_info) + replay_gain_info_free(data->replay_gain_info); + data->replay_gain_info = flac_parse_replay_gain(block); if (data->tag != NULL) flac_vorbis_comments_to_tag(data->tag, NULL, |