Add support for Monkey's Audio

This commit is contained in:
Jonas Kvinge
2019-01-06 00:32:58 +01:00
parent e4159dd7c2
commit a11f43520e
7 changed files with 17 additions and 1 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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;
} }

View File

@@ -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) {

View File

@@ -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,
}; };

View File

@@ -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);

View File

@@ -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;