Add support for Monkey's Audio
This commit is contained in:
@@ -12,7 +12,7 @@ Strawberry is a audio player and music collection organizer. It is a fork of Cle
|
|||||||
### :heavy_check_mark: Features:
|
### :heavy_check_mark: Features:
|
||||||
|
|
||||||
* Play and organize music
|
* Play and organize music
|
||||||
* Supports WAV, FLAC, WavPack, DSF, DSDIFF, Ogg Vorbis, Speex, MPC, TrueAudio, AIFF, MP4, MP3 and ASF
|
* Supports WAV, FLAC, WavPack, DSF, DSDIFF, Ogg Vorbis, Speex, MPC, TrueAudio, AIFF, MP4, MP3, ASF and Monkey's Audio.
|
||||||
* Audio CD playback
|
* Audio CD playback
|
||||||
* Native desktop notifications
|
* Native desktop notifications
|
||||||
* Playlists in multiple formats
|
* Playlists in multiple formats
|
||||||
|
|||||||
@@ -66,6 +66,7 @@
|
|||||||
#include <taglib/mpegfile.h>
|
#include <taglib/mpegfile.h>
|
||||||
#include <taglib/opusfile.h>
|
#include <taglib/opusfile.h>
|
||||||
#include <taglib/trueaudiofile.h>
|
#include <taglib/trueaudiofile.h>
|
||||||
|
#include <taglib/apefile.h>
|
||||||
#ifdef HAVE_TAGLIB_DSFFILE
|
#ifdef HAVE_TAGLIB_DSFFILE
|
||||||
# include <taglib/dsffile.h>
|
# include <taglib/dsffile.h>
|
||||||
# include <taglib/dsdifffile.h>
|
# include <taglib/dsdifffile.h>
|
||||||
@@ -329,6 +330,10 @@ void TagReader::ReadFile(const QString &filename, pb::tagreader::SongMetadata *s
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if (TagLib::APE::File *file = dynamic_cast<TagLib::APE::File*>(fileref->file())) {
|
||||||
|
song->set_bitdepth(file->audioProperties()->bitsPerSample());
|
||||||
|
}
|
||||||
|
|
||||||
else if (tag) {
|
else if (tag) {
|
||||||
Decode(tag->comment(), nullptr, song->mutable_comment());
|
Decode(tag->comment(), nullptr, song->mutable_comment());
|
||||||
}
|
}
|
||||||
@@ -490,6 +495,7 @@ pb::tagreader::SongMetadata_FileType TagReader::GuessFileType(TagLib::FileRef *f
|
|||||||
if (dynamic_cast<TagLib::RIFF::AIFF::File*>(fileref->file())) return pb::tagreader::SongMetadata_FileType_AIFF;
|
if (dynamic_cast<TagLib::RIFF::AIFF::File*>(fileref->file())) return pb::tagreader::SongMetadata_FileType_AIFF;
|
||||||
if (dynamic_cast<TagLib::MPC::File*>(fileref->file())) return pb::tagreader::SongMetadata_FileType_MPC;
|
if (dynamic_cast<TagLib::MPC::File*>(fileref->file())) return pb::tagreader::SongMetadata_FileType_MPC;
|
||||||
if (dynamic_cast<TagLib::TrueAudio::File*>(fileref->file())) return pb::tagreader::SongMetadata_FileType_TRUEAUDIO;
|
if (dynamic_cast<TagLib::TrueAudio::File*>(fileref->file())) return pb::tagreader::SongMetadata_FileType_TRUEAUDIO;
|
||||||
|
if (dynamic_cast<TagLib::APE::File*>(fileref->file())) return pb::tagreader::SongMetadata_FileType_APE;
|
||||||
#ifdef HAVE_TAGLIB_DSFFILE
|
#ifdef HAVE_TAGLIB_DSFFILE
|
||||||
if (dynamic_cast<TagLib::DSF::File*>(fileref->file())) return pb::tagreader::SongMetadata_FileType_DSF;
|
if (dynamic_cast<TagLib::DSF::File*>(fileref->file())) return pb::tagreader::SongMetadata_FileType_DSF;
|
||||||
if (dynamic_cast<TagLib::DSDIFF::File*>(fileref->file())) return pb::tagreader::SongMetadata_FileType_DSDIFF;
|
if (dynamic_cast<TagLib::DSDIFF::File*>(fileref->file())) return pb::tagreader::SongMetadata_FileType_DSDIFF;
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ message SongMetadata {
|
|||||||
DSF = 14;
|
DSF = 14;
|
||||||
DSDIFF = 15;
|
DSDIFF = 15;
|
||||||
PCM = 16;
|
PCM = 16;
|
||||||
|
APE = 17;
|
||||||
CDDA = 90;
|
CDDA = 90;
|
||||||
STREAM = 91;
|
STREAM = 91;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -431,6 +431,7 @@ QString Song::TextForFiletype(FileType filetype) {
|
|||||||
case Song::FileType_DSF: return QObject::tr("DSF");
|
case Song::FileType_DSF: return QObject::tr("DSF");
|
||||||
case Song::FileType_DSDIFF: return QObject::tr("DSDIFF");
|
case Song::FileType_DSDIFF: return QObject::tr("DSDIFF");
|
||||||
case Song::FileType_PCM: return QObject::tr("PCM");
|
case Song::FileType_PCM: return QObject::tr("PCM");
|
||||||
|
case Song::FileType_APE: return QObject::tr("Monkey's Audio");
|
||||||
case Song::FileType_CDDA: return QObject::tr("CDDA");
|
case Song::FileType_CDDA: return QObject::tr("CDDA");
|
||||||
case Song::FileType_Stream: return QObject::tr("Stream");
|
case Song::FileType_Stream: return QObject::tr("Stream");
|
||||||
case Song::FileType_Unknown:
|
case Song::FileType_Unknown:
|
||||||
@@ -458,6 +459,7 @@ QIcon Song::IconForFiletype(FileType filetype) {
|
|||||||
case Song::FileType_DSF: return IconLoader::Load("dsf");
|
case Song::FileType_DSF: return IconLoader::Load("dsf");
|
||||||
case Song::FileType_DSDIFF: return IconLoader::Load("dsd");
|
case Song::FileType_DSDIFF: return IconLoader::Load("dsd");
|
||||||
case Song::FileType_PCM: return IconLoader::Load("pcm");
|
case Song::FileType_PCM: return IconLoader::Load("pcm");
|
||||||
|
case Song::FileType_APE: return IconLoader::Load("ape");
|
||||||
case Song::FileType_CDDA: return IconLoader::Load("cd");
|
case Song::FileType_CDDA: return IconLoader::Load("cd");
|
||||||
case Song::FileType_Stream: return IconLoader::Load("applications-internet");
|
case Song::FileType_Stream: return IconLoader::Load("applications-internet");
|
||||||
case Song::FileType_Unknown:
|
case Song::FileType_Unknown:
|
||||||
@@ -475,6 +477,7 @@ bool Song::IsFileLossless() const {
|
|||||||
case Song::FileType_AIFF:
|
case Song::FileType_AIFF:
|
||||||
case Song::FileType_DSF:
|
case Song::FileType_DSF:
|
||||||
case Song::FileType_DSDIFF:
|
case Song::FileType_DSDIFF:
|
||||||
|
case Song::FileType_APE:
|
||||||
return true;
|
return true;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
@@ -496,6 +499,7 @@ Song::FileType Song::FiletypeByExtension(QString ext) {
|
|||||||
else if (ext.toLower() == "mpc" || ext.toLower() == "mp+" || ext.toLower() == "mpp") return Song::FileType_MPC;
|
else if (ext.toLower() == "mpc" || ext.toLower() == "mp+" || ext.toLower() == "mpp") return Song::FileType_MPC;
|
||||||
else if (ext.toLower() == "dsf") return Song::FileType_DSF;
|
else if (ext.toLower() == "dsf") return Song::FileType_DSF;
|
||||||
else if (ext.toLower() == "dsd" || ext.toLower() == "dff") return Song::FileType_DSDIFF;
|
else if (ext.toLower() == "dsd" || ext.toLower() == "dff") return Song::FileType_DSDIFF;
|
||||||
|
else if (ext.toLower() == "ape") return Song::FileType_APE;
|
||||||
else return Song::FileType_Unknown;
|
else return Song::FileType_Unknown;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -518,6 +522,7 @@ void Song::Init(const QString &title, const QString &artist, const QString &albu
|
|||||||
d->album_ = album;
|
d->album_ = album;
|
||||||
|
|
||||||
set_length_nanosec(length_nanosec);
|
set_length_nanosec(length_nanosec);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Song::Init(const QString &title, const QString &artist, const QString &album, qint64 beginning, qint64 end) {
|
void Song::Init(const QString &title, const QString &artist, const QString &album, qint64 beginning, qint64 end) {
|
||||||
@@ -530,6 +535,7 @@ void Song::Init(const QString &title, const QString &artist, const QString &albu
|
|||||||
|
|
||||||
d->beginning_ = beginning;
|
d->beginning_ = beginning;
|
||||||
d->end_ = end;
|
d->end_ = end;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Song::set_genre_id3(int id) {
|
void Song::set_genre_id3(int id) {
|
||||||
|
|||||||
@@ -120,6 +120,7 @@ class Song {
|
|||||||
FileType_DSF = 14,
|
FileType_DSF = 14,
|
||||||
FileType_DSDIFF = 15,
|
FileType_DSDIFF = 15,
|
||||||
FileType_PCM = 16,
|
FileType_PCM = 16,
|
||||||
|
FileType_APE = 17,
|
||||||
FileType_CDDA = 90,
|
FileType_CDDA = 90,
|
||||||
FileType_Stream = 91,
|
FileType_Stream = 91,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ CueParser::CueParser(CollectionBackendInterface *collection, QObject *parent)
|
|||||||
: ParserBase(collection, parent) {}
|
: ParserBase(collection, parent) {}
|
||||||
|
|
||||||
SongList CueParser::Load(QIODevice *device, const QString &playlist_path, const QDir &dir) const {
|
SongList CueParser::Load(QIODevice *device, const QString &playlist_path, const QDir &dir) const {
|
||||||
|
|
||||||
SongList ret;
|
SongList ret;
|
||||||
|
|
||||||
QTextStream text_stream(device);
|
QTextStream text_stream(device);
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ void ParserBase::LoadSong(const QString &filename_or_url, qint64 beginning, cons
|
|||||||
Song ParserBase::LoadSong(const QString &filename_or_url, qint64 beginning, const QDir &dir) const {
|
Song ParserBase::LoadSong(const QString &filename_or_url, qint64 beginning, const QDir &dir) const {
|
||||||
|
|
||||||
Song song;
|
Song song;
|
||||||
|
song.set_source(Song::Source_LocalFile);
|
||||||
LoadSong(filename_or_url, beginning, dir, &song);
|
LoadSong(filename_or_url, beginning, dir, &song);
|
||||||
return song;
|
return song;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user