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 can_save_keybindings = false;
169 Glib::signal_idle().connect (mem_fun (*this, &ARDOUR_UI::first_idle));
171 last_configure_time.tv_sec = 0;
172 last_configure_time.tv_usec = 0;
174 shuttle_grabbed = false;
176 shuttle_max_speed = 8.0f;
178 shuttle_style_menu = 0;
179 shuttle_unit_menu = 0;
181 gettimeofday (&last_peak_grab, 0);
182 gettimeofday (&last_shuttle_request, 0);
184 ARDOUR::Diskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
185 ARDOUR::Diskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
187 /* handle pending state with a dialog */
189 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
191 /* have to wait for AudioEngine and Configuration before proceeding */
195 ARDOUR_UI::set_engine (AudioEngine& e)
199 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
200 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
201 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
202 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
204 ActionManager::init ();
205 new_session_dialog = new NewSessionDialog();
209 keyboard = new Keyboard;
211 if (setup_windows ()) {
212 throw failed_constructor ();
215 if (GTK_ARDOUR::show_key_actions) {
216 vector<string> names;
217 vector<string> paths;
219 vector<AccelKey> bindings;
221 ActionManager::get_all_actions (names, paths, keys, bindings);
223 vector<string>::iterator n;
224 vector<string>::iterator k;
225 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
226 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
232 /* start with timecode, metering enabled
235 blink_timeout_tag = -1;
237 /* the global configuration object is now valid */
241 /* this being a GUI and all, we want peakfiles */
243 AudioFileSource::set_build_peakfiles (true);
244 AudioFileSource::set_build_missing_peakfiles (true);
246 if (AudioSource::start_peak_thread ()) {
247 throw failed_constructor();
250 /* start the time-of-day-clock */
252 update_wall_clock ();
253 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
255 update_disk_space ();
257 update_sample_rate (engine->frame_rate());
259 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
260 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
263 ARDOUR_UI::~ARDOUR_UI ()
265 save_ardour_state ();
279 if (add_route_dialog) {
280 delete add_route_dialog;
283 AudioSource::stop_peak_thread ();
287 ARDOUR_UI::configure_timeout ()
292 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
293 /* no configure events yet */
297 gettimeofday (&now, 0);
298 timersub (&now, &last_configure_time, &diff);
300 /* force a gap of 0.5 seconds since the last configure event
303 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
306 have_configure_timeout = false;
307 save_ardour_state ();
313 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
315 if (have_configure_timeout) {
316 gettimeofday (&last_configure_time, 0);
318 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
319 have_configure_timeout = true;
326 ARDOUR_UI::save_ardour_state ()
328 if (!keyboard || !mixer || !editor) {
332 /* XXX this is all a bit dubious. add_extra_xml() uses
333 a different lifetime model from add_instant_xml().
336 XMLNode* node = new XMLNode (keyboard->get_state());
337 Config->add_extra_xml (*node);
338 Config->save_state();
340 XMLNode enode(static_cast<Stateful*>(editor)->get_state());
341 XMLNode mnode(mixer->get_state());
344 session->add_instant_xml (enode, session->path());
345 session->add_instant_xml (mnode, session->path());
347 Config->add_instant_xml (enode, get_user_ardour_path());
348 Config->add_instant_xml (mnode, get_user_ardour_path());
355 ARDOUR_UI::startup ()
363 if (session && session->dirty()) {
364 switch (ask_about_saving_session(_("quit"))) {
369 /* use the default name */
370 if (save_state_canfail ("")) {
371 /* failed - don't quit */
372 MessageDialog msg (*editor,
374 Ardour was unable to save your session.\n\n\
375 If you still wish to quit, please use the\n\n\
376 \"Just quit\" option."));
387 session->set_deletion_in_progress ();
390 Config->save_state();
395 ARDOUR_UI::ask_about_saving_session (const string & what)
397 ArdourDialog window (_("ardour: save session?"));
398 Gtk::HBox dhbox; // the hbox for the image and text
399 Gtk::Label prompt_label;
400 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
404 msg = string_compose(_("Don't %1"), what);
405 window.add_button (msg, RESPONSE_REJECT);
406 msg = string_compose(_("Just %1"), what);
407 window.add_button (msg, RESPONSE_APPLY);
408 msg = string_compose(_("Save and %1"), what);
409 window.add_button (msg, RESPONSE_ACCEPT);
411 window.set_default_response (RESPONSE_ACCEPT);
413 Gtk::Button noquit_button (msg);
414 noquit_button.set_name ("EditorGTKButton");
419 if (session->snap_name() == session->name()) {
422 type = _("snapshot");
424 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?"),
425 type, session->snap_name());
427 prompt_label.set_text (prompt);
428 prompt_label.set_name (X_("PrompterLabel"));
429 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
431 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
433 dhbox.set_homogeneous (false);
434 dhbox.pack_start (*dimage, false, false, 5);
435 dhbox.pack_start (prompt_label, true, false, 5);
436 window.get_vbox()->pack_start (dhbox);
438 window.set_name (_("Prompter"));
439 window.set_position (Gtk::WIN_POS_MOUSE);
440 window.set_modal (true);
441 window.set_resizable (false);
444 save_the_session = 0;
446 window.set_keep_above (true);
449 ResponseType r = (ResponseType) window.run();
454 case RESPONSE_ACCEPT: // save and get out of here
456 case RESPONSE_APPLY: // get out of here
466 ARDOUR_UI::every_second ()
469 update_buffer_load ();
470 update_disk_space ();
475 ARDOUR_UI::every_point_one_seconds ()
477 update_speed_display ();
478 RapidScreenUpdate(); /* EMIT_SIGNAL */
483 ARDOUR_UI::every_point_zero_one_seconds ()
485 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
490 ARDOUR_UI::update_sample_rate (nframes_t ignored)
494 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
496 if (!engine->connected()) {
498 snprintf (buf, sizeof (buf), _("disconnected"));
502 nframes_t rate = engine->frame_rate();
504 if (fmod (rate, 1000.0) != 0.0) {
505 snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"),
506 (float) rate/1000.0f,
507 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
509 snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"),
511 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
515 sample_rate_label.set_text (buf);
519 ARDOUR_UI::update_cpu_load ()
522 snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
523 cpu_load_label.set_text (buf);
527 ARDOUR_UI::update_buffer_load ()
532 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
533 session->playback_load(), session->capture_load());
534 buffer_load_label.set_text (buf);
536 buffer_load_label.set_text ("");
541 ARDOUR_UI::count_recenabled_streams (Route& route)
543 Track* track = dynamic_cast<Track*>(&route);
544 if (track && track->diskstream()->record_enabled()) {
545 rec_enabled_streams += track->n_inputs();
550 ARDOUR_UI::update_disk_space()
556 nframes_t frames = session->available_capture_duration();
559 if (frames == max_frames) {
560 strcpy (buf, _("Disk: 24hrs+"));
565 nframes_t fr = session->frame_rate();
567 rec_enabled_streams = 0;
568 session->foreach_route (this, &ARDOUR_UI::count_recenabled_streams);
570 if (rec_enabled_streams) {
571 frames /= rec_enabled_streams;
574 hrs = frames / (fr * 3600);
575 frames -= hrs * fr * 3600;
576 mins = frames / (fr * 60);
577 frames -= mins * fr * 60;
580 snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
583 disk_space_label.set_text (buf);
587 ARDOUR_UI::update_wall_clock ()
594 tm_now = localtime (&now);
596 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
597 wall_clock_label.set_text (buf);
602 ARDOUR_UI::control_methods_adjusted ()
607 which_method = (int) online_control_button->adjustment.get_value();
608 switch (which_method) {
610 allow_mmc_and_local ();
619 fatal << _("programming error: impossible control method") << endmsg;
625 ARDOUR_UI::mmc_device_id_adjusted ()
630 int dev_id = (int) mmc_id_button->adjustment.get_value();
631 mmc->set_device_id (dev_id);
637 ARDOUR_UI::session_menu (GdkEventButton *ev)
639 session_popup_menu->popup (0, 0);
644 ARDOUR_UI::redisplay_recent_sessions ()
646 vector<string *> *sessions;
647 vector<string *>::iterator i;
648 RecentSessionsSorter cmp;
650 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
651 recent_session_model->clear ();
654 ARDOUR::read_recent_sessions (rs);
657 recent_session_display.set_model (recent_session_model);
661 /* sort them alphabetically */
662 sort (rs.begin(), rs.end(), cmp);
663 sessions = new vector<string*>;
665 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
666 sessions->push_back (new string ((*i).second));
669 for (i = sessions->begin(); i != sessions->end(); ++i) {
671 vector<string*>* states;
672 vector<const gchar*> item;
673 string fullpath = *(*i);
675 /* remove any trailing / */
677 if (fullpath[fullpath.length()-1] == '/') {
678 fullpath = fullpath.substr (0, fullpath.length()-1);
681 /* now get available states for this session */
683 if ((states = Session::possible_states (fullpath)) == 0) {
688 TreeModel::Row row = *(recent_session_model->append());
690 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
691 row[recent_session_columns.fullpath] = fullpath;
693 if (states->size() > 1) {
695 /* add the children */
697 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
699 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
701 child_row[recent_session_columns.visible_name] = **i2;
702 child_row[recent_session_columns.fullpath] = fullpath;
711 recent_session_display.set_model (recent_session_model);
716 ARDOUR_UI::build_session_selector ()
718 session_selector_window = new ArdourDialog ("session selector");
720 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
722 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
723 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
724 session_selector_window->set_default_response (RESPONSE_ACCEPT);
725 recent_session_model = TreeStore::create (recent_session_columns);
726 recent_session_display.set_model (recent_session_model);
727 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
728 recent_session_display.set_headers_visible (false);
729 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
731 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
733 scroller->add (recent_session_display);
734 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
736 session_selector_window->set_name ("SessionSelectorWindow");
737 session_selector_window->set_size_request (200, 400);
738 session_selector_window->get_vbox()->pack_start (*scroller);
739 session_selector_window->show_all_children();
743 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
745 session_selector_window->response (RESPONSE_ACCEPT);
749 ARDOUR_UI::open_recent_session ()
751 /* popup selector window */
753 if (session_selector_window == 0) {
754 build_session_selector ();
757 redisplay_recent_sessions ();
759 ResponseType r = (ResponseType) session_selector_window->run ();
761 session_selector_window->hide();
764 case RESPONSE_ACCEPT:
770 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
772 if (i == recent_session_model->children().end()) {
776 Glib::ustring path = (*i)[recent_session_columns.fullpath];
777 Glib::ustring state = (*i)[recent_session_columns.visible_name];
779 _session_is_new = false;
781 load_session (path, state);
785 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
789 if (stat (info.filename.c_str(), &statbuf) != 0) {
793 if (!S_ISDIR(statbuf.st_mode)) {
799 string session_file = info.filename;
801 session_file += Glib::path_get_basename (info.filename);
802 session_file += ".ardour";
804 if (stat (session_file.c_str(), &statbuf) != 0) {
808 return S_ISREG (statbuf.st_mode);
812 ARDOUR_UI::open_session ()
814 /* popup selector window */
816 if (open_session_selector == 0) {
818 /* ardour sessions are folders */
820 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
821 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
822 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
824 FileFilter session_filter;
825 session_filter.add_pattern ("*.ardour");
826 session_filter.set_name (_("Ardour sessions"));
827 open_session_selector->add_filter (session_filter);
828 open_session_selector->set_filter (session_filter);
831 int response = open_session_selector->run();
832 open_session_selector->hide ();
835 case RESPONSE_ACCEPT:
838 open_session_selector->hide();
842 open_session_selector->hide();
843 string session_path = open_session_selector->get_filename();
847 if (session_path.length() > 0) {
848 if (Session::find_session (session_path, path, name, isnew) == 0) {
849 _session_is_new = isnew;
850 load_session (path, name);
857 ARDOUR_UI::session_add_midi_track ()
859 cerr << _("Patience is a virtue.\n");
863 ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many)
865 list<boost::shared_ptr<AudioTrack> > tracks;
866 Session::RouteList routes;
869 warning << _("You cannot add a track or bus without a session already loaded.") << endmsg;
875 tracks = session->new_audio_track (input_channels, output_channels, mode, how_many);
877 if (tracks.size() != how_many) {
879 error << _("could not create a new audio track") << endmsg;
881 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
887 routes = session->new_audio_route (input_channels, output_channels, how_many);
889 if (routes.size() != how_many) {
891 error << _("could not create a new audio track") << endmsg;
893 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
899 if (need_control_room_outs) {
905 route->set_stereo_control_outs (control_lr_channels);
906 route->control_outs()->set_stereo_pan (pans, this);
908 #endif /* CONTROLOUTS */
912 MessageDialog msg (*editor,
913 _("There are insufficient JACK ports available\n\
914 to create a new track or bus.\n\
915 You should save Ardour, exit and\n\
916 restart JACK with more ports."));
922 ARDOUR_UI::do_transport_locate (nframes_t new_position)
924 nframes_t _preroll = 0;
927 // XXX CONFIG_CHANGE FIX - requires AnyTime handling
928 // _preroll = session->convert_to_frames_at (new_position, Config->get_preroll());
930 if (new_position > _preroll) {
931 new_position -= _preroll;
936 session->request_locate (new_position);
941 ARDOUR_UI::transport_goto_start ()
944 session->goto_start();
947 /* force displayed area in editor to start no matter
948 what "follow playhead" setting is.
952 editor->reposition_x_origin (session->current_start_frame());
958 ARDOUR_UI::transport_goto_zero ()
961 session->request_locate (0);
964 /* force displayed area in editor to start no matter
965 what "follow playhead" setting is.
969 editor->reposition_x_origin (0);
975 ARDOUR_UI::transport_goto_end ()
978 nframes_t frame = session->current_end_frame();
979 session->request_locate (frame);
981 /* force displayed area in editor to start no matter
982 what "follow playhead" setting is.
986 editor->reposition_x_origin (frame);
992 ARDOUR_UI::transport_stop ()
998 if (session->is_auditioning()) {
999 session->cancel_audition ();
1003 if (session->get_play_loop ()) {
1004 session->request_play_loop (false);
1007 session->request_stop ();
1011 ARDOUR_UI::transport_stop_and_forget_capture ()
1014 session->request_stop (true);
1019 ARDOUR_UI::remove_last_capture()
1022 editor->remove_last_capture();
1027 ARDOUR_UI::transport_record ()
1030 switch (session->record_status()) {
1031 case Session::Disabled:
1032 if (session->ntracks() == 0) {
1033 MessageDialog msg (*editor, _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu."));
1037 session->maybe_enable_record ();
1039 case Session::Recording:
1040 case Session::Enabled:
1041 session->disable_record (true);
1047 ARDOUR_UI::transport_roll ()
1055 rolling = session->transport_rolling ();
1057 if (session->get_play_loop()) {
1058 session->request_play_loop (false);
1059 auto_loop_button.set_active (false);
1060 roll_button.set_active (true);
1061 } else if (session->get_play_range ()) {
1062 session->request_play_range (false);
1063 play_selection_button.set_active (false);
1064 } else if (rolling) {
1065 session->request_locate (session->last_transport_start(), true);
1068 session->request_transport_speed (1.0f);
1072 ARDOUR_UI::transport_loop()
1075 if (session->get_play_loop()) {
1076 if (session->transport_rolling()) {
1077 Location * looploc = session->locations()->auto_loop_location();
1079 session->request_locate (looploc->start(), true);
1084 session->request_play_loop (true);
1090 ARDOUR_UI::transport_play_selection ()
1096 if (!session->get_play_range()) {
1097 session->request_stop ();
1100 editor->play_selection ();
1104 ARDOUR_UI::transport_rewind (int option)
1106 float current_transport_speed;
1109 current_transport_speed = session->transport_speed();
1111 if (current_transport_speed >= 0.0f) {
1114 session->request_transport_speed (-1.0f);
1117 session->request_transport_speed (-4.0f);
1120 session->request_transport_speed (-0.5f);
1125 session->request_transport_speed (current_transport_speed * 1.5f);
1131 ARDOUR_UI::transport_forward (int option)
1133 float current_transport_speed;
1136 current_transport_speed = session->transport_speed();
1138 if (current_transport_speed <= 0.0f) {
1141 session->request_transport_speed (1.0f);
1144 session->request_transport_speed (4.0f);
1147 session->request_transport_speed (0.5f);
1152 session->request_transport_speed (current_transport_speed * 1.5f);
1158 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1164 boost::shared_ptr<Route> r;
1166 if ((r = session->route_by_remote_id (dstream)) != 0) {
1170 if ((t = dynamic_cast<Track*>(r.get())) != 0) {
1171 t->diskstream()->set_record_enabled (!t->diskstream()->record_enabled());
1180 ARDOUR_UI::queue_transport_change ()
1182 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1186 ARDOUR_UI::map_transport_state ()
1188 float sp = session->transport_speed();
1191 transport_rolling ();
1192 } else if (sp < 0.0f) {
1193 transport_rewinding ();
1194 } else if (sp > 0.0f) {
1195 transport_forwarding ();
1197 transport_stopped ();
1202 ARDOUR_UI::allow_local_only ()
1208 ARDOUR_UI::allow_mmc_only ()
1214 ARDOUR_UI::allow_mmc_and_local ()
1220 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1222 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1223 (int) adj.get_value()].c_str());
1227 ARDOUR_UI::engine_stopped ()
1229 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1230 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1231 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1235 ARDOUR_UI::engine_running ()
1237 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1238 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1239 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1243 ARDOUR_UI::engine_halted ()
1245 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1247 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1248 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1250 update_sample_rate (0);
1252 MessageDialog msg (*editor,
1254 JACK has either been shutdown or it\n\
1255 disconnected Ardour because Ardour\n\
1256 was not fast enough. You can save the\n\
1257 session and/or try to reconnect to JACK ."));
1262 ARDOUR_UI::do_engine_start ()
1270 error << _("Unable to start the session running")
1280 ARDOUR_UI::start_engine ()
1282 if (do_engine_start () == 0) {
1283 if (session && _session_is_new) {
1284 /* we need to retain initial visual
1285 settings for a new session
1287 session->save_state ("");
1295 ARDOUR_UI::update_clocks ()
1297 if (!editor || !editor->dragging_playhead()) {
1298 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1303 ARDOUR_UI::start_clocking ()
1305 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1309 ARDOUR_UI::stop_clocking ()
1311 clock_signal_connection.disconnect ();
1315 ARDOUR_UI::toggle_clocking ()
1318 if (clock_button.get_active()) {
1327 ARDOUR_UI::_blink (void *arg)
1330 ((ARDOUR_UI *) arg)->blink ();
1337 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1341 ARDOUR_UI::start_blinking ()
1343 /* Start the blink signal. Everybody with a blinking widget
1344 uses Blink to drive the widget's state.
1347 if (blink_timeout_tag < 0) {
1349 blink_timeout_tag = g_timeout_add (240, _blink, this);
1354 ARDOUR_UI::stop_blinking ()
1356 if (blink_timeout_tag >= 0) {
1357 g_source_remove (blink_timeout_tag);
1358 blink_timeout_tag = -1;
1363 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1369 if (io.n_inputs() == 0) {
1374 /* XXX we're not handling multiple ports yet. */
1376 const char **connections = io.input(0)->get_connections();
1378 if (connections == 0 || connections[0] == '\0') {
1381 buf = connections[0];
1388 if (io.n_outputs() == 0) {
1393 /* XXX we're not handling multiple ports yet. */
1395 const char **connections = io.output(0)->get_connections();
1397 if (connections == 0 || connections[0] == '\0') {
1400 buf = connections[0];
1408 ARDOUR_UI::snapshot_session ()
1410 ArdourPrompter prompter (true);
1417 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1419 prompter.set_name ("Prompter");
1420 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1421 prompter.set_prompt (_("Name of New Snapshot"));
1422 prompter.set_initial_text (now);
1424 switch (prompter.run()) {
1425 case RESPONSE_ACCEPT:
1426 prompter.get_result (snapname);
1427 if (snapname.length()){
1428 save_state (snapname);
1438 ARDOUR_UI::save_state (const string & name)
1440 (void) save_state_canfail (name);
1444 ARDOUR_UI::save_state_canfail (string name)
1449 if (name.length() == 0) {
1450 name = session->snap_name();
1453 if ((ret = session->save_state (name)) != 0) {
1457 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1462 ARDOUR_UI::restore_state (string name)
1465 if (name.length() == 0) {
1466 name = session->name();
1468 session->restore_state (name);
1473 ARDOUR_UI::primary_clock_value_changed ()
1476 session->request_locate (primary_clock.current_time ());
1481 ARDOUR_UI::secondary_clock_value_changed ()
1484 session->request_locate (secondary_clock.current_time ());
1489 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1491 if (session && dstream && dstream->record_enabled()) {
1493 Session::RecordState rs;
1495 rs = session->record_status ();
1498 case Session::Disabled:
1499 case Session::Enabled:
1500 if (w->get_state() != STATE_SELECTED) {
1501 w->set_state (STATE_SELECTED);
1505 case Session::Recording:
1506 if (w->get_state() != STATE_ACTIVE) {
1507 w->set_state (STATE_ACTIVE);
1513 if (w->get_state() != STATE_NORMAL) {
1514 w->set_state (STATE_NORMAL);
1520 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1526 switch (session->record_status()) {
1527 case Session::Enabled:
1529 rec_button.set_state (1);
1531 rec_button.set_state (0);
1535 case Session::Recording:
1536 rec_button.set_state (2);
1540 rec_button.set_state (0);
1546 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1554 ARDOUR_UI::start_keyboard_prefix ()
1556 keyboard->start_prefix();
1560 ARDOUR_UI::save_template ()
1563 ArdourPrompter prompter (true);
1566 prompter.set_name (X_("Prompter"));
1567 prompter.set_prompt (_("Name for mix template:"));
1568 prompter.set_initial_text(session->name() + _("-template"));
1569 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1571 switch (prompter.run()) {
1572 case RESPONSE_ACCEPT:
1573 prompter.get_result (name);
1575 if (name.length()) {
1576 session->save_template (name);
1586 ARDOUR_UI::new_session (std::string predetermined_path)
1588 string session_name;
1589 string session_path;
1591 int response = Gtk::RESPONSE_NONE;
1593 new_session_dialog->set_modal(true);
1594 new_session_dialog->set_name (predetermined_path);
1595 new_session_dialog->reset_recent();
1596 new_session_dialog->show();
1599 response = new_session_dialog->run ();
1601 _session_is_new = false;
1603 if (response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1608 new_session_dialog->hide ();
1611 } else if (response == Gtk::RESPONSE_NONE) {
1613 /* Clear was pressed */
1614 new_session_dialog->reset();
1616 } else if (response == Gtk::RESPONSE_YES) {
1618 /* YES == OPEN, but there's no enum for that */
1620 session_name = new_session_dialog->session_name();
1622 if (session_name.empty()) {
1623 response = Gtk::RESPONSE_NONE;
1627 if (session_name[0] == '/' ||
1628 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1629 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1630 load_session (Glib::path_get_dirname (session_name), session_name);
1632 session_path = new_session_dialog->session_folder();
1633 load_session (session_path, session_name);
1636 } else if (response == Gtk::RESPONSE_OK) {
1638 session_name = new_session_dialog->session_name();
1640 if (new_session_dialog->get_current_page() == 1) {
1642 /* XXX this is a bit of a hack..
1643 i really want the new sesion dialog to return RESPONSE_YES
1644 if we're on page 1 (the load page)
1645 Unfortunately i can't see how atm..
1648 if (session_name.empty()) {
1649 response = Gtk::RESPONSE_NONE;
1653 if (session_name[0] == '/' ||
1654 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1655 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1656 load_session (Glib::path_get_dirname (session_name), session_name);
1658 session_path = new_session_dialog->session_folder();
1659 load_session (session_path, session_name);
1664 if (session_name.empty()) {
1665 response = Gtk::RESPONSE_NONE;
1669 if (session_name[0] == '/' ||
1670 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1671 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1673 session_path = Glib::path_get_dirname (session_name);
1674 session_name = Glib::path_get_basename (session_name);
1678 session_path = new_session_dialog->session_folder();
1682 //XXX This is needed because session constructor wants a
1683 //non-existant path. hopefully this will be fixed at some point.
1685 session_path = Glib::build_filename (session_path, session_name);
1687 if (g_file_test (session_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) {
1689 Glib::ustring str = string_compose (_("This session\n%1\nalready exists. Do you want to open it?"), session_path);
1691 MessageDialog msg (str,
1693 Gtk::MESSAGE_WARNING,
1694 Gtk::BUTTONS_YES_NO,
1698 msg.set_name (X_("CleanupDialog"));
1699 msg.set_wmclass (X_("existing_session"), "Ardour");
1700 msg.set_position (Gtk::WIN_POS_MOUSE);
1702 switch (msg.run()) {
1704 load_session (session_path, session_name);
1708 response = RESPONSE_NONE;
1709 new_session_dialog->reset ();
1714 _session_is_new = true;
1716 std::string template_name = new_session_dialog->session_template_name();
1718 if (new_session_dialog->use_session_template()) {
1720 load_session (session_path, session_name, &template_name);
1726 AutoConnectOption iconnect;
1727 AutoConnectOption oconnect;
1729 if (new_session_dialog->create_control_bus()) {
1730 cchns = (uint32_t) new_session_dialog->control_channel_count();
1735 if (new_session_dialog->create_master_bus()) {
1736 mchns = (uint32_t) new_session_dialog->master_channel_count();
1741 if (new_session_dialog->connect_inputs()) {
1742 iconnect = AutoConnectPhysical;
1744 iconnect = AutoConnectOption (0);
1747 /// @todo some minor tweaks.
1749 if (new_session_dialog->connect_outs_to_master()) {
1750 oconnect = AutoConnectMaster;
1751 } else if (new_session_dialog->connect_outs_to_physical()) {
1752 oconnect = AutoConnectPhysical;
1754 oconnect = AutoConnectOption (0);
1757 uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
1758 uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count();
1760 build_session (session_path,
1768 engine->frame_rate() * 60 * 5);
1773 } while (response == Gtk::RESPONSE_NONE);
1777 new_session_dialog->get_window()->set_cursor();
1778 new_session_dialog->hide();
1782 ARDOUR_UI::close_session()
1789 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1791 Session *new_session;
1793 session_loaded = false;
1794 x = unload_session ();
1802 /* if it already exists, we must have write access */
1804 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1805 MessageDialog msg (*editor, _("\
1806 You do not have write access to this session.\n\
1807 This prevents the session from being loaded."));
1813 new_session = new Session (*engine, path, snap_name, mix_template);
1818 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1822 connect_to_session (new_session);
1824 Config->set_current_owner (ConfigVariableBase::Interface);
1826 session_loaded = true;
1828 goto_editor_window ();
1831 session->set_clean ();
1838 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1839 uint32_t control_channels,
1840 uint32_t master_channels,
1841 AutoConnectOption input_connect,
1842 AutoConnectOption output_connect,
1845 nframes_t initial_length)
1847 Session *new_session;
1850 session_loaded = false;
1851 x = unload_session ();
1858 _session_is_new = true;
1861 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1862 control_channels, master_channels, nphysin, nphysout, initial_length);
1867 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1871 connect_to_session (new_session);
1873 session_loaded = true;
1881 editor->show_window ();
1892 ARDOUR_UI::show_splash ()
1895 about = new About();
1896 about->signal_response().connect(mem_fun (*this, &ARDOUR_UI::about_signal_response) );
1903 ARDOUR_UI::about_signal_response(int response)
1909 ARDOUR_UI::hide_splash ()
1912 about->get_window()->set_cursor ();
1918 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1922 removed = rep.paths.size();
1925 MessageDialog msgd (*editor,
1926 _("No audio files were ready for cleanup"),
1929 (Gtk::ButtonsType)(Gtk::BUTTONS_OK) );
1930 msgd.set_secondary_text (_("If this seems suprising, \n\
1931 check for any existing snapshots.\n\
1932 These may still include regions that\n\
1933 require some unused files to continue to exist."));
1939 ArdourDialog results (_("ardour: cleanup"), true, false);
1941 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1942 CleanupResultsModelColumns() {
1946 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1947 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1951 CleanupResultsModelColumns results_columns;
1952 Glib::RefPtr<Gtk::ListStore> results_model;
1953 Gtk::TreeView results_display;
1955 results_model = ListStore::create (results_columns);
1956 results_display.set_model (results_model);
1957 results_display.append_column (list_title, results_columns.visible_name);
1959 results_display.set_name ("CleanupResultsList");
1960 results_display.set_headers_visible (true);
1961 results_display.set_headers_clickable (false);
1962 results_display.set_reorderable (false);
1964 Gtk::ScrolledWindow list_scroller;
1967 Gtk::HBox dhbox; // the hbox for the image and text
1968 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1969 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1971 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1973 if (rep.space < 1048576.0f) {
1975 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1977 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1981 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1983 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1987 dhbox.pack_start (*dimage, true, false, 5);
1988 dhbox.pack_start (txt, true, false, 5);
1990 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1991 TreeModel::Row row = *(results_model->append());
1992 row[results_columns.visible_name] = *i;
1993 row[results_columns.fullpath] = *i;
1996 list_scroller.add (results_display);
1997 list_scroller.set_size_request (-1, 150);
1998 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2000 dvbox.pack_start (dhbox, true, false, 5);
2001 dvbox.pack_start (list_scroller, true, false, 5);
2002 ddhbox.pack_start (dvbox, true, false, 5);
2004 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2005 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2006 results.set_default_response (RESPONSE_CLOSE);
2007 results.set_position (Gtk::WIN_POS_MOUSE);
2008 results.show_all_children ();
2009 results.set_resizable (false);
2016 ARDOUR_UI::cleanup ()
2019 /* shouldn't happen: menu item is insensitive */
2024 MessageDialog checker (_("Are you sure you want to cleanup?"),
2026 Gtk::MESSAGE_QUESTION,
2027 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2029 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2030 ALL undo/redo information will be lost if you cleanup.\n\
2031 After cleanup, unused audio files will be moved to a \
2032 \"dead sounds\" location."));
2034 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2035 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2036 checker.set_default_response (RESPONSE_CANCEL);
2038 checker.set_name (_("CleanupDialog"));
2039 checker.set_wmclass (X_("ardour_cleanup"), "Ardour");
2040 checker.set_position (Gtk::WIN_POS_MOUSE);
2042 switch (checker.run()) {
2043 case RESPONSE_ACCEPT:
2049 Session::cleanup_report rep;
2051 editor->prepare_for_cleanup ();
2053 if (session->cleanup_sources (rep)) {
2057 display_cleanup_results (rep,
2060 The following %1 %2 not in use and \n\
2061 have been moved to:\n\
2063 Flushing the wastebasket will \n\
2064 release an additional\n\
2065 %4 %5bytes of disk space.\n"
2070 ARDOUR_UI::flush_trash ()
2073 /* shouldn't happen: menu item is insensitive */
2077 Session::cleanup_report rep;
2079 if (session->cleanup_trash_sources (rep)) {
2083 display_cleanup_results (rep,
2085 _("The following %1 %2 deleted from\n\
2087 releasing %4 %5bytes of disk space"));
2091 ARDOUR_UI::add_route ()
2099 if (add_route_dialog == 0) {
2100 add_route_dialog = new AddRouteDialog;
2101 editor->ensure_float (*add_route_dialog);
2104 if (add_route_dialog->is_visible()) {
2105 /* we're already doing this */
2109 ResponseType r = (ResponseType) add_route_dialog->run ();
2111 add_route_dialog->hide();
2114 case RESPONSE_ACCEPT:
2121 if ((count = add_route_dialog->count()) <= 0) {
2125 uint32_t input_chan = add_route_dialog->channels ();
2126 uint32_t output_chan;
2127 string name_template = add_route_dialog->name_template ();
2128 bool track = add_route_dialog->track ();
2130 AutoConnectOption oac = Config->get_output_auto_connect();
2132 if (oac & AutoConnectMaster) {
2133 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2135 output_chan = input_chan;
2138 /* XXX do something with name template */
2141 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
2143 session_add_audio_bus (input_chan, output_chan, count);
2148 ARDOUR_UI::mixer_settings () const
2153 node = session->instant_xml(X_("Mixer"), session->path());
2155 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2159 node = new XMLNode (X_("Mixer"));
2166 ARDOUR_UI::editor_settings () const
2171 node = session->instant_xml(X_("Editor"), session->path());
2173 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2177 node = new XMLNode (X_("Editor"));
2183 ARDOUR_UI::keyboard_settings () const
2187 node = Config->extra_xml(X_("Keyboard"));
2190 node = new XMLNode (X_("Keyboard"));
2196 ARDOUR_UI::halt_on_xrun_message ()
2198 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2200 MessageDialog msg (*editor,
2201 _("Recording was stopped because your system could not keep up."));
2206 ARDOUR_UI::disk_overrun_handler ()
2208 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2210 if (!have_disk_overrun_displayed) {
2211 have_disk_overrun_displayed = true;
2212 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2213 The disk system on your computer\n\
2214 was not able to keep up with Ardour.\n\
2216 Specifically, it failed to write data to disk\n\
2217 quickly enough to keep up with recording.\n"));
2219 have_disk_overrun_displayed = false;
2224 ARDOUR_UI::disk_underrun_handler ()
2226 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2228 if (!have_disk_underrun_displayed) {
2229 have_disk_underrun_displayed = true;
2230 MessageDialog msg (*editor,
2231 (_("The disk system on your computer\n\
2232 was not able to keep up with Ardour.\n\
2234 Specifically, it failed to read data from disk\n\
2235 quickly enough to keep up with playback.\n")));
2237 have_disk_underrun_displayed = false;
2242 ARDOUR_UI::disk_underrun_message_gone ()
2244 have_disk_underrun_displayed = false;
2248 ARDOUR_UI::disk_overrun_message_gone ()
2250 have_disk_underrun_displayed = false;
2254 ARDOUR_UI::pending_state_dialog ()
2256 ArdourDialog dialog ("pending state dialog");
2258 This session appears to have been in\n\
2259 middle of recording when ardour or\n\
2260 the computer was shutdown.\n\
2262 Ardour can recover any captured audio for\n\
2263 you, or it can ignore it. Please decide\n\
2264 what you would like to do.\n"));
2266 dialog.get_vbox()->pack_start (message);
2267 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2268 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2270 dialog.set_position (WIN_POS_CENTER);
2273 switch (dialog.run ()) {
2274 case RESPONSE_ACCEPT:
2282 ARDOUR_UI::disconnect_from_jack ()
2285 if( engine->disconnect_from_jack ()) {
2286 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2290 update_sample_rate (0);
2295 ARDOUR_UI::reconnect_to_jack ()
2298 if (engine->reconnect_to_jack ()) {
2299 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2303 update_sample_rate (0);
2308 ARDOUR_UI::set_jack_buffer_size (nframes_t nframes)
2310 engine->request_buffer_size (nframes);
2311 update_sample_rate (0);
2315 ARDOUR_UI::cmdline_new_session (string path)
2317 if (path[0] != '/') {
2318 char buf[PATH_MAX+1];
2321 getcwd (buf, sizeof (buf));
2330 _will_create_new_session_automatically = false; /* done it */
2331 return FALSE; /* don't call it again */
2335 ARDOUR_UI::use_config ()
2337 Glib::RefPtr<Action> act;
2339 switch (Config->get_native_file_data_format ()) {
2341 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2344 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2349 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2350 ract->set_active ();
2353 switch (Config->get_native_file_header_format ()) {
2355 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2358 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2361 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2364 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2367 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2370 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2373 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2378 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2379 ract->set_active ();
2384 ARDOUR_UI::update_transport_clocks (nframes_t pos)
2386 primary_clock.set (pos);
2387 secondary_clock.set (pos);
2389 if (big_clock_window) {
2390 big_clock.set (pos);
2395 ARDOUR_UI::record_state_changed ()
2397 if (!session || !big_clock_window) {
2398 /* why bother - the clock isn't visible */
2402 switch (session->record_status()) {
2403 case Session::Recording:
2404 big_clock.set_name ("BigClockRecording");
2407 big_clock.set_name ("BigClockNonRecording");
2413 ARDOUR_UI::set_keybindings_path (string path)
2415 keybindings_path = path;
2419 ARDOUR_UI::save_keybindings ()
2421 if (can_save_keybindings) {
2422 AccelMap::save (keybindings_path);
2427 ARDOUR_UI::first_idle ()
2429 can_save_keybindings = true;