start showing some DSP stats in the perf meter window

Lots of work to be done to decide what data to show and how to best present it
This commit is contained in:
Paul Davis 2021-06-12 09:20:58 -06:00
parent 8afc994177
commit 434bd2486e
4 changed files with 94 additions and 10 deletions

View File

@ -31,20 +31,40 @@ using namespace ARDOUR;
using namespace Gtkmm2ext;
using namespace Gtk;
DspStatisticsGUI::DspStatisticsGUI (Session* s)
: SessionHandlePtr (s)
DspStatisticsGUI::DspStatisticsGUI ()
: buffer_size_label ("", ALIGN_RIGHT, ALIGN_CENTER)
{
const size_t nlabels = Session::NTT + AudioEngine::NTT + AudioBackend::NTT;
labels = new Label*[nlabels];
for (size_t n = 0; n < nlabels; ++n) {
labels[n] = new Label ("", ALIGN_RIGHT, ALIGN_CENTER);
set_size_request_to_display_given_text (*labels[n], string_compose (_("%1 [ms]"), 99.123), 0, 0);
set_size_request_to_display_given_text (*labels[n], string_compose (_("%1 (%2 - %3 .. %4 "), 10000, 1000, 10000, 1000), 0, 0);
}
// attach (*manage (new Gtk::Label (_("Minimum"), ALIGN_RIGHT, ALIGN_CENTER)),
// 0, 1, 0, 1, Gtk::FILL, Gtk::SHRINK, 2, 0);
//attach (_lbl_min, 1, 2, 0, 1, Gtk::FILL, Gtk::SHRINK, 2, 0);
int row = 0;
attach (*manage (new Gtk::Label (_("Buffer size: "), ALIGN_RIGHT, ALIGN_CENTER)), 0, 1, row, row+1, Gtk::FILL, Gtk::SHRINK, 2, 0);
attach (buffer_size_label, 1, 2, row, row+1, Gtk::FILL, Gtk::SHRINK, 2, 0);
row++;
attach (*manage (new Gtk::Label (_("Device Wait: "), ALIGN_RIGHT, ALIGN_CENTER)), 0, 1, row, row+1, Gtk::FILL, Gtk::SHRINK, 2, 0);
attach (*labels[AudioEngine::NTT + Session::NTT + AudioBackend::DeviceWait], 1, 2, row, row+1, Gtk::FILL, Gtk::SHRINK, 2, 0);
row++;
attach (*manage (new Gtk::Label (_("Backend process: "), ALIGN_RIGHT, ALIGN_CENTER)), 0, 1, row, row+1, Gtk::FILL, Gtk::SHRINK, 2, 0);
attach (*labels[AudioEngine::NTT + Session::NTT + AudioBackend::ProcessCallback], 1, 2, row, row+1, Gtk::FILL, Gtk::SHRINK, 2, 0);
row++;
attach (*manage (new Gtk::Label (_("Engine: "), ALIGN_RIGHT, ALIGN_CENTER)), 0, 1, row, row+1, Gtk::FILL, Gtk::SHRINK, 2, 0);
attach (*labels[AudioEngine::ProcessCallback], 1, 2, row, row+1, Gtk::FILL, Gtk::SHRINK, 2, 0);
row++;
attach (*manage (new Gtk::Label (_("Session: "), ALIGN_RIGHT, ALIGN_CENTER)), 0, 1, row, row+1, Gtk::FILL, Gtk::SHRINK, 2, 0);
attach (*labels[AudioEngine::NTT + Session::OverallProcess], 1, 2, row, row+1, Gtk::FILL, Gtk::SHRINK, 2, 0);
row++;
show_all ();
}
void
@ -60,9 +80,61 @@ DspStatisticsGUI::stop_updating ()
update_connection.disconnect ();
}
void
DspStatisticsGUI::update ()
{
}
uint64_t min;
uint64_t max;
double avg;
double dev;
double minf;
double maxf;
char buf[64];
int bufsize = AudioEngine::instance()->raw_buffer_size (DataType::AUDIO);
double bufsize_msecs = (bufsize * 1000.0) / AudioEngine::instance()->sample_rate();
snprintf (buf, sizeof (buf), "%d samples / %5.2f msecs", bufsize, bufsize_msecs);
buffer_size_label.set_text (buf);
AudioEngine::instance()->dsp_stats[AudioEngine::ProcessCallback].get_stats (min, max, avg, dev);
minf = floor (min / 1000.0);
maxf = floor (max / 1000.0);
avg /= 1000.0;
dev /= 1000.0;
snprintf (buf, sizeof (buf), "%7.2g msec %5.2g%% (%7.4g - %-7.2g .. %7.2g)", avg, (100.0 * avg) / bufsize_msecs, minf, maxf, dev);
labels[AudioEngine::ProcessCallback]->set_text (buf);
AudioEngine::instance()->current_backend()->dsp_stats[AudioBackend::DeviceWait].get_stats (min, max, avg, dev);
minf = floor (min / 1000.0);
maxf = floor (max / 1000.0);
avg /= 1000.0;
dev /= 1000.0;
snprintf (buf, sizeof (buf), "%7.2g msec %5.2g%% (%7.4g - %-7.2g .. %7.2g)", avg, (100.0 * avg) / bufsize_msecs, minf, maxf, dev);
labels[AudioEngine::NTT + Session::NTT + AudioBackend::DeviceWait]->set_text (buf);
AudioEngine::instance()->current_backend()->dsp_stats[AudioBackend::ProcessCallback].get_stats (min, max, avg, dev);
minf = floor (min / 1000.0);
maxf = floor (max / 1000.0);
avg /= 1000.0;
dev /= 1000.0;
snprintf (buf, sizeof (buf), "%7.2g msec %5.2g%% (%7.4g - %-7.2g .. %7.2g)", avg, (100.0 * avg) / bufsize_msecs, minf, maxf, dev);
labels[AudioEngine::NTT + Session::NTT + AudioBackend::ProcessCallback]->set_text (buf);
if (_session) {
_session->dsp_stats[AudioEngine::ProcessCallback].get_stats (min, max, avg, dev);
min = (uint64_t) floor (min / 1000.0);
max = (uint64_t) floor (max / 1000.0);
avg /= 1000.0;
dev /= 1000.0;
snprintf (buf, sizeof (buf), "%7.2g msec %5.2g%% (%7.4g - %-7.2g .. %7.2g)", avg, (100.0 * avg) / bufsize_msecs, minf, maxf, dev);
labels[AudioEngine::NTT + Session::OverallProcess]->set_text (buf);
}
}

View File

@ -28,7 +28,7 @@
class DspStatisticsGUI : public Gtk::Table, public ARDOUR::SessionHandlePtr
{
public:
DspStatisticsGUI (ARDOUR::Session* s);
DspStatisticsGUI ();
void start_updating ();
void stop_updating ();
@ -38,6 +38,7 @@ private:
sigc::connection update_connection;
Gtk::Label buffer_size_label;
Gtk::Label** labels;
};

View File

@ -16,6 +16,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "dsp_stats_ui.h"
#include "dsp_stats_window.h"
#include "pbd/i18n.h"
@ -26,24 +27,33 @@ using namespace Gtk;
DspStatisticsWindow::DspStatisticsWindow()
: ArdourWindow (_("Performance Meters"))
, ui (new DspStatisticsGUI)
{
ui->show ();
add (*ui);
}
DspStatisticsWindow::~DspStatisticsWindow ()
{
delete ui;
}
void
DspStatisticsWindow::set_session (Session* s)
{
ui->set_session (s);
}
void
DspStatisticsWindow::on_show ()
{
ArdourWindow::on_show ();
ui->start_updating ();
}
void
DspStatisticsWindow::on_hide ()
{
ArdourWindow::on_hide ();
ui->stop_updating ();
}

View File

@ -22,7 +22,7 @@
#include "ardour_window.h"
class PluginLoadStatsGui;
class DspStatisticsGUI;
class DspStatisticsWindow : public ArdourWindow
{
@ -38,6 +38,7 @@ protected:
void on_hide ();
private:
DspStatisticsGUI* ui;
};
#endif