ref: 244d6dbe34069fb8f8c4cc61e5c4725537f0cfd6
dir: /tags.c/
#include "tagspriv.h"
typedef struct Getter Getter;
struct Getter
{
int (*f)(Tagctx *ctx);
int format;
};
static const Getter g[] =
{
{tagid3v2, Fmp3},
{tagid3v1, Fmp3},
{tagvorbis, Fvorbis},
{tagflac, Fflac},
{tagm4a, Fm4a},
{tagopus, Fopus},
{tagwav, Fwav},
{tagit, Fit},
{tagxm, Fxm},
{tags3m, Fs3m},
{tagmod, Fmod},
};
void
tagscallcb(Tagctx *ctx, int type, const char *k, char *s, int offset, int size, Tagread f)
{
char *e;
if(f == nil && size == 0){
while((uint8_t)*s <= ' ' && *s)
s++;
e = s + strlen(s);
while(e != s && (uint8_t)e[-1] <= ' ')
e--;
if(*e != 0)
*e = 0;
}
if(*s){
ctx->tag(ctx, type, k, s, offset, size, f);
if(type != Tunknown){
ctx->found |= 1<<type;
}
}
}
int
tagsget(Tagctx *ctx)
{
int i, res;
ctx->channels = ctx->samplerate = ctx->bitrate = ctx->duration = 0;
ctx->found = 0;
ctx->format = Funknown;
ctx->restart = 0;
res = -1;
for(i = 0; i < nelem(g); i++){
if(g[i].f(ctx) == 0){
ctx->format = g[i].format;
res = 0;
}
ctx->seek(ctx, ctx->restart, 0);
}
return res;
}