aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-11-10 22:03:58 +0100
committerMax Kellermann <max@duempel.org>2009-11-10 22:03:58 +0100
commitc1a999c4927181d5b9621af7a7808266e17f64e2 (patch)
treec9268ba8554e9bc04a87d6977a209b91857b3e1e /src
parente51d9fc6a9902c2ef448abf8f1151964a441d788 (diff)
decoder/flac: don't use float to calculate song duration
Simple (up-rounding) integer division is good enough. We're casting the result back to an integer anyway.
Diffstat (limited to 'src')
-rw-r--r--src/decoder/_flac_common.h7
-rw-r--r--src/decoder/flac_plugin.c7
-rw-r--r--src/decoder/oggflac_plugin.c4
3 files changed, 10 insertions, 8 deletions
diff --git a/src/decoder/_flac_common.h b/src/decoder/_flac_common.h
index fc240aa1..363f1ae8 100644
--- a/src/decoder/_flac_common.h
+++ b/src/decoder/_flac_common.h
@@ -159,6 +159,13 @@ struct flac_data {
struct tag *tag;
};
+static inline unsigned
+flac_duration(const FLAC__StreamMetadata_StreamInfo *stream_info)
+{
+ return (stream_info->total_samples + stream_info->sample_rate - 1) /
+ stream_info->sample_rate;
+}
+
/* initializes a given FlacData struct */
void
flac_data_init(struct flac_data *data, struct decoder * decoder,
diff --git a/src/decoder/flac_plugin.c b/src/decoder/flac_plugin.c
index e2620c67..1694f71f 100644
--- a/src/decoder/flac_plugin.c
+++ b/src/decoder/flac_plugin.c
@@ -272,8 +272,7 @@ flac_tag_load(const char *file, const char *char_tnum)
flac_vorbis_comments_to_tag(tag, char_tnum,
&block->data.vorbis_comment);
} else if (block->type == FLAC__METADATA_TYPE_STREAMINFO) {
- tag->time = ((float)block->data.stream_info.total_samples) /
- block->data.stream_info.sample_rate + 0.5;
+ tag->time = flac_duration(&block->data.stream_info);
}
FLAC__metadata_object_delete(block);
} while (FLAC__metadata_simple_iterator_next(it));
@@ -853,9 +852,7 @@ oggflac_tag_dup(const char *file)
flac_vorbis_comments_to_tag(ret, NULL,
&block->data.vorbis_comment);
} else if (block->type == FLAC__METADATA_TYPE_STREAMINFO) {
- ret->time = ((float)block->data.stream_info.
- total_samples) /
- block->data.stream_info.sample_rate + 0.5;
+ ret->time = flac_duration(&block->data.stream_info);
}
} while (FLAC__metadata_iterator_next(it));
FLAC__metadata_iterator_delete(it);
diff --git a/src/decoder/oggflac_plugin.c b/src/decoder/oggflac_plugin.c
index 0f5e774c..a4912f8a 100644
--- a/src/decoder/oggflac_plugin.c
+++ b/src/decoder/oggflac_plugin.c
@@ -172,9 +172,7 @@ static void of_metadata_dup_cb(G_GNUC_UNUSED const OggFLAC__SeekableStreamDecode
switch (block->type) {
case FLAC__METADATA_TYPE_STREAMINFO:
- data->tag->time = ((float)block->data.stream_info.
- total_samples) /
- block->data.stream_info.sample_rate + 0.5;
+ data->tag->time = flac_duration(&block->data.stream_info);
return;
case FLAC__METADATA_TYPE_VORBIS_COMMENT:
flac_vorbis_comments_to_tag(data->tag, NULL,