Repository navigation
Expand file tree
/
Copy pathreplaygainenhancer.cpp
More file actions
124 lines (105 loc) · 3.45 KB
/
Copy pathreplaygainenhancer.cpp
File metadata and controls
124 lines (105 loc) · 3.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "replaygainenhancer.h"
#include <QCoreApplication>
#include <QDebug>
#include <QProcess>
#include <QtConcurrentMap>
#include <QTimer>
#include <boost/bind.hpp>
ReplayGainEnhancer::ReplayGainEnhancer(const QString &path) :
_baseDirectory(path),
_forceComputation(false),
_computeFlac(true),
_computeVorbis(true),
_computeMP3(true),
_flacFilter("*.flac"),
_vorbisFilter("*.ogg"),
_mp3Filter("*.mp3")
{
//qDebug() << "Using" << QThread::idealThreadCount() << "threads to compute ReplayGain values.";
}
void ReplayGainEnhancer::process()
{
if (_baseDirectory.exists()) {
processDirectory(_baseDirectory);
computeReplayGain();
waitForFinish();
} else {
qWarning() << _baseDirectory.absolutePath() << "does not exist. Exiting.";
}
}
void ReplayGainEnhancer::processDirectory(const QDir &directory)
{
foreach (QFileInfo dir, directory.entryInfoList(QDir::NoDotAndDotDot | QDir::Dirs)) {
processDirectory(QDir(dir.absoluteFilePath()));
}
if (_computeFlac) {
processFiles(directory, _flacFiles, _flacFilter);
}
if (_computeVorbis) {
processFiles(directory, _vorbisFiles, _vorbisFilter);
}
if (_computeMP3) {
processFiles(directory, _mp3Files, _mp3Filter);
}
}
void ReplayGainEnhancer::processFiles(const QDir &directory, QList<QList<QFileInfo> > &albumList, const QStringList &fileFilter)
{
QList<QFileInfo> albumFiles;
// TODO Add just flac files without ReplayGain tags since metaflac has no option to skip files with tags
foreach (QFileInfo file, directory.entryInfoList(fileFilter, QDir::Files)) {
albumFiles.append(file);
}
if (!albumFiles.isEmpty()) {
albumList.append(albumFiles);
}
}
void ReplayGainEnhancer::computeReplayGain()
{
QFuture<void> flacFuture = QtConcurrent::map(_flacFiles, boost::bind(&ReplayGainEnhancer::processAlbum, this, _1, TYPE_FLAC));
_flacWatcher.setFuture(flacFuture);
QFuture<void> vorbisFuture = QtConcurrent::map(_vorbisFiles, boost::bind(&ReplayGainEnhancer::processAlbum, this, _1, TYPE_VORBIS));
_vorbisWatcher.setFuture(vorbisFuture);
QFuture<void> mp3Future = QtConcurrent::map(_mp3Files, boost::bind(&ReplayGainEnhancer::processAlbum, this, _1, TYPE_MP3));
_mp3Watcher.setFuture(mp3Future);
}
void ReplayGainEnhancer::processAlbum(const QList<QFileInfo> &album, FileType type)
{
qDebug() << "Starting ReplayGain computation for" << album.first().absolutePath();
QString program;
QStringList args;
switch (type) {
case TYPE_FLAC: {
program = "metaflac";
args << "--no-utf8-convert" << "--add-replay-gain";
break;
} case TYPE_VORBIS: {
program = "vorbisgain";
args << "-asq";
if (!_forceComputation) {
args << "-f";
}
break;
} case TYPE_MP3: {
program = "mp3gain";
args << "-a" << "-s" << "i" << "-q" << "-c";
if (_forceComputation) {
args << "-s" << "r";
}
break;
} default:
break;
}
foreach (QFileInfo file, album) {
args << file.absoluteFilePath().replace("\"", "\\\"");
}
QProcess process;
process.start(program, args);
process.waitForFinished(-1);
}
void ReplayGainEnhancer::waitForFinish()
{
_flacWatcher.waitForFinished();
_vorbisWatcher.waitForFinished();
_mp3Watcher.waitForFinished();
qDebug() << "ReplayGain computation finished.";
}