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.
This commit is contained in:
Max Kellermann 2012-02-11 19:36:59 +01:00
parent 29bf3d2c04
commit 1783aac438

View File

@ -272,6 +272,20 @@ wavpack_replaygain(struct replay_gain_info *replay_gain_info,
return found; 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. * Reads metainfo from the specified file.
*/ */
@ -281,8 +295,6 @@ wavpack_scan_file(const char *fname,
{ {
WavpackContext *wpc; WavpackContext *wpc;
char error[ERRORLEN]; char error[ERRORLEN];
char *s;
int size, allocated_size;
wpc = WavpackOpenFileInput(fname, error, OPEN_TAGS, 0); wpc = WavpackOpenFileInput(fname, error, OPEN_TAGS, 0);
if (wpc == NULL) { if (wpc == NULL) {
@ -297,30 +309,9 @@ wavpack_scan_file(const char *fname,
WavpackGetNumSamples(wpc) / WavpackGetNumSamples(wpc) /
WavpackGetSampleRate(wpc)); WavpackGetSampleRate(wpc));
allocated_size = 0; for (const struct tag_table *i = wavpack_tags; i->name != NULL; ++i)
s = NULL; wavpack_scan_tag_item(wpc, i->name, i->type,
handler, handler_ctx);
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);
WavpackCloseFile(wpc); WavpackCloseFile(wpc);