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 <pbd/enumwriter.h>
39 #include <gtkmm2ext/gtk_ui.h>
40 #include <gtkmm2ext/utils.h>
41 #include <gtkmm2ext/click_box.h>
42 #include <gtkmm2ext/fastmeter.h>
43 #include <gtkmm2ext/stop_signal.h>
44 #include <gtkmm2ext/popup.h>
46 #include <midi++/port.h>
47 #include <midi++/mmc.h>
49 #include <ardour/ardour.h>
50 #include <ardour/session_route.h>
51 #include <ardour/port.h>
52 #include <ardour/audioengine.h>
53 #include <ardour/playlist.h>
54 #include <ardour/utils.h>
55 #include <ardour/audio_diskstream.h>
56 #include <ardour/audiofilesource.h>
57 #include <ardour/recent_sessions.h>
58 #include <ardour/port.h>
59 #include <ardour/audio_track.h>
62 #include "ardour_ui.h"
63 #include "public_editor.h"
64 #include "audio_clock.h"
69 #include "keyboard_target.h"
70 #include "add_route_dialog.h"
71 #include "new_session_dialog.h"
74 #include "gui_thread.h"
75 #include "color_manager.h"
79 using namespace ARDOUR;
81 using namespace Gtkmm2ext;
85 ARDOUR_UI *ARDOUR_UI::theArdourUI = 0;
87 sigc::signal<void,bool> ARDOUR_UI::Blink;
88 sigc::signal<void> ARDOUR_UI::RapidScreenUpdate;
89 sigc::signal<void> ARDOUR_UI::SuperRapidScreenUpdate;
90 sigc::signal<void,nframes_t> ARDOUR_UI::Clock;
92 ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
94 : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile),
96 primary_clock (X_("TransportClockDisplay"), true, false, true),
97 secondary_clock (X_("SecondaryClockDisplay"), true, false, true),
98 preroll_clock (X_("PreRollClock"), true, true),
99 postroll_clock (X_("PostRollClock"), true, true),
103 adjuster_table (3, 3),
107 preroll_button (_("pre\nroll")),
108 postroll_button (_("post\nroll")),
112 big_clock ("BigClockNonRecording", true, false, true),
116 time_master_button (_("time\nmaster")),
118 shuttle_units_button (_("% ")),
120 punch_in_button (_("Punch In")),
121 punch_out_button (_("Punch Out")),
122 auto_return_button (_("Auto Return")),
123 auto_play_button (_("Autuo Play")),
124 auto_input_button (_("Auto Input")),
125 click_button (_("Click")),
126 auditioning_alert_button (_("AUDITION")),
127 solo_alert_button (_("SOLO")),
130 using namespace Gtk::Menu_Helpers;
136 if (theArdourUI == 0) {
142 color_manager = new ColorManager();
144 std::string color_file = ARDOUR::find_config_file("ardour.colors");
146 color_manager->load (color_file);
151 _session_is_new = false;
152 big_clock_window = 0;
153 session_selector_window = 0;
154 last_key_press_time = 0;
155 connection_editor = 0;
156 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 can_save_keybindings = false;
170 Glib::signal_idle().connect (mem_fun (*this, &ARDOUR_UI::first_idle));
172 last_configure_time.tv_sec = 0;
173 last_configure_time.tv_usec = 0;
175 shuttle_grabbed = false;
177 shuttle_max_speed = 8.0f;
179 shuttle_style_menu = 0;
180 shuttle_unit_menu = 0;
182 gettimeofday (&last_peak_grab, 0);
183 gettimeofday (&last_shuttle_request, 0);
185 ARDOUR::Diskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
186 ARDOUR::Diskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
188 /* handle pending state with a dialog */
190 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
192 /* have to wait for AudioEngine and Configuration before proceeding */
196 ARDOUR_UI::set_engine (AudioEngine& e)
200 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
201 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
202 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
203 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
205 ActionManager::init ();
206 new_session_dialog = new NewSessionDialog();
210 keyboard = new Keyboard;
212 if (setup_windows ()) {
213 throw failed_constructor ();
216 if (GTK_ARDOUR::show_key_actions) {
217 vector<string> names;
218 vector<string> paths;
220 vector<AccelKey> bindings;
222 ActionManager::get_all_actions (names, paths, keys, bindings);
224 vector<string>::iterator n;
225 vector<string>::iterator k;
226 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
227 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
233 /* start with timecode, metering enabled
236 blink_timeout_tag = -1;
238 /* the global configuration object is now valid */
242 /* this being a GUI and all, we want peakfiles */
244 AudioFileSource::set_build_peakfiles (true);
245 AudioFileSource::set_build_missing_peakfiles (true);
247 if (AudioSource::start_peak_thread ()) {
248 throw failed_constructor();
251 /* start the time-of-day-clock */
253 update_wall_clock ();
254 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
256 update_disk_space ();
258 update_sample_rate (engine->frame_rate());
260 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
261 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
264 ARDOUR_UI::~ARDOUR_UI ()
266 save_ardour_state ();
280 if (add_route_dialog) {
281 delete add_route_dialog;
284 AudioSource::stop_peak_thread ();
288 ARDOUR_UI::configure_timeout ()
293 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
294 /* no configure events yet */
298 gettimeofday (&now, 0);
299 timersub (&now, &last_configure_time, &diff);
301 /* force a gap of 0.5 seconds since the last configure event
304 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
307 have_configure_timeout = false;
308 save_ardour_state ();
314 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
316 if (have_configure_timeout) {
317 gettimeofday (&last_configure_time, 0);
319 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
320 have_configure_timeout = true;
327 ARDOUR_UI::save_ardour_state ()
329 if (!keyboard || !mixer || !editor) {
333 /* XXX this is all a bit dubious. add_extra_xml() uses
334 a different lifetime model from add_instant_xml().
337 XMLNode* node = new XMLNode (keyboard->get_state());
338 Config->add_extra_xml (*node);
339 Config->save_state();
341 XMLNode enode(static_cast<Stateful*>(editor)->get_state());
342 XMLNode mnode(mixer->get_state());
345 session->add_instant_xml (enode, session->path());
346 session->add_instant_xml (mnode, session->path());
348 Config->add_instant_xml (enode, get_user_ardour_path());
349 Config->add_instant_xml (mnode, get_user_ardour_path());
356 ARDOUR_UI::startup ()
364 if (session && session->dirty()) {
365 switch (ask_about_saving_session(_("quit"))) {
370 /* use the default name */
371 if (save_state_canfail ("")) {
372 /* failed - don't quit */
373 MessageDialog msg (*editor,
375 Ardour was unable to save your session.\n\n\
376 If you still wish to quit, please use the\n\n\
377 \"Just quit\" option."));
388 session->set_deletion_in_progress ();
391 Config->save_state();
396 ARDOUR_UI::ask_about_saving_session (const string & what)
398 ArdourDialog window (_("ardour: save session?"));
399 Gtk::HBox dhbox; // the hbox for the image and text
400 Gtk::Label prompt_label;
401 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
405 msg = string_compose(_("Don't %1"), what);
406 window.add_button (msg, RESPONSE_REJECT);
407 msg = string_compose(_("Just %1"), what);
408 window.add_button (msg, RESPONSE_APPLY);
409 msg = string_compose(_("Save and %1"), what);
410 window.add_button (msg, RESPONSE_ACCEPT);
412 window.set_default_response (RESPONSE_ACCEPT);
414 Gtk::Button noquit_button (msg);
415 noquit_button.set_name ("EditorGTKButton");
420 if (session->snap_name() == session->name()) {
423 type = _("snapshot");
425 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?"),
426 type, session->snap_name());
428 prompt_label.set_text (prompt);
429 prompt_label.set_name (X_("PrompterLabel"));
430 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
432 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
434 dhbox.set_homogeneous (false);
435 dhbox.pack_start (*dimage, false, false, 5);
436 dhbox.pack_start (prompt_label, true, false, 5);
437 window.get_vbox()->pack_start (dhbox);
439 window.set_name (_("Prompter"));
440 window.set_position (Gtk::WIN_POS_MOUSE);
441 window.set_modal (true);
442 window.set_resizable (false);
445 save_the_session = 0;
447 window.set_keep_above (true);
450 ResponseType r = (ResponseType) window.run();
455 case RESPONSE_ACCEPT: // save and get out of here
457 case RESPONSE_APPLY: // get out of here
467 ARDOUR_UI::every_second ()
470 update_buffer_load ();
471 update_disk_space ();
476 ARDOUR_UI::every_point_one_seconds ()
478 update_speed_display ();
479 RapidScreenUpdate(); /* EMIT_SIGNAL */
484 ARDOUR_UI::every_point_zero_one_seconds ()
486 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
491 ARDOUR_UI::update_sample_rate (nframes_t ignored)
495 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
497 if (!engine->connected()) {
499 snprintf (buf, sizeof (buf), _("disconnected"));
503 nframes_t rate = engine->frame_rate();
505 if (fmod (rate, 1000.0) != 0.0) {
506 snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"),
507 (float) rate/1000.0f,
508 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
510 snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"),
512 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
516 sample_rate_label.set_text (buf);
520 ARDOUR_UI::update_cpu_load ()
523 snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
524 cpu_load_label.set_text (buf);
528 ARDOUR_UI::update_buffer_load ()
533 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
534 session->playback_load(), session->capture_load());
535 buffer_load_label.set_text (buf);
537 buffer_load_label.set_text ("");
542 ARDOUR_UI::count_recenabled_streams (Route& route)
544 Track* track = dynamic_cast<Track*>(&route);
545 if (track && track->diskstream()->record_enabled()) {
546 rec_enabled_streams += track->n_inputs();
551 ARDOUR_UI::update_disk_space()
557 nframes_t frames = session->available_capture_duration();
560 if (frames == max_frames) {
561 strcpy (buf, _("Disk: 24hrs+"));
566 nframes_t fr = session->frame_rate();
568 rec_enabled_streams = 0;
569 session->foreach_route (this, &ARDOUR_UI::count_recenabled_streams);
571 if (rec_enabled_streams) {
572 frames /= rec_enabled_streams;
575 hrs = frames / (fr * 3600);
576 frames -= hrs * fr * 3600;
577 mins = frames / (fr * 60);
578 frames -= mins * fr * 60;
581 snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
584 disk_space_label.set_text (buf);
588 ARDOUR_UI::update_wall_clock ()
595 tm_now = localtime (&now);
597 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
598 wall_clock_label.set_text (buf);
603 ARDOUR_UI::control_methods_adjusted ()
608 which_method = (int) online_control_button->adjustment.get_value();
609 switch (which_method) {
611 allow_mmc_and_local ();
620 fatal << _("programming error: impossible control method") << endmsg;
626 ARDOUR_UI::mmc_device_id_adjusted ()
631 int dev_id = (int) mmc_id_button->adjustment.get_value();
632 mmc->set_device_id (dev_id);
638 ARDOUR_UI::session_menu (GdkEventButton *ev)
640 session_popup_menu->popup (0, 0);
645 ARDOUR_UI::redisplay_recent_sessions ()
647 vector<string *> *sessions;
648 vector<string *>::iterator i;
649 RecentSessionsSorter cmp;
651 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
652 recent_session_model->clear ();
655 ARDOUR::read_recent_sessions (rs);
658 recent_session_display.set_model (recent_session_model);
662 /* sort them alphabetically */
663 sort (rs.begin(), rs.end(), cmp);
664 sessions = new vector<string*>;
666 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
667 sessions->push_back (new string ((*i).second));
670 for (i = sessions->begin(); i != sessions->end(); ++i) {
672 vector<string*>* states;
673 vector<const gchar*> item;
674 string fullpath = *(*i);
676 /* remove any trailing / */
678 if (fullpath[fullpath.length()-1] == '/') {
679 fullpath = fullpath.substr (0, fullpath.length()-1);
682 /* now get available states for this session */
684 if ((states = Session::possible_states (fullpath)) == 0) {
689 TreeModel::Row row = *(recent_session_model->append());
691 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
692 row[recent_session_columns.fullpath] = fullpath;
694 if (states->size() > 1) {
696 /* add the children */
698 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
700 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
702 child_row[recent_session_columns.visible_name] = **i2;
703 child_row[recent_session_columns.fullpath] = fullpath;
712 recent_session_display.set_model (recent_session_model);
717 ARDOUR_UI::build_session_selector ()
719 session_selector_window = new ArdourDialog ("session selector");
721 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
723 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
724 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
725 session_selector_window->set_default_response (RESPONSE_ACCEPT);
726 recent_session_model = TreeStore::create (recent_session_columns);
727 recent_session_display.set_model (recent_session_model);
728 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
729 recent_session_display.set_headers_visible (false);
730 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
732 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
734 scroller->add (recent_session_display);
735 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
737 session_selector_window->set_name ("SessionSelectorWindow");
738 session_selector_window->set_size_request (200, 400);
739 session_selector_window->get_vbox()->pack_start (*scroller);
740 session_selector_window->show_all_children();
744 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
746 session_selector_window->response (RESPONSE_ACCEPT);
750 ARDOUR_UI::open_recent_session ()
752 /* popup selector window */
754 if (session_selector_window == 0) {
755 build_session_selector ();
758 redisplay_recent_sessions ();
760 ResponseType r = (ResponseType) session_selector_window->run ();
762 session_selector_window->hide();
765 case RESPONSE_ACCEPT:
771 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
773 if (i == recent_session_model->children().end()) {
777 Glib::ustring path = (*i)[recent_session_columns.fullpath];
778 Glib::ustring state = (*i)[recent_session_columns.visible_name];
780 _session_is_new = false;
782 load_session (path, state);
786 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
790 if (stat (info.filename.c_str(), &statbuf) != 0) {
794 if (!S_ISDIR(statbuf.st_mode)) {
800 string session_file = info.filename;
802 session_file += Glib::path_get_basename (info.filename);
803 session_file += ".ardour";
805 if (stat (session_file.c_str(), &statbuf) != 0) {
809 return S_ISREG (statbuf.st_mode);
813 ARDOUR_UI::open_session ()
815 /* popup selector window */
817 if (open_session_selector == 0) {
819 /* ardour sessions are folders */
821 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
822 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
823 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
825 FileFilter session_filter;
826 session_filter.add_pattern ("*.ardour");
827 session_filter.set_name (_("Ardour sessions"));
828 open_session_selector->add_filter (session_filter);
829 open_session_selector->set_filter (session_filter);
832 int response = open_session_selector->run();
833 open_session_selector->hide ();
836 case RESPONSE_ACCEPT:
839 open_session_selector->hide();
843 open_session_selector->hide();
844 string session_path = open_session_selector->get_filename();
848 if (session_path.length() > 0) {
849 if (Session::find_session (session_path, path, name, isnew) == 0) {
850 _session_is_new = isnew;
851 load_session (path, name);
858 ARDOUR_UI::session_add_midi_track ()
860 cerr << _("Patience is a virtue.\n");
864 ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many)
866 list<boost::shared_ptr<AudioTrack> > tracks;
867 Session::RouteList routes;
870 warning << _("You cannot add a track or bus without a session already loaded.") << endmsg;
876 tracks = session->new_audio_track (input_channels, output_channels, mode, how_many);
878 if (tracks.size() != how_many) {
880 error << _("could not create a new audio track") << endmsg;
882 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
888 routes = session->new_audio_route (input_channels, output_channels, how_many);
890 if (routes.size() != how_many) {
892 error << _("could not create a new audio track") << endmsg;
894 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
900 if (need_control_room_outs) {
906 route->set_stereo_control_outs (control_lr_channels);
907 route->control_outs()->set_stereo_pan (pans, this);
909 #endif /* CONTROLOUTS */
913 MessageDialog msg (*editor,
914 _("There are insufficient JACK ports available\n\
915 to create a new track or bus.\n\
916 You should save Ardour, exit and\n\
917 restart JACK with more ports."));
923 ARDOUR_UI::do_transport_locate (nframes_t new_position)
925 nframes_t _preroll = 0;
928 // XXX CONFIG_CHANGE FIX - requires AnyTime handling
929 // _preroll = session->convert_to_frames_at (new_position, Config->get_preroll());
931 if (new_position > _preroll) {
932 new_position -= _preroll;
937 session->request_locate (new_position);
942 ARDOUR_UI::transport_goto_start ()
945 session->goto_start();
948 /* force displayed area in editor to start no matter
949 what "follow playhead" setting is.
953 editor->reposition_x_origin (session->current_start_frame());
959 ARDOUR_UI::transport_goto_zero ()
962 session->request_locate (0);
965 /* force displayed area in editor to start no matter
966 what "follow playhead" setting is.
970 editor->reposition_x_origin (0);
976 ARDOUR_UI::transport_goto_end ()
979 nframes_t frame = session->current_end_frame();
980 session->request_locate (frame);
982 /* force displayed area in editor to start no matter
983 what "follow playhead" setting is.
987 editor->reposition_x_origin (frame);
993 ARDOUR_UI::transport_stop ()
999 if (session->is_auditioning()) {
1000 session->cancel_audition ();
1004 if (session->get_play_loop ()) {
1005 session->request_play_loop (false);
1008 session->request_stop ();
1012 ARDOUR_UI::transport_stop_and_forget_capture ()
1015 session->request_stop (true);
1020 ARDOUR_UI::remove_last_capture()
1023 editor->remove_last_capture();
1028 ARDOUR_UI::transport_record ()
1031 switch (session->record_status()) {
1032 case Session::Disabled:
1033 if (session->ntracks() == 0) {
1034 MessageDialog msg (*editor, _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu."));
1038 session->maybe_enable_record ();
1040 case Session::Recording:
1041 case Session::Enabled:
1042 session->disable_record (true);
1048 ARDOUR_UI::transport_roll ()
1056 rolling = session->transport_rolling ();
1058 if (session->get_play_loop()) {
1059 session->request_play_loop (false);
1060 auto_loop_button.set_active (false);
1061 roll_button.set_active (true);
1062 } else if (session->get_play_range ()) {
1063 session->request_play_range (false);
1064 play_selection_button.set_active (false);
1065 } else if (rolling) {
1066 session->request_locate (session->last_transport_start(), true);
1069 session->request_transport_speed (1.0f);
1073 ARDOUR_UI::transport_loop()
1076 if (session->get_play_loop()) {
1077 if (session->transport_rolling()) {
1078 Location * looploc = session->locations()->auto_loop_location();
1080 session->request_locate (looploc->start(), true);
1085 session->request_play_loop (true);
1091 ARDOUR_UI::transport_play_selection ()
1097 if (!session->get_play_range()) {
1098 session->request_stop ();
1101 editor->play_selection ();
1105 ARDOUR_UI::transport_rewind (int option)
1107 float current_transport_speed;
1110 current_transport_speed = session->transport_speed();
1112 if (current_transport_speed >= 0.0f) {
1115 session->request_transport_speed (-1.0f);
1118 session->request_transport_speed (-4.0f);
1121 session->request_transport_speed (-0.5f);
1126 session->request_transport_speed (current_transport_speed * 1.5f);
1132 ARDOUR_UI::transport_forward (int option)
1134 float current_transport_speed;
1137 current_transport_speed = session->transport_speed();
1139 if (current_transport_speed <= 0.0f) {
1142 session->request_transport_speed (1.0f);
1145 session->request_transport_speed (4.0f);
1148 session->request_transport_speed (0.5f);
1153 session->request_transport_speed (current_transport_speed * 1.5f);
1159 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1165 boost::shared_ptr<Route> r;
1167 if ((r = session->route_by_remote_id (dstream)) != 0) {
1171 if ((t = dynamic_cast<Track*>(r.get())) != 0) {
1172 t->diskstream()->set_record_enabled (!t->diskstream()->record_enabled());
1181 ARDOUR_UI::queue_transport_change ()
1183 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1187 ARDOUR_UI::map_transport_state ()
1189 float sp = session->transport_speed();
1192 transport_rolling ();
1193 } else if (sp < 0.0f) {
1194 transport_rewinding ();
1195 } else if (sp > 0.0f) {
1196 transport_forwarding ();
1198 transport_stopped ();
1203 ARDOUR_UI::allow_local_only ()
1209 ARDOUR_UI::allow_mmc_only ()
1215 ARDOUR_UI::allow_mmc_and_local ()
1221 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1223 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1224 (int) adj.get_value()].c_str());
1228 ARDOUR_UI::engine_stopped ()
1230 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1231 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1232 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1236 ARDOUR_UI::engine_running ()
1238 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1239 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1240 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1244 ARDOUR_UI::engine_halted ()
1246 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1248 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1249 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1251 update_sample_rate (0);
1253 MessageDialog msg (*editor,
1255 JACK has either been shutdown or it\n\
1256 disconnected Ardour because Ardour\n\
1257 was not fast enough. You can save the\n\
1258 session and/or try to reconnect to JACK ."));
1263 ARDOUR_UI::do_engine_start ()
1271 error << _("Unable to start the session running")
1281 ARDOUR_UI::start_engine ()
1283 if (do_engine_start () == 0) {
1284 if (session && _session_is_new) {
1285 /* we need to retain initial visual
1286 settings for a new session
1288 session->save_state ("");
1296 ARDOUR_UI::update_clocks ()
1298 if (!editor || !editor->dragging_playhead()) {
1299 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1304 ARDOUR_UI::start_clocking ()
1306 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1310 ARDOUR_UI::stop_clocking ()
1312 clock_signal_connection.disconnect ();
1316 ARDOUR_UI::toggle_clocking ()
1319 if (clock_button.get_active()) {
1328 ARDOUR_UI::_blink (void *arg)
1331 ((ARDOUR_UI *) arg)->blink ();
1338 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1342 ARDOUR_UI::start_blinking ()
1344 /* Start the blink signal. Everybody with a blinking widget
1345 uses Blink to drive the widget's state.
1348 if (blink_timeout_tag < 0) {
1350 blink_timeout_tag = g_timeout_add (240, _blink, this);
1355 ARDOUR_UI::stop_blinking ()
1357 if (blink_timeout_tag >= 0) {
1358 g_source_remove (blink_timeout_tag);
1359 blink_timeout_tag = -1;
1364 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1370 if (io.n_inputs() == 0) {
1375 /* XXX we're not handling multiple ports yet. */
1377 const char **connections = io.input(0)->get_connections();
1379 if (connections == 0 || connections[0] == '\0') {
1382 buf = connections[0];
1389 if (io.n_outputs() == 0) {
1394 /* XXX we're not handling multiple ports yet. */
1396 const char **connections = io.output(0)->get_connections();
1398 if (connections == 0 || connections[0] == '\0') {
1401 buf = connections[0];
1409 ARDOUR_UI::snapshot_session ()
1411 ArdourPrompter prompter (true);
1418 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1420 prompter.set_name ("Prompter");
1421 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1422 prompter.set_prompt (_("Name of New Snapshot"));
1423 prompter.set_initial_text (now);
1425 switch (prompter.run()) {
1426 case RESPONSE_ACCEPT:
1427 prompter.get_result (snapname);
1428 if (snapname.length()){
1429 save_state (snapname);
1439 ARDOUR_UI::save_state (const string & name)
1441 (void) save_state_canfail (name);
1445 ARDOUR_UI::save_state_canfail (string name)
1450 if (name.length() == 0) {
1451 name = session->snap_name();
1454 if ((ret = session->save_state (name)) != 0) {
1458 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1463 ARDOUR_UI::restore_state (string name)
1466 if (name.length() == 0) {
1467 name = session->name();
1469 session->restore_state (name);
1474 ARDOUR_UI::primary_clock_value_changed ()
1477 session->request_locate (primary_clock.current_time ());
1482 ARDOUR_UI::secondary_clock_value_changed ()
1485 session->request_locate (secondary_clock.current_time ());
1490 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1492 if (session && dstream && dstream->record_enabled()) {
1494 Session::RecordState rs;
1496 rs = session->record_status ();
1499 case Session::Disabled:
1500 case Session::Enabled:
1501 if (w->get_state() != STATE_SELECTED) {
1502 w->set_state (STATE_SELECTED);
1506 case Session::Recording:
1507 if (w->get_state() != STATE_ACTIVE) {
1508 w->set_state (STATE_ACTIVE);
1514 if (w->get_state() != STATE_NORMAL) {
1515 w->set_state (STATE_NORMAL);
1521 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1527 switch (session->record_status()) {
1528 case Session::Enabled:
1530 rec_button.set_state (1);
1532 rec_button.set_state (0);
1536 case Session::Recording:
1537 rec_button.set_state (2);
1541 rec_button.set_state (0);
1547 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1555 ARDOUR_UI::start_keyboard_prefix ()
1557 keyboard->start_prefix();
1561 ARDOUR_UI::save_template ()
1564 ArdourPrompter prompter (true);
1567 prompter.set_name (X_("Prompter"));
1568 prompter.set_prompt (_("Name for mix template:"));
1569 prompter.set_initial_text(session->name() + _("-template"));
1570 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1572 switch (prompter.run()) {
1573 case RESPONSE_ACCEPT:
1574 prompter.get_result (name);
1576 if (name.length()) {
1577 session->save_template (name);
1587 ARDOUR_UI::new_session (std::string predetermined_path)
1589 string session_name;
1590 string session_path;
1592 int response = Gtk::RESPONSE_NONE;
1594 new_session_dialog->set_modal(true);
1595 new_session_dialog->set_name (predetermined_path);
1596 new_session_dialog->reset_recent();
1597 new_session_dialog->show();
1600 response = new_session_dialog->run ();
1602 _session_is_new = false;
1604 if (response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1609 new_session_dialog->hide ();
1612 } else if (response == Gtk::RESPONSE_NONE) {
1614 /* Clear was pressed */
1615 new_session_dialog->reset();
1617 } else if (response == Gtk::RESPONSE_YES) {
1619 /* YES == OPEN, but there's no enum for that */
1621 session_name = new_session_dialog->session_name();
1623 if (session_name.empty()) {
1624 response = Gtk::RESPONSE_NONE;
1628 if (session_name[0] == '/' ||
1629 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1630 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1631 load_session (Glib::path_get_dirname (session_name), session_name);
1633 session_path = new_session_dialog->session_folder();
1634 load_session (session_path, session_name);
1637 } else if (response == Gtk::RESPONSE_OK) {
1639 session_name = new_session_dialog->session_name();
1641 if (new_session_dialog->get_current_page() == 1) {
1643 /* XXX this is a bit of a hack..
1644 i really want the new sesion dialog to return RESPONSE_YES
1645 if we're on page 1 (the load page)
1646 Unfortunately i can't see how atm..
1649 if (session_name.empty()) {
1650 response = Gtk::RESPONSE_NONE;
1654 if (session_name[0] == '/' ||
1655 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1656 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1657 load_session (Glib::path_get_dirname (session_name), session_name);
1659 session_path = new_session_dialog->session_folder();
1660 load_session (session_path, session_name);
1665 if (session_name.empty()) {
1666 response = Gtk::RESPONSE_NONE;
1670 if (session_name[0] == '/' ||
1671 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1672 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1674 session_path = Glib::path_get_dirname (session_name);
1675 session_name = Glib::path_get_basename (session_name);
1679 session_path = new_session_dialog->session_folder();
1683 //XXX This is needed because session constructor wants a
1684 //non-existant path. hopefully this will be fixed at some point.
1686 session_path = Glib::build_filename (session_path, session_name);
1688 if (g_file_test (session_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) {
1690 Glib::ustring str = string_compose (_("This session\n%1\nalready exists. Do you want to open it?"), session_path);
1692 MessageDialog msg (str,
1694 Gtk::MESSAGE_WARNING,
1695 Gtk::BUTTONS_YES_NO,
1699 msg.set_name (X_("CleanupDialog"));
1700 msg.set_wmclass (X_("existing_session"), "Ardour");
1701 msg.set_position (Gtk::WIN_POS_MOUSE);
1703 switch (msg.run()) {
1705 load_session (session_path, session_name);
1709 response = RESPONSE_NONE;
1710 new_session_dialog->reset ();
1715 _session_is_new = true;
1717 std::string template_name = new_session_dialog->session_template_name();
1719 if (new_session_dialog->use_session_template()) {
1721 load_session (session_path, session_name, &template_name);
1727 AutoConnectOption iconnect;
1728 AutoConnectOption oconnect;
1730 if (new_session_dialog->create_control_bus()) {
1731 cchns = (uint32_t) new_session_dialog->control_channel_count();
1736 if (new_session_dialog->create_master_bus()) {
1737 mchns = (uint32_t) new_session_dialog->master_channel_count();
1742 if (new_session_dialog->connect_inputs()) {
1743 iconnect = AutoConnectPhysical;
1745 iconnect = AutoConnectOption (0);
1748 /// @todo some minor tweaks.
1750 if (new_session_dialog->connect_outs_to_master()) {
1751 oconnect = AutoConnectMaster;
1752 } else if (new_session_dialog->connect_outs_to_physical()) {
1753 oconnect = AutoConnectPhysical;
1755 oconnect = AutoConnectOption (0);
1758 uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
1759 uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count();
1761 build_session (session_path,
1769 engine->frame_rate() * 60 * 5);
1774 } while (response == Gtk::RESPONSE_NONE);
1778 new_session_dialog->get_window()->set_cursor();
1779 new_session_dialog->hide();
1783 ARDOUR_UI::close_session()
1790 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1792 Session *new_session;
1794 session_loaded = false;
1795 x = unload_session ();
1803 /* if it already exists, we must have write access */
1805 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1806 MessageDialog msg (*editor, _("\
1807 You do not have write access to this session.\n\
1808 This prevents the session from being loaded."));
1814 new_session = new Session (*engine, path, snap_name, mix_template);
1819 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1823 connect_to_session (new_session);
1825 Config->set_current_owner (ConfigVariableBase::Interface);
1827 session_loaded = true;
1829 goto_editor_window ();
1832 session->set_clean ();
1839 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1840 uint32_t control_channels,
1841 uint32_t master_channels,
1842 AutoConnectOption input_connect,
1843 AutoConnectOption output_connect,
1846 nframes_t initial_length)
1848 Session *new_session;
1851 session_loaded = false;
1852 x = unload_session ();
1859 _session_is_new = true;
1862 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1863 control_channels, master_channels, nphysin, nphysout, initial_length);
1868 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1872 connect_to_session (new_session);
1874 session_loaded = true;
1882 editor->show_window ();
1893 ARDOUR_UI::show_splash ()
1896 about = new About();
1897 about->signal_response().connect(mem_fun (*this, &ARDOUR_UI::about_signal_response) );
1904 ARDOUR_UI::about_signal_response(int response)
1910 ARDOUR_UI::hide_splash ()
1913 about->get_window()->set_cursor ();
1919 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1923 removed = rep.paths.size();
1926 MessageDialog msgd (*editor,
1927 _("No audio files were ready for cleanup"),
1930 (Gtk::ButtonsType)(Gtk::BUTTONS_OK) );
1931 msgd.set_secondary_text (_("If this seems suprising, \n\
1932 check for any existing snapshots.\n\
1933 These may still include regions that\n\
1934 require some unused files to continue to exist."));
1940 ArdourDialog results (_("ardour: cleanup"), true, false);
1942 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1943 CleanupResultsModelColumns() {
1947 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1948 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1952 CleanupResultsModelColumns results_columns;
1953 Glib::RefPtr<Gtk::ListStore> results_model;
1954 Gtk::TreeView results_display;
1956 results_model = ListStore::create (results_columns);
1957 results_display.set_model (results_model);
1958 results_display.append_column (list_title, results_columns.visible_name);
1960 results_display.set_name ("CleanupResultsList");
1961 results_display.set_headers_visible (true);
1962 results_display.set_headers_clickable (false);
1963 results_display.set_reorderable (false);
1965 Gtk::ScrolledWindow list_scroller;
1968 Gtk::HBox dhbox; // the hbox for the image and text
1969 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1970 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1972 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1974 if (rep.space < 1048576.0f) {
1976 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1978 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1982 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1984 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1988 dhbox.pack_start (*dimage, true, false, 5);
1989 dhbox.pack_start (txt, true, false, 5);
1991 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1992 TreeModel::Row row = *(results_model->append());
1993 row[results_columns.visible_name] = *i;
1994 row[results_columns.fullpath] = *i;
1997 list_scroller.add (results_display);
1998 list_scroller.set_size_request (-1, 150);
1999 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2001 dvbox.pack_start (dhbox, true, false, 5);
2002 dvbox.pack_start (list_scroller, true, false, 5);
2003 ddhbox.pack_start (dvbox, true, false, 5);
2005 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2006 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2007 results.set_default_response (RESPONSE_CLOSE);
2008 results.set_position (Gtk::WIN_POS_MOUSE);
2009 results.show_all_children ();
2010 results.set_resizable (false);
2017 ARDOUR_UI::cleanup ()
2020 /* shouldn't happen: menu item is insensitive */
2025 MessageDialog checker (_("Are you sure you want to cleanup?"),
2027 Gtk::MESSAGE_QUESTION,
2028 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2030 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2031 ALL undo/redo information will be lost if you cleanup.\n\
2032 After cleanup, unused audio files will be moved to a \
2033 \"dead sounds\" location."));
2035 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2036 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2037 checker.set_default_response (RESPONSE_CANCEL);
2039 checker.set_name (_("CleanupDialog"));
2040 checker.set_wmclass (X_("ardour_cleanup"), "Ardour");
2041 checker.set_position (Gtk::WIN_POS_MOUSE);
2043 switch (checker.run()) {
2044 case RESPONSE_ACCEPT:
2050 Session::cleanup_report rep;
2052 editor->prepare_for_cleanup ();
2054 if (session->cleanup_sources (rep)) {
2058 display_cleanup_results (rep,
2061 The following %1 %2 not in use and \n\
2062 have been moved to:\n\
2064 Flushing the wastebasket will \n\
2065 release an additional\n\
2066 %4 %5bytes of disk space.\n"
2071 ARDOUR_UI::flush_trash ()
2074 /* shouldn't happen: menu item is insensitive */
2078 Session::cleanup_report rep;
2080 if (session->cleanup_trash_sources (rep)) {
2084 display_cleanup_results (rep,
2086 _("The following %1 %2 deleted from\n\
2088 releasing %4 %5bytes of disk space"));
2092 ARDOUR_UI::add_route ()
2100 if (add_route_dialog == 0) {
2101 add_route_dialog = new AddRouteDialog;
2102 editor->ensure_float (*add_route_dialog);
2105 if (add_route_dialog->is_visible()) {
2106 /* we're already doing this */
2110 ResponseType r = (ResponseType) add_route_dialog->run ();
2112 add_route_dialog->hide();
2115 case RESPONSE_ACCEPT:
2122 if ((count = add_route_dialog->count()) <= 0) {
2126 uint32_t input_chan = add_route_dialog->channels ();
2127 uint32_t output_chan;
2128 string name_template = add_route_dialog->name_template ();
2129 bool track = add_route_dialog->track ();
2131 AutoConnectOption oac = Config->get_output_auto_connect();
2133 if (oac & AutoConnectMaster) {
2134 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2136 output_chan = input_chan;
2139 /* XXX do something with name template */
2142 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
2144 session_add_audio_bus (input_chan, output_chan, count);
2149 ARDOUR_UI::mixer_settings () const
2154 node = session->instant_xml(X_("Mixer"), session->path());
2156 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2160 node = new XMLNode (X_("Mixer"));
2167 ARDOUR_UI::editor_settings () const
2172 node = session->instant_xml(X_("Editor"), session->path());
2174 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2178 node = new XMLNode (X_("Editor"));
2184 ARDOUR_UI::keyboard_settings () const
2188 node = Config->extra_xml(X_("Keyboard"));
2191 node = new XMLNode (X_("Keyboard"));
2197 ARDOUR_UI::halt_on_xrun_message ()
2199 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2201 MessageDialog msg (*editor,
2202 _("Recording was stopped because your system could not keep up."));
2207 ARDOUR_UI::disk_overrun_handler ()
2209 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2211 if (!have_disk_overrun_displayed) {
2212 have_disk_overrun_displayed = true;
2213 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2214 The disk system on your computer\n\
2215 was not able to keep up with Ardour.\n\
2217 Specifically, it failed to write data to disk\n\
2218 quickly enough to keep up with recording.\n"));
2220 have_disk_overrun_displayed = false;
2225 ARDOUR_UI::disk_underrun_handler ()
2227 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2229 if (!have_disk_underrun_displayed) {
2230 have_disk_underrun_displayed = true;
2231 MessageDialog msg (*editor,
2232 (_("The disk system on your computer\n\
2233 was not able to keep up with Ardour.\n\
2235 Specifically, it failed to read data from disk\n\
2236 quickly enough to keep up with playback.\n")));
2238 have_disk_underrun_displayed = false;
2243 ARDOUR_UI::disk_underrun_message_gone ()
2245 have_disk_underrun_displayed = false;
2249 ARDOUR_UI::disk_overrun_message_gone ()
2251 have_disk_underrun_displayed = false;
2255 ARDOUR_UI::pending_state_dialog ()
2257 ArdourDialog dialog ("pending state dialog");
2259 This session appears to have been in\n\
2260 middle of recording when ardour or\n\
2261 the computer was shutdown.\n\
2263 Ardour can recover any captured audio for\n\
2264 you, or it can ignore it. Please decide\n\
2265 what you would like to do.\n"));
2267 dialog.get_vbox()->pack_start (message);
2268 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2269 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2271 dialog.set_position (WIN_POS_CENTER);
2274 switch (dialog.run ()) {
2275 case RESPONSE_ACCEPT:
2283 ARDOUR_UI::disconnect_from_jack ()
2286 if( engine->disconnect_from_jack ()) {
2287 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2291 update_sample_rate (0);
2296 ARDOUR_UI::reconnect_to_jack ()
2299 if (engine->reconnect_to_jack ()) {
2300 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2304 update_sample_rate (0);
2309 ARDOUR_UI::set_jack_buffer_size (nframes_t nframes)
2311 engine->request_buffer_size (nframes);
2312 update_sample_rate (0);
2316 ARDOUR_UI::cmdline_new_session (string path)
2318 if (path[0] != '/') {
2319 char buf[PATH_MAX+1];
2322 getcwd (buf, sizeof (buf));
2331 _will_create_new_session_automatically = false; /* done it */
2332 return FALSE; /* don't call it again */
2336 ARDOUR_UI::use_config ()
2338 Glib::RefPtr<Action> act;
2340 switch (Config->get_native_file_data_format ()) {
2342 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2345 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2350 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2351 ract->set_active ();
2354 switch (Config->get_native_file_header_format ()) {
2356 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2359 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2362 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2365 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2368 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2371 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2374 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2379 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2380 ract->set_active ();
2385 ARDOUR_UI::update_transport_clocks (nframes_t pos)
2387 primary_clock.set (pos);
2388 secondary_clock.set (pos);
2390 if (big_clock_window) {
2391 big_clock.set (pos);
2396 ARDOUR_UI::record_state_changed ()
2398 if (!session || !big_clock_window) {
2399 /* why bother - the clock isn't visible */
2403 switch (session->record_status()) {
2404 case Session::Recording:
2405 big_clock.set_name ("BigClockRecording");
2408 big_clock.set_name ("BigClockNonRecording");
2414 ARDOUR_UI::set_keybindings_path (string path)
2416 keybindings_path = path;
2420 ARDOUR_UI::save_keybindings ()
2422 if (can_save_keybindings) {
2423 AccelMap::save (keybindings_path);
2428 ARDOUR_UI::first_idle ()
2430 can_save_keybindings = true;
2435 ARDOUR_UI::store_clock_modes ()
2437 XMLNode* node = new XMLNode(X_("ClockModes"));
2439 node->add_property (X_("primary"), enum_2_string (primary_clock.mode()));
2440 node->add_property (X_("secondary"), enum_2_string (secondary_clock.mode()));
2442 session->add_extra_xml (*node);
2443 session->set_dirty ();
2447 ARDOUR_UI::restore_clock_modes ()
2450 XMLNode * node = session->extra_xml (X_("ClockModes"));
2451 AudioClock::Mode mode;
2454 if ((prop = node->property ("primary")) != 0) {
2455 mode = AudioClock::Mode (string_2_enum (prop->value(), mode));
2456 primary_clock.set_mode (mode);
2459 if ((prop = node->property ("secondary")) != 0) {
2460 mode = AudioClock::Mode (string_2_enum (prop->value(), mode));
2461 secondary_clock.set_mode (mode);