aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2012-02-11 19:36:59 +0100
committerMax Kellermann <max@duempel.org>2012-02-11 19:36:59 +0100
commit1783aac4384ccc53d9ad25c237d4286ccdbccbc0 (patch)
treee2ca41281160306d974d9efff2f34bd9c41424a0
parent29bf3d2c040bf2f1f06f2ef9a2dcb42b0962e5d6 (diff)
decoder/wavpack: move code to wavpack_scan_tag_item()
Remove clutter from wavpack_scan_file(), and use a (large) fixed buffer for the tag item.
-rw-r--r--src/decoder/wavpack_decoder_plugin.c43
1 files changed, 17 insertions, 26 deletions
diff --git a/src/decoder/wavpack_decoder_plugin.c b/src/decoder/wavpack_decoder_plugin.c
index 0e11cff2..7ba50ba3 100644
--- a/src/decoder/wavpack_decoder_plugin.c
+++ b/src/decoder/wavpack_decoder_plugin.c
@@ -272,6 +272,20 @@ wavpack_replaygain(struct replay_gain_info *replay_gain_info,
return found;
}
+static void
+wavpack_scan_tag_item(WavpackContext *wpc, const char *name,
+ enum tag_type type,
+ const struct tag_handler *handler, void *handler_ctx)
+{
+ char buffer[1024];
+ int len = WavpackGetTagItem(wpc, name, buffer, sizeof(buffer));
+ if (len <= 0 || (unsigned)len >= sizeof(buffer))
+ return;
+
+ tag_handler_invoke_tag(handler, handler_ctx, type, buffer);
+
+}
+
/*
* Reads metainfo from the specified file.
*/
@@ -281,8 +295,6 @@ wavpack_scan_file(const char *fname,
{
WavpackContext *wpc;
char error[ERRORLEN];
- char *s;
- int size, allocated_size;
wpc = WavpackOpenFileInput(fname, error, OPEN_TAGS, 0);
if (wpc == NULL) {
@@ -297,30 +309,9 @@ wavpack_scan_file(const char *fname,
WavpackGetNumSamples(wpc) /
WavpackGetSampleRate(wpc));
- allocated_size = 0;
- s = NULL;
-
- for (const struct tag_table *i = wavpack_tags; i->name != NULL; ++i) {
- size = WavpackGetTagItem(wpc, i->name, NULL, 0);
- if (size > 0) {
- ++size; /* EOS */
-
- if (s == NULL) {
- s = g_malloc(size);
- allocated_size = size;
- } else if (size > allocated_size) {
- char *t = (char *)g_realloc(s, size);
- allocated_size = size;
- s = t;
- }
-
- WavpackGetTagItem(wpc, i->name, s, size);
- tag_handler_invoke_tag(handler, handler_ctx,
- i->type, s);
- }
- }
-
- g_free(s);
+ for (const struct tag_table *i = wavpack_tags; i->name != NULL; ++i)
+ wavpack_scan_tag_item(wpc, i->name, i->type,
+ handler, handler_ctx);
WavpackCloseFile(wpc);