summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2009-04-27 16:34:11 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2009-04-27 16:34:11 +0000
commit3fc1f9fb4cc7881087ed869809eff8c950b5e3c4 (patch)
tree1ce449976435f8d0eb4d3b2b761ed886fd4b8868 /gtk2_ardour
parent68f0da769473632d1b84daf608299e98fa2955c0 (diff)
write buffer stats to file on disk underrun/overrun
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@5003 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/ardour_ui.cc59
-rw-r--r--gtk2_ardour/ardour_ui.h16
2 files changed, 74 insertions, 1 deletions
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index 411f8d4f62..a3b699c809 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -901,8 +901,14 @@ void
ARDOUR_UI::update_buffer_load ()
{
char buf[64];
+ uint32_t c, p;
if (session) {
+ c = session->capture_load ();
+ p = session->playback_load ();
+
+ push_buffer_stats (c, p);
+
snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
session->playback_load(), session->capture_load());
buffer_load_label.set_text (buf);
@@ -3011,10 +3017,60 @@ What you would like to do?\n"));
}
void
+ARDOUR_UI::push_buffer_stats (uint32_t capture, uint32_t playback)
+{
+ time_t now;
+ time (&now);
+
+ while (disk_buffer_stats.size() > 60) {
+ disk_buffer_stats.pop_front ();
+ }
+
+ disk_buffer_stats.push_back (DiskBufferStat (now, capture, playback));
+}
+
+void
+ARDOUR_UI::write_buffer_stats ()
+{
+ std::ofstream fout;
+ struct tm tm;
+ char buf[64];
+ char* path;
+
+ if ((path = tempnam (0, "ardourBuffering")) == 0) {
+ cerr << X_("cannot find temporary name for ardour buffer stats") << endl;
+ return;
+ }
+
+ fout.open (path);
+
+ if (!fout) {
+ cerr << string_compose (X_("cannot open file %1 for ardour buffer stats"), path) << endl;
+ return;
+ }
+
+ for (list<DiskBufferStat>::iterator i = disk_buffer_stats.begin(); i != disk_buffer_stats.end(); ++i) {
+ localtime_r (&(*i).when, &tm);
+ strftime (buf, sizeof (buf), "%T", &tm);
+ fout << buf << ' ' << (*i).capture << ' ' << (*i).playback << endl;
+ }
+
+ disk_buffer_stats.clear ();
+
+ fout.close ();
+
+ cerr << "Ardour buffering statistics can be found in: " << path << endl;
+ free (path);
+}
+
+void
ARDOUR_UI::disk_overrun_handler ()
{
+
ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
+ write_buffer_stats ();
+
if (!have_disk_speed_dialog_displayed) {
have_disk_speed_dialog_displayed = true;
MessageDialog* msg = new MessageDialog (*editor, _("\
@@ -3031,8 +3087,11 @@ quickly enough to keep up with recording.\n"));
void
ARDOUR_UI::disk_underrun_handler ()
{
+
ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
+ write_buffer_stats ();
+
if (!have_disk_speed_dialog_displayed) {
have_disk_speed_dialog_displayed = true;
MessageDialog* msg = new MessageDialog (*editor,
diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h
index a0c84a18d8..29acce6377 100644
--- a/gtk2_ardour/ardour_ui.h
+++ b/gtk2_ardour/ardour_ui.h
@@ -20,6 +20,8 @@
#ifndef __ardour_gui_h__
#define __ardour_gui_h__
+#include <time.h>
+
/* need _BSD_SOURCE to get timersub macros */
#ifdef _BSD_SOURCE
@@ -31,7 +33,6 @@
#endif
#include <list>
-
#include <cmath>
#include <libgnomecanvasmm/canvas.h>
@@ -655,6 +656,19 @@ class ARDOUR_UI : public Gtkmm2ext::UI
ARDOUR::microseconds_t last_peak_grab;
ARDOUR::microseconds_t last_shuttle_request;
+ struct DiskBufferStat {
+ time_t when;
+ uint32_t capture;
+ uint32_t playback;
+
+ DiskBufferStat (time_t w, uint32_t c, uint32_t p)
+ : when (w), capture (c), playback (p) {}
+ };
+
+ std::list<DiskBufferStat> disk_buffer_stats;
+ void push_buffer_stats (uint32_t, uint32_t);
+ void write_buffer_stats ();
+
bool have_disk_speed_dialog_displayed;
void disk_speed_dialog_gone (int ignored_response, Gtk::MessageDialog*);
void disk_overrun_handler ();