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:
parent
29bf3d2c04
commit
1783aac438
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user