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,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 ("BigClockNonRecording", true, false, 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 shuttle_style_menu = 0;
176 shuttle_unit_menu = 0;
178 gettimeofday (&last_peak_grab, 0);
179 gettimeofday (&last_shuttle_request, 0);
181 ARDOUR::Diskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
182 ARDOUR::Diskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
184 /* handle pending state with a dialog */
186 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
188 /* have to wait for AudioEngine and Configuration before proceeding */
192 ARDOUR_UI::set_engine (AudioEngine& e)
196 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
197 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
198 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
199 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
201 ActionManager::init ();
202 new_session_dialog = new NewSessionDialog();
206 keyboard = new Keyboard;
208 if (setup_windows ()) {
209 throw failed_constructor ();
212 if (GTK_ARDOUR::show_key_actions) {
213 vector<string> names;
214 vector<string> paths;
216 vector<AccelKey> bindings;
218 ActionManager::get_all_actions (names, paths, keys, bindings);
220 vector<string>::iterator n;
221 vector<string>::iterator k;
222 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
223 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
229 /* start with timecode, metering enabled
232 blink_timeout_tag = -1;
234 /* the global configuration object is now valid */
238 /* this being a GUI and all, we want peakfiles */
240 AudioFileSource::set_build_peakfiles (true);
241 AudioFileSource::set_build_missing_peakfiles (true);
243 if (AudioSource::start_peak_thread ()) {
244 throw failed_constructor();
247 /* start the time-of-day-clock */
249 update_wall_clock ();
250 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
252 update_disk_space ();
254 update_sample_rate (engine->frame_rate());
256 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
257 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
260 ARDOUR_UI::~ARDOUR_UI ()
262 save_ardour_state ();
276 if (add_route_dialog) {
277 delete add_route_dialog;
280 AudioSource::stop_peak_thread ();
284 ARDOUR_UI::configure_timeout ()
289 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
290 /* no configure events yet */
294 gettimeofday (&now, 0);
295 timersub (&now, &last_configure_time, &diff);
297 /* force a gap of 0.5 seconds since the last configure event
300 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
303 have_configure_timeout = false;
304 save_ardour_state ();
310 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
312 if (have_configure_timeout) {
313 gettimeofday (&last_configure_time, 0);
315 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
316 have_configure_timeout = true;
323 ARDOUR_UI::save_ardour_state ()
325 if (!keyboard || !mixer || !editor) {
329 /* XXX this is all a bit dubious. add_extra_xml() uses
330 a different lifetime model from add_instant_xml().
333 XMLNode* node = new XMLNode (keyboard->get_state());
334 Config->add_extra_xml (*node);
335 Config->save_state();
337 XMLNode enode(static_cast<Stateful*>(editor)->get_state());
338 XMLNode mnode(mixer->get_state());
341 session->add_instant_xml (enode, session->path());
342 session->add_instant_xml (mnode, session->path());
344 Config->add_instant_xml (enode, get_user_ardour_path());
345 Config->add_instant_xml (mnode, get_user_ardour_path());
350 AccelMap::save ("ardour.saved_bindings");
354 ARDOUR_UI::startup ()
362 if (session && session->dirty()) {
363 switch (ask_about_saving_session(_("quit"))) {
368 /* use the default name */
369 if (save_state_canfail ("")) {
370 /* failed - don't quit */
371 MessageDialog msg (*editor,
373 Ardour was unable to save your session.\n\n\
374 If you still wish to quit, please use the\n\n\
375 \"Just quit\" option."));
386 Config->save_state();
391 ARDOUR_UI::ask_about_saving_session (const string & what)
393 ArdourDialog window (_("ardour: save session?"));
394 Gtk::HBox dhbox; // the hbox for the image and text
395 Gtk::Label prompt_label;
396 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
400 msg = string_compose(_("Don't %1"), what);
401 window.add_button (msg, RESPONSE_REJECT);
402 msg = string_compose(_("Just %1"), what);
403 window.add_button (msg, RESPONSE_APPLY);
404 msg = string_compose(_("Save and %1"), what);
405 window.add_button (msg, RESPONSE_ACCEPT);
407 window.set_default_response (RESPONSE_ACCEPT);
409 Gtk::Button noquit_button (msg);
410 noquit_button.set_name ("EditorGTKButton");
415 if (session->snap_name() == session->name()) {
418 type = _("snapshot");
420 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?"),
421 type, session->snap_name());
423 prompt_label.set_text (prompt);
424 prompt_label.set_name (X_("PrompterLabel"));
425 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
427 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
429 dhbox.set_homogeneous (false);
430 dhbox.pack_start (*dimage, false, false, 5);
431 dhbox.pack_start (prompt_label, true, false, 5);
432 window.get_vbox()->pack_start (dhbox);
434 window.set_name (_("Prompter"));
435 window.set_position (Gtk::WIN_POS_MOUSE);
436 window.set_modal (true);
437 window.set_resizable (false);
440 save_the_session = 0;
442 window.set_keep_above (true);
445 ResponseType r = (ResponseType) window.run();
450 case RESPONSE_ACCEPT: // save and get out of here
452 case RESPONSE_APPLY: // get out of here
462 ARDOUR_UI::every_second ()
465 update_buffer_load ();
466 update_disk_space ();
471 ARDOUR_UI::every_point_one_seconds ()
473 update_speed_display ();
474 RapidScreenUpdate(); /* EMIT_SIGNAL */
479 ARDOUR_UI::every_point_zero_one_seconds ()
481 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
486 ARDOUR_UI::update_sample_rate (nframes_t ignored)
490 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
492 if (!engine->connected()) {
494 snprintf (buf, sizeof (buf), _("disconnected"));
498 nframes_t rate = engine->frame_rate();
500 if (fmod (rate, 1000.0) != 0.0) {
501 snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"),
502 (float) rate/1000.0f,
503 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
505 snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"),
507 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
511 sample_rate_label.set_text (buf);
515 ARDOUR_UI::update_cpu_load ()
518 snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
519 cpu_load_label.set_text (buf);
523 ARDOUR_UI::update_buffer_load ()
528 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
529 session->playback_load(), session->capture_load());
530 buffer_load_label.set_text (buf);
532 buffer_load_label.set_text ("");
537 ARDOUR_UI::count_recenabled_streams (Route& route)
539 Track* track = dynamic_cast<Track*>(&route);
540 if (track && track->diskstream()->record_enabled()) {
541 rec_enabled_streams += track->n_inputs();
546 ARDOUR_UI::update_disk_space()
552 nframes_t frames = session->available_capture_duration();
555 if (frames == max_frames) {
556 strcpy (buf, _("Disk: 24hrs+"));
561 nframes_t fr = session->frame_rate();
563 rec_enabled_streams = 0;
564 session->foreach_route (this, &ARDOUR_UI::count_recenabled_streams);
566 if (rec_enabled_streams) {
567 frames /= rec_enabled_streams;
570 hrs = frames / (fr * 3600);
571 frames -= hrs * fr * 3600;
572 mins = frames / (fr * 60);
573 frames -= mins * fr * 60;
576 snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
579 disk_space_label.set_text (buf);
583 ARDOUR_UI::update_wall_clock ()
590 tm_now = localtime (&now);
592 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
593 wall_clock_label.set_text (buf);
598 ARDOUR_UI::control_methods_adjusted ()
603 which_method = (int) online_control_button->adjustment.get_value();
604 switch (which_method) {
606 allow_mmc_and_local ();
615 fatal << _("programming error: impossible control method") << endmsg;
621 ARDOUR_UI::mmc_device_id_adjusted ()
626 int dev_id = (int) mmc_id_button->adjustment.get_value();
627 mmc->set_device_id (dev_id);
633 ARDOUR_UI::session_menu (GdkEventButton *ev)
635 session_popup_menu->popup (0, 0);
640 ARDOUR_UI::redisplay_recent_sessions ()
642 vector<string *> *sessions;
643 vector<string *>::iterator i;
644 RecentSessionsSorter cmp;
646 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
647 recent_session_model->clear ();
650 ARDOUR::read_recent_sessions (rs);
653 recent_session_display.set_model (recent_session_model);
657 /* sort them alphabetically */
658 sort (rs.begin(), rs.end(), cmp);
659 sessions = new vector<string*>;
661 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
662 sessions->push_back (new string ((*i).second));
665 for (i = sessions->begin(); i != sessions->end(); ++i) {
667 vector<string*>* states;
668 vector<const gchar*> item;
669 string fullpath = *(*i);
671 /* remove any trailing / */
673 if (fullpath[fullpath.length()-1] == '/') {
674 fullpath = fullpath.substr (0, fullpath.length()-1);
677 /* now get available states for this session */
679 if ((states = Session::possible_states (fullpath)) == 0) {
684 TreeModel::Row row = *(recent_session_model->append());
686 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
687 row[recent_session_columns.fullpath] = fullpath;
689 if (states->size() > 1) {
691 /* add the children */
693 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
695 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
697 child_row[recent_session_columns.visible_name] = **i2;
698 child_row[recent_session_columns.fullpath] = fullpath;
707 recent_session_display.set_model (recent_session_model);
712 ARDOUR_UI::build_session_selector ()
714 session_selector_window = new ArdourDialog ("session selector");
716 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
718 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
719 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
720 session_selector_window->set_default_response (RESPONSE_ACCEPT);
721 recent_session_model = TreeStore::create (recent_session_columns);
722 recent_session_display.set_model (recent_session_model);
723 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
724 recent_session_display.set_headers_visible (false);
725 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
727 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
729 scroller->add (recent_session_display);
730 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
732 session_selector_window->set_name ("SessionSelectorWindow");
733 session_selector_window->set_size_request (200, 400);
734 session_selector_window->get_vbox()->pack_start (*scroller);
735 session_selector_window->show_all_children();
739 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
741 session_selector_window->response (RESPONSE_ACCEPT);
745 ARDOUR_UI::open_recent_session ()
747 /* popup selector window */
749 if (session_selector_window == 0) {
750 build_session_selector ();
753 redisplay_recent_sessions ();
755 ResponseType r = (ResponseType) session_selector_window->run ();
757 session_selector_window->hide();
760 case RESPONSE_ACCEPT:
766 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
768 if (i == recent_session_model->children().end()) {
772 Glib::ustring path = (*i)[recent_session_columns.fullpath];
773 Glib::ustring state = (*i)[recent_session_columns.visible_name];
775 _session_is_new = false;
777 load_session (path, state);
781 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
785 if (stat (info.filename.c_str(), &statbuf) != 0) {
789 if (!S_ISDIR(statbuf.st_mode)) {
795 string session_file = info.filename;
797 session_file += Glib::path_get_basename (info.filename);
798 session_file += ".ardour";
800 if (stat (session_file.c_str(), &statbuf) != 0) {
804 return S_ISREG (statbuf.st_mode);
808 ARDOUR_UI::open_session ()
810 /* popup selector window */
812 if (open_session_selector == 0) {
814 /* ardour sessions are folders */
816 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
817 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
818 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
820 FileFilter session_filter;
821 session_filter.add_pattern ("*.ardour");
822 session_filter.set_name (_("Ardour sessions"));
823 open_session_selector->add_filter (session_filter);
824 open_session_selector->set_filter (session_filter);
827 int response = open_session_selector->run();
828 open_session_selector->hide ();
831 case RESPONSE_ACCEPT:
834 open_session_selector->hide();
838 open_session_selector->hide();
839 string session_path = open_session_selector->get_filename();
843 if (session_path.length() > 0) {
844 if (Session::find_session (session_path, path, name, isnew) == 0) {
845 _session_is_new = isnew;
846 load_session (path, name);
853 ARDOUR_UI::session_add_midi_track ()
855 cerr << _("Patience is a virtue.\n");
859 ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many)
861 list<boost::shared_ptr<AudioTrack> > tracks;
862 Session::RouteList routes;
865 warning << _("You cannot add a track or bus without a session already loaded.") << endmsg;
871 tracks = session->new_audio_track (input_channels, output_channels, mode, how_many);
873 if (tracks.size() != how_many) {
875 error << _("could not create a new audio track") << endmsg;
877 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
883 routes = session->new_audio_route (input_channels, output_channels, how_many);
885 if (routes.size() != how_many) {
887 error << _("could not create a new audio track") << endmsg;
889 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
895 if (need_control_room_outs) {
901 route->set_stereo_control_outs (control_lr_channels);
902 route->control_outs()->set_stereo_pan (pans, this);
904 #endif /* CONTROLOUTS */
908 MessageDialog msg (*editor,
909 _("There are insufficient JACK ports available\n\
910 to create a new track or bus.\n\
911 You should save Ardour, exit and\n\
912 restart JACK with more ports."));
918 ARDOUR_UI::do_transport_locate (nframes_t new_position)
920 nframes_t _preroll = 0;
923 // XXX CONFIG_CHANGE FIX - requires AnyTime handling
924 // _preroll = session->convert_to_frames_at (new_position, Config->get_preroll());
926 if (new_position > _preroll) {
927 new_position -= _preroll;
932 session->request_locate (new_position);
937 ARDOUR_UI::transport_goto_start ()
940 session->goto_start();
943 /* force displayed area in editor to start no matter
944 what "follow playhead" setting is.
948 editor->reposition_x_origin (session->current_start_frame());
954 ARDOUR_UI::transport_goto_zero ()
957 session->request_locate (0);
960 /* force displayed area in editor to start no matter
961 what "follow playhead" setting is.
965 editor->reposition_x_origin (0);
971 ARDOUR_UI::transport_goto_end ()
974 nframes_t frame = session->current_end_frame();
975 session->request_locate (frame);
977 /* force displayed area in editor to start no matter
978 what "follow playhead" setting is.
982 editor->reposition_x_origin (frame);
988 ARDOUR_UI::transport_stop ()
994 if (session->is_auditioning()) {
995 session->cancel_audition ();
999 if (session->get_play_loop ()) {
1000 session->request_play_loop (false);
1003 session->request_stop ();
1007 ARDOUR_UI::transport_stop_and_forget_capture ()
1010 session->request_stop (true);
1015 ARDOUR_UI::remove_last_capture()
1018 editor->remove_last_capture();
1023 ARDOUR_UI::transport_record ()
1026 switch (session->record_status()) {
1027 case Session::Disabled:
1028 if (session->ntracks() == 0) {
1029 MessageDialog msg (*editor, _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu."));
1033 session->maybe_enable_record ();
1035 case Session::Recording:
1036 case Session::Enabled:
1037 session->disable_record (true);
1043 ARDOUR_UI::transport_roll ()
1051 rolling = session->transport_rolling ();
1053 if (session->get_play_loop()) {
1054 session->request_play_loop (false);
1055 auto_loop_button.set_active (false);
1056 roll_button.set_active (true);
1057 } else if (session->get_play_range ()) {
1058 session->request_play_range (false);
1059 play_selection_button.set_active (false);
1060 } else if (rolling) {
1061 session->request_locate (session->last_transport_start(), true);
1064 session->request_transport_speed (1.0f);
1068 ARDOUR_UI::transport_loop()
1071 if (session->get_play_loop()) {
1072 if (session->transport_rolling()) {
1073 Location * looploc = session->locations()->auto_loop_location();
1075 session->request_locate (looploc->start(), true);
1080 session->request_play_loop (true);
1086 ARDOUR_UI::transport_play_selection ()
1092 if (!session->get_play_range()) {
1093 session->request_stop ();
1096 editor->play_selection ();
1100 ARDOUR_UI::transport_rewind (int option)
1102 float current_transport_speed;
1105 current_transport_speed = session->transport_speed();
1107 if (current_transport_speed >= 0.0f) {
1110 session->request_transport_speed (-1.0f);
1113 session->request_transport_speed (-4.0f);
1116 session->request_transport_speed (-0.5f);
1121 session->request_transport_speed (current_transport_speed * 1.5f);
1127 ARDOUR_UI::transport_forward (int option)
1129 float current_transport_speed;
1132 current_transport_speed = session->transport_speed();
1134 if (current_transport_speed <= 0.0f) {
1137 session->request_transport_speed (1.0f);
1140 session->request_transport_speed (4.0f);
1143 session->request_transport_speed (0.5f);
1148 session->request_transport_speed (current_transport_speed * 1.5f);
1154 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1160 boost::shared_ptr<Route> r;
1162 if ((r = session->route_by_remote_id (dstream)) != 0) {
1166 if ((t = dynamic_cast<Track*>(r.get())) != 0) {
1167 t->diskstream()->set_record_enabled (!t->diskstream()->record_enabled());
1176 ARDOUR_UI::queue_transport_change ()
1178 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1182 ARDOUR_UI::map_transport_state ()
1184 float sp = session->transport_speed();
1187 transport_rolling ();
1188 } else if (sp < 0.0f) {
1189 transport_rewinding ();
1190 } else if (sp > 0.0f) {
1191 transport_forwarding ();
1193 transport_stopped ();
1198 ARDOUR_UI::allow_local_only ()
1204 ARDOUR_UI::allow_mmc_only ()
1210 ARDOUR_UI::allow_mmc_and_local ()
1216 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1218 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1219 (int) adj.get_value()].c_str());
1223 ARDOUR_UI::engine_stopped ()
1225 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1226 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1227 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1231 ARDOUR_UI::engine_running ()
1233 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1234 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1235 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1239 ARDOUR_UI::engine_halted ()
1241 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1243 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1244 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1246 update_sample_rate (0);
1248 MessageDialog msg (*editor,
1250 JACK has either been shutdown or it\n\
1251 disconnected Ardour because Ardour\n\
1252 was not fast enough. You can save the\n\
1253 session and/or try to reconnect to JACK ."));
1258 ARDOUR_UI::do_engine_start ()
1264 catch (AudioEngine::PortRegistrationFailure& err) {
1266 error << _("Unable to create all required ports")
1274 error << _("Unable to start the session running")
1284 ARDOUR_UI::start_engine ()
1286 if (do_engine_start () == 0) {
1287 if (session && _session_is_new) {
1288 /* we need to retain initial visual
1289 settings for a new session
1291 session->save_state ("");
1299 ARDOUR_UI::update_clocks ()
1301 if (!editor || !editor->dragging_playhead()) {
1302 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1307 ARDOUR_UI::start_clocking ()
1309 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1313 ARDOUR_UI::stop_clocking ()
1315 clock_signal_connection.disconnect ();
1319 ARDOUR_UI::toggle_clocking ()
1322 if (clock_button.get_active()) {
1331 ARDOUR_UI::_blink (void *arg)
1334 ((ARDOUR_UI *) arg)->blink ();
1341 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1345 ARDOUR_UI::start_blinking ()
1347 /* Start the blink signal. Everybody with a blinking widget
1348 uses Blink to drive the widget's state.
1351 if (blink_timeout_tag < 0) {
1353 blink_timeout_tag = g_timeout_add (240, _blink, this);
1358 ARDOUR_UI::stop_blinking ()
1360 if (blink_timeout_tag >= 0) {
1361 g_source_remove (blink_timeout_tag);
1362 blink_timeout_tag = -1;
1367 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1373 if (io.n_inputs() == 0) {
1378 /* XXX we're not handling multiple ports yet. */
1380 const char **connections = io.input(0)->get_connections();
1382 if (connections == 0 || connections[0] == '\0') {
1385 buf = connections[0];
1392 if (io.n_outputs() == 0) {
1397 /* XXX we're not handling multiple ports yet. */
1399 const char **connections = io.output(0)->get_connections();
1401 if (connections == 0 || connections[0] == '\0') {
1404 buf = connections[0];
1412 ARDOUR_UI::snapshot_session ()
1414 ArdourPrompter prompter (true);
1421 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1423 prompter.set_name ("Prompter");
1424 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1425 prompter.set_prompt (_("Name of New Snapshot"));
1426 prompter.set_initial_text (now);
1428 switch (prompter.run()) {
1429 case RESPONSE_ACCEPT:
1430 prompter.get_result (snapname);
1431 if (snapname.length()){
1432 save_state (snapname);
1442 ARDOUR_UI::save_state (const string & name)
1444 (void) save_state_canfail (name);
1448 ARDOUR_UI::save_state_canfail (string name)
1453 if (name.length() == 0) {
1454 name = session->snap_name();
1457 if ((ret = session->save_state (name)) != 0) {
1461 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1466 ARDOUR_UI::restore_state (string name)
1469 if (name.length() == 0) {
1470 name = session->name();
1472 session->restore_state (name);
1477 ARDOUR_UI::primary_clock_value_changed ()
1480 session->request_locate (primary_clock.current_time ());
1485 ARDOUR_UI::secondary_clock_value_changed ()
1488 session->request_locate (secondary_clock.current_time ());
1493 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1495 if (session && dstream && dstream->record_enabled()) {
1497 Session::RecordState rs;
1499 rs = session->record_status ();
1502 case Session::Disabled:
1503 case Session::Enabled:
1504 if (w->get_state() != STATE_SELECTED) {
1505 w->set_state (STATE_SELECTED);
1509 case Session::Recording:
1510 if (w->get_state() != STATE_ACTIVE) {
1511 w->set_state (STATE_ACTIVE);
1517 if (w->get_state() != STATE_NORMAL) {
1518 w->set_state (STATE_NORMAL);
1524 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1530 switch (session->record_status()) {
1531 case Session::Enabled:
1533 rec_button.set_state (1);
1535 rec_button.set_state (0);
1539 case Session::Recording:
1540 rec_button.set_state (2);
1544 rec_button.set_state (0);
1550 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1558 ARDOUR_UI::start_keyboard_prefix ()
1560 keyboard->start_prefix();
1564 ARDOUR_UI::save_template ()
1567 ArdourPrompter prompter (true);
1570 prompter.set_name (X_("Prompter"));
1571 prompter.set_prompt (_("Name for mix template:"));
1572 prompter.set_initial_text(session->name() + _("-template"));
1573 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1575 switch (prompter.run()) {
1576 case RESPONSE_ACCEPT:
1577 prompter.get_result (name);
1579 if (name.length()) {
1580 session->save_template (name);
1590 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1592 string session_name;
1593 string session_path;
1595 int response = Gtk::RESPONSE_NONE;
1597 new_session_dialog->set_modal(true);
1598 new_session_dialog->set_name (predetermined_path);
1599 new_session_dialog->reset_recent();
1600 new_session_dialog->show();
1603 response = new_session_dialog->run ();
1605 _session_is_new = false;
1607 if (response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1612 new_session_dialog->hide ();
1615 } else if (response == Gtk::RESPONSE_NONE) {
1617 /* Clear was pressed */
1618 new_session_dialog->reset();
1620 } else if (response == Gtk::RESPONSE_YES) {
1622 /* YES == OPEN, but there's no enum for that */
1624 session_name = new_session_dialog->session_name();
1626 if (session_name.empty()) {
1627 response = Gtk::RESPONSE_NONE;
1631 if (session_name[0] == '/' ||
1632 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1633 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1634 load_session (Glib::path_get_dirname (session_name), session_name);
1636 session_path = new_session_dialog->session_folder();
1637 load_session (session_path, session_name);
1640 } else if (response == Gtk::RESPONSE_OK) {
1642 session_name = new_session_dialog->session_name();
1644 if (new_session_dialog->get_current_page() == 1) {
1646 /* XXX this is a bit of a hack..
1647 i really want the new sesion dialog to return RESPONSE_YES
1648 if we're on page 1 (the load page)
1649 Unfortunately i can't see how atm..
1652 if (session_name.empty()) {
1653 response = Gtk::RESPONSE_NONE;
1657 if (session_name[0] == '/' ||
1658 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1659 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1660 load_session (Glib::path_get_dirname (session_name), session_name);
1662 session_path = new_session_dialog->session_folder();
1663 load_session (session_path, session_name);
1668 if (session_name.empty()) {
1669 response = Gtk::RESPONSE_NONE;
1673 if (session_name[0] == '/' ||
1674 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1675 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1677 session_path = Glib::path_get_dirname (session_name);
1678 session_name = Glib::path_get_basename (session_name);
1682 session_path = new_session_dialog->session_folder();
1686 //XXX This is needed because session constructor wants a
1687 //non-existant path. hopefully this will be fixed at some point.
1689 session_path = Glib::build_filename (session_path, session_name);
1691 if (g_file_test (session_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) {
1693 Glib::ustring str = string_compose (_("This session\n%1\nalready exists. Do you want to open it?"), session_path);
1695 MessageDialog msg (str,
1697 Gtk::MESSAGE_WARNING,
1698 Gtk::BUTTONS_YES_NO,
1702 msg.set_name (X_("CleanupDialog"));
1703 msg.set_wmclass (_("existing_session"), "Ardour");
1704 msg.set_position (Gtk::WIN_POS_MOUSE);
1706 switch (msg.run()) {
1708 load_session (session_path, session_name);
1712 response = RESPONSE_NONE;
1713 new_session_dialog->reset ();
1718 _session_is_new = true;
1720 std::string template_name = new_session_dialog->session_template_name();
1722 if (new_session_dialog->use_session_template()) {
1724 load_session (session_path, session_name, &template_name);
1730 AutoConnectOption iconnect;
1731 AutoConnectOption oconnect;
1733 if (new_session_dialog->create_control_bus()) {
1734 cchns = (uint32_t) new_session_dialog->control_channel_count();
1739 if (new_session_dialog->create_master_bus()) {
1740 mchns = (uint32_t) new_session_dialog->master_channel_count();
1745 if (new_session_dialog->connect_inputs()) {
1746 iconnect = AutoConnectPhysical;
1748 iconnect = AutoConnectOption (0);
1751 /// @todo some minor tweaks.
1753 if (new_session_dialog->connect_outs_to_master()) {
1754 oconnect = AutoConnectMaster;
1755 } else if (new_session_dialog->connect_outs_to_physical()) {
1756 oconnect = AutoConnectPhysical;
1758 oconnect = AutoConnectOption (0);
1761 uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
1762 uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count();
1764 build_session (session_path,
1772 engine->frame_rate() * 60 * 5);
1777 } while (response == Gtk::RESPONSE_NONE);
1781 new_session_dialog->get_window()->set_cursor();
1782 new_session_dialog->hide();
1786 ARDOUR_UI::close_session()
1793 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1795 Session *new_session;
1797 session_loaded = false;
1798 x = unload_session ();
1806 /* if it already exists, we must have write access */
1808 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1809 MessageDialog msg (*editor, _("\
1810 You do not have write access to this session.\n\
1811 This prevents the session from being loaded."));
1817 new_session = new Session (*engine, path, snap_name, mix_template);
1822 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1826 connect_to_session (new_session);
1828 Config->set_current_owner (ConfigVariableBase::Interface);
1830 session_loaded = true;
1832 goto_editor_window ();
1838 ARDOUR_UI::make_session_clean ()
1841 session->set_clean ();
1850 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1851 uint32_t control_channels,
1852 uint32_t master_channels,
1853 AutoConnectOption input_connect,
1854 AutoConnectOption output_connect,
1857 nframes_t initial_length)
1859 Session *new_session;
1862 session_loaded = false;
1863 x = unload_session ();
1870 _session_is_new = true;
1873 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1874 control_channels, master_channels, nphysin, nphysout, initial_length);
1879 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1883 connect_to_session (new_session);
1885 session_loaded = true;
1893 editor->show_window ();
1904 ARDOUR_UI::show_splash ()
1907 about = new About();
1908 about->signal_response().connect(mem_fun (*this, &ARDOUR_UI::about_signal_response) );
1915 ARDOUR_UI::about_signal_response(int response)
1921 ARDOUR_UI::hide_splash ()
1924 about->get_window()->set_cursor ();
1930 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1934 removed = rep.paths.size();
1937 MessageDialog msgd (*editor,
1938 _("No audio files were ready for cleanup"),
1941 (Gtk::ButtonsType)(Gtk::BUTTONS_OK) );
1942 msgd.set_secondary_text (_("If this seems suprising, \n\
1943 check for any existing snapshots.\n\
1944 These may still include regions that\n\
1945 require some unused files to continue to exist."));
1951 ArdourDialog results (_("ardour: cleanup"), true, false);
1953 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1954 CleanupResultsModelColumns() {
1958 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1959 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1963 CleanupResultsModelColumns results_columns;
1964 Glib::RefPtr<Gtk::ListStore> results_model;
1965 Gtk::TreeView results_display;
1967 results_model = ListStore::create (results_columns);
1968 results_display.set_model (results_model);
1969 results_display.append_column (list_title, results_columns.visible_name);
1971 results_display.set_name ("CleanupResultsList");
1972 results_display.set_headers_visible (true);
1973 results_display.set_headers_clickable (false);
1974 results_display.set_reorderable (false);
1976 Gtk::ScrolledWindow list_scroller;
1979 Gtk::HBox dhbox; // the hbox for the image and text
1980 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1981 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1983 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1985 if (rep.space < 1048576.0f) {
1987 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1989 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1993 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1995 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1999 dhbox.pack_start (*dimage, true, false, 5);
2000 dhbox.pack_start (txt, true, false, 5);
2002 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
2003 TreeModel::Row row = *(results_model->append());
2004 row[results_columns.visible_name] = *i;
2005 row[results_columns.fullpath] = *i;
2008 list_scroller.add (results_display);
2009 list_scroller.set_size_request (-1, 150);
2010 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2012 dvbox.pack_start (dhbox, true, false, 5);
2013 dvbox.pack_start (list_scroller, true, false, 5);
2014 ddhbox.pack_start (dvbox, true, false, 5);
2016 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2017 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2018 results.set_default_response (RESPONSE_CLOSE);
2019 results.set_position (Gtk::WIN_POS_MOUSE);
2020 results.show_all_children ();
2021 results.set_resizable (false);
2028 ARDOUR_UI::cleanup ()
2031 /* shouldn't happen: menu item is insensitive */
2036 MessageDialog checker (_("Are you sure you want to cleanup?"),
2038 Gtk::MESSAGE_QUESTION,
2039 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2041 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2042 ALL undo/redo information will be lost if you cleanup.\n\
2043 After cleanup, unused audio files will be moved to a \
2044 \"dead sounds\" location."));
2046 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2047 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2048 checker.set_default_response (RESPONSE_CANCEL);
2050 checker.set_name (_("CleanupDialog"));
2051 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2052 checker.set_position (Gtk::WIN_POS_MOUSE);
2054 switch (checker.run()) {
2055 case RESPONSE_ACCEPT:
2061 Session::cleanup_report rep;
2063 editor->prepare_for_cleanup ();
2065 if (session->cleanup_sources (rep)) {
2069 display_cleanup_results (rep,
2072 The following %1 %2 not in use and \n\
2073 have been moved to:\n\
2075 Flushing the wastebasket will \n\
2076 release an additional\n\
2077 %4 %5bytes of disk space.\n"
2082 ARDOUR_UI::flush_trash ()
2085 /* shouldn't happen: menu item is insensitive */
2089 Session::cleanup_report rep;
2091 if (session->cleanup_trash_sources (rep)) {
2095 display_cleanup_results (rep,
2097 _("The following %1 %2 deleted from\n\
2099 releasing %4 %5bytes of disk space"));
2103 ARDOUR_UI::add_route ()
2111 if (add_route_dialog == 0) {
2112 add_route_dialog = new AddRouteDialog;
2113 editor->ensure_float (*add_route_dialog);
2116 if (add_route_dialog->is_visible()) {
2117 /* we're already doing this */
2121 ResponseType r = (ResponseType) add_route_dialog->run ();
2123 add_route_dialog->hide();
2126 case RESPONSE_ACCEPT:
2133 if ((count = add_route_dialog->count()) <= 0) {
2137 uint32_t input_chan = add_route_dialog->channels ();
2138 uint32_t output_chan;
2139 string name_template = add_route_dialog->name_template ();
2140 bool track = add_route_dialog->track ();
2142 AutoConnectOption oac = Config->get_output_auto_connect();
2144 if (oac & AutoConnectMaster) {
2145 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2147 output_chan = input_chan;
2150 /* XXX do something with name template */
2153 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
2155 session_add_audio_bus (input_chan, output_chan, count);
2160 ARDOUR_UI::mixer_settings () const
2165 node = session->instant_xml(X_("Mixer"), session->path());
2167 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2171 node = new XMLNode (X_("Mixer"));
2178 ARDOUR_UI::editor_settings () const
2183 node = session->instant_xml(X_("Editor"), session->path());
2185 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2189 node = new XMLNode (X_("Editor"));
2195 ARDOUR_UI::keyboard_settings () const
2199 node = Config->extra_xml(X_("Keyboard"));
2202 node = new XMLNode (X_("Keyboard"));
2208 ARDOUR_UI::halt_on_xrun_message ()
2210 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2212 MessageDialog msg (*editor,
2213 _("Recording was stopped because your system could not keep up."));
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 (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::use_config ()
2349 Glib::RefPtr<Action> act;
2351 switch (Config->get_native_file_data_format ()) {
2353 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2356 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2361 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2362 ract->set_active ();
2365 switch (Config->get_native_file_header_format ()) {
2367 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2370 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2373 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2376 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2379 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2382 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2385 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2390 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2391 ract->set_active ();
2396 ARDOUR_UI::update_transport_clocks (nframes_t pos)
2398 primary_clock.set (pos);
2399 secondary_clock.set (pos);
2401 if (big_clock_window) {
2402 big_clock.set (pos);
2407 ARDOUR_UI::record_state_changed ()
2409 if (!session || !big_clock_window) {
2410 /* why bother - the clock isn't visible */
2414 switch (session->record_status()) {
2415 case Session::Recording:
2416 big_clock.set_name ("BigClockRecording");
2419 big_clock.set_name ("BigClockNonRecording");