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;
167 keybindings_path = ARDOUR::find_config_file ("ardour.bindings");
169 last_configure_time.tv_sec = 0;
170 last_configure_time.tv_usec = 0;
172 shuttle_grabbed = false;
174 shuttle_max_speed = 8.0f;
176 shuttle_style_menu = 0;
177 shuttle_unit_menu = 0;
179 gettimeofday (&last_peak_grab, 0);
180 gettimeofday (&last_shuttle_request, 0);
182 ARDOUR::Diskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
183 ARDOUR::Diskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
185 /* handle pending state with a dialog */
187 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
189 /* have to wait for AudioEngine and Configuration before proceeding */
193 ARDOUR_UI::set_engine (AudioEngine& e)
197 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
198 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
199 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
200 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
202 ActionManager::init ();
203 new_session_dialog = new NewSessionDialog();
207 keyboard = new Keyboard;
209 if (setup_windows ()) {
210 throw failed_constructor ();
213 if (GTK_ARDOUR::show_key_actions) {
214 vector<string> names;
215 vector<string> paths;
217 vector<AccelKey> bindings;
219 ActionManager::get_all_actions (names, paths, keys, bindings);
221 vector<string>::iterator n;
222 vector<string>::iterator k;
223 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
224 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
230 /* start with timecode, metering enabled
233 blink_timeout_tag = -1;
235 /* the global configuration object is now valid */
239 /* this being a GUI and all, we want peakfiles */
241 AudioFileSource::set_build_peakfiles (true);
242 AudioFileSource::set_build_missing_peakfiles (true);
244 if (AudioSource::start_peak_thread ()) {
245 throw failed_constructor();
248 /* start the time-of-day-clock */
250 update_wall_clock ();
251 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
253 update_disk_space ();
255 update_sample_rate (engine->frame_rate());
257 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
258 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
261 ARDOUR_UI::~ARDOUR_UI ()
263 save_ardour_state ();
277 if (add_route_dialog) {
278 delete add_route_dialog;
281 AudioSource::stop_peak_thread ();
285 ARDOUR_UI::configure_timeout ()
290 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
291 /* no configure events yet */
295 gettimeofday (&now, 0);
296 timersub (&now, &last_configure_time, &diff);
298 /* force a gap of 0.5 seconds since the last configure event
301 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
304 have_configure_timeout = false;
305 save_ardour_state ();
311 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
313 if (have_configure_timeout) {
314 gettimeofday (&last_configure_time, 0);
316 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
317 have_configure_timeout = true;
324 ARDOUR_UI::save_ardour_state ()
326 if (!keyboard || !mixer || !editor) {
330 /* XXX this is all a bit dubious. add_extra_xml() uses
331 a different lifetime model from add_instant_xml().
334 XMLNode* node = new XMLNode (keyboard->get_state());
335 Config->add_extra_xml (*node);
336 Config->save_state();
338 XMLNode enode(static_cast<Stateful*>(editor)->get_state());
339 XMLNode mnode(mixer->get_state());
342 session->add_instant_xml (enode, session->path());
343 session->add_instant_xml (mnode, session->path());
345 Config->add_instant_xml (enode, get_user_ardour_path());
346 Config->add_instant_xml (mnode, get_user_ardour_path());
353 ARDOUR_UI::startup ()
361 if (session && session->dirty()) {
362 switch (ask_about_saving_session(_("quit"))) {
367 /* use the default name */
368 if (save_state_canfail ("")) {
369 /* failed - don't quit */
370 MessageDialog msg (*editor,
372 Ardour was unable to save your session.\n\n\
373 If you still wish to quit, please use the\n\n\
374 \"Just quit\" option."));
385 session->set_deletion_in_progress ();
388 Config->save_state();
393 ARDOUR_UI::ask_about_saving_session (const string & what)
395 ArdourDialog window (_("ardour: save session?"));
396 Gtk::HBox dhbox; // the hbox for the image and text
397 Gtk::Label prompt_label;
398 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
402 msg = string_compose(_("Don't %1"), what);
403 window.add_button (msg, RESPONSE_REJECT);
404 msg = string_compose(_("Just %1"), what);
405 window.add_button (msg, RESPONSE_APPLY);
406 msg = string_compose(_("Save and %1"), what);
407 window.add_button (msg, RESPONSE_ACCEPT);
409 window.set_default_response (RESPONSE_ACCEPT);
411 Gtk::Button noquit_button (msg);
412 noquit_button.set_name ("EditorGTKButton");
417 if (session->snap_name() == session->name()) {
420 type = _("snapshot");
422 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?"),
423 type, session->snap_name());
425 prompt_label.set_text (prompt);
426 prompt_label.set_name (X_("PrompterLabel"));
427 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
429 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
431 dhbox.set_homogeneous (false);
432 dhbox.pack_start (*dimage, false, false, 5);
433 dhbox.pack_start (prompt_label, true, false, 5);
434 window.get_vbox()->pack_start (dhbox);
436 window.set_name (_("Prompter"));
437 window.set_position (Gtk::WIN_POS_MOUSE);
438 window.set_modal (true);
439 window.set_resizable (false);
442 save_the_session = 0;
444 window.set_keep_above (true);
447 ResponseType r = (ResponseType) window.run();
452 case RESPONSE_ACCEPT: // save and get out of here
454 case RESPONSE_APPLY: // get out of here
464 ARDOUR_UI::every_second ()
467 update_buffer_load ();
468 update_disk_space ();
473 ARDOUR_UI::every_point_one_seconds ()
475 update_speed_display ();
476 RapidScreenUpdate(); /* EMIT_SIGNAL */
481 ARDOUR_UI::every_point_zero_one_seconds ()
483 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
488 ARDOUR_UI::update_sample_rate (nframes_t ignored)
492 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
494 if (!engine->connected()) {
496 snprintf (buf, sizeof (buf), _("disconnected"));
500 nframes_t rate = engine->frame_rate();
502 if (fmod (rate, 1000.0) != 0.0) {
503 snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"),
504 (float) rate/1000.0f,
505 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
507 snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"),
509 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
513 sample_rate_label.set_text (buf);
517 ARDOUR_UI::update_cpu_load ()
520 snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
521 cpu_load_label.set_text (buf);
525 ARDOUR_UI::update_buffer_load ()
530 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
531 session->playback_load(), session->capture_load());
532 buffer_load_label.set_text (buf);
534 buffer_load_label.set_text ("");
539 ARDOUR_UI::count_recenabled_streams (Route& route)
541 Track* track = dynamic_cast<Track*>(&route);
542 if (track && track->diskstream()->record_enabled()) {
543 rec_enabled_streams += track->n_inputs();
548 ARDOUR_UI::update_disk_space()
554 nframes_t frames = session->available_capture_duration();
557 if (frames == max_frames) {
558 strcpy (buf, _("Disk: 24hrs+"));
563 nframes_t fr = session->frame_rate();
565 rec_enabled_streams = 0;
566 session->foreach_route (this, &ARDOUR_UI::count_recenabled_streams);
568 if (rec_enabled_streams) {
569 frames /= rec_enabled_streams;
572 hrs = frames / (fr * 3600);
573 frames -= hrs * fr * 3600;
574 mins = frames / (fr * 60);
575 frames -= mins * fr * 60;
578 snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
581 disk_space_label.set_text (buf);
585 ARDOUR_UI::update_wall_clock ()
592 tm_now = localtime (&now);
594 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
595 wall_clock_label.set_text (buf);
600 ARDOUR_UI::control_methods_adjusted ()
605 which_method = (int) online_control_button->adjustment.get_value();
606 switch (which_method) {
608 allow_mmc_and_local ();
617 fatal << _("programming error: impossible control method") << endmsg;
623 ARDOUR_UI::mmc_device_id_adjusted ()
628 int dev_id = (int) mmc_id_button->adjustment.get_value();
629 mmc->set_device_id (dev_id);
635 ARDOUR_UI::session_menu (GdkEventButton *ev)
637 session_popup_menu->popup (0, 0);
642 ARDOUR_UI::redisplay_recent_sessions ()
644 vector<string *> *sessions;
645 vector<string *>::iterator i;
646 RecentSessionsSorter cmp;
648 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
649 recent_session_model->clear ();
652 ARDOUR::read_recent_sessions (rs);
655 recent_session_display.set_model (recent_session_model);
659 /* sort them alphabetically */
660 sort (rs.begin(), rs.end(), cmp);
661 sessions = new vector<string*>;
663 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
664 sessions->push_back (new string ((*i).second));
667 for (i = sessions->begin(); i != sessions->end(); ++i) {
669 vector<string*>* states;
670 vector<const gchar*> item;
671 string fullpath = *(*i);
673 /* remove any trailing / */
675 if (fullpath[fullpath.length()-1] == '/') {
676 fullpath = fullpath.substr (0, fullpath.length()-1);
679 /* now get available states for this session */
681 if ((states = Session::possible_states (fullpath)) == 0) {
686 TreeModel::Row row = *(recent_session_model->append());
688 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
689 row[recent_session_columns.fullpath] = fullpath;
691 if (states->size() > 1) {
693 /* add the children */
695 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
697 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
699 child_row[recent_session_columns.visible_name] = **i2;
700 child_row[recent_session_columns.fullpath] = fullpath;
709 recent_session_display.set_model (recent_session_model);
714 ARDOUR_UI::build_session_selector ()
716 session_selector_window = new ArdourDialog ("session selector");
718 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
720 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
721 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
722 session_selector_window->set_default_response (RESPONSE_ACCEPT);
723 recent_session_model = TreeStore::create (recent_session_columns);
724 recent_session_display.set_model (recent_session_model);
725 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
726 recent_session_display.set_headers_visible (false);
727 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
729 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
731 scroller->add (recent_session_display);
732 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
734 session_selector_window->set_name ("SessionSelectorWindow");
735 session_selector_window->set_size_request (200, 400);
736 session_selector_window->get_vbox()->pack_start (*scroller);
737 session_selector_window->show_all_children();
741 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
743 session_selector_window->response (RESPONSE_ACCEPT);
747 ARDOUR_UI::open_recent_session ()
749 /* popup selector window */
751 if (session_selector_window == 0) {
752 build_session_selector ();
755 redisplay_recent_sessions ();
757 ResponseType r = (ResponseType) session_selector_window->run ();
759 session_selector_window->hide();
762 case RESPONSE_ACCEPT:
768 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
770 if (i == recent_session_model->children().end()) {
774 Glib::ustring path = (*i)[recent_session_columns.fullpath];
775 Glib::ustring state = (*i)[recent_session_columns.visible_name];
777 _session_is_new = false;
779 load_session (path, state);
783 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
787 if (stat (info.filename.c_str(), &statbuf) != 0) {
791 if (!S_ISDIR(statbuf.st_mode)) {
797 string session_file = info.filename;
799 session_file += Glib::path_get_basename (info.filename);
800 session_file += ".ardour";
802 if (stat (session_file.c_str(), &statbuf) != 0) {
806 return S_ISREG (statbuf.st_mode);
810 ARDOUR_UI::open_session ()
812 /* popup selector window */
814 if (open_session_selector == 0) {
816 /* ardour sessions are folders */
818 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
819 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
820 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
822 FileFilter session_filter;
823 session_filter.add_pattern ("*.ardour");
824 session_filter.set_name (_("Ardour sessions"));
825 open_session_selector->add_filter (session_filter);
826 open_session_selector->set_filter (session_filter);
829 int response = open_session_selector->run();
830 open_session_selector->hide ();
833 case RESPONSE_ACCEPT:
836 open_session_selector->hide();
840 open_session_selector->hide();
841 string session_path = open_session_selector->get_filename();
845 if (session_path.length() > 0) {
846 if (Session::find_session (session_path, path, name, isnew) == 0) {
847 _session_is_new = isnew;
848 load_session (path, name);
855 ARDOUR_UI::session_add_midi_track ()
857 cerr << _("Patience is a virtue.\n");
861 ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many)
863 list<boost::shared_ptr<AudioTrack> > tracks;
864 Session::RouteList routes;
867 warning << _("You cannot add a track or bus without a session already loaded.") << endmsg;
873 tracks = session->new_audio_track (input_channels, output_channels, mode, how_many);
875 if (tracks.size() != how_many) {
877 error << _("could not create a new audio track") << endmsg;
879 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
885 routes = session->new_audio_route (input_channels, output_channels, how_many);
887 if (routes.size() != how_many) {
889 error << _("could not create a new audio track") << endmsg;
891 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
897 if (need_control_room_outs) {
903 route->set_stereo_control_outs (control_lr_channels);
904 route->control_outs()->set_stereo_pan (pans, this);
906 #endif /* CONTROLOUTS */
910 MessageDialog msg (*editor,
911 _("There are insufficient JACK ports available\n\
912 to create a new track or bus.\n\
913 You should save Ardour, exit and\n\
914 restart JACK with more ports."));
920 ARDOUR_UI::do_transport_locate (nframes_t new_position)
922 nframes_t _preroll = 0;
925 // XXX CONFIG_CHANGE FIX - requires AnyTime handling
926 // _preroll = session->convert_to_frames_at (new_position, Config->get_preroll());
928 if (new_position > _preroll) {
929 new_position -= _preroll;
934 session->request_locate (new_position);
939 ARDOUR_UI::transport_goto_start ()
942 session->goto_start();
945 /* force displayed area in editor to start no matter
946 what "follow playhead" setting is.
950 editor->reposition_x_origin (session->current_start_frame());
956 ARDOUR_UI::transport_goto_zero ()
959 session->request_locate (0);
962 /* force displayed area in editor to start no matter
963 what "follow playhead" setting is.
967 editor->reposition_x_origin (0);
973 ARDOUR_UI::transport_goto_end ()
976 nframes_t frame = session->current_end_frame();
977 session->request_locate (frame);
979 /* force displayed area in editor to start no matter
980 what "follow playhead" setting is.
984 editor->reposition_x_origin (frame);
990 ARDOUR_UI::transport_stop ()
996 if (session->is_auditioning()) {
997 session->cancel_audition ();
1001 if (session->get_play_loop ()) {
1002 session->request_play_loop (false);
1005 session->request_stop ();
1009 ARDOUR_UI::transport_stop_and_forget_capture ()
1012 session->request_stop (true);
1017 ARDOUR_UI::remove_last_capture()
1020 editor->remove_last_capture();
1025 ARDOUR_UI::transport_record ()
1028 switch (session->record_status()) {
1029 case Session::Disabled:
1030 if (session->ntracks() == 0) {
1031 MessageDialog msg (*editor, _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu."));
1035 session->maybe_enable_record ();
1037 case Session::Recording:
1038 case Session::Enabled:
1039 session->disable_record (true);
1045 ARDOUR_UI::transport_roll ()
1053 rolling = session->transport_rolling ();
1055 if (session->get_play_loop()) {
1056 session->request_play_loop (false);
1057 auto_loop_button.set_active (false);
1058 roll_button.set_active (true);
1059 } else if (session->get_play_range ()) {
1060 session->request_play_range (false);
1061 play_selection_button.set_active (false);
1062 } else if (rolling) {
1063 session->request_locate (session->last_transport_start(), true);
1066 session->request_transport_speed (1.0f);
1070 ARDOUR_UI::transport_loop()
1073 if (session->get_play_loop()) {
1074 if (session->transport_rolling()) {
1075 Location * looploc = session->locations()->auto_loop_location();
1077 session->request_locate (looploc->start(), true);
1082 session->request_play_loop (true);
1088 ARDOUR_UI::transport_play_selection ()
1094 if (!session->get_play_range()) {
1095 session->request_stop ();
1098 editor->play_selection ();
1102 ARDOUR_UI::transport_rewind (int option)
1104 float current_transport_speed;
1107 current_transport_speed = session->transport_speed();
1109 if (current_transport_speed >= 0.0f) {
1112 session->request_transport_speed (-1.0f);
1115 session->request_transport_speed (-4.0f);
1118 session->request_transport_speed (-0.5f);
1123 session->request_transport_speed (current_transport_speed * 1.5f);
1129 ARDOUR_UI::transport_forward (int option)
1131 float current_transport_speed;
1134 current_transport_speed = session->transport_speed();
1136 if (current_transport_speed <= 0.0f) {
1139 session->request_transport_speed (1.0f);
1142 session->request_transport_speed (4.0f);
1145 session->request_transport_speed (0.5f);
1150 session->request_transport_speed (current_transport_speed * 1.5f);
1156 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1162 boost::shared_ptr<Route> r;
1164 if ((r = session->route_by_remote_id (dstream)) != 0) {
1168 if ((t = dynamic_cast<Track*>(r.get())) != 0) {
1169 t->diskstream()->set_record_enabled (!t->diskstream()->record_enabled());
1178 ARDOUR_UI::queue_transport_change ()
1180 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1184 ARDOUR_UI::map_transport_state ()
1186 float sp = session->transport_speed();
1189 transport_rolling ();
1190 } else if (sp < 0.0f) {
1191 transport_rewinding ();
1192 } else if (sp > 0.0f) {
1193 transport_forwarding ();
1195 transport_stopped ();
1200 ARDOUR_UI::allow_local_only ()
1206 ARDOUR_UI::allow_mmc_only ()
1212 ARDOUR_UI::allow_mmc_and_local ()
1218 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1220 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1221 (int) adj.get_value()].c_str());
1225 ARDOUR_UI::engine_stopped ()
1227 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1228 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1229 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1233 ARDOUR_UI::engine_running ()
1235 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1236 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1237 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1241 ARDOUR_UI::engine_halted ()
1243 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1245 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1246 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1248 update_sample_rate (0);
1250 MessageDialog msg (*editor,
1252 JACK has either been shutdown or it\n\
1253 disconnected Ardour because Ardour\n\
1254 was not fast enough. You can save the\n\
1255 session and/or try to reconnect to JACK ."));
1260 ARDOUR_UI::do_engine_start ()
1266 catch (AudioEngine::PortRegistrationFailure& err) {
1268 error << _("Unable to create all required ports")
1276 error << _("Unable to start the session running")
1286 ARDOUR_UI::start_engine ()
1288 if (do_engine_start () == 0) {
1289 if (session && _session_is_new) {
1290 /* we need to retain initial visual
1291 settings for a new session
1293 session->save_state ("");
1301 ARDOUR_UI::update_clocks ()
1303 if (!editor || !editor->dragging_playhead()) {
1304 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1309 ARDOUR_UI::start_clocking ()
1311 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1315 ARDOUR_UI::stop_clocking ()
1317 clock_signal_connection.disconnect ();
1321 ARDOUR_UI::toggle_clocking ()
1324 if (clock_button.get_active()) {
1333 ARDOUR_UI::_blink (void *arg)
1336 ((ARDOUR_UI *) arg)->blink ();
1343 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1347 ARDOUR_UI::start_blinking ()
1349 /* Start the blink signal. Everybody with a blinking widget
1350 uses Blink to drive the widget's state.
1353 if (blink_timeout_tag < 0) {
1355 blink_timeout_tag = g_timeout_add (240, _blink, this);
1360 ARDOUR_UI::stop_blinking ()
1362 if (blink_timeout_tag >= 0) {
1363 g_source_remove (blink_timeout_tag);
1364 blink_timeout_tag = -1;
1369 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1375 if (io.n_inputs() == 0) {
1380 /* XXX we're not handling multiple ports yet. */
1382 const char **connections = io.input(0)->get_connections();
1384 if (connections == 0 || connections[0] == '\0') {
1387 buf = connections[0];
1394 if (io.n_outputs() == 0) {
1399 /* XXX we're not handling multiple ports yet. */
1401 const char **connections = io.output(0)->get_connections();
1403 if (connections == 0 || connections[0] == '\0') {
1406 buf = connections[0];
1414 ARDOUR_UI::snapshot_session ()
1416 ArdourPrompter prompter (true);
1423 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1425 prompter.set_name ("Prompter");
1426 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1427 prompter.set_prompt (_("Name of New Snapshot"));
1428 prompter.set_initial_text (now);
1430 switch (prompter.run()) {
1431 case RESPONSE_ACCEPT:
1432 prompter.get_result (snapname);
1433 if (snapname.length()){
1434 save_state (snapname);
1444 ARDOUR_UI::save_state (const string & name)
1446 (void) save_state_canfail (name);
1450 ARDOUR_UI::save_state_canfail (string name)
1455 if (name.length() == 0) {
1456 name = session->snap_name();
1459 if ((ret = session->save_state (name)) != 0) {
1463 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1468 ARDOUR_UI::restore_state (string name)
1471 if (name.length() == 0) {
1472 name = session->name();
1474 session->restore_state (name);
1479 ARDOUR_UI::primary_clock_value_changed ()
1482 session->request_locate (primary_clock.current_time ());
1487 ARDOUR_UI::secondary_clock_value_changed ()
1490 session->request_locate (secondary_clock.current_time ());
1495 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1497 if (session && dstream && dstream->record_enabled()) {
1499 Session::RecordState rs;
1501 rs = session->record_status ();
1504 case Session::Disabled:
1505 case Session::Enabled:
1506 if (w->get_state() != STATE_SELECTED) {
1507 w->set_state (STATE_SELECTED);
1511 case Session::Recording:
1512 if (w->get_state() != STATE_ACTIVE) {
1513 w->set_state (STATE_ACTIVE);
1519 if (w->get_state() != STATE_NORMAL) {
1520 w->set_state (STATE_NORMAL);
1526 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1532 switch (session->record_status()) {
1533 case Session::Enabled:
1535 rec_button.set_state (1);
1537 rec_button.set_state (0);
1541 case Session::Recording:
1542 rec_button.set_state (2);
1546 rec_button.set_state (0);
1552 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1560 ARDOUR_UI::start_keyboard_prefix ()
1562 keyboard->start_prefix();
1566 ARDOUR_UI::save_template ()
1569 ArdourPrompter prompter (true);
1572 prompter.set_name (X_("Prompter"));
1573 prompter.set_prompt (_("Name for mix template:"));
1574 prompter.set_initial_text(session->name() + _("-template"));
1575 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1577 switch (prompter.run()) {
1578 case RESPONSE_ACCEPT:
1579 prompter.get_result (name);
1581 if (name.length()) {
1582 session->save_template (name);
1592 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1594 string session_name;
1595 string session_path;
1597 int response = Gtk::RESPONSE_NONE;
1599 new_session_dialog->set_modal(true);
1600 new_session_dialog->set_name (predetermined_path);
1601 new_session_dialog->reset_recent();
1602 new_session_dialog->show();
1605 response = new_session_dialog->run ();
1607 _session_is_new = false;
1609 if (response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1614 new_session_dialog->hide ();
1617 } else if (response == Gtk::RESPONSE_NONE) {
1619 /* Clear was pressed */
1620 new_session_dialog->reset();
1622 } else if (response == Gtk::RESPONSE_YES) {
1624 /* YES == OPEN, but there's no enum for that */
1626 session_name = new_session_dialog->session_name();
1628 if (session_name.empty()) {
1629 response = Gtk::RESPONSE_NONE;
1633 if (session_name[0] == '/' ||
1634 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1635 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1636 load_session (Glib::path_get_dirname (session_name), session_name);
1638 session_path = new_session_dialog->session_folder();
1639 load_session (session_path, session_name);
1642 } else if (response == Gtk::RESPONSE_OK) {
1644 session_name = new_session_dialog->session_name();
1646 if (new_session_dialog->get_current_page() == 1) {
1648 /* XXX this is a bit of a hack..
1649 i really want the new sesion dialog to return RESPONSE_YES
1650 if we're on page 1 (the load page)
1651 Unfortunately i can't see how atm..
1654 if (session_name.empty()) {
1655 response = Gtk::RESPONSE_NONE;
1659 if (session_name[0] == '/' ||
1660 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1661 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1662 load_session (Glib::path_get_dirname (session_name), session_name);
1664 session_path = new_session_dialog->session_folder();
1665 load_session (session_path, session_name);
1670 if (session_name.empty()) {
1671 response = Gtk::RESPONSE_NONE;
1675 if (session_name[0] == '/' ||
1676 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1677 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1679 session_path = Glib::path_get_dirname (session_name);
1680 session_name = Glib::path_get_basename (session_name);
1684 session_path = new_session_dialog->session_folder();
1688 //XXX This is needed because session constructor wants a
1689 //non-existant path. hopefully this will be fixed at some point.
1691 session_path = Glib::build_filename (session_path, session_name);
1693 if (g_file_test (session_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) {
1695 Glib::ustring str = string_compose (_("This session\n%1\nalready exists. Do you want to open it?"), session_path);
1697 MessageDialog msg (str,
1699 Gtk::MESSAGE_WARNING,
1700 Gtk::BUTTONS_YES_NO,
1704 msg.set_name (X_("CleanupDialog"));
1705 msg.set_wmclass (_("existing_session"), "Ardour");
1706 msg.set_position (Gtk::WIN_POS_MOUSE);
1708 switch (msg.run()) {
1710 load_session (session_path, session_name);
1714 response = RESPONSE_NONE;
1715 new_session_dialog->reset ();
1720 _session_is_new = true;
1722 std::string template_name = new_session_dialog->session_template_name();
1724 if (new_session_dialog->use_session_template()) {
1726 load_session (session_path, session_name, &template_name);
1732 AutoConnectOption iconnect;
1733 AutoConnectOption oconnect;
1735 if (new_session_dialog->create_control_bus()) {
1736 cchns = (uint32_t) new_session_dialog->control_channel_count();
1741 if (new_session_dialog->create_master_bus()) {
1742 mchns = (uint32_t) new_session_dialog->master_channel_count();
1747 if (new_session_dialog->connect_inputs()) {
1748 iconnect = AutoConnectPhysical;
1750 iconnect = AutoConnectOption (0);
1753 /// @todo some minor tweaks.
1755 if (new_session_dialog->connect_outs_to_master()) {
1756 oconnect = AutoConnectMaster;
1757 } else if (new_session_dialog->connect_outs_to_physical()) {
1758 oconnect = AutoConnectPhysical;
1760 oconnect = AutoConnectOption (0);
1763 uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
1764 uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count();
1766 build_session (session_path,
1774 engine->frame_rate() * 60 * 5);
1779 } while (response == Gtk::RESPONSE_NONE);
1783 new_session_dialog->get_window()->set_cursor();
1784 new_session_dialog->hide();
1788 ARDOUR_UI::close_session()
1795 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1797 Session *new_session;
1799 session_loaded = false;
1800 x = unload_session ();
1808 /* if it already exists, we must have write access */
1810 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1811 MessageDialog msg (*editor, _("\
1812 You do not have write access to this session.\n\
1813 This prevents the session from being loaded."));
1819 new_session = new Session (*engine, path, snap_name, mix_template);
1824 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1828 connect_to_session (new_session);
1830 Config->set_current_owner (ConfigVariableBase::Interface);
1832 session_loaded = true;
1834 goto_editor_window ();
1837 session->set_clean ();
1844 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1845 uint32_t control_channels,
1846 uint32_t master_channels,
1847 AutoConnectOption input_connect,
1848 AutoConnectOption output_connect,
1851 nframes_t initial_length)
1853 Session *new_session;
1856 session_loaded = false;
1857 x = unload_session ();
1864 _session_is_new = true;
1867 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1868 control_channels, master_channels, nphysin, nphysout, initial_length);
1873 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1877 connect_to_session (new_session);
1879 session_loaded = true;
1887 editor->show_window ();
1898 ARDOUR_UI::show_splash ()
1901 about = new About();
1902 about->signal_response().connect(mem_fun (*this, &ARDOUR_UI::about_signal_response) );
1909 ARDOUR_UI::about_signal_response(int response)
1915 ARDOUR_UI::hide_splash ()
1918 about->get_window()->set_cursor ();
1924 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1928 removed = rep.paths.size();
1931 MessageDialog msgd (*editor,
1932 _("No audio files were ready for cleanup"),
1935 (Gtk::ButtonsType)(Gtk::BUTTONS_OK) );
1936 msgd.set_secondary_text (_("If this seems suprising, \n\
1937 check for any existing snapshots.\n\
1938 These may still include regions that\n\
1939 require some unused files to continue to exist."));
1945 ArdourDialog results (_("ardour: cleanup"), true, false);
1947 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1948 CleanupResultsModelColumns() {
1952 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1953 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1957 CleanupResultsModelColumns results_columns;
1958 Glib::RefPtr<Gtk::ListStore> results_model;
1959 Gtk::TreeView results_display;
1961 results_model = ListStore::create (results_columns);
1962 results_display.set_model (results_model);
1963 results_display.append_column (list_title, results_columns.visible_name);
1965 results_display.set_name ("CleanupResultsList");
1966 results_display.set_headers_visible (true);
1967 results_display.set_headers_clickable (false);
1968 results_display.set_reorderable (false);
1970 Gtk::ScrolledWindow list_scroller;
1973 Gtk::HBox dhbox; // the hbox for the image and text
1974 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1975 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1977 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1979 if (rep.space < 1048576.0f) {
1981 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1983 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1987 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1989 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1993 dhbox.pack_start (*dimage, true, false, 5);
1994 dhbox.pack_start (txt, true, false, 5);
1996 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1997 TreeModel::Row row = *(results_model->append());
1998 row[results_columns.visible_name] = *i;
1999 row[results_columns.fullpath] = *i;
2002 list_scroller.add (results_display);
2003 list_scroller.set_size_request (-1, 150);
2004 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2006 dvbox.pack_start (dhbox, true, false, 5);
2007 dvbox.pack_start (list_scroller, true, false, 5);
2008 ddhbox.pack_start (dvbox, true, false, 5);
2010 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2011 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2012 results.set_default_response (RESPONSE_CLOSE);
2013 results.set_position (Gtk::WIN_POS_MOUSE);
2014 results.show_all_children ();
2015 results.set_resizable (false);
2022 ARDOUR_UI::cleanup ()
2025 /* shouldn't happen: menu item is insensitive */
2030 MessageDialog checker (_("Are you sure you want to cleanup?"),
2032 Gtk::MESSAGE_QUESTION,
2033 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2035 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2036 ALL undo/redo information will be lost if you cleanup.\n\
2037 After cleanup, unused audio files will be moved to a \
2038 \"dead sounds\" location."));
2040 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2041 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2042 checker.set_default_response (RESPONSE_CANCEL);
2044 checker.set_name (_("CleanupDialog"));
2045 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2046 checker.set_position (Gtk::WIN_POS_MOUSE);
2048 switch (checker.run()) {
2049 case RESPONSE_ACCEPT:
2055 Session::cleanup_report rep;
2057 editor->prepare_for_cleanup ();
2059 if (session->cleanup_sources (rep)) {
2063 display_cleanup_results (rep,
2066 The following %1 %2 not in use and \n\
2067 have been moved to:\n\
2069 Flushing the wastebasket will \n\
2070 release an additional\n\
2071 %4 %5bytes of disk space.\n"
2076 ARDOUR_UI::flush_trash ()
2079 /* shouldn't happen: menu item is insensitive */
2083 Session::cleanup_report rep;
2085 if (session->cleanup_trash_sources (rep)) {
2089 display_cleanup_results (rep,
2091 _("The following %1 %2 deleted from\n\
2093 releasing %4 %5bytes of disk space"));
2097 ARDOUR_UI::add_route ()
2105 if (add_route_dialog == 0) {
2106 add_route_dialog = new AddRouteDialog;
2107 editor->ensure_float (*add_route_dialog);
2110 if (add_route_dialog->is_visible()) {
2111 /* we're already doing this */
2115 ResponseType r = (ResponseType) add_route_dialog->run ();
2117 add_route_dialog->hide();
2120 case RESPONSE_ACCEPT:
2127 if ((count = add_route_dialog->count()) <= 0) {
2131 uint32_t input_chan = add_route_dialog->channels ();
2132 uint32_t output_chan;
2133 string name_template = add_route_dialog->name_template ();
2134 bool track = add_route_dialog->track ();
2136 AutoConnectOption oac = Config->get_output_auto_connect();
2138 if (oac & AutoConnectMaster) {
2139 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2141 output_chan = input_chan;
2144 /* XXX do something with name template */
2147 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
2149 session_add_audio_bus (input_chan, output_chan, count);
2154 ARDOUR_UI::mixer_settings () const
2159 node = session->instant_xml(X_("Mixer"), session->path());
2161 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2165 node = new XMLNode (X_("Mixer"));
2172 ARDOUR_UI::editor_settings () const
2177 node = session->instant_xml(X_("Editor"), session->path());
2179 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2183 node = new XMLNode (X_("Editor"));
2189 ARDOUR_UI::keyboard_settings () const
2193 node = Config->extra_xml(X_("Keyboard"));
2196 node = new XMLNode (X_("Keyboard"));
2202 ARDOUR_UI::halt_on_xrun_message ()
2204 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2206 MessageDialog msg (*editor,
2207 _("Recording was stopped because your system could not keep up."));
2212 ARDOUR_UI::disk_overrun_handler ()
2214 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2216 if (!have_disk_overrun_displayed) {
2217 have_disk_overrun_displayed = true;
2218 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2219 The disk system on your computer\n\
2220 was not able to keep up with Ardour.\n\
2222 Specifically, it failed to write data to disk\n\
2223 quickly enough to keep up with recording.\n"));
2225 have_disk_overrun_displayed = false;
2230 ARDOUR_UI::disk_underrun_handler ()
2232 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2234 if (!have_disk_underrun_displayed) {
2235 have_disk_underrun_displayed = true;
2236 MessageDialog msg (*editor,
2237 (_("The disk system on your computer\n\
2238 was not able to keep up with Ardour.\n\
2240 Specifically, it failed to read data from disk\n\
2241 quickly enough to keep up with playback.\n")));
2243 have_disk_underrun_displayed = false;
2248 ARDOUR_UI::disk_underrun_message_gone ()
2250 have_disk_underrun_displayed = false;
2254 ARDOUR_UI::disk_overrun_message_gone ()
2256 have_disk_underrun_displayed = false;
2260 ARDOUR_UI::pending_state_dialog ()
2262 ArdourDialog dialog ("pending state dialog");
2264 This session appears to have been in\n\
2265 middle of recording when ardour or\n\
2266 the computer was shutdown.\n\
2268 Ardour can recover any captured audio for\n\
2269 you, or it can ignore it. Please decide\n\
2270 what you would like to do.\n"));
2272 dialog.get_vbox()->pack_start (message);
2273 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2274 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2276 dialog.set_position (WIN_POS_CENTER);
2279 switch (dialog.run ()) {
2280 case RESPONSE_ACCEPT:
2288 ARDOUR_UI::disconnect_from_jack ()
2291 if( engine->disconnect_from_jack ()) {
2292 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2296 update_sample_rate (0);
2301 ARDOUR_UI::reconnect_to_jack ()
2304 if (engine->reconnect_to_jack ()) {
2305 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2309 update_sample_rate (0);
2314 ARDOUR_UI::set_jack_buffer_size (nframes_t nframes)
2316 engine->request_buffer_size (nframes);
2317 update_sample_rate (0);
2321 ARDOUR_UI::cmdline_new_session (string path)
2323 if (path[0] != '/') {
2324 char buf[PATH_MAX+1];
2327 getcwd (buf, sizeof (buf));
2334 new_session (false, path);
2336 _will_create_new_session_automatically = false; /* done it */
2337 return FALSE; /* don't call it again */
2341 ARDOUR_UI::use_config ()
2343 Glib::RefPtr<Action> act;
2345 switch (Config->get_native_file_data_format ()) {
2347 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2350 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2355 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2356 ract->set_active ();
2359 switch (Config->get_native_file_header_format ()) {
2361 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2364 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2367 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2370 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2373 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2376 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2379 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2384 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2385 ract->set_active ();
2390 ARDOUR_UI::update_transport_clocks (nframes_t pos)
2392 primary_clock.set (pos);
2393 secondary_clock.set (pos);
2395 if (big_clock_window) {
2396 big_clock.set (pos);
2401 ARDOUR_UI::record_state_changed ()
2403 if (!session || !big_clock_window) {
2404 /* why bother - the clock isn't visible */
2408 switch (session->record_status()) {
2409 case Session::Recording:
2410 big_clock.set_name ("BigClockRecording");
2413 big_clock.set_name ("BigClockNonRecording");
2419 ARDOUR_UI::set_keybindings_path (string path)
2421 keybindings_path = path;
2425 ARDOUR_UI::save_keybindings ()
2427 AccelMap::save (keybindings_path);