2 Copyright (C) 1999-2002 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
31 #include <gtkmm/messagedialog.h>
32 #include <gtkmm/accelmap.h>
34 #include <pbd/error.h>
35 #include <pbd/compose.h>
36 #include <pbd/pathscanner.h>
37 #include <pbd/failed_constructor.h>
38 #include <gtkmm2ext/gtk_ui.h>
39 #include <gtkmm2ext/utils.h>
40 #include <gtkmm2ext/click_box.h>
41 #include <gtkmm2ext/fastmeter.h>
42 #include <gtkmm2ext/stop_signal.h>
43 #include <gtkmm2ext/popup.h>
45 #include <midi++/port.h>
46 #include <midi++/mmc.h>
48 #include <ardour/ardour.h>
49 #include <ardour/session_route.h>
50 #include <ardour/port.h>
51 #include <ardour/audioengine.h>
52 #include <ardour/playlist.h>
53 #include <ardour/utils.h>
54 #include <ardour/audio_diskstream.h>
55 #include <ardour/audiofilesource.h>
56 #include <ardour/recent_sessions.h>
57 #include <ardour/port.h>
58 #include <ardour/audio_track.h>
61 #include "ardour_ui.h"
62 #include "public_editor.h"
63 #include "audio_clock.h"
68 #include "keyboard_target.h"
69 #include "add_route_dialog.h"
70 #include "new_session_dialog.h"
73 #include "gui_thread.h"
74 #include "color_manager.h"
78 using namespace ARDOUR;
80 using namespace Gtkmm2ext;
84 ARDOUR_UI *ARDOUR_UI::theArdourUI = 0;
86 sigc::signal<void,bool> ARDOUR_UI::Blink;
87 sigc::signal<void> ARDOUR_UI::RapidScreenUpdate;
88 sigc::signal<void> ARDOUR_UI::SuperRapidScreenUpdate;
89 sigc::signal<void,jack_nframes_t> ARDOUR_UI::Clock;
91 ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
93 : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile),
95 primary_clock (X_("TransportClockDisplay"), true, false, true),
96 secondary_clock (X_("SecondaryClockDisplay"), true, false, true),
97 preroll_clock (X_("PreRollClock"), true, true),
98 postroll_clock (X_("PostRollClock"), true, true),
102 adjuster_table (3, 3),
106 preroll_button (_("pre\nroll")),
107 postroll_button (_("post\nroll")),
111 big_clock ("BigClockDisplay", true),
115 time_master_button (_("time\nmaster")),
117 shuttle_units_button (_("% ")),
119 punch_in_button (_("Punch In")),
120 punch_out_button (_("Punch Out")),
121 auto_return_button (_("Auto Return")),
122 auto_play_button (_("Autuo Play")),
123 auto_input_button (_("Auto Input")),
124 click_button (_("Click")),
125 auditioning_alert_button (_("AUDITION")),
126 solo_alert_button (_("SOLO")),
129 using namespace Gtk::Menu_Helpers;
135 if (theArdourUI == 0) {
141 color_manager = new ColorManager();
143 std::string color_file = ARDOUR::find_config_file("ardour.colors");
145 color_manager->load (color_file);
150 _session_is_new = false;
151 big_clock_window = 0;
152 session_selector_window = 0;
153 last_key_press_time = 0;
154 connection_editor = 0;
155 add_route_dialog = 0;
160 open_session_selector = 0;
161 have_configure_timeout = false;
162 have_disk_overrun_displayed = false;
163 have_disk_underrun_displayed = false;
164 _will_create_new_session_automatically = false;
165 session_loaded = false;
166 last_speed_displayed = -1.0f;
168 last_configure_time.tv_sec = 0;
169 last_configure_time.tv_usec = 0;
171 shuttle_grabbed = false;
173 shuttle_max_speed = 8.0f;
175 set_shuttle_units (Percentage);
176 set_shuttle_behaviour (Sprung);
178 shuttle_style_menu = 0;
179 shuttle_unit_menu = 0;
181 gettimeofday (&last_peak_grab, 0);
182 gettimeofday (&last_shuttle_request, 0);
184 ARDOUR::AudioDiskstream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
185 ARDOUR::Diskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
186 ARDOUR::Diskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
188 /* handle pending state with a dialog */
190 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
192 /* have to wait for AudioEngine and Configuration before proceeding */
196 ARDOUR_UI::set_engine (AudioEngine& e)
200 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
201 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
202 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
203 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
205 ActionManager::init ();
206 new_session_dialog = new NewSessionDialog();
210 keyboard = new Keyboard;
212 if (setup_windows ()) {
213 throw failed_constructor ();
216 if (GTK_ARDOUR::show_key_actions) {
217 vector<string> names;
218 vector<string> paths;
220 vector<AccelKey> bindings;
222 ActionManager::get_all_actions (names, paths, keys, bindings);
224 vector<string>::iterator n;
225 vector<string>::iterator k;
226 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
227 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
233 /* start with timecode, metering enabled
236 blink_timeout_tag = -1;
238 /* the global configuration object is now valid */
242 /* this being a GUI and all, we want peakfiles */
244 AudioFileSource::set_build_peakfiles (true);
245 AudioFileSource::set_build_missing_peakfiles (true);
247 if (AudioSource::start_peak_thread ()) {
248 throw failed_constructor();
251 /* start the time-of-day-clock */
253 update_wall_clock ();
254 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
256 update_disk_space ();
258 update_sample_rate (engine->frame_rate());
260 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
261 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
264 ARDOUR_UI::~ARDOUR_UI ()
266 save_ardour_state ();
280 if (add_route_dialog) {
281 delete add_route_dialog;
284 AudioSource::stop_peak_thread ();
288 ARDOUR_UI::configure_timeout ()
293 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
294 /* no configure events yet */
298 gettimeofday (&now, 0);
299 timersub (&now, &last_configure_time, &diff);
301 /* force a gap of 0.5 seconds since the last configure event
304 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
307 have_configure_timeout = false;
308 save_ardour_state ();
314 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
316 if (have_configure_timeout) {
317 gettimeofday (&last_configure_time, 0);
319 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
320 have_configure_timeout = true;
327 ARDOUR_UI::save_ardour_state ()
329 if (!keyboard || !mixer || !editor) {
333 /* XXX this is all a bit dubious. add_extra_xml() uses
334 a different lifetime model from add_instant_xml().
337 XMLNode* node = new XMLNode (keyboard->get_state());
338 Config->add_extra_xml (*node);
339 Config->save_state();
341 XMLNode enode(static_cast<Stateful*>(editor)->get_state());
342 XMLNode mnode(mixer->get_state());
345 session->add_instant_xml (enode, session->path());
346 session->add_instant_xml (mnode, session->path());
348 Config->add_instant_xml (enode, get_user_ardour_path());
349 Config->add_instant_xml (mnode, get_user_ardour_path());
354 AccelMap::save ("ardour.saved_bindings");
358 ARDOUR_UI::startup ()
360 /* Once the UI is up and running, start the audio engine. Doing
361 this before the UI is up and running can cause problems
362 when not running with SCHED_FIFO, because the amount of
363 CPU and disk work needed to get the UI started can interfere
364 with the scheduling of the audio thread.
367 Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
373 if (session && session->dirty()) {
374 switch (ask_about_saving_session(_("quit"))) {
379 /* use the default name */
380 if (save_state_canfail ("")) {
381 /* failed - don't quit */
382 MessageDialog msg (*editor,
384 Ardour was unable to save your session.\n\n\
385 If you still wish to quit, please use the\n\n\
386 \"Just quit\" option."));
395 Config->save_state();
400 ARDOUR_UI::ask_about_saving_session (const string & what)
402 ArdourDialog window (_("ardour: save session?"));
403 Gtk::HBox dhbox; // the hbox for the image and text
404 Gtk::Label prompt_label;
405 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
409 msg = string_compose(_("Don't %1"), what);
410 window.add_button (msg, RESPONSE_REJECT);
411 msg = string_compose(_("Just %1"), what);
412 window.add_button (msg, RESPONSE_APPLY);
413 msg = string_compose(_("Save and %1"), what);
414 window.add_button (msg, RESPONSE_ACCEPT);
416 window.set_default_response (RESPONSE_ACCEPT);
418 Gtk::Button noquit_button (msg);
419 noquit_button.set_name ("EditorGTKButton");
424 if (session->snap_name() == session->name()) {
427 type = _("snapshot");
429 prompt = string_compose(_("The %1\"%2\"\nhas not been saved.\n\nAny changes made this time\nwill be lost unless you save it.\n\nWhat do you want to do?"),
430 type, session->snap_name());
432 prompt_label.set_text (prompt);
433 prompt_label.set_name (X_("PrompterLabel"));
434 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
436 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
438 dhbox.set_homogeneous (false);
439 dhbox.pack_start (*dimage, false, false, 5);
440 dhbox.pack_start (prompt_label, true, false, 5);
441 window.get_vbox()->pack_start (dhbox);
443 window.set_name (_("Prompter"));
444 window.set_position (Gtk::WIN_POS_MOUSE);
445 window.set_modal (true);
446 window.set_resizable (false);
449 save_the_session = 0;
451 editor->ensure_float (window);
453 ResponseType r = (ResponseType) window.run();
458 case RESPONSE_ACCEPT: // save and get out of here
460 case RESPONSE_APPLY: // get out of here
470 ARDOUR_UI::every_second ()
473 update_buffer_load ();
474 update_disk_space ();
479 ARDOUR_UI::every_point_one_seconds ()
481 update_speed_display ();
482 RapidScreenUpdate(); /* EMIT_SIGNAL */
487 ARDOUR_UI::every_point_zero_one_seconds ()
489 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
494 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
498 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
500 if (!engine->connected()) {
502 snprintf (buf, sizeof (buf), _("disconnected"));
506 jack_nframes_t rate = engine->frame_rate();
508 if (fmod (rate, 1000.0) != 0.0) {
509 snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"),
510 (float) rate/1000.0f,
511 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
513 snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"),
515 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
519 sample_rate_label.set_text (buf);
523 ARDOUR_UI::update_cpu_load ()
526 snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
527 cpu_load_label.set_text (buf);
531 ARDOUR_UI::update_buffer_load ()
536 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
537 session->playback_load(), session->capture_load());
538 buffer_load_label.set_text (buf);
540 buffer_load_label.set_text ("");
545 ARDOUR_UI::count_recenabled_diskstreams (Route& route)
547 Track* track = dynamic_cast<Track*>(&route);
548 if (track && track->diskstream()->record_enabled()) {
549 rec_enabled_diskstreams++;
554 ARDOUR_UI::update_disk_space()
560 jack_nframes_t frames = session->available_capture_duration();
563 if (frames == max_frames) {
564 strcpy (buf, _("Disk: 24hrs+"));
569 jack_nframes_t fr = session->frame_rate();
571 if (session->actively_recording()){
573 rec_enabled_diskstreams = 0;
574 session->foreach_route (this, &ARDOUR_UI::count_recenabled_diskstreams);
576 if (rec_enabled_diskstreams) {
577 frames /= rec_enabled_diskstreams;
582 /* hmmm. shall we divide by the route count? or the diskstream count?
583 or what? for now, do nothing ...
588 hrs = frames / (fr * 3600);
589 frames -= hrs * fr * 3600;
590 mins = frames / (fr * 60);
591 frames -= mins * fr * 60;
594 snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
597 disk_space_label.set_text (buf);
601 ARDOUR_UI::update_wall_clock ()
608 tm_now = localtime (&now);
610 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
611 wall_clock_label.set_text (buf);
616 ARDOUR_UI::control_methods_adjusted ()
621 which_method = (int) online_control_button->adjustment.get_value();
622 switch (which_method) {
624 allow_mmc_and_local ();
633 fatal << _("programming error: impossible control method") << endmsg;
639 ARDOUR_UI::mmc_device_id_adjusted ()
644 int dev_id = (int) mmc_id_button->adjustment.get_value();
645 mmc->set_device_id (dev_id);
651 ARDOUR_UI::session_menu (GdkEventButton *ev)
653 session_popup_menu->popup (0, 0);
658 ARDOUR_UI::redisplay_recent_sessions ()
660 vector<string *> *sessions;
661 vector<string *>::iterator i;
662 RecentSessionsSorter cmp;
664 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
665 recent_session_model->clear ();
668 ARDOUR::read_recent_sessions (rs);
671 recent_session_display.set_model (recent_session_model);
675 /* sort them alphabetically */
676 sort (rs.begin(), rs.end(), cmp);
677 sessions = new vector<string*>;
679 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
680 sessions->push_back (new string ((*i).second));
683 for (i = sessions->begin(); i != sessions->end(); ++i) {
685 vector<string*>* states;
686 vector<const gchar*> item;
687 string fullpath = *(*i);
689 /* remove any trailing / */
691 if (fullpath[fullpath.length()-1] == '/') {
692 fullpath = fullpath.substr (0, fullpath.length()-1);
695 /* now get available states for this session */
697 if ((states = Session::possible_states (fullpath)) == 0) {
702 TreeModel::Row row = *(recent_session_model->append());
704 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
705 row[recent_session_columns.fullpath] = fullpath;
707 if (states->size() > 1) {
709 /* add the children */
711 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
713 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
715 child_row[recent_session_columns.visible_name] = **i2;
716 child_row[recent_session_columns.fullpath] = fullpath;
725 recent_session_display.set_model (recent_session_model);
730 ARDOUR_UI::build_session_selector ()
732 session_selector_window = new ArdourDialog ("session selector");
734 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
736 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
737 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
738 session_selector_window->set_default_response (RESPONSE_ACCEPT);
739 recent_session_model = TreeStore::create (recent_session_columns);
740 recent_session_display.set_model (recent_session_model);
741 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
742 recent_session_display.set_headers_visible (false);
743 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
745 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
747 scroller->add (recent_session_display);
748 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
750 session_selector_window->set_name ("SessionSelectorWindow");
751 session_selector_window->set_size_request (200, 400);
752 session_selector_window->get_vbox()->pack_start (*scroller);
753 session_selector_window->show_all_children();
757 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
759 session_selector_window->response (RESPONSE_ACCEPT);
763 ARDOUR_UI::open_recent_session ()
765 /* popup selector window */
767 if (session_selector_window == 0) {
768 build_session_selector ();
771 redisplay_recent_sessions ();
773 ResponseType r = (ResponseType) session_selector_window->run ();
775 session_selector_window->hide();
778 case RESPONSE_ACCEPT:
784 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
786 if (i == recent_session_model->children().end()) {
790 Glib::ustring path = (*i)[recent_session_columns.fullpath];
791 Glib::ustring state = (*i)[recent_session_columns.visible_name];
793 _session_is_new = false;
795 load_session (path, state);
799 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
803 if (stat (info.filename.c_str(), &statbuf) != 0) {
807 if (!S_ISDIR(statbuf.st_mode)) {
813 string session_file = info.filename;
815 session_file += Glib::path_get_basename (info.filename);
816 session_file += ".ardour";
818 if (stat (session_file.c_str(), &statbuf) != 0) {
822 return S_ISREG (statbuf.st_mode);
826 ARDOUR_UI::open_session ()
828 /* popup selector window */
830 if (open_session_selector == 0) {
832 /* ardour sessions are folders */
834 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
835 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
836 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
838 FileFilter session_filter;
839 session_filter.add_pattern ("*.ardour");
840 session_filter.set_name (_("Ardour sessions"));
841 open_session_selector->add_filter (session_filter);
842 open_session_selector->set_filter (session_filter);
845 int response = open_session_selector->run();
846 open_session_selector->hide ();
849 case RESPONSE_ACCEPT:
852 open_session_selector->hide();
856 open_session_selector->hide();
857 string session_path = open_session_selector->get_filename();
861 if (session_path.length() > 0) {
862 if (Session::find_session (session_path, path, name, isnew) == 0) {
863 _session_is_new = isnew;
864 load_session (path, name);
871 ARDOUR_UI::session_add_midi_track ()
873 cerr << _("Patience is a virtue.\n");
877 ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many)
879 list<boost::shared_ptr<AudioTrack> > tracks;
880 Session::RouteList routes;
883 warning << _("You cannot add a track or bus without a session already loaded.") << endmsg;
889 tracks = session->new_audio_track (input_channels, output_channels, mode, how_many);
891 if (tracks.size() != how_many) {
893 error << _("could not create a new audio track") << endmsg;
895 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
901 routes = session->new_audio_route (input_channels, output_channels, how_many);
903 if (routes.size() != how_many) {
905 error << _("could not create a new audio track") << endmsg;
907 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
913 if (need_control_room_outs) {
919 route->set_stereo_control_outs (control_lr_channels);
920 route->control_outs()->set_stereo_pan (pans, this);
922 #endif /* CONTROLOUTS */
926 MessageDialog msg (*editor,
927 _("There are insufficient JACK ports available\n\
928 to create a new track or bus.\n\
929 You should save Ardour, exit and\n\
930 restart JACK with more ports."));
936 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
938 jack_nframes_t _preroll;
941 _preroll = session->convert_to_frames_at (new_position, session->preroll);
943 if (new_position > _preroll) {
944 new_position -= _preroll;
949 session->request_locate (new_position);
954 ARDOUR_UI::transport_goto_start ()
957 session->goto_start();
960 /* force displayed area in editor to start no matter
961 what "follow playhead" setting is.
965 editor->reposition_x_origin (session->current_start_frame());
971 ARDOUR_UI::transport_goto_zero ()
974 session->request_locate (0);
977 /* force displayed area in editor to start no matter
978 what "follow playhead" setting is.
982 editor->reposition_x_origin (0);
988 ARDOUR_UI::transport_goto_end ()
991 jack_nframes_t frame = session->current_end_frame();
992 session->request_locate (frame);
994 /* force displayed area in editor to start no matter
995 what "follow playhead" setting is.
999 editor->reposition_x_origin (frame);
1005 ARDOUR_UI::transport_stop ()
1011 if (session->is_auditioning()) {
1012 session->cancel_audition ();
1016 if (session->get_auto_loop()) {
1017 session->request_auto_loop (false);
1020 session->request_stop ();
1024 ARDOUR_UI::transport_stop_and_forget_capture ()
1027 session->request_stop (true);
1032 ARDOUR_UI::remove_last_capture()
1035 editor->remove_last_capture();
1040 ARDOUR_UI::transport_record ()
1043 switch (session->record_status()) {
1044 case Session::Disabled:
1045 if (session->ntracks() == 0) {
1046 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1047 MessageDialog msg (*editor, txt);
1051 session->maybe_enable_record ();
1053 case Session::Recording:
1054 case Session::Enabled:
1055 session->disable_record (true);
1061 ARDOUR_UI::transport_roll ()
1069 rolling = session->transport_rolling ();
1071 if (session->get_auto_loop()) {
1072 session->request_auto_loop (false);
1073 auto_loop_button.set_active (false);
1074 roll_button.set_active (true);
1075 } else if (session->get_play_range ()) {
1076 session->request_play_range (false);
1077 play_selection_button.set_active (false);
1078 } else if (rolling) {
1079 session->request_locate (session->last_transport_start(), true);
1082 session->request_transport_speed (1.0f);
1086 ARDOUR_UI::transport_loop()
1089 if (session->get_auto_loop()) {
1090 if (session->transport_rolling()) {
1091 Location * looploc = session->locations()->auto_loop_location();
1093 session->request_locate (looploc->start(), true);
1098 session->request_auto_loop (true);
1104 ARDOUR_UI::transport_play_selection ()
1110 if (!session->get_play_range()) {
1111 session->request_stop ();
1114 editor->play_selection ();
1118 ARDOUR_UI::transport_rewind (int option)
1120 float current_transport_speed;
1123 current_transport_speed = session->transport_speed();
1125 if (current_transport_speed >= 0.0f) {
1128 session->request_transport_speed (-1.0f);
1131 session->request_transport_speed (-4.0f);
1134 session->request_transport_speed (-0.5f);
1139 session->request_transport_speed (current_transport_speed * 1.5f);
1145 ARDOUR_UI::transport_forward (int option)
1147 float current_transport_speed;
1150 current_transport_speed = session->transport_speed();
1152 if (current_transport_speed <= 0.0f) {
1155 session->request_transport_speed (1.0f);
1158 session->request_transport_speed (4.0f);
1161 session->request_transport_speed (0.5f);
1166 session->request_transport_speed (current_transport_speed * 1.5f);
1172 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1178 boost::shared_ptr<Route> r;
1180 if ((r = session->route_by_remote_id (dstream)) != 0) {
1184 if ((t = dynamic_cast<Track*>(r.get())) != 0) {
1185 t->diskstream()->set_record_enabled (!t->diskstream()->record_enabled());
1194 ARDOUR_UI::queue_transport_change ()
1196 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1200 ARDOUR_UI::map_transport_state ()
1202 float sp = session->transport_speed();
1205 transport_rolling ();
1206 } else if (sp < 0.0f) {
1207 transport_rewinding ();
1208 } else if (sp > 0.0f) {
1209 transport_forwarding ();
1211 transport_stopped ();
1216 ARDOUR_UI::allow_local_only ()
1222 ARDOUR_UI::allow_mmc_only ()
1228 ARDOUR_UI::allow_mmc_and_local ()
1234 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1236 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1237 (int) adj.get_value()].c_str());
1241 ARDOUR_UI::engine_stopped ()
1243 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1244 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1245 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1250 ARDOUR_UI::engine_running ()
1252 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1253 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1254 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1258 ARDOUR_UI::engine_halted ()
1260 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1262 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1263 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1265 update_sample_rate (0);
1267 MessageDialog msg (*editor,
1269 JACK has either been shutdown or it\n\
1270 disconnected Ardour because Ardour\n\
1271 was not fast enough. You can save the\n\
1272 session and/or try to reconnect to JACK ."));
1277 ARDOUR_UI::do_engine_start ()
1283 catch (AudioEngine::PortRegistrationFailure& err) {
1285 error << _("Unable to create all required ports")
1293 error << _("Unable to start the session running")
1303 ARDOUR_UI::start_engine ()
1305 if (do_engine_start () == 0) {
1306 if (session && _session_is_new) {
1307 /* we need to retain initial visual
1308 settings for a new session
1310 session->save_state ("");
1313 /* there is too much going on, in too many threads, for us to
1314 end up with a clean session. So wait 1 second after loading,
1315 and fix it up. its ugly, but until i come across a better
1316 solution, its what we have.
1319 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1326 ARDOUR_UI::update_clocks ()
1328 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1332 ARDOUR_UI::start_clocking ()
1334 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1338 ARDOUR_UI::stop_clocking ()
1340 clock_signal_connection.disconnect ();
1344 ARDOUR_UI::toggle_clocking ()
1347 if (clock_button.get_active()) {
1356 ARDOUR_UI::_blink (void *arg)
1359 ((ARDOUR_UI *) arg)->blink ();
1366 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1370 ARDOUR_UI::start_blinking ()
1372 /* Start the blink signal. Everybody with a blinking widget
1373 uses Blink to drive the widget's state.
1376 if (blink_timeout_tag < 0) {
1378 blink_timeout_tag = g_timeout_add (240, _blink, this);
1383 ARDOUR_UI::stop_blinking ()
1385 if (blink_timeout_tag >= 0) {
1386 g_source_remove (blink_timeout_tag);
1387 blink_timeout_tag = -1;
1392 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1398 if (io.n_inputs() == 0) {
1403 /* XXX we're not handling multiple ports yet. */
1405 const char **connections = io.input(0)->get_connections();
1407 if (connections == 0 || connections[0] == '\0') {
1410 buf = connections[0];
1417 if (io.n_outputs() == 0) {
1422 /* XXX we're not handling multiple ports yet. */
1424 const char **connections = io.output(0)->get_connections();
1426 if (connections == 0 || connections[0] == '\0') {
1429 buf = connections[0];
1437 ARDOUR_UI::snapshot_session ()
1439 ArdourPrompter prompter (true);
1446 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1448 prompter.set_name ("Prompter");
1449 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1450 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1451 prompter.set_prompt (_("Name of New Snapshot"));
1452 prompter.set_initial_text (now);
1454 switch (prompter.run()) {
1455 case RESPONSE_ACCEPT:
1456 prompter.get_result (snapname);
1457 if (snapname.length()){
1458 save_state (snapname);
1468 ARDOUR_UI::save_state (const string & name)
1470 (void) save_state_canfail (name);
1474 ARDOUR_UI::save_state_canfail (string name)
1479 if (name.length() == 0) {
1480 name = session->snap_name();
1483 if ((ret = session->save_state (name)) != 0) {
1487 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1492 ARDOUR_UI::restore_state (string name)
1495 if (name.length() == 0) {
1496 name = session->name();
1498 session->restore_state (name);
1503 ARDOUR_UI::primary_clock_value_changed ()
1506 session->request_locate (primary_clock.current_time ());
1511 ARDOUR_UI::secondary_clock_value_changed ()
1514 session->request_locate (secondary_clock.current_time ());
1519 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1521 if (session && dstream && dstream->record_enabled()) {
1523 Session::RecordState rs;
1525 rs = session->record_status ();
1528 case Session::Disabled:
1529 case Session::Enabled:
1530 if (w->get_state() != STATE_SELECTED) {
1531 w->set_state (STATE_SELECTED);
1535 case Session::Recording:
1536 if (w->get_state() != STATE_ACTIVE) {
1537 w->set_state (STATE_ACTIVE);
1543 if (w->get_state() != STATE_NORMAL) {
1544 w->set_state (STATE_NORMAL);
1550 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1556 switch (session->record_status()) {
1557 case Session::Enabled:
1559 rec_button.set_state (1);
1561 rec_button.set_state (0);
1565 case Session::Recording:
1566 rec_button.set_state (2);
1570 rec_button.set_state (0);
1576 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1584 ARDOUR_UI::start_keyboard_prefix ()
1586 keyboard->start_prefix();
1590 ARDOUR_UI::save_template ()
1593 ArdourPrompter prompter (true);
1596 prompter.set_name (X_("Prompter"));
1597 prompter.set_prompt (_("Name for mix template:"));
1598 prompter.set_initial_text(session->name() + _("-template"));
1599 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1600 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1602 switch (prompter.run()) {
1603 case RESPONSE_ACCEPT:
1604 prompter.get_result (name);
1606 if (name.length()) {
1607 session->save_template (name);
1617 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1619 string session_name;
1620 string session_path;
1622 int response = Gtk::RESPONSE_NONE;
1624 new_session_dialog->set_modal(true);
1625 new_session_dialog->set_name(predetermined_path);
1626 new_session_dialog->reset_recent();
1627 new_session_dialog->show();
1629 //Glib::RefPtr<Gdk::Window> nsd_window = new_session_dialog->get_window();
1632 response = new_session_dialog->run ();
1633 //nsd_window ->set_cursor(Gdk::Cursor(Gdk::WATCH));
1634 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1638 } else if (response == Gtk::RESPONSE_NONE) {
1639 /* Clear was pressed */
1640 new_session_dialog->reset();
1642 } else if (response == Gtk::RESPONSE_YES) {
1644 /* YES == OPEN, but there's no enum for that */
1646 session_name = new_session_dialog->session_name();
1648 if (session_name.empty()) {
1649 response = Gtk::RESPONSE_NONE;
1650 cerr << "session name is empty\n";
1654 if (session_name[0] == '/' ||
1655 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1656 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1657 load_session (Glib::path_get_dirname (session_name), session_name);
1659 session_path = new_session_dialog->session_folder();
1660 load_session (session_path, session_name);
1663 } else if (response == Gtk::RESPONSE_OK) {
1665 if (new_session_dialog->get_current_page() == 1) {
1667 /* XXX this is a bit of a hack..
1668 i really want the new sesion dialog to return RESPONSE_YES
1669 if we're on page 1 (the load page)
1670 Unfortunately i can't see how atm..
1673 if (session_name.empty()) {
1674 response = Gtk::RESPONSE_NONE;
1675 cerr << "session name is empty 2\n";
1679 if (session_name[0] == '/' ||
1680 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1681 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1682 load_session (Glib::path_get_dirname (session_name), session_name);
1684 session_path = new_session_dialog->session_folder();
1685 load_session (session_path, session_name);
1690 _session_is_new = true;
1692 session_name = new_session_dialog->session_name();
1694 if (session_name.empty()) {
1695 response = Gtk::RESPONSE_NONE;
1696 cerr << "session name is empty 3\n";
1700 if (session_name[0] == '/' ||
1701 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1702 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1704 session_path = Glib::path_get_dirname (session_name);
1705 session_name = Glib::path_get_basename (session_name);
1709 std::string session_path = new_session_dialog->session_folder();
1713 //XXX This is needed because session constructor wants a
1714 //non-existant path. hopefully this will be fixed at some point.
1716 session_path = Glib::build_filename (session_path, session_name);
1718 std::string template_name = new_session_dialog->session_template_name();
1720 if (new_session_dialog->use_session_template()) {
1722 load_session (session_path, session_name, &template_name);
1728 Session::AutoConnectOption iconnect;
1729 Session::AutoConnectOption oconnect;
1731 if (new_session_dialog->create_control_bus()) {
1732 cchns = (uint32_t) new_session_dialog->control_channel_count();
1737 if (new_session_dialog->create_master_bus()) {
1738 mchns = (uint32_t) new_session_dialog->master_channel_count();
1743 if (new_session_dialog->connect_inputs()) {
1744 iconnect = Session::AutoConnectPhysical;
1746 iconnect = Session::AutoConnectOption (0);
1749 /// @todo some minor tweaks.
1751 if (new_session_dialog->connect_outs_to_master()) {
1752 oconnect = Session::AutoConnectMaster;
1753 } else if (new_session_dialog->connect_outs_to_physical()) {
1754 oconnect = Session::AutoConnectPhysical;
1756 oconnect = Session::AutoConnectOption (0);
1759 uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
1760 uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count();
1762 build_session (session_path,
1770 engine->frame_rate() * 60 * 5);
1775 } while (response == Gtk::RESPONSE_NONE);
1778 new_session_dialog->get_window()->set_cursor();
1779 new_session_dialog->hide();
1783 ARDOUR_UI::close_session()
1790 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1792 Session *new_session;
1794 session_loaded = false;
1795 x = unload_session ();
1803 /* if it already exists, we must have write access */
1805 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1806 MessageDialog msg (*editor, _("\
1807 You do not have write access to this session.\n\
1808 This prevents the session from being loaded."));
1814 new_session = new Session (*engine, path, snap_name, mix_template);
1819 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1823 connect_to_session (new_session);
1825 session_loaded = true;
1830 ARDOUR_UI::make_session_clean ()
1833 session->set_clean ();
1842 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1843 uint32_t control_channels,
1844 uint32_t master_channels,
1845 Session::AutoConnectOption input_connect,
1846 Session::AutoConnectOption output_connect,
1849 jack_nframes_t initial_length)
1851 Session *new_session;
1854 session_loaded = false;
1855 x = unload_session ();
1862 _session_is_new = true;
1865 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1866 control_channels, master_channels, nphysin, nphysout, initial_length);
1871 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1875 connect_to_session (new_session);
1877 session_loaded = true;
1885 editor->show_window ();
1900 ARDOUR_UI::show_splash ()
1903 about = new About();
1909 ARDOUR_UI::hide_splash ()
1912 about->get_window()->set_cursor ();
1918 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1922 removed = rep.paths.size();
1925 MessageDialog msgd (*editor,
1926 _("No audio files were ready for cleanup"),
1929 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1930 msgd.set_secondary_text (_("If this seems suprising, \n\
1931 check for any existing snapshots.\n\
1932 These may still include regions that\n\
1933 require some unused files to continue to exist."));
1939 ArdourDialog results (_("ardour: cleanup"), true, false);
1941 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1942 CleanupResultsModelColumns() {
1946 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1947 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1951 CleanupResultsModelColumns results_columns;
1952 Glib::RefPtr<Gtk::ListStore> results_model;
1953 Gtk::TreeView results_display;
1955 results_model = ListStore::create (results_columns);
1956 results_display.set_model (results_model);
1957 results_display.append_column (list_title, results_columns.visible_name);
1959 results_display.set_name ("CleanupResultsList");
1960 results_display.set_headers_visible (true);
1961 results_display.set_headers_clickable (false);
1962 results_display.set_reorderable (false);
1964 Gtk::ScrolledWindow list_scroller;
1967 Gtk::HBox dhbox; // the hbox for the image and text
1968 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1969 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1971 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1973 if (rep.space < 1048576.0f) {
1975 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1977 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1981 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1983 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1987 dhbox.pack_start (*dimage, true, false, 5);
1988 dhbox.pack_start (txt, true, false, 5);
1990 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1991 TreeModel::Row row = *(results_model->append());
1992 row[results_columns.visible_name] = *i;
1993 row[results_columns.fullpath] = *i;
1996 list_scroller.add (results_display);
1997 list_scroller.set_size_request (-1, 150);
1998 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2000 dvbox.pack_start (dhbox, true, false, 5);
2001 dvbox.pack_start (list_scroller, true, false, 5);
2002 ddhbox.pack_start (dvbox, true, false, 5);
2004 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2005 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2006 results.set_default_response (RESPONSE_CLOSE);
2007 results.set_position (Gtk::WIN_POS_MOUSE);
2008 results.show_all_children ();
2009 results.set_resizable (false);
2016 ARDOUR_UI::cleanup ()
2019 /* shouldn't happen: menu item is insensitive */
2024 MessageDialog checker (_("Are you sure you want to cleanup?"),
2026 Gtk::MESSAGE_QUESTION,
2027 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2029 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2030 ALL undo/redo information will be lost if you cleanup.\n\
2031 After cleanup, unused audio files will be moved to a \
2032 \"dead sounds\" location."));
2034 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2035 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2036 checker.set_default_response (RESPONSE_CANCEL);
2038 checker.set_name (_("CleanupDialog"));
2039 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2040 checker.set_position (Gtk::WIN_POS_MOUSE);
2042 switch (checker.run()) {
2043 case RESPONSE_ACCEPT:
2049 Session::cleanup_report rep;
2051 editor->prepare_for_cleanup ();
2053 if (session->cleanup_sources (rep)) {
2057 display_cleanup_results (rep,
2060 The following %1 %2 not in use and \n\
2061 have been moved to:\n\
2063 Flushing the wastebasket will \n\
2064 release an additional\n\
2065 %4 %5bytes of disk space.\n"
2070 ARDOUR_UI::flush_trash ()
2073 /* shouldn't happen: menu item is insensitive */
2077 Session::cleanup_report rep;
2079 if (session->cleanup_trash_sources (rep)) {
2083 display_cleanup_results (rep,
2085 _("The following %1 %2 deleted from\n\
2087 releasing %4 %5bytes of disk space"));
2091 ARDOUR_UI::add_route ()
2099 if (add_route_dialog == 0) {
2100 add_route_dialog = new AddRouteDialog;
2101 editor->ensure_float (*add_route_dialog);
2104 if (add_route_dialog->is_visible()) {
2105 /* we're already doing this */
2109 ResponseType r = (ResponseType) add_route_dialog->run ();
2111 add_route_dialog->hide();
2114 case RESPONSE_ACCEPT:
2121 if ((count = add_route_dialog->count()) <= 0) {
2125 uint32_t input_chan = add_route_dialog->channels ();
2126 uint32_t output_chan;
2127 string name_template = add_route_dialog->name_template ();
2128 bool track = add_route_dialog->track ();
2130 Session::AutoConnectOption oac = session->get_output_auto_connect();
2132 if (oac & Session::AutoConnectMaster) {
2133 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2135 output_chan = input_chan;
2138 /* XXX do something with name template */
2141 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
2143 session_add_audio_bus (input_chan, output_chan, count);
2148 ARDOUR_UI::mixer_settings () const
2153 node = session->instant_xml(X_("Mixer"), session->path());
2155 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2159 node = new XMLNode (X_("Mixer"));
2166 ARDOUR_UI::editor_settings () const
2171 node = session->instant_xml(X_("Editor"), session->path());
2173 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2177 node = new XMLNode (X_("Editor"));
2183 ARDOUR_UI::keyboard_settings () const
2187 node = Config->extra_xml(X_("Keyboard"));
2190 node = new XMLNode (X_("Keyboard"));
2196 ARDOUR_UI::halt_on_xrun_message ()
2198 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2200 MessageDialog msg (*editor,
2201 _("Recording was stopped because your system could not keep up."));
2206 ARDOUR_UI::delete_sources_in_the_right_thread (list<boost::shared_ptr<ARDOUR::Source> >* deletion_list)
2208 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2210 for (list<boost::shared_ptr<Source> >::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2211 (*i)->drop_references ();
2214 delete deletion_list;
2218 ARDOUR_UI::disk_overrun_handler ()
2220 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2222 if (!have_disk_overrun_displayed) {
2223 have_disk_overrun_displayed = true;
2224 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2225 The disk system on your computer\n\
2226 was not able to keep up with Ardour.\n\
2228 Specifically, it failed to write data to disk\n\
2229 quickly enough to keep up with recording.\n"));
2231 have_disk_overrun_displayed = false;
2236 ARDOUR_UI::disk_underrun_handler ()
2238 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2240 if (!have_disk_underrun_displayed) {
2241 have_disk_underrun_displayed = true;
2242 MessageDialog msg (*editor,
2243 (_("The disk system on your computer\n\
2244 was not able to keep up with Ardour.\n\
2246 Specifically, it failed to read data from disk\n\
2247 quickly enough to keep up with playback.\n")));
2249 have_disk_underrun_displayed = false;
2254 ARDOUR_UI::disk_underrun_message_gone ()
2256 have_disk_underrun_displayed = false;
2260 ARDOUR_UI::disk_overrun_message_gone ()
2262 have_disk_underrun_displayed = false;
2266 ARDOUR_UI::pending_state_dialog ()
2268 ArdourDialog dialog ("pending state dialog");
2270 This session appears to have been in\n\
2271 middle of recording when ardour or\n\
2272 the computer was shutdown.\n\
2274 Ardour can recover any captured audio for\n\
2275 you, or it can ignore it. Please decide\n\
2276 what you would like to do.\n"));
2278 dialog.get_vbox()->pack_start (message);
2279 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2280 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2282 dialog.set_position (WIN_POS_CENTER);
2285 switch (dialog.run ()) {
2286 case RESPONSE_ACCEPT:
2294 ARDOUR_UI::disconnect_from_jack ()
2297 if( engine->disconnect_from_jack ()) {
2298 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2302 update_sample_rate (0);
2307 ARDOUR_UI::reconnect_to_jack ()
2310 if (engine->reconnect_to_jack ()) {
2311 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2315 update_sample_rate (0);
2320 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2322 engine->request_buffer_size (nframes);
2323 update_sample_rate (0);
2327 ARDOUR_UI::cmdline_new_session (string path)
2329 if (path[0] != '/') {
2330 char buf[PATH_MAX+1];
2333 getcwd (buf, sizeof (buf));
2340 new_session (false, path);
2342 _will_create_new_session_automatically = false; /* done it */
2343 return FALSE; /* don't call it again */
2347 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2349 Glib::RefPtr<Action> act;
2353 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2356 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2359 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2362 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2365 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2368 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2371 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2376 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2377 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2378 Config->set_native_file_header_format (hf);
2380 session->reset_native_file_format ();
2387 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2389 Glib::RefPtr<Action> act;
2393 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2396 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2401 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2403 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2404 Config->set_native_file_data_format (sf);
2406 session->reset_native_file_format ();
2413 ARDOUR_UI::use_config ()
2415 Glib::RefPtr<Action> act;
2417 switch (Config->get_native_file_data_format ()) {
2419 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2422 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2427 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2428 ract->set_active ();
2431 switch (Config->get_native_file_header_format ()) {
2433 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2436 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2439 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2442 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2445 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2448 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2451 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2456 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2457 ract->set_active ();