Split progress code
This commit is contained in:
parent
44d6cb83de
commit
11a29ddef6
|
@ -467,6 +467,8 @@ add_library(rhubarb-tools
|
|||
src/tools/parallel.h
|
||||
src/tools/platformTools.cpp
|
||||
src/tools/platformTools.h
|
||||
src/tools/progress.cpp
|
||||
src/tools/progress.h
|
||||
src/tools/ProgressBar.cpp
|
||||
src/tools/ProgressBar.h
|
||||
src/tools/stringTools.cpp
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include "processing.h"
|
||||
#include <algorithm>
|
||||
|
||||
using std::function;
|
||||
using std::vector;
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#include <vector>
|
||||
#include <functional>
|
||||
#include "AudioClip.h"
|
||||
#include "tools/ProgressBar.h"
|
||||
#include "tools/progress.h"
|
||||
|
||||
void process16bitAudioClip(const AudioClip& audioClip, std::function<void(const std::vector<int16_t>&)> processBuffer, size_t bufferCapacity, ProgressSink& progressSink);
|
||||
void process16bitAudioClip(const AudioClip& audioClip, std::function<void(const std::vector<int16_t>&)> processBuffer, ProgressSink& progressSink);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#pragma once
|
||||
#include "AudioClip.h"
|
||||
#include "time/BoundedTimeline.h"
|
||||
#include "tools/ProgressBar.h"
|
||||
#include "tools/progress.h"
|
||||
|
||||
JoiningBoundedTimeline<void> detectVoiceActivity(const AudioClip& audioClip, int maxThreadCount, ProgressSink& progressSink);
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#include "core/Shape.h"
|
||||
#include "time/ContinuousTimeline.h"
|
||||
#include "audio/AudioClip.h"
|
||||
#include "tools/ProgressBar.h"
|
||||
#include "tools/progress.h"
|
||||
#include <boost/filesystem.hpp>
|
||||
#include "animation/targetShapeSet.h"
|
||||
#include "recognition/Recognizer.h"
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
#include "audio/AudioClip.h"
|
||||
#include "core/Phone.h"
|
||||
#include "tools/ProgressBar.h"
|
||||
#include "tools/progress.h"
|
||||
#include "time/BoundedTimeline.h"
|
||||
|
||||
class Recognizer {
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#include "time/BoundedTimeline.h"
|
||||
#include "core/Phone.h"
|
||||
#include "audio/AudioClip.h"
|
||||
#include "tools/ProgressBar.h"
|
||||
#include "tools/progress.h"
|
||||
#include <boost/filesystem/path.hpp>
|
||||
|
||||
extern "C" {
|
||||
|
|
|
@ -3,52 +3,11 @@
|
|||
#include <future>
|
||||
#include <chrono>
|
||||
#include <format.h>
|
||||
#include <iostream>
|
||||
#include <boost/algorithm/clamp.hpp>
|
||||
#include <cmath>
|
||||
|
||||
using std::string;
|
||||
|
||||
ProgressForwarder::ProgressForwarder(std::function<void(double progress)> callback) :
|
||||
callback(callback)
|
||||
{}
|
||||
|
||||
void ProgressForwarder::reportProgress(double value) {
|
||||
callback(value);
|
||||
}
|
||||
|
||||
ProgressMerger::ProgressMerger(ProgressSink& sink) :
|
||||
sink(sink)
|
||||
{}
|
||||
|
||||
ProgressSink& ProgressMerger::addSink(double weight) {
|
||||
std::lock_guard<std::mutex> lock(mutex);
|
||||
|
||||
totalWeight += weight;
|
||||
int sinkIndex = weightedValues.size();
|
||||
weightedValues.push_back(0);
|
||||
forwarders.push_back(ProgressForwarder([weight, sinkIndex, this](double progress) {
|
||||
weightedValues[sinkIndex] = progress * weight;
|
||||
report();
|
||||
}));
|
||||
return forwarders.back();
|
||||
}
|
||||
|
||||
void ProgressMerger::report() {
|
||||
std::lock_guard<std::mutex> lock(mutex);
|
||||
|
||||
if (totalWeight != 0) {
|
||||
double weightedSum = 0;
|
||||
for (double weightedValue : weightedValues) {
|
||||
weightedSum += weightedValue;
|
||||
}
|
||||
double progress = weightedSum / totalWeight;
|
||||
sink.reportProgress(progress);
|
||||
} else {
|
||||
sink.reportProgress(0);
|
||||
}
|
||||
}
|
||||
|
||||
ProgressBar::ProgressBar(std::ostream& stream) :
|
||||
stream(stream)
|
||||
{
|
||||
|
|
|
@ -2,45 +2,8 @@
|
|||
|
||||
#include <atomic>
|
||||
#include <future>
|
||||
#include <functional>
|
||||
#include <list>
|
||||
#include <vector>
|
||||
#include <mutex>
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
|
||||
class ProgressSink {
|
||||
public:
|
||||
virtual ~ProgressSink() {}
|
||||
virtual void reportProgress(double value) = 0;
|
||||
};
|
||||
|
||||
class NullProgressSink : public ProgressSink {
|
||||
public:
|
||||
void reportProgress(double) override {}
|
||||
};
|
||||
|
||||
class ProgressForwarder : public ProgressSink {
|
||||
public:
|
||||
ProgressForwarder(std::function<void(double progress)> callback);
|
||||
void reportProgress(double value) override;
|
||||
private:
|
||||
std::function<void(double progress)> callback;
|
||||
};
|
||||
|
||||
class ProgressMerger {
|
||||
public:
|
||||
ProgressMerger(ProgressSink& sink);
|
||||
ProgressSink& addSink(double weight);
|
||||
private:
|
||||
void report();
|
||||
|
||||
ProgressSink& sink;
|
||||
std::mutex mutex;
|
||||
double totalWeight = 0;
|
||||
std::list<ProgressForwarder> forwarders;
|
||||
std::vector<double> weightedValues;
|
||||
};
|
||||
#include "progress.h"
|
||||
|
||||
class ProgressBar : public ProgressSink {
|
||||
public:
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
#pragma once
|
||||
|
||||
#include <functional>
|
||||
#include "ProgressBar.h"
|
||||
#include <future>
|
||||
#include "progress.h"
|
||||
#include <gsl_util.h>
|
||||
|
||||
template<typename TCollection>
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
#include "progress.h"
|
||||
|
||||
#include <mutex>
|
||||
|
||||
using std::string;
|
||||
|
||||
ProgressForwarder::ProgressForwarder(std::function<void(double progress)> callback) :
|
||||
callback(callback)
|
||||
{}
|
||||
|
||||
void ProgressForwarder::reportProgress(double value) {
|
||||
callback(value);
|
||||
}
|
||||
|
||||
ProgressMerger::ProgressMerger(ProgressSink& sink) :
|
||||
sink(sink)
|
||||
{}
|
||||
|
||||
ProgressSink& ProgressMerger::addSink(double weight) {
|
||||
std::lock_guard<std::mutex> lock(mutex);
|
||||
|
||||
totalWeight += weight;
|
||||
int sinkIndex = weightedValues.size();
|
||||
weightedValues.push_back(0);
|
||||
forwarders.push_back(ProgressForwarder([weight, sinkIndex, this](double progress) {
|
||||
weightedValues[sinkIndex] = progress * weight;
|
||||
report();
|
||||
}));
|
||||
return forwarders.back();
|
||||
}
|
||||
|
||||
void ProgressMerger::report() {
|
||||
std::lock_guard<std::mutex> lock(mutex);
|
||||
|
||||
if (totalWeight != 0) {
|
||||
double weightedSum = 0;
|
||||
for (double weightedValue : weightedValues) {
|
||||
weightedSum += weightedValue;
|
||||
}
|
||||
double progress = weightedSum / totalWeight;
|
||||
sink.reportProgress(progress);
|
||||
} else {
|
||||
sink.reportProgress(0);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
#pragma once
|
||||
|
||||
#include <list>
|
||||
#include <functional>
|
||||
#include <mutex>
|
||||
#include <vector>
|
||||
|
||||
class ProgressSink {
|
||||
public:
|
||||
virtual ~ProgressSink() {}
|
||||
virtual void reportProgress(double value) = 0;
|
||||
};
|
||||
|
||||
class NullProgressSink : public ProgressSink {
|
||||
public:
|
||||
void reportProgress(double) override {}
|
||||
};
|
||||
|
||||
class ProgressForwarder : public ProgressSink {
|
||||
public:
|
||||
ProgressForwarder(std::function<void(double progress)> callback);
|
||||
void reportProgress(double value) override;
|
||||
private:
|
||||
std::function<void(double progress)> callback;
|
||||
};
|
||||
|
||||
class ProgressMerger {
|
||||
public:
|
||||
ProgressMerger(ProgressSink& sink);
|
||||
ProgressSink& addSink(double weight);
|
||||
private:
|
||||
void report();
|
||||
|
||||
ProgressSink& sink;
|
||||
std::mutex mutex;
|
||||
double totalWeight = 0;
|
||||
std::list<ProgressForwarder> forwarders;
|
||||
std::vector<double> weightedValues;
|
||||
};
|
Loading…
Reference in New Issue