#include "widgets/fastmeter.h"
#include "widgets/prompter.h"
+#include "widgets/tooltips.h"
#include "ardour/ardour.h"
#include "ardour/audio_backend.h"
#include "ardour/session_state_utils.h"
#include "ardour/session_utils.h"
#include "ardour/source_factory.h"
-#include "ardour/slave.h"
+#include "ardour/transport_master.h"
+#include "ardour/transport_master_manager.h"
#include "ardour/system_exec.h"
#include "ardour/track.h"
#include "ardour/vca_manager.h"
#include "nsm.h"
#include "opts.h"
#include "pingback.h"
+#include "plugin_dspload_window.h"
#include "processor_box.h"
#include "public_editor.h"
#include "rc_option_editor.h"
#include "time_axis_view_item.h"
#include "time_info_box.h"
#include "timers.h"
+#include "transport_masters_dialog.h"
#include "utils.h"
#include "utils_videotl.h"
#include "video_server_dialog.h"
, export_video_dialog (X_("video-export"), _("Video Export Dialog"))
, lua_script_window (X_("script-manager"), _("Script Manager"))
, idleometer (X_("idle-o-meter"), _("Idle'o'Meter"))
+ , plugin_dsp_load_window (X_("plugin-dsp-load"), _("Plugin DSP Load"))
+ , transport_masters_window (X_("transport-masters"), _("Transport Masters"))
, session_option_editor (X_("session-options-editor"), _("Properties"), boost::bind (&ARDOUR_UI::create_session_option_editor, this))
, add_video_dialog (X_("add-video"), _("Add Video"), boost::bind (&ARDOUR_UI::create_add_video_dialog, this))
, bundle_manager (X_("bundle-manager"), _("Bundle Manager"), boost::bind (&ARDOUR_UI::create_bundle_manager, this))
export_video_dialog.set_state (*ui_xml, 0);
lua_script_window.set_state (*ui_xml, 0);
idleometer.set_state (*ui_xml, 0);
+ plugin_dsp_load_window.set_state (*ui_xml, 0);
+ transport_masters_window.set_state (*ui_xml, 0);
}
/* Separate windows */
WM::Manager::instance().register_window (&audio_port_matrix);
WM::Manager::instance().register_window (&midi_port_matrix);
WM::Manager::instance().register_window (&idleometer);
+ WM::Manager::instance().register_window (&plugin_dsp_load_window);
+ WM::Manager::instance().register_window (&transport_masters_window);
/* do not retain position for add route dialog */
add_route_dialog.set_state_mask (WindowProxy::Size);
}
update_disk_space ();
update_cpu_load ();
- update_xrun_count ();
update_sample_rate (AudioEngine::instance()->sample_rate());
update_timecode_format ();
update_peak_thread_work ();
ARDOUR_UI::every_second ()
{
update_cpu_load ();
- update_xrun_count ();
- update_buffer_load ();
update_disk_space ();
update_timecode_format ();
update_peak_thread_work ();
ENSURE_GUI_THREAD (*this, &ARDOUR_UI::update_sample_rate, ignored)
- if (!AudioEngine::instance()->connected()) {
+ if (!AudioEngine::instance()->running()) {
snprintf (buf, sizeof (buf), "%s", _("Audio: <span foreground=\"red\">none</span>"));
case MBWF:
s << _("MBWF");
break;
+ case FLAC:
+ s << _("FLAC");
+ break;
}
s << " ";
}
void
-ARDOUR_UI::update_xrun_count ()
+ARDOUR_UI::update_cpu_load ()
{
- char buf[64];
+ const unsigned int x = _session ? _session->get_xrun_count () : 0;
+ double const c = AudioEngine::instance()->get_dsp_load ();
- /* If this text is changed, the set_size_request_to_display_given_text call in ARDOUR_UI::resize_text_widgets
- should also be changed.
- */
+ const char* const bg = c > 90 ? " background=\"red\"" : "";
- if (_session) {
- const unsigned int x = _session->get_xrun_count ();
- dsp_load_indicator.set_xrun_count (x);
- if (x > 9999) {
- snprintf (buf, sizeof (buf), _("X: <span foreground=\"%s\">>10K</span>"), X_("red"));
- } else {
- snprintf (buf, sizeof (buf), _("X: <span foreground=\"%s\">%u</span>"), x > 0 ? X_("red") : X_("green"), x);
- }
+ char buf[64];
+ if (x > 9999) {
+ snprintf (buf, sizeof (buf), "DSP: <span%s>%.0f%%</span> (>10k)", bg, c);
+ } else if (x > 0) {
+ snprintf (buf, sizeof (buf), "DSP: <span%s>%.0f%%</span> (%d)", bg, c, x);
} else {
- snprintf (buf, sizeof (buf), _("X: <span foreground=\"%s\">?</span>"), X_("yellow"));
- dsp_load_indicator.set_xrun_count (UINT_MAX);
+ snprintf (buf, sizeof (buf), "DSP: <span%s>%.0f%%</span>", bg, c);
}
- xrun_label.set_markup (buf);
- set_tip (xrun_label, _("Audio dropouts. Shift+click to reset"));
-}
-void
-ARDOUR_UI::update_cpu_load ()
-{
- char buf[64];
+ dsp_load_label.set_markup (buf);
- /* If this text is changed, the set_size_request_to_display_given_text call in ARDOUR_UI::resize_text_widgets
- should also be changed.
- */
+ if (x > 9999) {
+ snprintf (buf, sizeof (buf), _("DSP: %.1f%% X: >10k\n%s"), c, _("Shift+Click to clear xruns."));
+ } else if (x > 0) {
+ snprintf (buf, sizeof (buf), _("DSP: %.1f%% X: %u\n%s"), c, x, _("Shift+Click to clear xruns."));
+ } else {
+ snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), c);
+ }
- double const c = AudioEngine::instance()->get_dsp_load ();
- dsp_load_indicator.set_dsp_load (c);
- snprintf (buf, sizeof (buf), _("DSP: <span foreground=\"%s\">%5.1f%%</span>"), c >= 90 ? X_("red") : X_("green"), c);
- cpu_load_label.set_markup (buf);
+ ArdourWidgets::set_tooltip (dsp_load_label, buf);
}
void
}
}
-void
-ARDOUR_UI::update_buffer_load ()
-{
- char buf[256];
-
- uint32_t const playback = _session ? _session->playback_load () : 100;
- uint32_t const capture = _session ? _session->capture_load () : 100;
-
- /* If this text is changed, the set_size_request_to_display_given_text call in ARDOUR_UI::resize_text_widgets
- should also be changed.
- */
-
- uint32_t max_load = std::min ( playback, capture );
-
- disk_io_indicator.set_disk_io(max_load);
-}
-
void
ARDOUR_UI::count_recenabled_streams (Route& route)
{
}
}
+void
+ARDOUR_UI::format_disk_space_label (float remain_sec)
+{
+ if (remain_sec < 0) {
+ disk_space_label.set_text (_("N/A"));
+ ArdourWidgets::set_tooltip (disk_space_label, _("Unknown"));
+ return;
+ }
+
+ char buf[64];
+
+ int sec = floor (remain_sec);
+ int hrs = sec / 3600;
+ int mins = (sec / 60) % 60;
+ int secs = sec % 60;
+ snprintf (buf, sizeof(buf), _("%02dh:%02dm:%02ds"), hrs, mins, secs);
+ ArdourWidgets::set_tooltip (disk_space_label, buf);
+
+ if (remain_sec > 86400) {
+ disk_space_label.set_text (_("Rec: >24h"));
+ return;
+ } else if (remain_sec > 32400 /* 9 hours */) {
+ snprintf (buf, sizeof (buf), "Rec: %.0fh", remain_sec / 3600.f);
+ } else if (remain_sec > 5940 /* 99 mins */) {
+ snprintf (buf, sizeof (buf), "Rec: %.1fh", remain_sec / 3600.f);
+ } else {
+ snprintf (buf, sizeof (buf), "Rec: %.0fm", remain_sec / 60.f);
+ }
+ disk_space_label.set_text (buf);
+
+}
+
void
ARDOUR_UI::update_disk_space()
{
if (_session == 0) {
- disk_space_indicator.set_available_disk_sec (-1);
+ format_disk_space_label (-1);
return;
}
boost::optional<samplecnt_t> opt_samples = _session->available_capture_duration();
- char buf[64];
samplecnt_t fr = _session->sample_rate();
if (fr == 0) {
/* skip update - no SR available */
- disk_space_indicator.set_available_disk_sec (-1);
+ format_disk_space_label (-1);
return;
}
if (!opt_samples) {
/* Available space is unknown */
- snprintf (buf, sizeof (buf), "%s", _("Disk: <span foreground=\"green\">Unknown</span>"));
- disk_space_indicator.set_available_disk_sec (-1);
+ format_disk_space_label (-1);
} else if (opt_samples.get_value_or (0) == max_samplecnt) {
- snprintf (buf, sizeof (buf), "%s", _("Disk: <span foreground=\"green\">24hrs+</span>"));
- disk_space_indicator.set_available_disk_sec (max_samplecnt);
+ format_disk_space_label (max_samplecnt);
} else {
rec_enabled_streams = 0;
_session->foreach_route (this, &ARDOUR_UI::count_recenabled_streams, false);
samples /= rec_enabled_streams;
}
- int hrs;
- int mins;
- int secs;
-
- disk_space_indicator.set_available_disk_sec (samples / (float)fr);
-
- hrs = samples / (fr * 3600);
-
- if (hrs > 24) {
- snprintf (buf, sizeof (buf), "%s", _("Disk: <span foreground=\"green\">>24 hrs</span>"));
- } else {
- samples -= hrs * fr * 3600;
- mins = samples / (fr * 60);
- samples -= mins * fr * 60;
- secs = samples / fr;
-
- bool const low = (hrs == 0 && mins <= 30);
-
- snprintf (
- buf, sizeof(buf),
- _("Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"),
- low ? X_("red") : X_("green"),
- hrs, mins, secs
- );
- }
+ format_disk_space_label (samples / (float)fr);
}
- disk_space_label.set_markup (buf);
}
void
if (_session) {
bool matching;
- TimecodeSlave* tcslave;
- SyncSource sync_src = Config->get_sync_source();
+ boost::shared_ptr<TimecodeTransportMaster> tcmaster;
+ boost::shared_ptr<TransportMaster> tm = TransportMasterManager::instance().current();
- if ((sync_src == LTC || sync_src == MTC) && (tcslave = dynamic_cast<TimecodeSlave*>(_session->slave())) != 0) {
- matching = (tcslave->apparent_timecode_format() == _session->config.get_timecode_format());
+ if ((tm->type() == LTC || tm->type() == MTC) && (tcmaster = boost::dynamic_pointer_cast<TimecodeTransportMaster>(tm)) != 0) {
+ matching = (tcmaster->apparent_timecode_format() == _session->config.get_timecode_format());
} else {
matching = true;
}
bool
ARDOUR_UI::check_audioengine (Gtk::Window& parent)
{
- if (!AudioEngine::instance()->connected()) {
+ if (!AudioEngine::instance()->running()) {
MessageDialog msg (parent, string_compose (
_("%1 is not connected to any audio backend.\n"
"You cannot open or close sessions in this condition"),
}
}
+void
+ARDOUR_UI::session_add_foldback_bus (uint32_t how_many, string const & name_template)
+{
+ RouteList routes;
+
+ assert (_session);
+
+ try {
+ routes = _session->new_audio_route (2, 2, 0, how_many, name_template, PresentationInfo::FoldbackBus, -1);
+
+ if (routes.size() != how_many) {
+ error << string_compose (P_("could not create %1 new foldback bus", "could not create %1 new foldback busses", how_many), how_many)
+ << endmsg;
+ }
+ }
+
+ catch (...) {
+ display_insufficient_ports_message ();
+ return;
+ }
+
+ for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
+ (*i)->set_strict_io (true);
+ }
+}
+
void
ARDOUR_UI::display_insufficient_ports_message ()
{
return;
}
-#if 0
if (_session->config.get_external_sync()) {
- switch (Config->get_sync_source()) {
+ switch (TransportMasterManager::instance().current()->type()) {
case Engine:
break;
default:
return;
}
}
-#endif
bool rolling = _session->transport_rolling();
}
if (_session->config.get_external_sync()) {
- switch (Config->get_sync_source()) {
+ switch (TransportMasterManager::instance().current()->type()) {
case Engine:
break;
default:
solo_blink (blink_on);
audition_blink (blink_on);
feedback_blink (blink_on);
-
- dsp_load_indicator.blink(blink_on);
- disk_space_indicator.blink(blink_on);
}
void
MessageDialog msg (_main_window,
string_compose (_("\
%1 was unable to save your session.\n\n\
-If you still wish to proceeed, please use the\n\n\
+If you still wish to proceed, please use the\n\n\
\"Don't save now\" option."), PROGRAM_NAME));
pop_back_splash(msg);
msg.run ();
return;
}
- // no break
+ /* fall through */
case 0:
_session->remove_pending_capture_state ();
break;
MessageDialog msg (_main_window,
string_compose (_("\
%1 was unable to save your session.\n\n\
-If you still wish to proceeed, please use the\n\n\
+If you still wish to proceed, please use the\n\n\
\"Don't save now\" option."), PROGRAM_NAME));
pop_back_splash(msg);
msg.run ();
return;
}
- // no break
+ /* fall through */
case 0:
_session->remove_pending_capture_state ();
break;
switch (dialog.run()) {
case RESPONSE_OK:
-#ifdef __APPLE__
- open_uri("http://webchat.freenode.net/?channels=ardour-osx");
-#elif defined PLATFORM_WINDOWS
- open_uri("http://webchat.freenode.net/?channels=ardour-windows");
-#else
open_uri("http://webchat.freenode.net/?channels=ardour");
-#endif
break;
default:
break;
return;
}
+ if (!AudioEngine::instance()->running ()) {
+ switch (r) {
+ case AddRouteDialog::Add:
+ case AddRouteDialog::AddAndClose:
+ break;
+ default:
+ return;
+ }
+ add_route_dialog->ArdourDialog::on_response (r);
+ ARDOUR_UI_UTILS::engine_is_running ();
+ return;
+ }
+
int count;
switch (r) {
case AddRouteDialog::VCAMaster:
_session->vca_manager().create_vca (count, name_template);
break;
+ case AddRouteDialog::FoldbackBus:
+ session_add_foldback_bus (count, name_template);
+ break;
}
}
ENSURE_GUI_THREAD (*this, &ARDOUR_UI::xrun_handler, where)
- if (_session && _session->actively_recording()) {
- dsp_load_indicator.set_xrun_while_recording();
- }
-
if (_session && Config->get_create_xrun_marker() && _session->actively_recording()) {
create_xrun_marker(where);
}