📄 tag.cpp
字号:
** size_t actualSize = myTag.Render(buffer);
** // do something useful with the first
** // 'actualSize' bytes of the buffer,
** // like push it down a socket
** delete [] buffer;
** }
** }
** }
** \endcode
**
** @see #Render
** @return The (overestimated) number of bytes required to store a binary
** version of a tag
**/
size_t ID3_Tag::Size() const
{
return _impl->Size();
}
/** Turns unsynchronization on or off, dependant on the value of the boolean
** parameter.
**
** If you call this method with 'false' as the parameter, the
** binary tag will not be unsync'ed, regardless of whether the tag should
** be. This option is useful when the file is only going to be used by
** ID3v2-compliant software. See the ID3v2 standard document for futher
** details on unsync.
**
** Be default, tags are created without unsync.
**
** \code
** myTag.SetUnsync(false);
** \endcode
**
** \param bSync Whether the tag should be unsynchronized
**/
bool ID3_Tag::SetUnsync(bool b)
{
return _impl->SetUnsync(b);
}
/** Turns extended header rendering on or off, dependant on the value of the
** boolean parameter.
**
** This option is currently ignored as id3lib doesn't yet create extended
** headers. This option only applies when rendering tags for ID3v2 versions
** that support extended headers.
**
** \code
** myTag.SetExtendedHeader(true);
** \endcode
**
** \param bExt Whether to render an extended header
**/
bool ID3_Tag::SetExtendedHeader(bool ext)
{
return _impl->SetExtended(ext);
}
/** Turns padding on or off, dependant on the value of the boolean
** parameter.
**
** When using ID3v2 tags in association with files, id3lib can optionally
** add padding to the tags to ensure minmal file write times when updating
** the tag in the future.
**
** When the padding option is switched on, id3lib automatically creates
** padding according to the 'ID3v2 Programming Guidelines'. Specifically,
** enough padding will be added to round out the entire file (song plus
** tag) to an even multiple of 2K. Padding will only be created when the
** tag is attached to a file and that file is not empty (aside from a
** pre-existing tag).
**
** id3lib's addition to the guidelines for padding, is that if frames are
** removed from a pre-existing tag (or the tag simply shrinks because of
** other reasons), the new tag will continue to stay the same size as the
** old tag (with padding making the difference of course) until such time as
** the padding is greater than 4K. When this happens, the padding will be
** reduced and the new tag will be smaller than the old.
**
** By default, padding is switched on.
**
** \code
** myTag.SetPadding(false);
** \endcode
**
** \param bPad Whether or not render the tag with padding.
**/
bool ID3_Tag::SetPadding(bool pad)
{
return _impl->SetPadding(pad);
}
bool ID3_Tag::SetExperimental(bool exp)
{
return _impl->SetExperimental(exp);
}
bool ID3_Tag::GetUnsync() const
{
return _impl->GetUnsync();
}
bool ID3_Tag::GetExtendedHeader() const
{
return _impl->GetExtended();
}
bool ID3_Tag::GetExperimental() const
{
return _impl->GetExperimental();
}
void ID3_Tag::AddFrame(const ID3_Frame& frame)
{
_impl->AddFrame(frame);
}
/** Attaches a frame to the tag; the tag doesn't take responsibility for
** releasing the frame's memory when tag goes out of scope.
**
** Optionally, operator<< can also be used to attach a frame to a tag. To
** use, simply supply its parameter a pointer to the ID3_Frame object you wish
** to attach.
**
** \code
** ID3_Frame myFrame;
** myTag.AddFrame(&myFrame);
** \endcode
**
** As stated, this method attaches the frames to the tag---the tag does
** not create its own copy of the frame. Frames created by an application
** must exist until the frame is removed or the tag is finished with it.
**
** \param pFrame A pointer to the frame that is being added to the tag.
** \sa ID3_Frame
**/
void ID3_Tag::AddFrame(const ID3_Frame* frame)
{
_impl->AddFrame(frame);
}
/** Attaches a frame to the tag; the tag takes responsibility for
** releasing the frame's memory when tag goes out of scope.
**
** This method accepts responsibility for the attached frame's memory, and
** will delete the frame and its contents when the tag goes out of scope or is
** deleted. Therefore, be sure the frame isn't "Attached" to other tags.
**
** \code
** ID3_Frame *frame = new ID3_Frame;
** myTag.AttachFrame(frame);
** \endcode
**
** \param frame A pointer to the frame that is being added to the tag.
**/
void ID3_Tag::AttachFrame(ID3_Frame *frame)
{
_impl->AttachFrame(frame);
}
/** Removes a frame from the tag.
**
** If you already own the frame object in question, then you should already
** have a pointer to the frame you want to delete. If not, or if you wish to
** delete a pre-existing frame (from a tag you have parsed, for example), the
** use one of the Find methods to obtain a frame pointer to pass to this
** method.
**
** \code
** ID3_Frame *someFrame;
** if (someFrame = myTag.Find(ID3FID_TITLE))
** {
** myTag.RemoveFrame(someFrame);
** }
** \endcode
**
** \sa ID3_Tag#Find
** \param pOldFrame A pointer to the frame that is to be removed from the
** tag
**/
ID3_Frame* ID3_Tag::RemoveFrame(const ID3_Frame *frame)
{
return _impl->RemoveFrame(frame);
}
bool ID3_Tag::Parse(ID3_Reader& reader)
{
return id3::v2::parse(*_impl, reader);
}
size_t ID3_Tag::Parse(const uchar* buffer, size_t bytes)
{
ID3_MemoryReader mr(buffer, bytes);
ID3_Reader::pos_type beg = mr.getCur();
id3::v2::parse(*_impl, mr);
return mr.getEnd() - beg;
}
/** Turns a binary tag into a series of ID3_Frame objects attached to the
** tag.
**
** \code
** ID3_Tag myTag;
** uchar header[ID3_TAGHEADERSIZE];
** uchar *buffer;
** luint tagSize;
**
** // get ID3_TAGHEADERSIZE from a socket or somewhere
** // ...
**
** if ((tagSize = ID3_IsTagHeader(ourSourceBuffer)) > -1)
** {
** // read a further 'tagSize' bytes in
** // from our data source
** // ...
**
** if (buffer = new uchar[tagSize])
** {
** // now we will call ID3_Tag::Parse()
** // with these values (explained later)
** myTag.Parse(header, buffer);
**
** // do something with the objects,
** // like look for titles, artists, etc.
** // ...
**
** // free the buffer
** delete [] buffer;
** }
** }
** \endcode
**
** \sa ID3_Frame
** @param header The byte header read in from the data source.
** @param buffer The remainder of the tag (not including the data source)
** read in from the data source.
**/
size_t ID3_Tag::Parse(const uchar header[ID3_TAGHEADERSIZE],
const uchar *buffer)
{
size_t size = ID3_Tag::IsV2Tag(header);
if (0 == size)
{
return 0;
}
BString buf;
buf.reserve(ID3_TagHeader::SIZE + size);
buf.append(reinterpret_cast<const BString::value_type *>(header),
ID3_TagHeader::SIZE);
buf.append(reinterpret_cast<const BString::value_type *>(buffer), size);
return this->Parse(buf.data(), buf.size());
}
/** Renders the tag and writes it to the attached file; the type of tag
** rendered can be specified as a parameter. The default is to update only
** the ID3v2 tag. See the ID3_TagType enumeration for the constants that
** can be used.
**
** Make sure the rendering parameters are set before calling the method.
** See the Link dcoumentation for an example of this method in use.
**
** \sa ID3_TagType
** \sa Link
** \param tt The type of tag to update.
**/
/** Renders a binary image of the tag into the supplied buffer.
**
** See Size() for an example. This method returns the actual number of the
** bytes of the buffer used to store the tag. This will be no more than the
** size of the buffer itself, because Size() over estimates the required
** buffer size when padding is enabled.
**
** Before calling this method, it is advisable to call HasChanged() first as
** this will let you know whether you should bother rendering the tag.
**
** @see ID3_IsTagHeader
** @see ID3_Tag#HasChanged
** @return The actual number of the bytes of the buffer used to store the
** tag
** @param buffer The buffer that will contain the rendered tag.
**/
size_t ID3_Tag::Render(uchar* buffer, ID3_TagType tt) const
{
ID3_MemoryWriter mw(buffer, -1);
return this->Render(mw, tt);
}
size_t ID3_Tag::Render(ID3_Writer& writer, ID3_TagType tt) const
{
ID3_Writer::pos_type beg = writer.getCur();
if (ID3TT_ID3V2 & tt)
{
id3::v2::render(writer, *this);
}
else if (ID3TT_ID3V1 & tt)
{
id3::v1::render(writer, *this);
}
return writer.getCur() - beg;
}
/** Attaches a file to the tag, parses the file, and adds any tag information
** found in the file to the tag.
**
** Use this method if you created your ID3_Tag object without supplying a
** parameter to the constructor (maybe you created an array of ID3_Tag
** pointers). This is the preferred method of interacting with files, since
** id3lib can automatically do things like parse foreign tag formats and
** handle padding when linked to a file. When a tag is linked to a file, you
** do not need to use the Size(), Render(const uchar*, size_t), or
** Parse(ID3_Reader&) methods or the IsV2Tag(ID3_Reader&) static function--
** id3lib will take care of those details for you. The single parameter is a
** pointer to a file name.
**
** Link returns the size of the the ID3v2 tag (if any) that begins the file.
**
** \code
** ID3_Tag myTag;
** myTag.Link("mysong.mp3");
**
** // do whatever we want with the tag
** // ...
**
** // setup all our rendering parameters
** myTag->SetUnsync(false);
** myTag->SetExtendedHeader(true);
** myTag->SetCompression(true);
** myTag->SetPadding(true);
**
** // write any changes to the file
** myTag->Update()
**
** \endcode
**
** @see IsV2Tag
** @param fileInfo The filename of the file to link to.
**/
size_t ID3_Tag::Link(const char *fileInfo, flags_t flags)
{
return _impl->Link(fileInfo, flags);
}
flags_t ID3_Tag::Update(flags_t flags)
{
return _impl->Update(flags);
}
/** Strips the tag(s) from the attached file. The type of tag stripped
** can be specified as a parameter. The default is to strip all tag types.
**
** \param tt The type of tag to strip
** \sa ID3_TagType
**/
flags_t ID3_Tag::Strip(flags_t flags)
{
return _impl->Strip(flags);
}
size_t ID3_Tag::GetPrependedBytes() const
{
return _impl->GetPrependedBytes();
}
size_t ID3_Tag::GetAppendedBytes() const
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -