#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#include "id3.h"
MODULE = MP3::ID3Lib PACKAGE = MP3::ID3LibXS PREFIX= id3_
ID3Tag*
id3_create(package, filename)
char * package;
char * filename;
CODE:
ID3Tag *tag;
SV* rv;
tag = ID3Tag_New();
(void) ID3Tag_Link(tag, filename);
RETVAL = tag;
OUTPUT:
RETVAL
MODULE = MP3::ID3Lib PACKAGE = ID3TagPtr PREFIX= id3_
AV*
id3_frames(tag)
ID3Tag* tag;
CODE:
ID3Frame* frame;
ID3TagIterator* iterator;
int i = 0;
ID3_FrameID id;
ID3Field* field;
iterator = ID3Tag_CreateIterator(tag);
AV* ret = newAV();
while ((frame = ID3TagIterator_GetNext(iterator)) != NULL) {
id = ID3Frame_GetID(frame);
if ((field = ID3Frame_GetField(frame, ID3FN_TEXT)) != NULL) {
char title[1024];
(void) ID3Field_GetASCII(field, title, 1024);
HV* h = newHV();
SV* si = newSV(0);
sv_setiv(si, i);
SvPV_nolen(si);
hv_store(h, "index", 5, si, 0);
si = newSV(0);
sv_setiv(si, id);
hv_store(h, "type", 4, si, 0);
si = newSV(0);
sv_setpv(si, title);
hv_store(h, "value", 5, si, 0);
SV* hr = newRV_inc((SV*)h);
av_push(ret, hr);
i++;
}
}
ID3TagIterator_Delete(iterator);
RETVAL = ret;
OUTPUT:
RETVAL
void
id3_commit(tag, ins)
ID3Tag* tag;
SV* ins;
CODE:
I32 in_len, i;
SV* hr;
AV* in;
SV* offset;
SV* value;
SV* type;
SV* is_changed;
SV** svp;
HV* h;
ID3Frame* frame;
ID3TagIterator* iterator;
int id;
ID3Field* field;
if (SvTYPE(ins) != SVt_RV) {
Perl_die(aTHX_ "Expected type SV for ins");
}
in = (AV*)SvRV(ins);
if (SvTYPE(in) != SVt_PVAV) {
Perl_die(aTHX_ "Expected type AV for in");
}
in_len = av_len(in);
iterator = ID3Tag_CreateIterator(tag);
for (i = 0; i < in_len; i++) {
frame = ID3TagIterator_GetNext(iterator);
id = ID3Frame_GetID(frame);
hr = *av_fetch(in, i, 0);
if (!SvROK(hr)) {
Perl_die(aTHX_ "Expected RV for hr");
}
h = (HV*)SvRV(hr);
if (SvTYPE(h) != SVt_PVHV) {
Perl_die(aTHX_ "Expected type HV for h");
}
offset = *hv_fetch(h, "index", 5, 0);
if (!SvIOK(offset)) {
Perl_die(aTHX_ "Expected IV for offset");
}
if (i != SvIV(offset)) {
Perl_die(aTHX_ "offset != i\n");
}
is_changed = *hv_fetch(h, "is_changed", 10, 0);
if (!SvIOK(is_changed)) {
Perl_die(aTHX_ "Expected IV for is_changed");
}
if (SvIV(is_changed)) {
value = *hv_fetch(h, "value", 5, 0);
if (!SvPOK(value)) {
Perl_die(aTHX_ "Expected PV for value");
}
field = ID3Frame_GetField(frame, ID3FN_TEXT);
ID3Field_SetASCII(field, SvPV_nolen(value));
}
}
ID3Tag_Update(tag);
void
id3_add_frame(tag, id, value)
ID3Tag* tag;
int id;
char* value;
CODE:
ID3Frame* frame;
ID3_FrameID fid;
ID3Field* field;
fid = (ID3_FrameID) id;
frame = ID3Frame_NewID(fid);
field = ID3Frame_GetField(frame, ID3FN_TEXT);
ID3Field_SetASCII(field, value);
ID3Tag_AttachFrame(tag, frame);
void
id3_DESTROY(tag)
ID3Tag* tag;
CODE:
ID3Tag_Delete(tag);