Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
c4bd788bcc | |||
97f61bb40c |
@ -1,10 +1,7 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## MLC 1.3.4 (March 30, 2025)
|
## MLC 1.3.4 (UNRELEASED)
|
||||||
- Build fixes
|
- Build fixes
|
||||||
- Source and Destination paths now can contain spaces
|
|
||||||
- Regex to copy non music files can have spaces
|
|
||||||
- A feature to define a regex to exclude paths from rendering
|
|
||||||
|
|
||||||
## MLC 1.3.3 (October 13, 2023)
|
## MLC 1.3.3 (October 13, 2023)
|
||||||
- Regex to specify non-music files to copy
|
- Regex to specify non-music files to copy
|
||||||
@ -31,7 +28,7 @@
|
|||||||
- New logging system
|
- New logging system
|
||||||
- Artist, Album artist, Album and Title are now utf16 encoded, should fix broken titles
|
- Artist, Album artist, Album and Title are now utf16 encoded, should fix broken titles
|
||||||
- BPM tag is now rounded, as it supposed to be by spec
|
- BPM tag is now rounded, as it supposed to be by spec
|
||||||
- Lyrics is not set now for USLT tag for unsynchronized lyrics is not supported in LAME
|
- Lyrics is not set now for USLT tag for unsychronized lyrics is not supported in LAME
|
||||||
- Date bug fix, it was MMDD instead of standard DDMM
|
- Date bug fix, it was MMDD instead of standard DDMM
|
||||||
|
|
||||||
## MLC 1.0.1 (July 21, 2023)
|
## MLC 1.0.1 (July 21, 2023)
|
||||||
|
34
README.md
34
README.md
@ -13,13 +13,13 @@ This is a program to compile your local lossless music library to lossy formats
|
|||||||
|
|
||||||
### Building
|
### Building
|
||||||
|
|
||||||
```shell
|
```sh
|
||||||
git clone https://git.macaw.me/blue/mlc
|
$ git clone https://git.macaw.me/blue/mlc
|
||||||
cd mlc
|
$ cd mlc
|
||||||
mkdir build
|
$ mkdir build
|
||||||
cd build
|
$ cd build
|
||||||
cmake ..
|
$ cmake ..
|
||||||
cmake --build .
|
$ cmake --build .
|
||||||
```
|
```
|
||||||
|
|
||||||
### Usage
|
### Usage
|
||||||
@ -27,19 +27,19 @@ cmake --build .
|
|||||||
Just to compile lossless library to lossy you can use this command
|
Just to compile lossless library to lossy you can use this command
|
||||||
assuming you are in the same directory you have just built `MLC`:
|
assuming you are in the same directory you have just built `MLC`:
|
||||||
|
|
||||||
```shell
|
```
|
||||||
./mlc path/to/lossless/library path/to/store/lossy/library
|
./mlc path/to/lossless/library path/to/store/lossy/library
|
||||||
```
|
```
|
||||||
|
|
||||||
There are more ways to use `MLC`, please refer to help for more options:
|
There are more ways to use `MLC`, please refer to help for more options:
|
||||||
|
|
||||||
```shell
|
```sh
|
||||||
./mlc help
|
$ ./mlc help
|
||||||
# or
|
# or
|
||||||
./mlc --help
|
$ ./mlc --help
|
||||||
#
|
#
|
||||||
# or
|
# or
|
||||||
./mlc -h
|
$ ./mlc -h
|
||||||
```
|
```
|
||||||
|
|
||||||
`MLC` has a way to configure conversion process, it will generate global for you user config on the first launch.
|
`MLC` has a way to configure conversion process, it will generate global for you user config on the first launch.
|
||||||
@ -49,16 +49,14 @@ You can also make local configs for each directory you launch mlc from.
|
|||||||
|
|
||||||
To output the default config run the following, assuming you are in the same directory you have just built `MLC`:
|
To output the default config run the following, assuming you are in the same directory you have just built `MLC`:
|
||||||
|
|
||||||
```shell
|
```sh
|
||||||
./mlc config #to print
|
$ ./mlc config
|
||||||
#or
|
|
||||||
./mlc config > config.conf #to save to config.conf in current directory
|
|
||||||
```
|
```
|
||||||
|
|
||||||
To use non default config run the following, assuming you are in the same directory you have just built `MLC`:
|
To use non default config run the following, assuming you are in the same directory you have just built `MLC`:
|
||||||
|
|
||||||
```shell
|
```sh
|
||||||
./mlc path/to/lossless/library path/to/store/lossy/library -c path/to/config/file
|
$ ./mlc path/to/lossless/library path/to/store/lossy/library -c path/to/config/file
|
||||||
```
|
```
|
||||||
|
|
||||||
### About
|
### About
|
||||||
|
@ -6,12 +6,11 @@ namespace fs = std::filesystem;
|
|||||||
|
|
||||||
static const std::string flac(".flac");
|
static const std::string flac(".flac");
|
||||||
|
|
||||||
Collection::Collection(const std::filesystem::path& path, const std::shared_ptr<TaskManager>& tm, const std::shared_ptr<Settings>& st):
|
Collection::Collection(const std::filesystem::path& path, TaskManager* tm) :
|
||||||
path(path),
|
path(path),
|
||||||
countMusical(0),
|
countMusical(0),
|
||||||
counted(false),
|
counted(false),
|
||||||
taskManager(tm),
|
taskManager(tm)
|
||||||
settings(st)
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
Collection::~Collection()
|
Collection::~Collection()
|
||||||
@ -34,16 +33,13 @@ uint32_t Collection::countMusicFiles() const {
|
|||||||
++countMusical;
|
++countMusical;
|
||||||
} else if (fs::is_directory(path)) {
|
} else if (fs::is_directory(path)) {
|
||||||
for (const fs::directory_entry& entry : fs::directory_iterator(path)) {
|
for (const fs::directory_entry& entry : fs::directory_iterator(path)) {
|
||||||
if (settings->isExcluded(entry.path()))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
switch (entry.status().type()) {
|
switch (entry.status().type()) {
|
||||||
case fs::file_type::regular:
|
case fs::file_type::regular:
|
||||||
if (isMusic(entry.path()))
|
if (isMusic(entry.path()))
|
||||||
++countMusical;
|
++countMusical;
|
||||||
break;
|
break;
|
||||||
case fs::file_type::directory: {
|
case fs::file_type::directory: {
|
||||||
Collection collection(entry.path(), taskManager, settings);
|
Collection collection(entry.path());
|
||||||
countMusical += collection.countMusicFiles();
|
countMusical += collection.countMusicFiles();
|
||||||
} break;
|
} break;
|
||||||
default:
|
default:
|
||||||
@ -57,24 +53,25 @@ uint32_t Collection::countMusicFiles() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Collection::convert(const std::string& outPath) {
|
void Collection::convert(const std::string& outPath) {
|
||||||
|
if (taskManager == nullptr)
|
||||||
|
throw 6;
|
||||||
|
|
||||||
fs::path out = fs::absolute(outPath);
|
fs::path out = fs::absolute(outPath);
|
||||||
|
|
||||||
fs::create_directories(out);
|
fs::create_directories(out);
|
||||||
out = fs::canonical(outPath);
|
out = fs::canonical(outPath);
|
||||||
for (const fs::directory_entry& entry : fs::directory_iterator(path)) {
|
for (const fs::directory_entry& entry : fs::directory_iterator(path)) {
|
||||||
fs::path sourcePath = entry.path();
|
|
||||||
if (settings->isExcluded(sourcePath))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
switch (entry.status().type()) {
|
switch (entry.status().type()) {
|
||||||
case fs::file_type::regular: {
|
case fs::file_type::regular: {
|
||||||
|
fs::path sourcePath = entry.path();
|
||||||
if (isMusic(sourcePath))
|
if (isMusic(sourcePath))
|
||||||
taskManager->queueConvert(sourcePath, out / sourcePath.stem());
|
taskManager->queueConvert(sourcePath, out / sourcePath.stem());
|
||||||
else
|
else
|
||||||
taskManager->queueCopy(sourcePath, out / sourcePath.filename());
|
taskManager->queueCopy(sourcePath, out / sourcePath.filename());
|
||||||
} break;
|
} break;
|
||||||
case fs::file_type::directory: {
|
case fs::file_type::directory: {
|
||||||
Collection collection(sourcePath, taskManager, settings);
|
fs::path sourcePath = entry.path();
|
||||||
|
Collection collection(sourcePath, taskManager);
|
||||||
fs::path::iterator itr = sourcePath.end();
|
fs::path::iterator itr = sourcePath.end();
|
||||||
--itr;
|
--itr;
|
||||||
collection.convert(std::string(out / *itr));
|
collection.convert(std::string(out / *itr));
|
||||||
|
@ -3,16 +3,14 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
#include "settings.h"
|
|
||||||
#include "flactomp3.h"
|
#include "flactomp3.h"
|
||||||
|
|
||||||
class TaskManager;
|
class TaskManager;
|
||||||
|
|
||||||
class Collection {
|
class Collection {
|
||||||
public:
|
public:
|
||||||
Collection(const std::filesystem::path& path, const std::shared_ptr<TaskManager>& tm, const std::shared_ptr<Settings>& st);
|
Collection(const std::filesystem::path& path, TaskManager* tm = nullptr);
|
||||||
~Collection();
|
~Collection();
|
||||||
|
|
||||||
void list() const;
|
void list() const;
|
||||||
@ -26,7 +24,6 @@ private:
|
|||||||
std::filesystem::path path;
|
std::filesystem::path path;
|
||||||
mutable uint32_t countMusical;
|
mutable uint32_t countMusical;
|
||||||
mutable bool counted;
|
mutable bool counted;
|
||||||
std::shared_ptr<TaskManager> taskManager;
|
TaskManager* taskManager;
|
||||||
std::shared_ptr<Settings> settings;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -92,15 +92,7 @@
|
|||||||
|
|
||||||
# Variable bitrate
|
# Variable bitrate
|
||||||
# Switches on or off variable bitrate
|
# Switches on or off variable bitrate
|
||||||
# VBR files are usually smaller, but not supposed to be worse
|
# VBR files are usually smaller, but not supped to be worse
|
||||||
# in terms of quality. VBR files might be a bit more tricky for the player
|
# in terms of quality. VBR files might be a bit more tricky for the player
|
||||||
# Allowed values are: [true, false]
|
# Allowed values are: [true, false]
|
||||||
#vbr true
|
#vbr true
|
||||||
|
|
||||||
# Exclude
|
|
||||||
# MLC renders any music file it finds in source directory
|
|
||||||
# UNLESS its path matches the following regex
|
|
||||||
# Allowed value is the regex without any additional syntax,
|
|
||||||
# for example: exclude [Ss]hamefull?\s[Ss]ong[Ss]
|
|
||||||
# If you don't want to exclude anything leave this option blank
|
|
||||||
#exclude
|
|
@ -294,16 +294,28 @@ bool FLACtoMP3::scaleJPEG(const FLAC__StreamMetadata_Picture& picture) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FLACtoMP3::decodeFrame(const int32_t * const buffer[], uint32_t size) {
|
bool FLACtoMP3::decodeFrame(const int32_t * const buffer[], uint32_t size, const uint32_t bitsPerSample) {
|
||||||
if (!outputInitilized) {
|
if (!outputInitilized) {
|
||||||
bool success = initializeOutput();
|
bool success = initializeOutput();
|
||||||
if (!success)
|
if (!success)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bitsPerSample >= 16)
|
||||||
|
return decodeFrameImpl(buffer, size, 1 << (bitsPerSample - 16));
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FLACtoMP3::decodeFrameImpl(const int32_t * const buffer[], uint32_t size, const uint32_t divisor)
|
||||||
|
{
|
||||||
for (size_t i = 0; i < size; ++i) {
|
for (size_t i = 0; i < size; ++i) {
|
||||||
pcm[pcmCounter++] = (int16_t)buffer[0][i];
|
int32_t left = buffer[0][i];
|
||||||
pcm[pcmCounter++] = (int16_t)buffer[1][i];
|
int32_t right = buffer[1][i];
|
||||||
|
left /= divisor;
|
||||||
|
right /= divisor;
|
||||||
|
pcm[pcmCounter++] = (int16_t)left;
|
||||||
|
pcm[pcmCounter++] = (int16_t)right;
|
||||||
|
|
||||||
if (pcmCounter == pcmSize)
|
if (pcmCounter == pcmSize)
|
||||||
return flush();
|
return flush();
|
||||||
@ -395,7 +407,7 @@ FLAC__StreamDecoderWriteStatus FLACtoMP3::write(
|
|||||||
return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
|
return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool result = self->decodeFrame(buffer, frame->header.blocksize);
|
bool result = self->decodeFrame(buffer, frame->header.blocksize, frame->header.bits_per_sample);
|
||||||
|
|
||||||
if (result)
|
if (result)
|
||||||
return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
|
return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
|
||||||
|
@ -29,7 +29,8 @@ private:
|
|||||||
void processTags(const FLAC__StreamMetadata_VorbisComment& tags);
|
void processTags(const FLAC__StreamMetadata_VorbisComment& tags);
|
||||||
void processInfo(const FLAC__StreamMetadata_StreamInfo& info);
|
void processInfo(const FLAC__StreamMetadata_StreamInfo& info);
|
||||||
void processPicture(const FLAC__StreamMetadata_Picture& picture);
|
void processPicture(const FLAC__StreamMetadata_Picture& picture);
|
||||||
bool decodeFrame(const int32_t * const buffer[], uint32_t size);
|
bool decodeFrame(const int32_t * const buffer[], uint32_t size, const uint32_t bitsPerSample);
|
||||||
|
bool decodeFrameImpl(const int32_t * const buffer[], uint32_t size, const uint32_t divisor);
|
||||||
bool flush();
|
bool flush();
|
||||||
bool initializeOutput();
|
bool initializeOutput();
|
||||||
bool scaleJPEG(const FLAC__StreamMetadata_Picture& picture);
|
bool scaleJPEG(const FLAC__StreamMetadata_Picture& picture);
|
||||||
|
10
src/main.cpp
10
src/main.cpp
@ -57,16 +57,16 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
logger->setSeverity(settings->getLogLevel());
|
logger->setSeverity(settings->getLogLevel());
|
||||||
std::shared_ptr<TaskManager> taskManager = std::make_shared<TaskManager>(settings, logger);
|
TaskManager taskManager(settings, logger);
|
||||||
taskManager->start();
|
taskManager.start();
|
||||||
|
|
||||||
std::chrono::time_point start = std::chrono::system_clock::now();
|
std::chrono::time_point start = std::chrono::system_clock::now();
|
||||||
Collection collection(input, taskManager, settings);
|
Collection collection(input, &taskManager);
|
||||||
collection.convert(output);
|
collection.convert(output);
|
||||||
|
|
||||||
taskManager->wait();
|
taskManager.wait();
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
taskManager->stop();
|
taskManager.stop();
|
||||||
|
|
||||||
std::chrono::time_point end = std::chrono::system_clock::now();
|
std::chrono::time_point end = std::chrono::system_clock::now();
|
||||||
std::chrono::duration<double> seconds = end - start;
|
std::chrono::duration<double> seconds = end - start;
|
||||||
|
@ -17,7 +17,6 @@ enum class Option {
|
|||||||
destination,
|
destination,
|
||||||
parallel,
|
parallel,
|
||||||
filesToCopy,
|
filesToCopy,
|
||||||
exclude,
|
|
||||||
encodingQuality,
|
encodingQuality,
|
||||||
outputQuality,
|
outputQuality,
|
||||||
vbr,
|
vbr,
|
||||||
@ -43,7 +42,6 @@ constexpr std::array<std::string_view, static_cast<int>(Option::_optionsSize)> o
|
|||||||
"destination",
|
"destination",
|
||||||
"parallel",
|
"parallel",
|
||||||
"filesToCopy",
|
"filesToCopy",
|
||||||
"exclude",
|
|
||||||
"encodingQuality",
|
"encodingQuality",
|
||||||
"outputQuality",
|
"outputQuality",
|
||||||
"vbr"
|
"vbr"
|
||||||
@ -266,74 +264,69 @@ void Settings::readConfigLine(const std::string& line) {
|
|||||||
if (option == Option::_optionsSize)
|
if (option == Option::_optionsSize)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
std::string value;
|
|
||||||
std::getline(stream >> std::ws, value);
|
|
||||||
strip(value);
|
|
||||||
if (value.empty())
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (option) {
|
switch (option) {
|
||||||
case Option::level: {
|
case Option::level: {
|
||||||
std::string lv;
|
std::string lv;
|
||||||
if (!logLevel.has_value() && std::istringstream(value) >> lv) {
|
if (!logLevel.has_value() && stream >> lv) {
|
||||||
Logger::Severity level = Logger::stringToSeverity(lv);
|
Logger::Severity level = Logger::stringToSeverity(lv);
|
||||||
if (level < Logger::Severity::_severitySize)
|
if (level < Logger::Severity::_severitySize)
|
||||||
logLevel = level;
|
logLevel = level;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case Option::type: {
|
case Option::type: {
|
||||||
std::string tp;
|
std::string lv;
|
||||||
if (!outputType.has_value() && std::istringstream(value) >> tp) {
|
if (!outputType.has_value() && stream >> lv) {
|
||||||
Type type = stringToType(tp);
|
Type type = stringToType(lv);
|
||||||
if (type < _typesSize)
|
if (type < _typesSize)
|
||||||
outputType = type;
|
outputType = type;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case Option::source: {
|
case Option::source: {
|
||||||
if (!input.has_value()) {
|
std::string path;
|
||||||
input = value;
|
if (stream >> path) {
|
||||||
} else if (!output.has_value()) {
|
if (!input.has_value()) {
|
||||||
output = input;
|
input = path;
|
||||||
input = value;
|
} else if (!output.has_value()) {
|
||||||
|
output = input;
|
||||||
|
input = path;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case Option::destination: {
|
case Option::destination: {
|
||||||
if (!output.has_value())
|
std::string path;
|
||||||
output = value;
|
if (!output.has_value() && stream >> path)
|
||||||
|
output = path;
|
||||||
} break;
|
} break;
|
||||||
case Option::parallel: {
|
case Option::parallel: {
|
||||||
unsigned int count;
|
unsigned int count;
|
||||||
if (!threads.has_value() && std::istringstream(value) >> count)
|
if (!threads.has_value() && stream >> count)
|
||||||
threads = count;
|
threads = count;
|
||||||
} break;
|
} break;
|
||||||
case Option::filesToCopy: {
|
case Option::filesToCopy: {
|
||||||
if (!nonMusic.has_value()) {
|
std::string regex;
|
||||||
if (value == "all")
|
if (!nonMusic.has_value() && stream >> regex) {
|
||||||
value = "";
|
if (regex == "all")
|
||||||
else if (value == "none")
|
regex = "";
|
||||||
value = "a^";
|
else if (regex == "none")
|
||||||
|
regex = "a^";
|
||||||
|
|
||||||
nonMusic = value;
|
nonMusic = regex;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case Option::exclude: {
|
|
||||||
if (!excluded.has_value())
|
|
||||||
excluded = value;
|
|
||||||
} break;
|
|
||||||
case Option::outputQuality: {
|
case Option::outputQuality: {
|
||||||
unsigned int quality;
|
unsigned int value;
|
||||||
if (!outputQuality.has_value() && std::istringstream(value) >> quality)
|
if (!outputQuality.has_value() && stream >> value)
|
||||||
outputQuality = std::clamp(quality, minQuality, maxQuality);
|
outputQuality = std::clamp(value, minQuality, maxQuality);
|
||||||
} break;
|
} break;
|
||||||
case Option::encodingQuality: {
|
case Option::encodingQuality: {
|
||||||
unsigned int quality;
|
unsigned int value;
|
||||||
if (!encodingQuality.has_value() && std::istringstream(value) >> quality)
|
if (!encodingQuality.has_value() && stream >> value)
|
||||||
encodingQuality = std::clamp(quality, minQuality, maxQuality);
|
encodingQuality = std::clamp(value, minQuality, maxQuality);
|
||||||
} break;
|
} break;
|
||||||
case Option::vbr: {
|
case Option::vbr: {
|
||||||
bool vb;
|
bool value;
|
||||||
if (!vbr.has_value() && std::istringstream(value) >> std::boolalpha >> vb)
|
if (!vbr.has_value() && stream >> std::boolalpha >> value)
|
||||||
vbr = vb;
|
vbr = value;
|
||||||
} break;
|
} break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -372,16 +365,9 @@ std::string Settings::resolvePath(const std::string& line) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Settings::matchNonMusic(const std::string& fileName) const {
|
bool Settings::matchNonMusic(const std::string& fileName) const {
|
||||||
if (!nonMusic.has_value())
|
if (nonMusic.has_value())
|
||||||
|
return std::regex_search(fileName, nonMusic.value());
|
||||||
|
else
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return std::regex_search(fileName, nonMusic.value());
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Settings::isExcluded(const std::string& path) const {
|
|
||||||
if (!excluded.has_value())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return std::regex_search(path, excluded.value());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,7 +40,6 @@ public:
|
|||||||
Action getAction() const;
|
Action getAction() const;
|
||||||
unsigned int getThreads() const;
|
unsigned int getThreads() const;
|
||||||
bool matchNonMusic(const std::string& fileName) const;
|
bool matchNonMusic(const std::string& fileName) const;
|
||||||
bool isExcluded(const std::string& path) const;
|
|
||||||
unsigned char getEncodingQuality() const;
|
unsigned char getEncodingQuality() const;
|
||||||
unsigned char getOutputQuality() const;
|
unsigned char getOutputQuality() const;
|
||||||
bool getVBR() const;
|
bool getVBR() const;
|
||||||
@ -70,7 +69,6 @@ private:
|
|||||||
std::optional<std::string> configPath;
|
std::optional<std::string> configPath;
|
||||||
std::optional<unsigned int> threads;
|
std::optional<unsigned int> threads;
|
||||||
std::optional<std::regex> nonMusic;
|
std::optional<std::regex> nonMusic;
|
||||||
std::optional<std::regex> excluded;
|
|
||||||
std::optional<unsigned char> encodingQuality;
|
std::optional<unsigned char> encodingQuality;
|
||||||
std::optional<unsigned char> outputQuality;
|
std::optional<unsigned char> outputQuality;
|
||||||
std::optional<bool> vbr;
|
std::optional<bool> vbr;
|
||||||
|
@ -22,9 +22,6 @@ TaskManager::~TaskManager() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TaskManager::queueConvert(const std::filesystem::path& source, const std::filesystem::path& destination) {
|
void TaskManager::queueConvert(const std::filesystem::path& source, const std::filesystem::path& destination) {
|
||||||
if (settings->isExcluded(source))
|
|
||||||
return;
|
|
||||||
|
|
||||||
std::unique_lock<std::mutex> lock(queueMutex);
|
std::unique_lock<std::mutex> lock(queueMutex);
|
||||||
jobs.emplace(Job::convert, source, destination);
|
jobs.emplace(Job::convert, source, destination);
|
||||||
|
|
||||||
@ -86,7 +83,7 @@ void TaskManager::loop() {
|
|||||||
|
|
||||||
lock.lock();
|
lock.lock();
|
||||||
++completeTasks;
|
++completeTasks;
|
||||||
printResult(job, result);
|
printResilt(job, result);
|
||||||
--busyThreads;
|
--busyThreads;
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
waitConditional.notify_all();
|
waitConditional.notify_all();
|
||||||
@ -141,7 +138,7 @@ TaskManager::JobResult TaskManager::execute(Job& job) {
|
|||||||
}};
|
}};
|
||||||
}
|
}
|
||||||
|
|
||||||
void TaskManager::printResult(const TaskManager::Job& job, const TaskManager::JobResult& result) {
|
void TaskManager::printResilt(const TaskManager::Job& job, const TaskManager::JobResult& result) {
|
||||||
std::string msg;
|
std::string msg;
|
||||||
switch (job.type) {
|
switch (job.type) {
|
||||||
case Job::copy:
|
case Job::copy:
|
||||||
|
@ -36,7 +36,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
void loop();
|
void loop();
|
||||||
JobResult execute(Job& job);
|
JobResult execute(Job& job);
|
||||||
void printResult(const Job& job, const JobResult& result);
|
void printResilt(const Job& job, const JobResult& result);
|
||||||
static JobResult mp3Job(const Job& job, const std::shared_ptr<Settings>& settings);
|
static JobResult mp3Job(const Job& job, const std::shared_ptr<Settings>& settings);
|
||||||
static JobResult copyJob(const Job& job, const std::shared_ptr<Settings>& settings);
|
static JobResult copyJob(const Job& job, const std::shared_ptr<Settings>& settings);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user