📄 misc_support.cpp
字号:
}
char *ID3_GetTrack(const ID3_Tag *tag)
{
char *sTrack = NULL;
if (NULL == tag)
{
return sTrack;
}
ID3_Frame *frame = tag->Find(ID3FID_TRACKNUM);
if (frame != NULL)
{
sTrack = ID3_GetString(frame, ID3FN_TEXT);
}
return sTrack;
}
size_t ID3_GetTrackNum(const ID3_Tag *tag)
{
char *sTrack = ID3_GetTrack(tag);
size_t nTrack = 0;
if (NULL != sTrack)
{
nTrack = atoi(sTrack);
delete [] sTrack;
}
return nTrack;
}
ID3_Frame* ID3_AddTrack(ID3_Tag *tag, uchar trk, uchar ttl, bool replace)
{
ID3_Frame* frame = NULL;
if (NULL != tag && trk > 0)
{
if (replace)
{
ID3_RemoveTracks(tag);
}
if (replace || NULL == tag->Find(ID3FID_TRACKNUM))
{
frame = new ID3_Frame(ID3FID_TRACKNUM);
if (frame)
{
char *sTrack = NULL;
if (0 == ttl)
{
sTrack = new char[4];
sprintf(sTrack, "%lu", (luint) trk);
}
else
{
sTrack = new char[8];
sprintf(sTrack, "%lu/%lu", (luint) trk, (luint) ttl);
}
frame->GetField(ID3FN_TEXT)->Set(sTrack);
tag->AttachFrame(frame);
delete [] sTrack;
}
}
}
return frame;
}
size_t ID3_RemoveTracks(ID3_Tag *tag)
{
size_t num_removed = 0;
ID3_Frame *frame = NULL;
if (NULL == tag)
{
return num_removed;
}
while ((frame = tag->Find(ID3FID_TRACKNUM)))
{
frame = tag->RemoveFrame(frame);
delete frame;
num_removed++;
}
return num_removed;
}
char *ID3_GetGenre(const ID3_Tag *tag)
{
char *sGenre = NULL;
if (NULL == tag)
{
return sGenre;
}
ID3_Frame *frame = tag->Find(ID3FID_CONTENTTYPE);
if (frame != NULL)
{
sGenre = ID3_GetString(frame, ID3FN_TEXT);
}
return sGenre;
}
size_t ID3_GetGenreNum(const ID3_Tag *tag)
{
char *sGenre = ID3_GetGenre(tag);
size_t ulGenre = 0xFF;
if (NULL == sGenre)
{
return ulGenre;
}
// If the genre string begins with "(ddd)", where "ddd" is a number, then
// "ddd" is the genre number---get it
if (sGenre[0] == '(')
{
char *pCur = &sGenre[1];
while (isdigit(*pCur))
{
pCur++;
}
if (*pCur == ')')
{
// if the genre number is greater than 255, its invalid.
ulGenre = dami::min(0xFF, atoi(&sGenre[1]));
}
}
delete [] sGenre;
return ulGenre;
}
ID3_Frame* ID3_AddGenre(ID3_Tag *tag, size_t genre, bool replace)
{
ID3_Frame* frame = NULL;
if (NULL != tag && 0xFF != genre)
{
if (replace)
{
ID3_RemoveGenres(tag);
}
if (replace || NULL == tag->Find(ID3FID_CONTENTTYPE))
{
frame = new ID3_Frame(ID3FID_CONTENTTYPE);
if (NULL != frame)
{
char sGenre[6];
sprintf(sGenre, "(%lu)", (luint) genre);
frame->GetField(ID3FN_TEXT)->Set(sGenre);
tag->AttachFrame(frame);
}
}
}
return frame;
}
size_t ID3_RemoveGenres(ID3_Tag *tag)
{
size_t num_removed = 0;
ID3_Frame *frame = NULL;
if (NULL == tag)
{
return num_removed;
}
while ((frame = tag->Find(ID3FID_CONTENTTYPE)))
{
frame = tag->RemoveFrame(frame);
delete frame;
num_removed++;
}
return num_removed;
}
char *ID3_GetLyrics(const ID3_Tag *tag)
{
char *sLyrics = NULL;
if (NULL == tag)
{
return sLyrics;
}
ID3_Frame *frame = tag->Find(ID3FID_UNSYNCEDLYRICS);
if (frame != NULL)
{
sLyrics = ID3_GetString(frame, ID3FN_TEXT);
}
return sLyrics;
}
ID3_Frame* ID3_AddLyrics(ID3_Tag *tag, const char *text, bool replace)
{
return ID3_AddLyrics(tag, text, "", replace);
}
ID3_Frame* ID3_AddLyrics(ID3_Tag *tag, const char *text, const char* desc,
bool replace)
{
return ID3_AddLyrics(tag, text, desc, "XXX", replace);
}
ID3_Frame* ID3_AddLyrics(ID3_Tag *tag, const char *text, const char* desc,
const char* lang, bool replace)
{
ID3_Frame* frame = NULL;
if (NULL != tag && strlen(text) > 0)
{
if (replace)
{
ID3_RemoveLyrics(tag);
}
if (replace || tag->Find(ID3FID_UNSYNCEDLYRICS) == NULL)
{
frame = new ID3_Frame(ID3FID_UNSYNCEDLYRICS);
if (NULL != frame)
{
frame->GetField(ID3FN_LANGUAGE)->Set(lang);
frame->GetField(ID3FN_DESCRIPTION)->Set(desc);
frame->GetField(ID3FN_TEXT)->Set(text);
tag->AttachFrame(frame);
}
}
}
return frame;
}
size_t ID3_RemoveLyrics(ID3_Tag *tag)
{
size_t num_removed = 0;
ID3_Frame *frame = NULL;
if (NULL == tag)
{
return num_removed;
}
while ((frame = tag->Find(ID3FID_UNSYNCEDLYRICS)))
{
frame = tag->RemoveFrame(frame);
delete frame;
num_removed++;
}
return num_removed;
}
char *ID3_GetLyricist(const ID3_Tag *tag)
{
char *sLyricist = NULL;
if (NULL == tag)
{
return sLyricist;
}
ID3_Frame *frame = tag->Find(ID3FID_LYRICIST);
if (frame != NULL)
{
sLyricist = ID3_GetString(frame, ID3FN_TEXT);
}
return sLyricist;
}
ID3_Frame* ID3_AddLyricist(ID3_Tag *tag, const char *text, bool replace)
{
ID3_Frame* frame = NULL;
if (NULL != tag && NULL != text && strlen(text) > 0)
{
if (replace)
{
ID3_RemoveLyricist(tag);
}
if (replace || (tag->Find(ID3FID_LYRICIST) == NULL))
{
frame = new ID3_Frame(ID3FID_LYRICIST);
if (frame)
{
frame->GetField(ID3FN_TEXT)->Set(text);
tag->AttachFrame(frame);
}
}
}
return frame;
}
size_t ID3_RemoveLyricist(ID3_Tag *tag)
{
size_t num_removed = 0;
ID3_Frame *frame = NULL;
if (NULL == tag)
{
return num_removed;
}
while ((frame = tag->Find(ID3FID_LYRICIST)))
{
frame = tag->RemoveFrame(frame);
delete frame;
num_removed++;
}
return num_removed;
}
ID3_Frame* ID3_AddSyncLyrics(ID3_Tag *tag, const uchar *data, size_t datasize,
ID3_TimeStampFormat format, bool replace)
{
return ID3_AddSyncLyrics(tag, data, datasize, format, "", replace);
}
ID3_Frame* ID3_AddSyncLyrics(ID3_Tag *tag, const uchar *data, size_t datasize,
ID3_TimeStampFormat format, const char *desc,
bool replace)
{
return ID3_AddSyncLyrics(tag, data, datasize, format, desc, "XXX", replace);
}
ID3_Frame* ID3_AddSyncLyrics(ID3_Tag *tag, const uchar *data, size_t datasize,
ID3_TimeStampFormat format, const char *desc,
const char *lang, bool replace)
{
return ID3_AddSyncLyrics(tag, data, datasize, format, desc, lang,
ID3CT_LYRICS, replace);
}
ID3_Frame* ID3_AddSyncLyrics(ID3_Tag *tag, const uchar *data, size_t datasize,
ID3_TimeStampFormat format, const char *desc,
const char *lang, ID3_ContentType type,
bool replace)
{
ID3_Frame* frame = NULL;
// language and descriptor should be mandatory
if ((NULL == lang) || (NULL == desc))
{
return NULL;
}
// check if a SYLT frame of this language or descriptor already exists
ID3_Frame* frmExist = tag->Find(ID3FID_SYNCEDLYRICS, ID3FN_LANGUAGE, lang);
if (!frmExist)
{
frmExist = tag->Find(ID3FID_SYNCEDLYRICS, ID3FN_DESCRIPTION, desc);
}
if (NULL != tag && NULL != data)
{
if (replace && frmExist)
{
frmExist = tag->RemoveFrame (frmExist);
delete frmExist;
frmExist = NULL;
}
// if the frame still exist, cannot continue
if (frmExist)
{
return NULL;
}
ID3_Frame* frame = new ID3_Frame(ID3FID_SYNCEDLYRICS);
frame->GetField(ID3FN_LANGUAGE)->Set(lang);
frame->GetField(ID3FN_DESCRIPTION)->Set(desc);
frame->GetField(ID3FN_TIMESTAMPFORMAT)->Set(format);
frame->GetField(ID3FN_CONTENTTYPE)->Set(type);
frame->GetField(ID3FN_DATA)->Set(data, datasize);
tag->AttachFrame(frame);
}
return frame;
}
ID3_Frame *ID3_GetSyncLyricsInfo(const ID3_Tag *tag, const char *desc,
const char *lang,
ID3_TimeStampFormat& format,
ID3_ContentType& type, size_t& size)
{
// check if a SYLT frame of this language or descriptor exists
ID3_Frame* frmExist = NULL;
if (NULL != lang)
{
// search through language
frmExist = tag->Find(ID3FID_SYNCEDLYRICS, ID3FN_LANGUAGE, lang);
}
else if (NULL != desc)
{
// search through descriptor
frmExist = tag->Find(ID3FID_SYNCEDLYRICS, ID3FN_DESCRIPTION, desc);
}
else
{
// both language and description not specified, search the first SYLT frame
frmExist = tag->Find(ID3FID_SYNCEDLYRICS);
}
if (!frmExist)
{
return NULL;
}
// get the lyrics time stamp format
format = static_cast<ID3_TimeStampFormat>(frmExist->GetField(ID3FN_TIMESTAMPFORMAT)->Get ());
// get the lyrics content type
type = static_cast<ID3_ContentType>(frmExist->GetField(ID3FN_CONTENTTYPE)->Get ());
// get the lyrics size
size = frmExist->GetField (ID3FN_DATA)->Size ();
// return the frame pointer for further uses
return frmExist;
}
ID3_Frame *ID3_GetSyncLyrics(const ID3_Tag *tag, const char *lang,
const char *desc, const uchar *pData, size_t& size)
{
// check if a SYLT frame of this language or descriptor exists
ID3_Frame* frmExist = NULL;
if (NULL != lang)
{
// search through language
frmExist = tag->Find(ID3FID_SYNCEDLYRICS, ID3FN_LANGUAGE, lang);
}
else if (NULL != desc)
{
// search through descriptor
frmExist = tag->Find(ID3FID_SYNCEDLYRICS, ID3FN_DESCRIPTION, desc);
}
else
{
// both language and description not specified, search the first SYLT frame
frmExist = tag->Find(ID3FID_SYNCEDLYRICS);
}
if (NULL == frmExist)
{
return NULL;
}
// get the lyrics size
size = dami::min(size, frmExist->GetField(ID3FN_DATA)->Size());
// get the lyrics data
pData = frmExist->GetField (ID3FN_DATA)->GetRawBinary();
// return the frame pointer for further uses
return frmExist;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -