diff --git a/CMakeLists.txt b/CMakeLists.txt index b42e70723..14cd2df74 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -170,6 +170,10 @@ if (TAGLIB_FOUND AND USE_SYSTEM_TAGLIB) set(CMAKE_REQUIRED_LIBRARIES "${TAGLIB_LIBRARIES}") set(CMAKE_REQUIRED_INCLUDES) set(CMAKE_REQUIRED_LIBRARIES) + find_path(HAVE_TAGLIB_DSFFILE_H taglib/dsffile.h) + if(HAVE_TAGLIB_DSFFILE_H) + set(HAVE_TAGLIB_DSFFILE ON) + endif(HAVE_TAGLIB_DSFFILE_H) else() message(STATUS "Using builtin taglib library") set(TAGLIB_INCLUDE_DIRS "${CMAKE_BINARY_DIR}/3rdparty/taglib/headers/taglib/;${CMAKE_BINARY_DIR}/3rdparty/taglib/headers/") @@ -177,6 +181,7 @@ else() set(TAGLIB_LIBRARIES tag) add_subdirectory(3rdparty/utf8-cpp) add_subdirectory(3rdparty/taglib) + set(HAVE_TAGLIB_DSFFILE ON) endif() # LASTFM diff --git a/ext/libstrawberry-tagreader/tagreader.cpp b/ext/libstrawberry-tagreader/tagreader.cpp index 16d4ac2bd..109d40d9d 100644 --- a/ext/libstrawberry-tagreader/tagreader.cpp +++ b/ext/libstrawberry-tagreader/tagreader.cpp @@ -63,6 +63,10 @@ #include #include #include +#ifdef HAVE_TAGLIB_DSFFILE +# include +# include +#endif #include #include @@ -135,7 +139,7 @@ TagReader::TagReader() kEmbeddedCover("(embedded)") {} void TagReader::ReadFile(const QString &filename, pb::tagreader::SongMetadata *song) const { - + const QByteArray url(QUrl::fromLocalFile(filename).toEncoded()); const QFileInfo info(filename); @@ -149,10 +153,10 @@ void TagReader::ReadFile(const QString &filename, pb::tagreader::SongMetadata *s std::unique_ptr fileref(factory_->GetFileRef(filename)); if (fileref->isNull()) { - qLog(Info) << "TagLib hasn't been able to read " << filename << " file"; + qLog(Info) << "TagLib hasn't been able to read" << filename << "file"; return; } - + if (fileref->audioProperties()) { song->set_bitrate(fileref->audioProperties()->bitrate()); song->set_samplerate(fileref->audioProperties()->sampleRate()); @@ -177,8 +181,7 @@ void TagReader::ReadFile(const QString &filename, pb::tagreader::SongMetadata *s QString compilation; // Handle all the files which have VorbisComments (Ogg, OPUS, ...) in the same way; - // apart, so we keep specific behavior for some formats by adding another - // "else if" block below. + // apart, so we keep specific behavior for some formats by adding another "else if" block below. if (TagLib::Ogg::XiphComment *tag = dynamic_cast(fileref->file()->tag())) { ParseOggTag(tag->fieldListMap(), nullptr, &disc, &compilation, song); @@ -292,16 +295,12 @@ void TagReader::ReadFile(const QString &filename, pb::tagreader::SongMetadata *s if (items.contains(kMP4_OriginalYear_ID)) { song->set_originalyear( - TStringToQString( - items[kMP4_OriginalYear_ID].toStringList().toString('\n')) - .left(4) - .toInt()); + TStringToQString(items[kMP4_OriginalYear_ID].toStringList().toString('\n')).left(4).toInt()); } Decode(mp4_tag->comment(), nullptr, song->mutable_comment()); } } -#ifdef TAGLIB_WITH_ASF else if (TagLib::ASF::File *file = dynamic_cast(fileref->file())) { @@ -310,23 +309,19 @@ void TagReader::ReadFile(const QString &filename, pb::tagreader::SongMetadata *s const TagLib::ASF::AttributeListMap &attributes_map = file->tag()->attributeListMap(); if (attributes_map.contains(kASF_OriginalDate_ID)) { - const TagLib::ASF::AttributeList &attributes = - attributes_map[kASF_OriginalDate_ID]; + const TagLib::ASF::AttributeList &attributes = attributes_map[kASF_OriginalDate_ID]; if (!attributes.isEmpty()) { - song->set_originalyear( - TStringToQString(attributes.front().toString()).left(4).toInt()); + song->set_originalyear(TStringToQString(attributes.front().toString()).left(4).toInt()); } } else if (attributes_map.contains(kASF_OriginalYear_ID)) { - const TagLib::ASF::AttributeList &attributes = - attributes_map[kASF_OriginalYear_ID]; + const TagLib::ASF::AttributeList &attributes = attributes_map[kASF_OriginalYear_ID]; if (!attributes.isEmpty()) { - song->set_originalyear( - TStringToQString(attributes.front().toString()).left(4).toInt()); + song->set_originalyear(TStringToQString(attributes.front().toString()).left(4).toInt()); } } } -#endif + else if (tag) { Decode(tag->comment(), nullptr, song->mutable_comment()); } @@ -352,8 +347,6 @@ void TagReader::ReadFile(const QString &filename, pb::tagreader::SongMetadata *s song->set_compilation(compilation.toInt() == 1); } - - // Set integer fields to -1 if they're not valid #define SetDefault(field) if (song->field() <= 0) { song->set_##field(-1); } SetDefault(track); @@ -473,15 +466,15 @@ pb::tagreader::SongMetadata_Type TagReader::GuessFileType(TagLib::FileRef *filer if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_OGGOPUS; if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_OGGSPEEX; if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_MPEG; -#ifdef TAGLIB_WITH_MP4 if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_MP4; -#endif -#ifdef TAGLIB_WITH_ASF if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_ASF; -#endif if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_AIFF; if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_MPC; if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_TRUEAUDIO; +#ifdef HAVE_TAGLIB_DSFFILE + if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_DSF; + if (dynamic_cast(fileref->file())) return pb::tagreader::SongMetadata_Type_DSDIFF; +#endif return pb::tagreader::SongMetadata_Type_UNKNOWN; diff --git a/ext/libstrawberry-tagreader/tagreadermessages.proto b/ext/libstrawberry-tagreader/tagreadermessages.proto index 1b17dc524..068b55f91 100644 --- a/ext/libstrawberry-tagreader/tagreadermessages.proto +++ b/ext/libstrawberry-tagreader/tagreadermessages.proto @@ -19,6 +19,8 @@ message SongMetadata { AIFF = 11; MPC = 12; TRUEAUDIO = 13; + DSF = 14; + DSDIFF = 15; CDDA = 90; STREAM = 91; } diff --git a/src/config.h.in b/src/config.h.in index 6b542c7f2..864304cec 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -37,6 +37,7 @@ #cmakedefine HAVE_QCA #cmakedefine HAVE_SPARKLE #cmakedefine HAVE_CHROMAPRINT +#cmakedefine HAVE_TAGLIB_DSFFILE #cmakedefine IMOBILEDEVICE_USES_UDIDS #cmakedefine USE_INSTALL_PREFIX #cmakedefine USE_SYSTEM_SHA2 diff --git a/src/core/song.cpp b/src/core/song.cpp index b4cd97b8a..f8146b6b7 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -379,6 +379,8 @@ QString Song::TextForFiletype(FileType type) { case Song::Type_MPC: return QObject::tr("MPC"); case Song::Type_TrueAudio: return QObject::tr("TrueAudio"); case Song::Type_CDDA: return QObject::tr("CDDA"); + case Song::Type_DSF: return QObject::tr("DSF"); // .dsf + case Song::Type_DSDIFF: return QObject::tr("DSDIFF"); // .dff case Song::Type_Unknown: default: return QObject::tr("Unknown"); @@ -693,7 +695,7 @@ void Song::InitFromFilePartial(const QString &filename) { TagLib::FileRef fileref(filename.toUtf8().constData()); //if (TagLib::FileRef::defaultFileExtensions().contains(suffix.toUtf8().constData())) { - if (fileref.file() || (suffix == "dsf")) d->valid_ = true; + if (fileref.file()) d->valid_ = true; else { d->valid_ = false; qLog(Error) << "File" << filename << "is not recognized by TagLib as a valid audio file."; diff --git a/src/core/song.h b/src/core/song.h index 6062aed80..b8e6b6167 100644 --- a/src/core/song.h +++ b/src/core/song.h @@ -102,6 +102,8 @@ class Song { Type_AIFF = 11, Type_MPC = 12, Type_TrueAudio = 13, + Type_DSF = 14, + Type_DSDIFF = 15, Type_CDDA = 90, Type_Stream = 91, };