Я кратко изучил код TagLib.
Я ничего не знаю об этом и никогда не использовал его, но код кажется мне глючным. И вот почему -
В MPEG :: File :: read () мы ищем тег - d->ID3v2Location = findID3v2();
. Если он не существует, он не добавляется в вектор тегов. Это чек - if(d->ID3v2Location >= 0)
.
Однако в конце функции, перед возвратом, мы имеем -
// Make sure that we have our default tag types available.
ID3v2Tag(true);
ID3v1Tag(true);
Теперь Id3v2Tag(create)
с истинным параметром фактически вызывает return d->tag.access(ID3v2Index, create);
. Функция доступа () -
template <class T> T *access(int index, bool create)
{
if(!create || tag(index))
return static_cast<T *>(tag(index));
set(index, new T);
return static_cast<T *>(tag(index));
}
Таким образом, когда create
имеет значение true, мы создаем новый пустой тег и помещаем его в вектор (используя функцию set()
).
Это означает, что независимо от того, содержит ли файл теги или нет, они добавляются в вектор. Это не задокументированное поведение. Похоже, ошибка.
Я не знаю, зачем нужны эти две строки - просмотр истории этого файла может подсказать, почему они были добавлены, но я этого не делал.
В любом случае, я хочу подчеркнуть, что я никогда не выполнял этот код. Это основано на чисто статическом считывании только очень маленьких частей, без учета больших проблем.
Я думаю, что открытие отчета об ошибке не повредит.