fix crash when copy'ing latent plugins
[ardour.git] / libs / ardour / audiofile_tagger.cc
index 7391bf9ae3171fc9bce77445552dc8513131ca74..e2d81176e115dc87e0527efc7d9c538dab2e4039 100644 (file)
 
 */
 
-#include <ardour/audiofile_tagger.h>
+#include "ardour/audiofile_tagger.h"
 
-#include <ardour/session_metadata.h>
+#include "ardour/session_metadata.h"
 
-#include <pbd/convert.h>
+#include "pbd/convert.h"
 
 #include <taglib/fileref.h>
-#include <taglib/oggfile.h>
 #include <taglib/flacfile.h>
+#include <taglib/oggfile.h>
+#include <taglib/tag.h>
+#include <taglib/taglib.h>
+#include <taglib/xiphcomment.h>
 
-/* Convert Glib::ustring to TagLib::String */
-#define TL_STR(ustring) TagLib::String ((ustring).c_str(), TagLib::String::UTF8)
+/* Convert string to TagLib::String */
+#define TL_STR(string) TagLib::String ((string).c_str(), TagLib::String::UTF8)
 
 using namespace PBD;
 
@@ -37,15 +40,25 @@ namespace ARDOUR
 {
 
 bool
-AudiofileTagger::tag_file (string const & filename, SessionMetadata const & metadata)
+AudiofileTagger::tag_file (std::string const & filename, SessionMetadata const & metadata)
 {
        TagLib::FileRef file (filename.c_str());
+       if (file.isNull()) {
+               std::cerr << "TagLib::FileRef is null for file" << filename  << std::endl;
+               return true; // continue anyway?!
+       }
+
+       if (!file.tag()) {
+               std::cerr << "TagLib::Tag is null for file" << filename  << std::endl;
+               return true; // continue anyway?!
+       }
+
        TagLib::Tag & tag (*file.tag());
-       
+
        tag_generic (tag, metadata);
-       
+
        /* FLAC */
-       
+
        TagLib::FLAC::File * flac_file;
        if ((flac_file = dynamic_cast<TagLib::FLAC::File *> (file.file()))) {
                TagLib::Ogg::XiphComment * vorbis_tag;
@@ -55,9 +68,9 @@ AudiofileTagger::tag_file (string const & filename, SessionMetadata const & meta
                        std::cerr << "Could not get Xiph comment for FLAC file!" << std::endl;
                }
        }
-       
+
        /* Ogg */
-       
+
        TagLib::Ogg::File * ogg_file;
        if ((ogg_file = dynamic_cast<TagLib::Ogg::File *> (file.file()))) {
                TagLib::Ogg::XiphComment * vorbis_tag;
@@ -67,7 +80,7 @@ AudiofileTagger::tag_file (string const & filename, SessionMetadata const & meta
                        std::cerr << "Could not get Xiph comment for Ogg file!" << std::endl;
                }
        }
-       
+
        file.save();
        return true;
 }
@@ -82,7 +95,7 @@ AudiofileTagger::tag_generic (TagLib::Tag & tag, SessionMetadata const & metadat
        tag.setGenre (TL_STR(metadata.genre()));
        tag.setYear (metadata.year());
        tag.setTrack (metadata.track_number());
-       
+
        return true;
 }
 
@@ -106,7 +119,7 @@ AudiofileTagger::tag_vorbis_comment (TagLib::Ogg::XiphComment & tag, SessionMeta
        tag.addField ("COMPILATION", TL_STR(metadata.compilation()));
        tag.addField ("DISCSUBTITLE", TL_STR(metadata.disc_subtitle()));
        tag.addField ("DISCNUMBER", to_string (metadata.disc_number(), std::dec));
-       
+
        // No field for total discs or tracks
 
        return true;