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;
159 open_session_selector = 0;
160 have_configure_timeout = false;
161 have_disk_overrun_displayed = false;
162 have_disk_underrun_displayed = false;
163 _will_create_new_session_automatically = false;
164 session_loaded = false;
165 last_speed_displayed = -1.0f;
166 keybindings_path = ARDOUR::find_config_file ("ardour.bindings");
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());
352 ARDOUR_UI::startup ()
360 if (session && session->dirty()) {
361 switch (ask_about_saving_session(_("quit"))) {
366 /* use the default name */
367 if (save_state_canfail ("")) {
368 /* failed - don't quit */
369 MessageDialog msg (*editor,
371 Ardour was unable to save your session.\n\n\
372 If you still wish to quit, please use the\n\n\
373 \"Just quit\" option."));
384 session->set_deletion_in_progress ();
387 Config->save_state();
392 ARDOUR_UI::ask_about_saving_session (const string & what)
394 ArdourDialog window (_("ardour: save session?"));
395 Gtk::HBox dhbox; // the hbox for the image and text
396 Gtk::Label prompt_label;
397 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
401 msg = string_compose(_("Don't %1"), what);
402 window.add_button (msg, RESPONSE_REJECT);
403 msg = string_compose(_("Just %1"), what);
404 window.add_button (msg, RESPONSE_APPLY);
405 msg = string_compose(_("Save and %1"), what);
406 window.add_button (msg, RESPONSE_ACCEPT);
408 window.set_default_response (RESPONSE_ACCEPT);
410 Gtk::Button noquit_button (msg);
411 noquit_button.set_name ("EditorGTKButton");
416 if (session->snap_name() == session->name()) {
419 type = _("snapshot");
421 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?"),
422 type, session->snap_name());
424 prompt_label.set_text (prompt);
425 prompt_label.set_name (X_("PrompterLabel"));
426 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
428 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
430 dhbox.set_homogeneous (false);
431 dhbox.pack_start (*dimage, false, false, 5);
432 dhbox.pack_start (prompt_label, true, false, 5);
433 window.get_vbox()->pack_start (dhbox);
435 window.set_name (_("Prompter"));
436 window.set_position (Gtk::WIN_POS_MOUSE);
437 window.set_modal (true);
438 window.set_resizable (false);
441 save_the_session = 0;
443 window.set_keep_above (true);
446 ResponseType r = (ResponseType) window.run();
451 case RESPONSE_ACCEPT: // save and get out of here
453 case RESPONSE_APPLY: // get out of here
463 ARDOUR_UI::every_second ()
466 update_buffer_load ();
467 update_disk_space ();
472 ARDOUR_UI::every_point_one_seconds ()
474 update_speed_display ();
475 RapidScreenUpdate(); /* EMIT_SIGNAL */
480 ARDOUR_UI::every_point_zero_one_seconds ()
482 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
487 ARDOUR_UI::update_sample_rate (nframes_t ignored)
491 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
493 if (!engine->connected()) {
495 snprintf (buf, sizeof (buf), _("disconnected"));
499 nframes_t rate = engine->frame_rate();
501 if (fmod (rate, 1000.0) != 0.0) {
502 snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"),
503 (float) rate/1000.0f,
504 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
506 snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"),
508 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
512 sample_rate_label.set_text (buf);
516 ARDOUR_UI::update_cpu_load ()
519 snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
520 cpu_load_label.set_text (buf);
524 ARDOUR_UI::update_buffer_load ()
529 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
530 session->playback_load(), session->capture_load());
531 buffer_load_label.set_text (buf);
533 buffer_load_label.set_text ("");
538 ARDOUR_UI::count_recenabled_streams (Route& route)
540 Track* track = dynamic_cast<Track*>(&route);
541 if (track && track->diskstream()->record_enabled()) {
542 rec_enabled_streams += track->n_inputs();
547 ARDOUR_UI::update_disk_space()
553 nframes_t frames = session->available_capture_duration();
556 if (frames == max_frames) {
557 strcpy (buf, _("Disk: 24hrs+"));
562 nframes_t fr = session->frame_rate();
564 rec_enabled_streams = 0;
565 session->foreach_route (this, &ARDOUR_UI::count_recenabled_streams);
567 if (rec_enabled_streams) {
568 frames /= rec_enabled_streams;
571 hrs = frames / (fr * 3600);
572 frames -= hrs * fr * 3600;
573 mins = frames / (fr * 60);
574 frames -= mins * fr * 60;
577 snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
580 disk_space_label.set_text (buf);
584 ARDOUR_UI::update_wall_clock ()
591 tm_now = localtime (&now);
593 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
594 wall_clock_label.set_text (buf);
599 ARDOUR_UI::control_methods_adjusted ()
604 which_method = (int) online_control_button->adjustment.get_value();
605 switch (which_method) {
607 allow_mmc_and_local ();
616 fatal << _("programming error: impossible control method") << endmsg;
622 ARDOUR_UI::mmc_device_id_adjusted ()
627 int dev_id = (int) mmc_id_button->adjustment.get_value();
628 mmc->set_device_id (dev_id);
634 ARDOUR_UI::session_menu (GdkEventButton *ev)
636 session_popup_menu->popup (0, 0);
641 ARDOUR_UI::redisplay_recent_sessions ()
643 vector<string *> *sessions;
644 vector<string *>::iterator i;
645 RecentSessionsSorter cmp;
647 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
648 recent_session_model->clear ();
651 ARDOUR::read_recent_sessions (rs);
654 recent_session_display.set_model (recent_session_model);
658 /* sort them alphabetically */
659 sort (rs.begin(), rs.end(), cmp);
660 sessions = new vector<string*>;
662 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
663 sessions->push_back (new string ((*i).second));
666 for (i = sessions->begin(); i != sessions->end(); ++i) {
668 vector<string*>* states;
669 vector<const gchar*> item;
670 string fullpath = *(*i);
672 /* remove any trailing / */
674 if (fullpath[fullpath.length()-1] == '/') {
675 fullpath = fullpath.substr (0, fullpath.length()-1);
678 /* now get available states for this session */
680 if ((states = Session::possible_states (fullpath)) == 0) {
685 TreeModel::Row row = *(recent_session_model->append());
687 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
688 row[recent_session_columns.fullpath] = fullpath;
690 if (states->size() > 1) {
692 /* add the children */
694 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
696 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
698 child_row[recent_session_columns.visible_name] = **i2;
699 child_row[recent_session_columns.fullpath] = fullpath;
708 recent_session_display.set_model (recent_session_model);
713 ARDOUR_UI::build_session_selector ()
715 session_selector_window = new ArdourDialog ("session selector");
717 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
719 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
720 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
721 session_selector_window->set_default_response (RESPONSE_ACCEPT);
722 recent_session_model = TreeStore::create (recent_session_columns);
723 recent_session_display.set_model (recent_session_model);
724 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
725 recent_session_display.set_headers_visible (false);
726 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
728 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
730 scroller->add (recent_session_display);
731 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
733 session_selector_window->set_name ("SessionSelectorWindow");
734 session_selector_window->set_size_request (200, 400);
735 session_selector_window->get_vbox()->pack_start (*scroller);
736 session_selector_window->show_all_children();
740 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
742 session_selector_window->response (RESPONSE_ACCEPT);
746 ARDOUR_UI::open_recent_session ()
748 /* popup selector window */
750 if (session_selector_window == 0) {
751 build_session_selector ();
754 redisplay_recent_sessions ();
756 ResponseType r = (ResponseType) session_selector_window->run ();
758 session_selector_window->hide();
761 case RESPONSE_ACCEPT:
767 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
769 if (i == recent_session_model->children().end()) {
773 Glib::ustring path = (*i)[recent_session_columns.fullpath];
774 Glib::ustring state = (*i)[recent_session_columns.visible_name];
776 _session_is_new = false;
778 load_session (path, state);
782 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
786 if (stat (info.filename.c_str(), &statbuf) != 0) {
790 if (!S_ISDIR(statbuf.st_mode)) {
796 string session_file = info.filename;
798 session_file += Glib::path_get_basename (info.filename);
799 session_file += ".ardour";
801 if (stat (session_file.c_str(), &statbuf) != 0) {
805 return S_ISREG (statbuf.st_mode);
809 ARDOUR_UI::open_session ()
811 /* popup selector window */
813 if (open_session_selector == 0) {
815 /* ardour sessions are folders */
817 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
818 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
819 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
821 FileFilter session_filter;
822 session_filter.add_pattern ("*.ardour");
823 session_filter.set_name (_("Ardour sessions"));
824 open_session_selector->add_filter (session_filter);
825 open_session_selector->set_filter (session_filter);
828 int response = open_session_selector->run();
829 open_session_selector->hide ();
832 case RESPONSE_ACCEPT:
835 open_session_selector->hide();
839 open_session_selector->hide();
840 string session_path = open_session_selector->get_filename();
844 if (session_path.length() > 0) {
845 if (Session::find_session (session_path, path, name, isnew) == 0) {
846 _session_is_new = isnew;
847 load_session (path, name);
854 ARDOUR_UI::session_add_midi_track ()
856 cerr << _("Patience is a virtue.\n");
860 ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many)
862 list<boost::shared_ptr<AudioTrack> > tracks;
863 Session::RouteList routes;
866 warning << _("You cannot add a track or bus without a session already loaded.") << endmsg;
872 tracks = session->new_audio_track (input_channels, output_channels, mode, how_many);
874 if (tracks.size() != how_many) {
876 error << _("could not create a new audio track") << endmsg;
878 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
884 routes = session->new_audio_route (input_channels, output_channels, how_many);
886 if (routes.size() != how_many) {
888 error << _("could not create a new audio track") << endmsg;
890 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
896 if (need_control_room_outs) {
902 route->set_stereo_control_outs (control_lr_channels);
903 route->control_outs()->set_stereo_pan (pans, this);
905 #endif /* CONTROLOUTS */
909 MessageDialog msg (*editor,
910 _("There are insufficient JACK ports available\n\
911 to create a new track or bus.\n\
912 You should save Ardour, exit and\n\
913 restart JACK with more ports."));
919 ARDOUR_UI::do_transport_locate (nframes_t new_position)
921 nframes_t _preroll = 0;
924 // XXX CONFIG_CHANGE FIX - requires AnyTime handling
925 // _preroll = session->convert_to_frames_at (new_position, Config->get_preroll());
927 if (new_position > _preroll) {
928 new_position -= _preroll;
933 session->request_locate (new_position);
938 ARDOUR_UI::transport_goto_start ()
941 session->goto_start();
944 /* force displayed area in editor to start no matter
945 what "follow playhead" setting is.
949 editor->reposition_x_origin (session->current_start_frame());
955 ARDOUR_UI::transport_goto_zero ()
958 session->request_locate (0);
961 /* force displayed area in editor to start no matter
962 what "follow playhead" setting is.
966 editor->reposition_x_origin (0);
972 ARDOUR_UI::transport_goto_end ()
975 nframes_t frame = session->current_end_frame();
976 session->request_locate (frame);
978 /* force displayed area in editor to start no matter
979 what "follow playhead" setting is.
983 editor->reposition_x_origin (frame);
989 ARDOUR_UI::transport_stop ()
995 if (session->is_auditioning()) {
996 session->cancel_audition ();
1000 if (session->get_play_loop ()) {
1001 session->request_play_loop (false);
1004 session->request_stop ();
1008 ARDOUR_UI::transport_stop_and_forget_capture ()
1011 session->request_stop (true);
1016 ARDOUR_UI::remove_last_capture()
1019 editor->remove_last_capture();
1024 ARDOUR_UI::transport_record ()
1027 switch (session->record_status()) {
1028 case Session::Disabled:
1029 if (session->ntracks() == 0) {
1030 MessageDialog msg (*editor, _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu."));
1034 session->maybe_enable_record ();
1036 case Session::Recording:
1037 case Session::Enabled:
1038 session->disable_record (true);
1044 ARDOUR_UI::transport_roll ()
1052 rolling = session->transport_rolling ();
1054 if (session->get_play_loop()) {
1055 session->request_play_loop (false);
1056 auto_loop_button.set_active (false);
1057 roll_button.set_active (true);
1058 } else if (session->get_play_range ()) {
1059 session->request_play_range (false);
1060 play_selection_button.set_active (false);
1061 } else if (rolling) {
1062 session->request_locate (session->last_transport_start(), true);
1065 session->request_transport_speed (1.0f);
1069 ARDOUR_UI::transport_loop()
1072 if (session->get_play_loop()) {
1073 if (session->transport_rolling()) {
1074 Location * looploc = session->locations()->auto_loop_location();
1076 session->request_locate (looploc->start(), true);
1081 session->request_play_loop (true);
1087 ARDOUR_UI::transport_play_selection ()
1093 if (!session->get_play_range()) {
1094 session->request_stop ();
1097 editor->play_selection ();
1101 ARDOUR_UI::transport_rewind (int option)
1103 float current_transport_speed;
1106 current_transport_speed = session->transport_speed();
1108 if (current_transport_speed >= 0.0f) {
1111 session->request_transport_speed (-1.0f);
1114 session->request_transport_speed (-4.0f);
1117 session->request_transport_speed (-0.5f);
1122 session->request_transport_speed (current_transport_speed * 1.5f);
1128 ARDOUR_UI::transport_forward (int option)
1130 float current_transport_speed;
1133 current_transport_speed = session->transport_speed();
1135 if (current_transport_speed <= 0.0f) {
1138 session->request_transport_speed (1.0f);
1141 session->request_transport_speed (4.0f);
1144 session->request_transport_speed (0.5f);
1149 session->request_transport_speed (current_transport_speed * 1.5f);
1155 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1161 boost::shared_ptr<Route> r;
1163 if ((r = session->route_by_remote_id (dstream)) != 0) {
1167 if ((t = dynamic_cast<Track*>(r.get())) != 0) {
1168 t->diskstream()->set_record_enabled (!t->diskstream()->record_enabled());
1177 ARDOUR_UI::queue_transport_change ()
1179 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1183 ARDOUR_UI::map_transport_state ()
1185 float sp = session->transport_speed();
1188 transport_rolling ();
1189 } else if (sp < 0.0f) {
1190 transport_rewinding ();
1191 } else if (sp > 0.0f) {
1192 transport_forwarding ();
1194 transport_stopped ();
1199 ARDOUR_UI::allow_local_only ()
1205 ARDOUR_UI::allow_mmc_only ()
1211 ARDOUR_UI::allow_mmc_and_local ()
1217 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1219 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1220 (int) adj.get_value()].c_str());
1224 ARDOUR_UI::engine_stopped ()
1226 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1227 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1228 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1232 ARDOUR_UI::engine_running ()
1234 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1235 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1236 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1240 ARDOUR_UI::engine_halted ()
1242 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1244 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1245 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1247 update_sample_rate (0);
1249 MessageDialog msg (*editor,
1251 JACK has either been shutdown or it\n\
1252 disconnected Ardour because Ardour\n\
1253 was not fast enough. You can save the\n\
1254 session and/or try to reconnect to JACK ."));
1259 ARDOUR_UI::do_engine_start ()
1265 catch (AudioEngine::PortRegistrationFailure& err) {
1267 error << _("Unable to create all required ports")
1275 error << _("Unable to start the session running")
1285 ARDOUR_UI::start_engine ()
1287 if (do_engine_start () == 0) {
1288 if (session && _session_is_new) {
1289 /* we need to retain initial visual
1290 settings for a new session
1292 session->save_state ("");
1300 ARDOUR_UI::update_clocks ()
1302 if (!editor || !editor->dragging_playhead()) {
1303 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1308 ARDOUR_UI::start_clocking ()
1310 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1314 ARDOUR_UI::stop_clocking ()
1316 clock_signal_connection.disconnect ();
1320 ARDOUR_UI::toggle_clocking ()
1323 if (clock_button.get_active()) {
1332 ARDOUR_UI::_blink (void *arg)
1335 ((ARDOUR_UI *) arg)->blink ();
1342 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1346 ARDOUR_UI::start_blinking ()
1348 /* Start the blink signal. Everybody with a blinking widget
1349 uses Blink to drive the widget's state.
1352 if (blink_timeout_tag < 0) {
1354 blink_timeout_tag = g_timeout_add (240, _blink, this);
1359 ARDOUR_UI::stop_blinking ()
1361 if (blink_timeout_tag >= 0) {
1362 g_source_remove (blink_timeout_tag);
1363 blink_timeout_tag = -1;
1368 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1374 if (io.n_inputs() == 0) {
1379 /* XXX we're not handling multiple ports yet. */
1381 const char **connections = io.input(0)->get_connections();
1383 if (connections == 0 || connections[0] == '\0') {
1386 buf = connections[0];
1393 if (io.n_outputs() == 0) {
1398 /* XXX we're not handling multiple ports yet. */
1400 const char **connections = io.output(0)->get_connections();
1402 if (connections == 0 || connections[0] == '\0') {
1405 buf = connections[0];
1413 ARDOUR_UI::snapshot_session ()
1415 ArdourPrompter prompter (true);
1422 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1424 prompter.set_name ("Prompter");
1425 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1426 prompter.set_prompt (_("Name of New Snapshot"));
1427 prompter.set_initial_text (now);
1429 switch (prompter.run()) {
1430 case RESPONSE_ACCEPT:
1431 prompter.get_result (snapname);
1432 if (snapname.length()){
1433 save_state (snapname);
1443 ARDOUR_UI::save_state (const string & name)
1445 (void) save_state_canfail (name);
1449 ARDOUR_UI::save_state_canfail (string name)
1454 if (name.length() == 0) {
1455 name = session->snap_name();
1458 if ((ret = session->save_state (name)) != 0) {
1462 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1467 ARDOUR_UI::restore_state (string name)
1470 if (name.length() == 0) {
1471 name = session->name();
1473 session->restore_state (name);
1478 ARDOUR_UI::primary_clock_value_changed ()
1481 session->request_locate (primary_clock.current_time ());
1486 ARDOUR_UI::secondary_clock_value_changed ()
1489 session->request_locate (secondary_clock.current_time ());
1494 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1496 if (session && dstream && dstream->record_enabled()) {
1498 Session::RecordState rs;
1500 rs = session->record_status ();
1503 case Session::Disabled:
1504 case Session::Enabled:
1505 if (w->get_state() != STATE_SELECTED) {
1506 w->set_state (STATE_SELECTED);
1510 case Session::Recording:
1511 if (w->get_state() != STATE_ACTIVE) {
1512 w->set_state (STATE_ACTIVE);
1518 if (w->get_state() != STATE_NORMAL) {
1519 w->set_state (STATE_NORMAL);
1525 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1531 switch (session->record_status()) {
1532 case Session::Enabled:
1534 rec_button.set_state (1);
1536 rec_button.set_state (0);
1540 case Session::Recording:
1541 rec_button.set_state (2);
1545 rec_button.set_state (0);
1551 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1559 ARDOUR_UI::start_keyboard_prefix ()
1561 keyboard->start_prefix();
1565 ARDOUR_UI::save_template ()
1568 ArdourPrompter prompter (true);
1571 prompter.set_name (X_("Prompter"));
1572 prompter.set_prompt (_("Name for mix template:"));
1573 prompter.set_initial_text(session->name() + _("-template"));
1574 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1576 switch (prompter.run()) {
1577 case RESPONSE_ACCEPT:
1578 prompter.get_result (name);
1580 if (name.length()) {
1581 session->save_template (name);
1591 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1593 string session_name;
1594 string session_path;
1596 int response = Gtk::RESPONSE_NONE;
1598 new_session_dialog->set_modal(true);
1599 new_session_dialog->set_name (predetermined_path);
1600 new_session_dialog->reset_recent();
1601 new_session_dialog->show();
1604 response = new_session_dialog->run ();
1606 _session_is_new = false;
1608 if (response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1613 new_session_dialog->hide ();
1616 } else if (response == Gtk::RESPONSE_NONE) {
1618 /* Clear was pressed */
1619 new_session_dialog->reset();
1621 } else if (response == Gtk::RESPONSE_YES) {
1623 /* YES == OPEN, but there's no enum for that */
1625 session_name = new_session_dialog->session_name();
1627 if (session_name.empty()) {
1628 response = Gtk::RESPONSE_NONE;
1632 if (session_name[0] == '/' ||
1633 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1634 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1635 load_session (Glib::path_get_dirname (session_name), session_name);
1637 session_path = new_session_dialog->session_folder();
1638 load_session (session_path, session_name);
1641 } else if (response == Gtk::RESPONSE_OK) {
1643 session_name = new_session_dialog->session_name();
1645 if (new_session_dialog->get_current_page() == 1) {
1647 /* XXX this is a bit of a hack..
1648 i really want the new sesion dialog to return RESPONSE_YES
1649 if we're on page 1 (the load page)
1650 Unfortunately i can't see how atm..
1653 if (session_name.empty()) {
1654 response = Gtk::RESPONSE_NONE;
1658 if (session_name[0] == '/' ||
1659 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1660 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1661 load_session (Glib::path_get_dirname (session_name), session_name);
1663 session_path = new_session_dialog->session_folder();
1664 load_session (session_path, session_name);
1669 if (session_name.empty()) {
1670 response = Gtk::RESPONSE_NONE;
1674 if (session_name[0] == '/' ||
1675 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1676 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1678 session_path = Glib::path_get_dirname (session_name);
1679 session_name = Glib::path_get_basename (session_name);
1683 session_path = new_session_dialog->session_folder();
1687 //XXX This is needed because session constructor wants a
1688 //non-existant path. hopefully this will be fixed at some point.
1690 session_path = Glib::build_filename (session_path, session_name);
1692 if (g_file_test (session_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) {
1694 Glib::ustring str = string_compose (_("This session\n%1\nalready exists. Do you want to open it?"), session_path);
1696 MessageDialog msg (str,
1698 Gtk::MESSAGE_WARNING,
1699 Gtk::BUTTONS_YES_NO,
1703 msg.set_name (X_("CleanupDialog"));
1704 msg.set_wmclass (X_("existing_session"), "Ardour");
1705 msg.set_position (Gtk::WIN_POS_MOUSE);
1707 switch (msg.run()) {
1709 load_session (session_path, session_name);
1713 response = RESPONSE_NONE;
1714 new_session_dialog->reset ();
1719 _session_is_new = true;
1721 std::string template_name = new_session_dialog->session_template_name();
1723 if (new_session_dialog->use_session_template()) {
1725 load_session (session_path, session_name, &template_name);
1731 AutoConnectOption iconnect;
1732 AutoConnectOption oconnect;
1734 if (new_session_dialog->create_control_bus()) {
1735 cchns = (uint32_t) new_session_dialog->control_channel_count();
1740 if (new_session_dialog->create_master_bus()) {
1741 mchns = (uint32_t) new_session_dialog->master_channel_count();
1746 if (new_session_dialog->connect_inputs()) {
1747 iconnect = AutoConnectPhysical;
1749 iconnect = AutoConnectOption (0);
1752 /// @todo some minor tweaks.
1754 if (new_session_dialog->connect_outs_to_master()) {
1755 oconnect = AutoConnectMaster;
1756 } else if (new_session_dialog->connect_outs_to_physical()) {
1757 oconnect = AutoConnectPhysical;
1759 oconnect = AutoConnectOption (0);
1762 uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
1763 uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count();
1765 build_session (session_path,
1773 engine->frame_rate() * 60 * 5);
1778 } while (response == Gtk::RESPONSE_NONE);
1782 new_session_dialog->get_window()->set_cursor();
1783 new_session_dialog->hide();
1787 ARDOUR_UI::close_session()
1794 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1796 Session *new_session;
1798 session_loaded = false;
1799 x = unload_session ();
1807 /* if it already exists, we must have write access */
1809 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1810 MessageDialog msg (*editor, _("\
1811 You do not have write access to this session.\n\
1812 This prevents the session from being loaded."));
1818 new_session = new Session (*engine, path, snap_name, mix_template);
1823 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1827 connect_to_session (new_session);
1829 Config->set_current_owner (ConfigVariableBase::Interface);
1831 session_loaded = true;
1833 goto_editor_window ();
1836 session->set_clean ();
1843 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1844 uint32_t control_channels,
1845 uint32_t master_channels,
1846 AutoConnectOption input_connect,
1847 AutoConnectOption output_connect,
1850 nframes_t initial_length)
1852 Session *new_session;
1855 session_loaded = false;
1856 x = unload_session ();
1863 _session_is_new = true;
1866 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1867 control_channels, master_channels, nphysin, nphysout, initial_length);
1872 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1876 connect_to_session (new_session);
1878 session_loaded = true;
1886 editor->show_window ();
1897 ARDOUR_UI::show_splash ()
1900 about = new About();
1901 about->signal_response().connect(mem_fun (*this, &ARDOUR_UI::about_signal_response) );
1908 ARDOUR_UI::about_signal_response(int response)
1914 ARDOUR_UI::hide_splash ()
1917 about->get_window()->set_cursor ();
1923 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1927 removed = rep.paths.size();
1930 MessageDialog msgd (*editor,
1931 _("No audio files were ready for cleanup"),
1934 (Gtk::ButtonsType)(Gtk::BUTTONS_OK) );
1935 msgd.set_secondary_text (_("If this seems suprising, \n\
1936 check for any existing snapshots.\n\
1937 These may still include regions that\n\
1938 require some unused files to continue to exist."));
1944 ArdourDialog results (_("ardour: cleanup"), true, false);
1946 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1947 CleanupResultsModelColumns() {
1951 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1952 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1956 CleanupResultsModelColumns results_columns;
1957 Glib::RefPtr<Gtk::ListStore> results_model;
1958 Gtk::TreeView results_display;
1960 results_model = ListStore::create (results_columns);
1961 results_display.set_model (results_model);
1962 results_display.append_column (list_title, results_columns.visible_name);
1964 results_display.set_name ("CleanupResultsList");
1965 results_display.set_headers_visible (true);
1966 results_display.set_headers_clickable (false);
1967 results_display.set_reorderable (false);
1969 Gtk::ScrolledWindow list_scroller;
1972 Gtk::HBox dhbox; // the hbox for the image and text
1973 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1974 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1976 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1978 if (rep.space < 1048576.0f) {
1980 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1982 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1986 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1988 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1992 dhbox.pack_start (*dimage, true, false, 5);
1993 dhbox.pack_start (txt, true, false, 5);
1995 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1996 TreeModel::Row row = *(results_model->append());
1997 row[results_columns.visible_name] = *i;
1998 row[results_columns.fullpath] = *i;
2001 list_scroller.add (results_display);
2002 list_scroller.set_size_request (-1, 150);
2003 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2005 dvbox.pack_start (dhbox, true, false, 5);
2006 dvbox.pack_start (list_scroller, true, false, 5);
2007 ddhbox.pack_start (dvbox, true, false, 5);
2009 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2010 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2011 results.set_default_response (RESPONSE_CLOSE);
2012 results.set_position (Gtk::WIN_POS_MOUSE);
2013 results.show_all_children ();
2014 results.set_resizable (false);
2021 ARDOUR_UI::cleanup ()
2024 /* shouldn't happen: menu item is insensitive */
2029 MessageDialog checker (_("Are you sure you want to cleanup?"),
2031 Gtk::MESSAGE_QUESTION,
2032 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2034 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2035 ALL undo/redo information will be lost if you cleanup.\n\
2036 After cleanup, unused audio files will be moved to a \
2037 \"dead sounds\" location."));
2039 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2040 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2041 checker.set_default_response (RESPONSE_CANCEL);
2043 checker.set_name (_("CleanupDialog"));
2044 checker.set_wmclass (X_("ardour_cleanup"), "Ardour");
2045 checker.set_position (Gtk::WIN_POS_MOUSE);
2047 switch (checker.run()) {
2048 case RESPONSE_ACCEPT:
2054 Session::cleanup_report rep;
2056 editor->prepare_for_cleanup ();
2058 if (session->cleanup_sources (rep)) {
2062 display_cleanup_results (rep,
2065 The following %1 %2 not in use and \n\
2066 have been moved to:\n\
2068 Flushing the wastebasket will \n\
2069 release an additional\n\
2070 %4 %5bytes of disk space.\n"
2075 ARDOUR_UI::flush_trash ()
2078 /* shouldn't happen: menu item is insensitive */
2082 Session::cleanup_report rep;
2084 if (session->cleanup_trash_sources (rep)) {
2088 display_cleanup_results (rep,
2090 _("The following %1 %2 deleted from\n\
2092 releasing %4 %5bytes of disk space"));
2096 ARDOUR_UI::add_route ()
2104 if (add_route_dialog == 0) {
2105 add_route_dialog = new AddRouteDialog;
2106 editor->ensure_float (*add_route_dialog);
2109 if (add_route_dialog->is_visible()) {
2110 /* we're already doing this */
2114 ResponseType r = (ResponseType) add_route_dialog->run ();
2116 add_route_dialog->hide();
2119 case RESPONSE_ACCEPT:
2126 if ((count = add_route_dialog->count()) <= 0) {
2130 uint32_t input_chan = add_route_dialog->channels ();
2131 uint32_t output_chan;
2132 string name_template = add_route_dialog->name_template ();
2133 bool track = add_route_dialog->track ();
2135 AutoConnectOption oac = Config->get_output_auto_connect();
2137 if (oac & AutoConnectMaster) {
2138 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2140 output_chan = input_chan;
2143 /* XXX do something with name template */
2146 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
2148 session_add_audio_bus (input_chan, output_chan, count);
2153 ARDOUR_UI::mixer_settings () const
2158 node = session->instant_xml(X_("Mixer"), session->path());
2160 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2164 node = new XMLNode (X_("Mixer"));
2171 ARDOUR_UI::editor_settings () const
2176 node = session->instant_xml(X_("Editor"), session->path());
2178 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2182 node = new XMLNode (X_("Editor"));
2188 ARDOUR_UI::keyboard_settings () const
2192 node = Config->extra_xml(X_("Keyboard"));
2195 node = new XMLNode (X_("Keyboard"));
2201 ARDOUR_UI::halt_on_xrun_message ()
2203 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2205 MessageDialog msg (*editor,
2206 _("Recording was stopped because your system could not keep up."));
2211 ARDOUR_UI::disk_overrun_handler ()
2213 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2215 if (!have_disk_overrun_displayed) {
2216 have_disk_overrun_displayed = true;
2217 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2218 The disk system on your computer\n\
2219 was not able to keep up with Ardour.\n\
2221 Specifically, it failed to write data to disk\n\
2222 quickly enough to keep up with recording.\n"));
2224 have_disk_overrun_displayed = false;
2229 ARDOUR_UI::disk_underrun_handler ()
2231 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2233 if (!have_disk_underrun_displayed) {
2234 have_disk_underrun_displayed = true;
2235 MessageDialog msg (*editor,
2236 (_("The disk system on your computer\n\
2237 was not able to keep up with Ardour.\n\
2239 Specifically, it failed to read data from disk\n\
2240 quickly enough to keep up with playback.\n")));
2242 have_disk_underrun_displayed = false;
2247 ARDOUR_UI::disk_underrun_message_gone ()
2249 have_disk_underrun_displayed = false;
2253 ARDOUR_UI::disk_overrun_message_gone ()
2255 have_disk_underrun_displayed = false;
2259 ARDOUR_UI::pending_state_dialog ()
2261 ArdourDialog dialog ("pending state dialog");
2263 This session appears to have been in\n\
2264 middle of recording when ardour or\n\
2265 the computer was shutdown.\n\
2267 Ardour can recover any captured audio for\n\
2268 you, or it can ignore it. Please decide\n\
2269 what you would like to do.\n"));
2271 dialog.get_vbox()->pack_start (message);
2272 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2273 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2275 dialog.set_position (WIN_POS_CENTER);
2278 switch (dialog.run ()) {
2279 case RESPONSE_ACCEPT:
2287 ARDOUR_UI::disconnect_from_jack ()
2290 if( engine->disconnect_from_jack ()) {
2291 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2295 update_sample_rate (0);
2300 ARDOUR_UI::reconnect_to_jack ()
2303 if (engine->reconnect_to_jack ()) {
2304 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2308 update_sample_rate (0);
2313 ARDOUR_UI::set_jack_buffer_size (nframes_t nframes)
2315 engine->request_buffer_size (nframes);
2316 update_sample_rate (0);
2320 ARDOUR_UI::cmdline_new_session (string path)
2322 if (path[0] != '/') {
2323 char buf[PATH_MAX+1];
2326 getcwd (buf, sizeof (buf));
2333 new_session (false, path);
2335 _will_create_new_session_automatically = false; /* done it */
2336 return FALSE; /* don't call it again */
2340 ARDOUR_UI::use_config ()
2342 Glib::RefPtr<Action> act;
2344 switch (Config->get_native_file_data_format ()) {
2346 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2349 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2354 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2355 ract->set_active ();
2358 switch (Config->get_native_file_header_format ()) {
2360 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2363 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2366 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2369 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2372 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2375 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2378 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2383 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2384 ract->set_active ();
2389 ARDOUR_UI::update_transport_clocks (nframes_t pos)
2391 primary_clock.set (pos);
2392 secondary_clock.set (pos);
2394 if (big_clock_window) {
2395 big_clock.set (pos);
2400 ARDOUR_UI::record_state_changed ()
2402 if (!session || !big_clock_window) {
2403 /* why bother - the clock isn't visible */
2407 switch (session->record_status()) {
2408 case Session::Recording:
2409 big_clock.set_name ("BigClockRecording");
2412 big_clock.set_name ("BigClockNonRecording");
2418 ARDOUR_UI::set_keybindings_path (string path)
2420 keybindings_path = path;
2424 ARDOUR_UI::save_keybindings ()
2426 AccelMap::save (keybindings_path);