UI: Estimate recording time left until disk is full

This commit is contained in:
Clayton Groeneveld committed 2019-04-14 22:45:31 -05:00
1 parent 49d178d593
commit 171f811669
3 files changed
+87 -4

No files matched your search

+70 -4
View File
@@ -4,6 +4,7 @@
#include "window-basic-main.hpp"
#include "platform.hpp"
#include "obs-app.hpp"
#include "qt-wrappers.hpp"
#include <QDesktopWidget>
#include <QPushButton>
@@ -15,6 +16,7 @@
#include <string>
#define TIMER_INTERVAL 2000
#define REC_TIME_LEFT_INTERVAL 30000
static void setThemeID(QWidget *widget, const QString &themeID)
{
@@ -28,15 +30,32 @@ static void setThemeID(QWidget *widget, const QString &themeID)
}
}
void OBSBasicStats::OBSFrontendEvent(enum obs_frontend_event event, void *ptr)
{
OBSBasicStats *stats = reinterpret_cast<OBSBasicStats *>(ptr);
switch ((int)event) {
case OBS_FRONTEND_EVENT_RECORDING_STARTED:
stats->StartRecTimeLeft();
break;
case OBS_FRONTEND_EVENT_RECORDING_STOPPED:
stats->ResetRecTimeLeft();
break;
}
}
OBSBasicStats::OBSBasicStats(QWidget *parent, bool closeable)
: QWidget (parent),
cpu_info (os_cpu_usage_info_start()),
timer (this)
timer (this),
recTimeLeft (this)
{
QVBoxLayout *mainLayout = new QVBoxLayout();
QGridLayout *topLayout = new QGridLayout();
outputLayout = new QGridLayout();
bitrates.reserve(REC_TIME_LEFT_INTERVAL / TIMER_INTERVAL);
int row = 0;
auto newStatBare = [&] (QString name, QWidget *label, int col)
@@ -57,10 +76,12 @@ OBSBasicStats::OBSBasicStats(QWidget *parent, bool closeable)
cpuUsage = new QLabel(this);
hddSpace = new QLabel(this);
recordTimeLeft = new QLabel(this);
memUsage = new QLabel(this);
newStat("CPUUsage", cpuUsage, 0);
newStat("HDDSpaceAvailable", hddSpace, 0);
newStat("DiskFullIn", recordTimeLeft, 0);
newStat("MemoryUsage", memUsage, 0);
fps = new QLabel(this);
@@ -152,6 +173,11 @@ OBSBasicStats::OBSBasicStats(QWidget *parent, bool closeable)
Update();
QObject::connect(&recTimeLeft, &QTimer::timeout, this,
&OBSBasicStats::RecordingTimeLeft);
recTimeLeft.setInterval(REC_TIME_LEFT_INTERVAL);
recTimeLeft.start();
OBSBasic *main = reinterpret_cast<OBSBasic*>(App()->GetMainWindow());
const char *geometry = config_get_string(main->Config(),
@@ -170,6 +196,8 @@ OBSBasicStats::OBSBasicStats(QWidget *parent, bool closeable)
size(), rect));
}
}
obs_frontend_add_event_callback(OBSFrontendEvent, this);
}
void OBSBasicStats::closeEvent(QCloseEvent *event)
@@ -280,7 +308,7 @@ void OBSBasicStats::Update()
#define MBYTE (1024ULL * 1024ULL)
#define GBYTE (1024ULL * 1024ULL * 1024ULL)
#define TBYTE (1024ULL * 1024ULL * 1024ULL * 1024ULL)
uint64_t num_bytes = os_get_free_disk_space(path);
num_bytes = os_get_free_disk_space(path);
QString abrv = QStringLiteral(" MB");
long double num;
@@ -393,6 +421,45 @@ void OBSBasicStats::Update()
outputLabels[0].Update(strOutput, false);
outputLabels[1].Update(recOutput, true);
if (obs_output_active(recOutput)) {
long double kbps = outputLabels[1].kbps;
bitrates.push_back(kbps);
}
}
void OBSBasicStats::StartRecTimeLeft()
{
recordTimeLeft->setText(QTStr("Calculating"));
recTimeLeft.start();
}
void OBSBasicStats::ResetRecTimeLeft()
{
bitrates.clear();
recTimeLeft.stop();
recordTimeLeft->setText(QTStr(""));
}
void OBSBasicStats::RecordingTimeLeft()
{
long double averageBitrate = accumulate(bitrates.begin(),
bitrates.end(), 0.0) /
(long double)bitrates.size();
long double bytesPerSec = (averageBitrate / 8.0l) * 1000.0l;
long double secondsUntilFull = (long double)num_bytes / bytesPerSec;
bitrates.clear();
int totalMinutes = (int)secondsUntilFull / 60;
int minutes = totalMinutes % 60;
int hours = totalMinutes / 60;
QString text;
text.sprintf("%d %s, %d %s", hours, QT_TO_UTF8(QTStr("Hours")),
minutes, QT_TO_UTF8(QTStr("Minutes")));
recordTimeLeft->setText(text);
recordTimeLeft->setMinimumWidth(recordTimeLeft->width());
}
void OBSBasicStats::Reset()
@@ -428,8 +495,7 @@ void OBSBasicStats::OutputLabels::Update(obs_output_t *output, bool rec)
uint64_t bitsBetween = (bytesSent - lastBytesSent) * 8;
long double timePassed = (long double)(curTime - lastBytesSentTime) /
1000000000.0l;
long double kbps = (long double)bitsBetween /
timePassed / 1000.0l;
kbps = (long double)bitsBetween / timePassed / 1000.0l;
if (timePassed < 0.01l)
kbps = 0.0l;