2013-06-09 1 views
1

En utilisant TagLib 1.8 avec Qt 5.0.1 sur Mac OSX, j'essaye de créer un nouvel ensemble de balises ID3 pour un fichier AIFF. Le fichier ne contient aucune balise pour commencer. Voici mon code:TagLib ne sauvegarde pas la balise ID3

TagLib::Tag *t = concreteTag(); 

assert(tag); 

if (t) { 
     auto id3Tag = dynamic_cast<TagLib::ID3v2::Tag *>(t); 

     t -> setTitle(QStringToTagLib(tag -> title())); 
     t -> setAlbum(QStringToTagLib(tag -> album())); 
     t -> setComment(QStringToTagLib(tag -> comment())); 
     t -> setYear(tag -> year()); 

     if (id3Tag) 
       processID3(id3Tag, tag); 

     return m_file.save(); 
} 

return false; 

La variable tag est un objet de mon code de maintien des métadonnées. concreteTag() renvoie un objet de balise "correct" si le FileRef renvoie un TagUnion à partir de sa fonction tag(). J'ai vérifié que les données dans tag sont bonnes.

processID3 écriront des métadonnées qui ne fait pas partie des champs « de base » TagLib prend en charge sur l'objet TagLib::Tag:

processID3(TagLib::ID3v2::Tag *dst, TagSP src) const { 
     addID3Images(dst, src -> albumArt()); 
     addId3TextFrame(dst, "ALBUMARTIST", src -> albumArtist()); 
     addId3TextFrame(dst, "ARTIST", src -> artists()); 
     addId3TextFrame(dst, "GENRE", src -> genres()); 
     addId3TextFrame(dst, "COMPOSER", src -> composers()); 

     if (src -> track() > 0) { 
       if (src -> totalTracks() > 0) 
         addId3TextFrame(dst, "TRACKNUMBER", QString(src -> track()) + "/" + src -> totalTracks()); 
       else 
         addId3TextFrame(dst, "TRACKNUMBER", QString(src -> track())); 
     } 

     if (src -> disc() > 0) { 
       if (src -> totalDiscs() > 0) 
         addId3TextFrame(dst, "DISCNUMBER", QString(src -> disc()) + "/" + src -> totalDiscs()); 
       else 
         addId3TextFrame(dst, "DISCNUMBER", QString(src -> disc())); 
     } 

Enfin, addId3TextFrame ressemble à ceci (je n'ai pas les images si addID3Images() est jamais appelé): Mes métadonnées sont composées (pour mon fichier de test actuel) d'artiste d'album, de piste, de genre et d'année. Pour le moment, j'utilise ID3v2Frame::createTextualFrame() mais j'ai essayé de créer manuellement des cadres de texte en utilisant les identifiants de trames ID3 corrects (TRCK, TCON, etc.)

Voici mon problème. TagLib enregistre une balise ID3 v2.4 qui contient seulement 1 champ - le dernier champ que j'ai défini. Si je réorganise mon code en conséquence, je peux le définir correctement comme Artiste d'Artiste, Piste, Genre ou Année, mais il ne sauvera qu'un seul champ.

Dans le code complet, j'ai une fonction processMP4, qui est très similaire à processID3. Pour les fichiers MP4, toutes les étiquettes sont correctement sauvegardées. Cela m'amène à croire que mon approche est saine.

Des idées que je fais mal?

Répondre

0

Il s'avère que cela était dû aux paramètres de compilation. Par défaut, CMake sur OSX liera à l'ancienne implémentation GNU libstdC++ 6 de la bibliothèque standard. Mon projet utilise la nouvelle implémentation C++ 11 libC++. La partie intéressante est plutôt que de mourir d'une manière étonnamment évidente (se briser ou quelque chose), le code TagLib utilisant libstdC++ 6 était capable de lire seulement le premier itérateur généré par mon code libC++. En outre, l'opérateur ++ sur cet itérateur dans libstdC++ 6 land ne s'est pas écrasé et a renvoyé à la place end().