📄 metadata.cpp
字号:
FLAC__ASSERT(is_valid());
return (bool)::FLAC__metadata_object_seektable_is_legal(object_);
}
//
// VorbisComment::Entry
//
VorbisComment::Entry::Entry()
{
zero();
}
VorbisComment::Entry::Entry(const char *field, unsigned field_length)
{
zero();
construct(field, field_length);
}
VorbisComment::Entry::Entry(const char *field)
{
zero();
construct(field);
}
VorbisComment::Entry::Entry(const char *field_name, const char *field_value, unsigned field_value_length)
{
zero();
construct(field_name, field_value, field_value_length);
}
VorbisComment::Entry::Entry(const char *field_name, const char *field_value)
{
zero();
construct(field_name, field_value);
}
VorbisComment::Entry::Entry(const Entry &entry)
{
FLAC__ASSERT(entry.is_valid());
zero();
construct((const char *)entry.entry_.entry, entry.entry_.length);
}
VorbisComment::Entry &VorbisComment::Entry::operator=(const Entry &entry)
{
FLAC__ASSERT(entry.is_valid());
clear();
construct((const char *)entry.entry_.entry, entry.entry_.length);
return *this;
}
VorbisComment::Entry::~Entry()
{
clear();
}
bool VorbisComment::Entry::is_valid() const
{
return is_valid_;
}
unsigned VorbisComment::Entry::get_field_length() const
{
FLAC__ASSERT(is_valid());
return entry_.length;
}
unsigned VorbisComment::Entry::get_field_name_length() const
{
FLAC__ASSERT(is_valid());
return field_name_length_;
}
unsigned VorbisComment::Entry::get_field_value_length() const
{
FLAC__ASSERT(is_valid());
return field_value_length_;
}
::FLAC__StreamMetadata_VorbisComment_Entry VorbisComment::Entry::get_entry() const
{
FLAC__ASSERT(is_valid());
return entry_;
}
const char *VorbisComment::Entry::get_field() const
{
FLAC__ASSERT(is_valid());
return (const char *)entry_.entry;
}
const char *VorbisComment::Entry::get_field_name() const
{
FLAC__ASSERT(is_valid());
return field_name_;
}
const char *VorbisComment::Entry::get_field_value() const
{
FLAC__ASSERT(is_valid());
return field_value_;
}
bool VorbisComment::Entry::set_field(const char *field, unsigned field_length)
{
FLAC__ASSERT(is_valid());
FLAC__ASSERT(0 != field);
if(!::FLAC__format_vorbiscomment_entry_is_legal((const ::FLAC__byte*)field, field_length))
return is_valid_ = false;
clear_entry();
if(0 == (entry_.entry = (FLAC__byte*)malloc(field_length+1))) {
is_valid_ = false;
}
else {
entry_.length = field_length;
memcpy(entry_.entry, field, field_length);
entry_.entry[field_length] = '\0';
(void) parse_field();
}
return is_valid_;
}
bool VorbisComment::Entry::set_field(const char *field)
{
return set_field(field, strlen(field));
}
bool VorbisComment::Entry::set_field_name(const char *field_name)
{
FLAC__ASSERT(is_valid());
FLAC__ASSERT(0 != field_name);
if(!::FLAC__format_vorbiscomment_entry_name_is_legal(field_name))
return is_valid_ = false;
clear_field_name();
if(0 == (field_name_ = strdup(field_name))) {
is_valid_ = false;
}
else {
field_name_length_ = strlen(field_name_);
compose_field();
}
return is_valid_;
}
bool VorbisComment::Entry::set_field_value(const char *field_value, unsigned field_value_length)
{
FLAC__ASSERT(is_valid());
FLAC__ASSERT(0 != field_value);
if(!::FLAC__format_vorbiscomment_entry_value_is_legal((const FLAC__byte*)field_value, field_value_length))
return is_valid_ = false;
clear_field_value();
if(0 == (field_value_ = (char *)malloc(field_value_length+1))) {
is_valid_ = false;
}
else {
field_value_length_ = field_value_length;
memcpy(field_value_, field_value, field_value_length);
field_value_[field_value_length] = '\0';
compose_field();
}
return is_valid_;
}
bool VorbisComment::Entry::set_field_value(const char *field_value)
{
return set_field_value(field_value, strlen(field_value));
}
void VorbisComment::Entry::zero()
{
is_valid_ = true;
entry_.length = 0;
entry_.entry = 0;
field_name_ = 0;
field_name_length_ = 0;
field_value_ = 0;
field_value_length_ = 0;
}
void VorbisComment::Entry::clear()
{
clear_entry();
clear_field_name();
clear_field_value();
is_valid_ = true;
}
void VorbisComment::Entry::clear_entry()
{
if(0 != entry_.entry) {
free(entry_.entry);
entry_.entry = 0;
entry_.length = 0;
}
}
void VorbisComment::Entry::clear_field_name()
{
if(0 != field_name_) {
free(field_name_);
field_name_ = 0;
field_name_length_ = 0;
}
}
void VorbisComment::Entry::clear_field_value()
{
if(0 != field_value_) {
free(field_value_);
field_value_ = 0;
field_value_length_ = 0;
}
}
void VorbisComment::Entry::construct(const char *field, unsigned field_length)
{
if(set_field(field, field_length))
parse_field();
}
void VorbisComment::Entry::construct(const char *field)
{
construct(field, strlen(field));
}
void VorbisComment::Entry::construct(const char *field_name, const char *field_value, unsigned field_value_length)
{
if(set_field_name(field_name) && set_field_value(field_value, field_value_length))
compose_field();
}
void VorbisComment::Entry::construct(const char *field_name, const char *field_value)
{
construct(field_name, field_value, strlen(field_value));
}
void VorbisComment::Entry::compose_field()
{
clear_entry();
if(0 == (entry_.entry = (FLAC__byte*)malloc(field_name_length_ + 1 + field_value_length_ + 1))) {
is_valid_ = false;
}
else {
memcpy(entry_.entry, field_name_, field_name_length_);
entry_.length += field_name_length_;
memcpy(entry_.entry + entry_.length, "=", 1);
entry_.length += 1;
memcpy(entry_.entry + entry_.length, field_value_, field_value_length_);
entry_.length += field_value_length_;
entry_.entry[entry_.length] = '\0';
is_valid_ = true;
}
}
void VorbisComment::Entry::parse_field()
{
clear_field_name();
clear_field_value();
const char *p = (const char *)memchr(entry_.entry, '=', entry_.length);
if(0 == p)
p = (const char *)entry_.entry + entry_.length;
field_name_length_ = p - (const char *)entry_.entry;
if(0 == (field_name_ = (char *)malloc(field_name_length_ + 1))) { // +1 for the trailing \0
is_valid_ = false;
return;
}
memcpy(field_name_, entry_.entry, field_name_length_);
field_name_[field_name_length_] = '\0';
if(entry_.length - field_name_length_ == 0) {
field_value_length_ = 0;
if(0 == (field_value_ = (char *)malloc(0))) {
is_valid_ = false;
return;
}
}
else {
field_value_length_ = entry_.length - field_name_length_ - 1;
if(0 == (field_value_ = (char *)malloc(field_value_length_ + 1))) { // +1 for the trailing \0
is_valid_ = false;
return;
}
memcpy(field_value_, ++p, field_value_length_);
field_value_[field_value_length_] = '\0';
}
is_valid_ = true;
}
//
// VorbisComment
//
VorbisComment::VorbisComment():
Prototype(FLAC__metadata_object_new(FLAC__METADATA_TYPE_VORBIS_COMMENT), /*copy=*/false)
{ }
VorbisComment::~VorbisComment()
{ }
unsigned VorbisComment::get_num_comments() const
{
FLAC__ASSERT(is_valid());
return object_->data.vorbis_comment.num_comments;
}
const FLAC__byte *VorbisComment::get_vendor_string() const
{
FLAC__ASSERT(is_valid());
return object_->data.vorbis_comment.vendor_string.entry;
}
VorbisComment::Entry VorbisComment::get_comment(unsigned index) const
{
FLAC__ASSERT(is_valid());
FLAC__ASSERT(index < object_->data.vorbis_comment.num_comments);
return Entry((const char *)object_->data.vorbis_comment.comments[index].entry, object_->data.vorbis_comment.comments[index].length);
}
bool VorbisComment::set_vendor_string(const FLAC__byte *string)
{
FLAC__ASSERT(is_valid());
// vendor_string is a special kind of entry
const ::FLAC__StreamMetadata_VorbisComment_Entry vendor_string = { strlen((const char *)string), (FLAC__byte*)string }; // we can cheat on const-ness because we make a copy below:
return (bool)::FLAC__metadata_object_vorbiscomment_set_vendor_string(object_, vendor_string, /*copy=*/true);
}
bool VorbisComment::set_comment(unsigned index, const VorbisComment::Entry &entry)
{
FLAC__ASSERT(is_valid());
FLAC__ASSERT(index < object_->data.vorbis_comment.num_comments);
return (bool)::FLAC__metadata_object_vorbiscomment_set_comment(object_, index, entry.get_entry(), /*copy=*/true);
}
bool VorbisComment::insert_comment(unsigned index, const VorbisComment::Entry &entry)
{
FLAC__ASSERT(is_valid());
FLAC__ASSERT(index <= object_->data.vorbis_comment.num_comments);
return (bool)::FLAC__metadata_object_vorbiscomment_insert_comment(object_, index, entry.get_entry(), /*copy=*/true);
}
bool VorbisComment::append_comment(const VorbisComment::Entry &entry)
{
FLAC__ASSERT(is_valid());
return (bool)::FLAC__metadata_object_vorbiscomment_append_comment(object_, entry.get_entry(), /*copy=*/true);
}
bool VorbisComment::delete_comment(unsigned index)
{
FLAC__ASSERT(is_valid());
FLAC__ASSERT(index < object_->data.vorbis_comment.num_comments);
return (bool)::FLAC__metadata_object_vorbiscomment_delete_comment(object_, index);
}
//
// CueSheet::Track
//
CueSheet::Track::Track():
object_(::FLAC__metadata_object_cuesheet_track_new())
{ }
CueSheet::Track::Track(const ::FLAC__StreamMetadata_CueSheet_Track *track):
object_(::FLAC__metadata_object_cuesheet_track_clone(track))
{ }
CueSheet::Track::Track(const Track &track):
object_(::FLAC__metadata_object_cuesheet_track_clone(track.object_))
{ }
CueSheet::Track &CueSheet::Track::operator=(const Track &track)
{
if(0 != object_)
::FLAC__metadata_object_cuesheet_track_delete(object_);
object_ = ::FLAC__metadata_object_cuesheet_track_clone(track.object_);
return *this;
}
CueSheet::Track::~Track()
{
if(0 != object_)
::FLAC__metadata_object_cuesheet_track_delete(object_);
}
bool CueSheet::Track::is_valid() const
{
return(0 != object_);
}
::FLAC__StreamMetadata_CueSheet_Index CueSheet::Track::get_index(unsigned i) const
{
FLAC__ASSERT(is_valid());
FLAC__ASSERT(i < object_->num_indices);
return object_->indices[i];
}
void CueSheet::Track::set_isrc(const char value[12])
{
FLAC__ASSERT(is_valid());
FLAC__ASSERT(0 != value);
memcpy(object_->isrc, value, 12);
object_->isrc[12] = '\0';
}
void CueSheet::Track::set_type(unsigned value)
{
FLAC__ASSERT(is_valid());
FLAC__ASSERT(value <= 1);
object_->type = value;
}
void CueSheet::Track::set_index(unsigned i, const ::FLAC__StreamMetadata_CueSheet_Index &index)
{
FLAC__ASSERT(is_valid());
FLAC__ASSERT(i < object_->num_indices);
object_->indices[i] = index;
}
//
// CueSheet
//
CueSheet::CueSheet():
Prototype(FLAC__metadata_object_new(FLAC__METADATA_TYPE_CUESHEET), /*copy=*/false)
{ }
CueSheet::~CueSheet()
{ }
const char *CueSheet::get_media_catalog_number() const
{
FLAC__ASSERT(is_valid());
return object_->data.cue_sheet.media_catalog_number;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -