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_("primary"), false, X_("TransportClockDisplay"), true, false, true),
97 secondary_clock (X_("secondary"), false, X_("SecondaryClockDisplay"), true, false, true),
98 preroll_clock (X_("preroll"), false, X_("PreRollClock"), true, true),
99 postroll_clock (X_("postroll"), false, X_("PostRollClock"), true, true),
103 adjuster_table (3, 3),
107 preroll_button (_("pre\nroll")),
108 postroll_button (_("post\nroll")),
112 big_clock (X_("bigclock"), false, "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 /* set default clock modes */
253 primary_clock.set_mode (AudioClock::SMPTE);
254 secondary_clock.set_mode (AudioClock::BBT);
256 /* start the time-of-day-clock */
258 update_wall_clock ();
259 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
261 update_disk_space ();
263 update_sample_rate (engine->frame_rate());
265 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
266 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
269 ARDOUR_UI::~ARDOUR_UI ()
271 save_ardour_state ();
285 if (add_route_dialog) {
286 delete add_route_dialog;
289 AudioSource::stop_peak_thread ();
293 ARDOUR_UI::configure_timeout ()
298 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
299 /* no configure events yet */
303 gettimeofday (&now, 0);
304 timersub (&now, &last_configure_time, &diff);
306 /* force a gap of 0.5 seconds since the last configure event
309 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
312 have_configure_timeout = false;
313 save_ardour_state ();
319 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
321 if (have_configure_timeout) {
322 gettimeofday (&last_configure_time, 0);
324 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
325 have_configure_timeout = true;
332 ARDOUR_UI::save_ardour_state ()
334 if (!keyboard || !mixer || !editor) {
338 /* XXX this is all a bit dubious. add_extra_xml() uses
339 a different lifetime model from add_instant_xml().
342 XMLNode* node = new XMLNode (keyboard->get_state());
343 Config->add_extra_xml (*node);
344 Config->save_state();
346 XMLNode enode(static_cast<Stateful*>(editor)->get_state());
347 XMLNode mnode(mixer->get_state());
350 session->add_instant_xml (enode, session->path());
351 session->add_instant_xml (mnode, session->path());
353 Config->add_instant_xml (enode, get_user_ardour_path());
354 Config->add_instant_xml (mnode, get_user_ardour_path());
361 ARDOUR_UI::startup ()
369 if (session && session->dirty()) {
370 switch (ask_about_saving_session(_("quit"))) {
375 /* use the default name */
376 if (save_state_canfail ("")) {
377 /* failed - don't quit */
378 MessageDialog msg (*editor,
380 Ardour was unable to save your session.\n\n\
381 If you still wish to quit, please use the\n\n\
382 \"Just quit\" option."));
393 session->set_deletion_in_progress ();
396 Config->save_state();
401 ARDOUR_UI::ask_about_saving_session (const string & what)
403 ArdourDialog window (_("ardour: save session?"));
404 Gtk::HBox dhbox; // the hbox for the image and text
405 Gtk::Label prompt_label;
406 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
410 msg = string_compose(_("Don't %1"), what);
411 window.add_button (msg, RESPONSE_REJECT);
412 msg = string_compose(_("Just %1"), what);
413 window.add_button (msg, RESPONSE_APPLY);
414 msg = string_compose(_("Save and %1"), what);
415 window.add_button (msg, RESPONSE_ACCEPT);
417 window.set_default_response (RESPONSE_ACCEPT);
419 Gtk::Button noquit_button (msg);
420 noquit_button.set_name ("EditorGTKButton");
425 if (session->snap_name() == session->name()) {
428 type = _("snapshot");
430 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?"),
431 type, session->snap_name());
433 prompt_label.set_text (prompt);
434 prompt_label.set_name (X_("PrompterLabel"));
435 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
437 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
439 dhbox.set_homogeneous (false);
440 dhbox.pack_start (*dimage, false, false, 5);
441 dhbox.pack_start (prompt_label, true, false, 5);
442 window.get_vbox()->pack_start (dhbox);
444 window.set_name (_("Prompter"));
445 window.set_position (Gtk::WIN_POS_MOUSE);
446 window.set_modal (true);
447 window.set_resizable (false);
450 save_the_session = 0;
452 window.set_keep_above (true);
455 ResponseType r = (ResponseType) window.run();
460 case RESPONSE_ACCEPT: // save and get out of here
462 case RESPONSE_APPLY: // get out of here
472 ARDOUR_UI::every_second ()
475 update_buffer_load ();
476 update_disk_space ();
481 ARDOUR_UI::every_point_one_seconds ()
483 update_speed_display ();
484 RapidScreenUpdate(); /* EMIT_SIGNAL */
489 ARDOUR_UI::every_point_zero_one_seconds ()
491 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
496 ARDOUR_UI::update_sample_rate (nframes_t ignored)
500 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
502 if (!engine->connected()) {
504 snprintf (buf, sizeof (buf), _("disconnected"));
508 nframes_t rate = engine->frame_rate();
510 if (fmod (rate, 1000.0) != 0.0) {
511 snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"),
512 (float) rate/1000.0f,
513 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
515 snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"),
517 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
521 sample_rate_label.set_text (buf);
525 ARDOUR_UI::update_cpu_load ()
528 snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
529 cpu_load_label.set_text (buf);
533 ARDOUR_UI::update_buffer_load ()
538 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
539 session->playback_load(), session->capture_load());
540 buffer_load_label.set_text (buf);
542 buffer_load_label.set_text ("");
547 ARDOUR_UI::count_recenabled_streams (Route& route)
549 Track* track = dynamic_cast<Track*>(&route);
550 if (track && track->diskstream()->record_enabled()) {
551 rec_enabled_streams += track->n_inputs();
556 ARDOUR_UI::update_disk_space()
562 nframes_t frames = session->available_capture_duration();
565 if (frames == max_frames) {
566 strcpy (buf, _("Disk: 24hrs+"));
571 nframes_t fr = session->frame_rate();
573 rec_enabled_streams = 0;
574 session->foreach_route (this, &ARDOUR_UI::count_recenabled_streams);
576 if (rec_enabled_streams) {
577 frames /= rec_enabled_streams;
580 hrs = frames / (fr * 3600);
581 frames -= hrs * fr * 3600;
582 mins = frames / (fr * 60);
583 frames -= mins * fr * 60;
586 snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
589 disk_space_label.set_text (buf);
593 ARDOUR_UI::update_wall_clock ()
600 tm_now = localtime (&now);
602 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
603 wall_clock_label.set_text (buf);
608 ARDOUR_UI::control_methods_adjusted ()
613 which_method = (int) online_control_button->adjustment.get_value();
614 switch (which_method) {
616 allow_mmc_and_local ();
625 fatal << _("programming error: impossible control method") << endmsg;
631 ARDOUR_UI::mmc_device_id_adjusted ()
636 int dev_id = (int) mmc_id_button->adjustment.get_value();
637 mmc->set_device_id (dev_id);
643 ARDOUR_UI::session_menu (GdkEventButton *ev)
645 session_popup_menu->popup (0, 0);
650 ARDOUR_UI::redisplay_recent_sessions ()
652 vector<string *> *sessions;
653 vector<string *>::iterator i;
654 RecentSessionsSorter cmp;
656 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
657 recent_session_model->clear ();
660 ARDOUR::read_recent_sessions (rs);
663 recent_session_display.set_model (recent_session_model);
667 /* sort them alphabetically */
668 sort (rs.begin(), rs.end(), cmp);
669 sessions = new vector<string*>;
671 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
672 sessions->push_back (new string ((*i).second));
675 for (i = sessions->begin(); i != sessions->end(); ++i) {
677 vector<string*>* states;
678 vector<const gchar*> item;
679 string fullpath = *(*i);
681 /* remove any trailing / */
683 if (fullpath[fullpath.length()-1] == '/') {
684 fullpath = fullpath.substr (0, fullpath.length()-1);
687 /* now get available states for this session */
689 if ((states = Session::possible_states (fullpath)) == 0) {
694 TreeModel::Row row = *(recent_session_model->append());
696 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
697 row[recent_session_columns.fullpath] = fullpath;
699 if (states->size() > 1) {
701 /* add the children */
703 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
705 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
707 child_row[recent_session_columns.visible_name] = **i2;
708 child_row[recent_session_columns.fullpath] = fullpath;
717 recent_session_display.set_model (recent_session_model);
722 ARDOUR_UI::build_session_selector ()
724 session_selector_window = new ArdourDialog ("session selector");
726 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
728 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
729 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
730 session_selector_window->set_default_response (RESPONSE_ACCEPT);
731 recent_session_model = TreeStore::create (recent_session_columns);
732 recent_session_display.set_model (recent_session_model);
733 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
734 recent_session_display.set_headers_visible (false);
735 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
737 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
739 scroller->add (recent_session_display);
740 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
742 session_selector_window->set_name ("SessionSelectorWindow");
743 session_selector_window->set_size_request (200, 400);
744 session_selector_window->get_vbox()->pack_start (*scroller);
745 session_selector_window->show_all_children();
749 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
751 session_selector_window->response (RESPONSE_ACCEPT);
755 ARDOUR_UI::open_recent_session ()
757 /* popup selector window */
759 if (session_selector_window == 0) {
760 build_session_selector ();
763 redisplay_recent_sessions ();
765 ResponseType r = (ResponseType) session_selector_window->run ();
767 session_selector_window->hide();
770 case RESPONSE_ACCEPT:
776 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
778 if (i == recent_session_model->children().end()) {
782 Glib::ustring path = (*i)[recent_session_columns.fullpath];
783 Glib::ustring state = (*i)[recent_session_columns.visible_name];
785 _session_is_new = false;
787 load_session (path, state);
791 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
795 if (stat (info.filename.c_str(), &statbuf) != 0) {
799 if (!S_ISDIR(statbuf.st_mode)) {
805 string session_file = info.filename;
807 session_file += Glib::path_get_basename (info.filename);
808 session_file += ".ardour";
810 if (stat (session_file.c_str(), &statbuf) != 0) {
814 return S_ISREG (statbuf.st_mode);
818 ARDOUR_UI::open_session ()
820 /* popup selector window */
822 if (open_session_selector == 0) {
824 /* ardour sessions are folders */
826 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
827 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
828 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
830 FileFilter session_filter;
831 session_filter.add_pattern ("*.ardour");
832 session_filter.set_name (_("Ardour sessions"));
833 open_session_selector->add_filter (session_filter);
834 open_session_selector->set_filter (session_filter);
837 int response = open_session_selector->run();
838 open_session_selector->hide ();
841 case RESPONSE_ACCEPT:
844 open_session_selector->hide();
848 open_session_selector->hide();
849 string session_path = open_session_selector->get_filename();
853 if (session_path.length() > 0) {
854 if (Session::find_session (session_path, path, name, isnew) == 0) {
855 _session_is_new = isnew;
856 load_session (path, name);
863 ARDOUR_UI::session_add_midi_track ()
865 cerr << _("Patience is a virtue.\n");
869 ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many)
871 list<boost::shared_ptr<AudioTrack> > tracks;
872 Session::RouteList routes;
875 warning << _("You cannot add a track or bus without a session already loaded.") << endmsg;
881 tracks = session->new_audio_track (input_channels, output_channels, mode, how_many);
883 if (tracks.size() != how_many) {
885 error << _("could not create a new audio track") << endmsg;
887 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
893 routes = session->new_audio_route (input_channels, output_channels, how_many);
895 if (routes.size() != how_many) {
897 error << _("could not create a new audio track") << endmsg;
899 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
905 if (need_control_room_outs) {
911 route->set_stereo_control_outs (control_lr_channels);
912 route->control_outs()->set_stereo_pan (pans, this);
914 #endif /* CONTROLOUTS */
918 MessageDialog msg (*editor,
919 _("There are insufficient JACK ports available\n\
920 to create a new track or bus.\n\
921 You should save Ardour, exit and\n\
922 restart JACK with more ports."));
928 ARDOUR_UI::do_transport_locate (nframes_t new_position)
930 nframes_t _preroll = 0;
933 // XXX CONFIG_CHANGE FIX - requires AnyTime handling
934 // _preroll = session->convert_to_frames_at (new_position, Config->get_preroll());
936 if (new_position > _preroll) {
937 new_position -= _preroll;
942 session->request_locate (new_position);
947 ARDOUR_UI::transport_goto_start ()
950 session->goto_start();
953 /* force displayed area in editor to start no matter
954 what "follow playhead" setting is.
958 editor->reposition_x_origin (session->current_start_frame());
964 ARDOUR_UI::transport_goto_zero ()
967 session->request_locate (0);
970 /* force displayed area in editor to start no matter
971 what "follow playhead" setting is.
975 editor->reposition_x_origin (0);
981 ARDOUR_UI::transport_goto_end ()
984 nframes_t frame = session->current_end_frame();
985 session->request_locate (frame);
987 /* force displayed area in editor to start no matter
988 what "follow playhead" setting is.
992 editor->reposition_x_origin (frame);
998 ARDOUR_UI::transport_stop ()
1004 if (session->is_auditioning()) {
1005 session->cancel_audition ();
1009 if (session->get_play_loop ()) {
1010 session->request_play_loop (false);
1013 session->request_stop ();
1017 ARDOUR_UI::transport_stop_and_forget_capture ()
1020 session->request_stop (true);
1025 ARDOUR_UI::remove_last_capture()
1028 editor->remove_last_capture();
1033 ARDOUR_UI::transport_record ()
1036 switch (session->record_status()) {
1037 case Session::Disabled:
1038 if (session->ntracks() == 0) {
1039 MessageDialog msg (*editor, _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu."));
1043 session->maybe_enable_record ();
1045 case Session::Recording:
1046 case Session::Enabled:
1047 session->disable_record (true);
1053 ARDOUR_UI::transport_roll ()
1061 rolling = session->transport_rolling ();
1063 if (session->get_play_loop()) {
1064 session->request_play_loop (false);
1065 auto_loop_button.set_active (false);
1066 roll_button.set_active (true);
1067 } else if (session->get_play_range ()) {
1068 session->request_play_range (false);
1069 play_selection_button.set_active (false);
1070 } else if (rolling) {
1071 session->request_locate (session->last_transport_start(), true);
1074 session->request_transport_speed (1.0f);
1078 ARDOUR_UI::transport_loop()
1081 if (session->get_play_loop()) {
1082 if (session->transport_rolling()) {
1083 Location * looploc = session->locations()->auto_loop_location();
1085 session->request_locate (looploc->start(), true);
1090 session->request_play_loop (true);
1096 ARDOUR_UI::transport_play_selection ()
1102 if (!session->get_play_range()) {
1103 session->request_stop ();
1106 editor->play_selection ();
1110 ARDOUR_UI::transport_rewind (int option)
1112 float current_transport_speed;
1115 current_transport_speed = session->transport_speed();
1117 if (current_transport_speed >= 0.0f) {
1120 session->request_transport_speed (-1.0f);
1123 session->request_transport_speed (-4.0f);
1126 session->request_transport_speed (-0.5f);
1131 session->request_transport_speed (current_transport_speed * 1.5f);
1137 ARDOUR_UI::transport_forward (int option)
1139 float current_transport_speed;
1142 current_transport_speed = session->transport_speed();
1144 if (current_transport_speed <= 0.0f) {
1147 session->request_transport_speed (1.0f);
1150 session->request_transport_speed (4.0f);
1153 session->request_transport_speed (0.5f);
1158 session->request_transport_speed (current_transport_speed * 1.5f);
1164 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1170 boost::shared_ptr<Route> r;
1172 if ((r = session->route_by_remote_id (dstream)) != 0) {
1176 if ((t = dynamic_cast<Track*>(r.get())) != 0) {
1177 t->diskstream()->set_record_enabled (!t->diskstream()->record_enabled());
1186 ARDOUR_UI::queue_transport_change ()
1188 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1192 ARDOUR_UI::map_transport_state ()
1194 float sp = session->transport_speed();
1197 transport_rolling ();
1198 } else if (sp < 0.0f) {
1199 transport_rewinding ();
1200 } else if (sp > 0.0f) {
1201 transport_forwarding ();
1203 transport_stopped ();
1208 ARDOUR_UI::allow_local_only ()
1214 ARDOUR_UI::allow_mmc_only ()
1220 ARDOUR_UI::allow_mmc_and_local ()
1226 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1228 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1229 (int) adj.get_value()].c_str());
1233 ARDOUR_UI::engine_stopped ()
1235 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1236 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1237 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1241 ARDOUR_UI::engine_running ()
1243 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1244 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1245 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1249 ARDOUR_UI::engine_halted ()
1251 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1253 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1254 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1256 update_sample_rate (0);
1258 MessageDialog msg (*editor,
1260 JACK has either been shutdown or it\n\
1261 disconnected Ardour because Ardour\n\
1262 was not fast enough. You can save the\n\
1263 session and/or try to reconnect to JACK ."));
1268 ARDOUR_UI::do_engine_start ()
1276 error << _("Unable to start the session running")
1286 ARDOUR_UI::start_engine ()
1288 if (do_engine_start () == 0) {
1289 if (session && _session_is_new) {
1290 /* we need to retain initial visual
1291 settings for a new session
1293 session->save_state ("");
1301 ARDOUR_UI::update_clocks ()
1303 if (!editor || !editor->dragging_playhead()) {
1304 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1309 ARDOUR_UI::start_clocking ()
1311 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1315 ARDOUR_UI::stop_clocking ()
1317 clock_signal_connection.disconnect ();
1321 ARDOUR_UI::toggle_clocking ()
1324 if (clock_button.get_active()) {
1333 ARDOUR_UI::_blink (void *arg)
1336 ((ARDOUR_UI *) arg)->blink ();
1343 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1347 ARDOUR_UI::start_blinking ()
1349 /* Start the blink signal. Everybody with a blinking widget
1350 uses Blink to drive the widget's state.
1353 if (blink_timeout_tag < 0) {
1355 blink_timeout_tag = g_timeout_add (240, _blink, this);
1360 ARDOUR_UI::stop_blinking ()
1362 if (blink_timeout_tag >= 0) {
1363 g_source_remove (blink_timeout_tag);
1364 blink_timeout_tag = -1;
1369 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1375 if (io.n_inputs() == 0) {
1380 /* XXX we're not handling multiple ports yet. */
1382 const char **connections = io.input(0)->get_connections();
1384 if (connections == 0 || connections[0] == '\0') {
1387 buf = connections[0];
1394 if (io.n_outputs() == 0) {
1399 /* XXX we're not handling multiple ports yet. */
1401 const char **connections = io.output(0)->get_connections();
1403 if (connections == 0 || connections[0] == '\0') {
1406 buf = connections[0];
1414 ARDOUR_UI::snapshot_session ()
1416 ArdourPrompter prompter (true);
1423 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1425 prompter.set_name ("Prompter");
1426 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1427 prompter.set_prompt (_("Name of New Snapshot"));
1428 prompter.set_initial_text (now);
1430 switch (prompter.run()) {
1431 case RESPONSE_ACCEPT:
1432 prompter.get_result (snapname);
1433 if (snapname.length()){
1434 save_state (snapname);
1444 ARDOUR_UI::save_state (const string & name)
1446 (void) save_state_canfail (name);
1450 ARDOUR_UI::save_state_canfail (string name)
1455 if (name.length() == 0) {
1456 name = session->snap_name();
1459 if ((ret = session->save_state (name)) != 0) {
1463 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1468 ARDOUR_UI::restore_state (string name)
1471 if (name.length() == 0) {
1472 name = session->name();
1474 session->restore_state (name);
1479 ARDOUR_UI::primary_clock_value_changed ()
1482 session->request_locate (primary_clock.current_time ());
1487 ARDOUR_UI::secondary_clock_value_changed ()
1490 session->request_locate (secondary_clock.current_time ());
1495 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1497 if (session && dstream && dstream->record_enabled()) {
1499 Session::RecordState rs;
1501 rs = session->record_status ();
1504 case Session::Disabled:
1505 case Session::Enabled:
1506 if (w->get_state() != STATE_SELECTED) {
1507 w->set_state (STATE_SELECTED);
1511 case Session::Recording:
1512 if (w->get_state() != STATE_ACTIVE) {
1513 w->set_state (STATE_ACTIVE);
1519 if (w->get_state() != STATE_NORMAL) {
1520 w->set_state (STATE_NORMAL);
1526 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1532 switch (session->record_status()) {
1533 case Session::Enabled:
1535 rec_button.set_state (1);
1537 rec_button.set_state (0);
1541 case Session::Recording:
1542 rec_button.set_state (2);
1546 rec_button.set_state (0);
1552 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1560 ARDOUR_UI::start_keyboard_prefix ()
1562 keyboard->start_prefix();
1566 ARDOUR_UI::save_template ()
1569 ArdourPrompter prompter (true);
1572 prompter.set_name (X_("Prompter"));
1573 prompter.set_prompt (_("Name for mix template:"));
1574 prompter.set_initial_text(session->name() + _("-template"));
1575 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1577 switch (prompter.run()) {
1578 case RESPONSE_ACCEPT:
1579 prompter.get_result (name);
1581 if (name.length()) {
1582 session->save_template (name);
1592 ARDOUR_UI::new_session (std::string predetermined_path)
1594 string session_name;
1595 string session_path;
1597 int response = Gtk::RESPONSE_NONE;
1599 new_session_dialog->set_modal(true);
1600 new_session_dialog->set_name (predetermined_path);
1601 new_session_dialog->reset_recent();
1602 new_session_dialog->show();
1605 response = new_session_dialog->run ();
1607 _session_is_new = false;
1609 if (response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1614 new_session_dialog->hide ();
1617 } else if (response == Gtk::RESPONSE_NONE) {
1619 /* Clear was pressed */
1620 new_session_dialog->reset();
1622 } else if (response == Gtk::RESPONSE_YES) {
1624 /* YES == OPEN, but there's no enum for that */
1626 session_name = new_session_dialog->session_name();
1628 if (session_name.empty()) {
1629 response = Gtk::RESPONSE_NONE;
1633 if (session_name[0] == '/' ||
1634 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1635 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1636 load_session (Glib::path_get_dirname (session_name), session_name);
1638 session_path = new_session_dialog->session_folder();
1639 load_session (session_path, session_name);
1642 } else if (response == Gtk::RESPONSE_OK) {
1644 session_name = new_session_dialog->session_name();
1646 if (new_session_dialog->get_current_page() == 1) {
1648 /* XXX this is a bit of a hack..
1649 i really want the new sesion dialog to return RESPONSE_YES
1650 if we're on page 1 (the load page)
1651 Unfortunately i can't see how atm..
1654 if (session_name.empty()) {
1655 response = Gtk::RESPONSE_NONE;
1659 if (session_name[0] == '/' ||
1660 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1661 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1662 load_session (Glib::path_get_dirname (session_name), session_name);
1664 session_path = new_session_dialog->session_folder();
1665 load_session (session_path, session_name);
1670 if (session_name.empty()) {
1671 response = Gtk::RESPONSE_NONE;
1675 if (session_name[0] == '/' ||
1676 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1677 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1679 session_path = Glib::path_get_dirname (session_name);
1680 session_name = Glib::path_get_basename (session_name);
1684 session_path = new_session_dialog->session_folder();
1688 //XXX This is needed because session constructor wants a
1689 //non-existant path. hopefully this will be fixed at some point.
1691 session_path = Glib::build_filename (session_path, session_name);
1693 if (g_file_test (session_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) {
1695 Glib::ustring str = string_compose (_("This session\n%1\nalready exists. Do you want to open it?"), session_path);
1697 MessageDialog msg (str,
1699 Gtk::MESSAGE_WARNING,
1700 Gtk::BUTTONS_YES_NO,
1704 msg.set_name (X_("CleanupDialog"));
1705 msg.set_wmclass (X_("existing_session"), "Ardour");
1706 msg.set_position (Gtk::WIN_POS_MOUSE);
1708 switch (msg.run()) {
1710 load_session (session_path, session_name);
1714 response = RESPONSE_NONE;
1715 new_session_dialog->reset ();
1720 _session_is_new = true;
1722 std::string template_name = new_session_dialog->session_template_name();
1724 if (new_session_dialog->use_session_template()) {
1726 load_session (session_path, session_name, &template_name);
1732 AutoConnectOption iconnect;
1733 AutoConnectOption oconnect;
1735 if (new_session_dialog->create_control_bus()) {
1736 cchns = (uint32_t) new_session_dialog->control_channel_count();
1741 if (new_session_dialog->create_master_bus()) {
1742 mchns = (uint32_t) new_session_dialog->master_channel_count();
1747 if (new_session_dialog->connect_inputs()) {
1748 iconnect = AutoConnectPhysical;
1750 iconnect = AutoConnectOption (0);
1753 /// @todo some minor tweaks.
1755 if (new_session_dialog->connect_outs_to_master()) {
1756 oconnect = AutoConnectMaster;
1757 } else if (new_session_dialog->connect_outs_to_physical()) {
1758 oconnect = AutoConnectPhysical;
1760 oconnect = AutoConnectOption (0);
1763 uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
1764 uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count();
1766 build_session (session_path,
1774 engine->frame_rate() * 60 * 5);
1779 } while (response == Gtk::RESPONSE_NONE);
1783 new_session_dialog->get_window()->set_cursor();
1784 new_session_dialog->hide();
1788 ARDOUR_UI::close_session()
1795 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1797 Session *new_session;
1799 session_loaded = false;
1800 x = unload_session ();
1808 /* if it already exists, we must have write access */
1810 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1811 MessageDialog msg (*editor, _("You do not have write access to this session.\n"
1812 "This prevents the session from being loaded."));
1818 new_session = new Session (*engine, path, snap_name, mix_template);
1823 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1827 connect_to_session (new_session);
1829 Config->set_current_owner (ConfigVariableBase::Interface);
1831 session_loaded = true;
1833 goto_editor_window ();
1836 session->set_clean ();
1843 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1844 uint32_t control_channels,
1845 uint32_t master_channels,
1846 AutoConnectOption input_connect,
1847 AutoConnectOption output_connect,
1850 nframes_t initial_length)
1852 Session *new_session;
1855 session_loaded = false;
1856 x = unload_session ();
1863 _session_is_new = true;
1866 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1867 control_channels, master_channels, nphysin, nphysout, initial_length);
1872 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1876 connect_to_session (new_session);
1878 session_loaded = true;
1886 editor->show_window ();
1897 ARDOUR_UI::show_splash ()
1900 about = new About();
1901 about->signal_response().connect(mem_fun (*this, &ARDOUR_UI::about_signal_response) );
1908 ARDOUR_UI::about_signal_response(int response)
1914 ARDOUR_UI::hide_splash ()
1917 about->get_window()->set_cursor ();
1923 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1927 removed = rep.paths.size();
1930 MessageDialog msgd (*editor,
1931 _("No audio files were ready for cleanup"),
1934 (Gtk::ButtonsType)(Gtk::BUTTONS_OK) );
1935 msgd.set_secondary_text (_("If this seems suprising, \n\
1936 check for any existing snapshots.\n\
1937 These may still include regions that\n\
1938 require some unused files to continue to exist."));
1944 ArdourDialog results (_("ardour: cleanup"), true, false);
1946 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1947 CleanupResultsModelColumns() {
1951 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1952 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1956 CleanupResultsModelColumns results_columns;
1957 Glib::RefPtr<Gtk::ListStore> results_model;
1958 Gtk::TreeView results_display;
1960 results_model = ListStore::create (results_columns);
1961 results_display.set_model (results_model);
1962 results_display.append_column (list_title, results_columns.visible_name);
1964 results_display.set_name ("CleanupResultsList");
1965 results_display.set_headers_visible (true);
1966 results_display.set_headers_clickable (false);
1967 results_display.set_reorderable (false);
1969 Gtk::ScrolledWindow list_scroller;
1972 Gtk::HBox dhbox; // the hbox for the image and text
1973 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1974 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1976 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1978 if (rep.space < 1048576.0f) {
1980 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1982 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1986 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1988 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1992 dhbox.pack_start (*dimage, true, false, 5);
1993 dhbox.pack_start (txt, true, false, 5);
1995 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1996 TreeModel::Row row = *(results_model->append());
1997 row[results_columns.visible_name] = *i;
1998 row[results_columns.fullpath] = *i;
2001 list_scroller.add (results_display);
2002 list_scroller.set_size_request (-1, 150);
2003 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2005 dvbox.pack_start (dhbox, true, false, 5);
2006 dvbox.pack_start (list_scroller, true, false, 5);
2007 ddhbox.pack_start (dvbox, true, false, 5);
2009 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2010 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2011 results.set_default_response (RESPONSE_CLOSE);
2012 results.set_position (Gtk::WIN_POS_MOUSE);
2013 results.show_all_children ();
2014 results.set_resizable (false);
2021 ARDOUR_UI::cleanup ()
2024 /* shouldn't happen: menu item is insensitive */
2029 MessageDialog checker (_("Are you sure you want to cleanup?"),
2031 Gtk::MESSAGE_QUESTION,
2032 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2034 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2035 ALL undo/redo information will be lost if you cleanup.\n\
2036 After cleanup, unused audio files will be moved to a \
2037 \"dead sounds\" location."));
2039 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2040 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2041 checker.set_default_response (RESPONSE_CANCEL);
2043 checker.set_name (_("CleanupDialog"));
2044 checker.set_wmclass (X_("ardour_cleanup"), "Ardour");
2045 checker.set_position (Gtk::WIN_POS_MOUSE);
2047 switch (checker.run()) {
2048 case RESPONSE_ACCEPT:
2054 Session::cleanup_report rep;
2056 editor->prepare_for_cleanup ();
2058 if (session->cleanup_sources (rep)) {
2062 display_cleanup_results (rep,
2065 The following %1 %2 not in use and \n\
2066 have been moved to:\n\
2068 Flushing the wastebasket will \n\
2069 release an additional\n\
2070 %4 %5bytes of disk space.\n"
2075 ARDOUR_UI::flush_trash ()
2078 /* shouldn't happen: menu item is insensitive */
2082 Session::cleanup_report rep;
2084 if (session->cleanup_trash_sources (rep)) {
2088 display_cleanup_results (rep,
2090 _("The following %1 %2 deleted from\n\
2092 releasing %4 %5bytes of disk space"));
2096 ARDOUR_UI::add_route ()
2104 if (add_route_dialog == 0) {
2105 add_route_dialog = new AddRouteDialog;
2106 editor->ensure_float (*add_route_dialog);
2109 if (add_route_dialog->is_visible()) {
2110 /* we're already doing this */
2114 ResponseType r = (ResponseType) add_route_dialog->run ();
2116 add_route_dialog->hide();
2119 case RESPONSE_ACCEPT:
2126 if ((count = add_route_dialog->count()) <= 0) {
2130 uint32_t input_chan = add_route_dialog->channels ();
2131 uint32_t output_chan;
2132 string name_template = add_route_dialog->name_template ();
2133 bool track = add_route_dialog->track ();
2135 AutoConnectOption oac = Config->get_output_auto_connect();
2137 if (oac & AutoConnectMaster) {
2138 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2140 output_chan = input_chan;
2143 /* XXX do something with name template */
2146 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
2148 session_add_audio_bus (input_chan, output_chan, count);
2153 ARDOUR_UI::mixer_settings () const
2158 node = session->instant_xml(X_("Mixer"), session->path());
2160 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2164 node = new XMLNode (X_("Mixer"));
2171 ARDOUR_UI::editor_settings () const
2176 node = session->instant_xml(X_("Editor"), session->path());
2178 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2182 node = new XMLNode (X_("Editor"));
2188 ARDOUR_UI::keyboard_settings () const
2192 node = Config->extra_xml(X_("Keyboard"));
2195 node = new XMLNode (X_("Keyboard"));
2201 ARDOUR_UI::halt_on_xrun_message ()
2203 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2205 MessageDialog msg (*editor,
2206 _("Recording was stopped because your system could not keep up."));
2211 ARDOUR_UI::disk_overrun_handler ()
2213 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2215 if (!have_disk_overrun_displayed) {
2216 have_disk_overrun_displayed = true;
2217 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2218 The disk system on your computer\n\
2219 was not able to keep up with Ardour.\n\
2221 Specifically, it failed to write data to disk\n\
2222 quickly enough to keep up with recording.\n"));
2224 have_disk_overrun_displayed = false;
2229 ARDOUR_UI::disk_underrun_handler ()
2231 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2233 if (!have_disk_underrun_displayed) {
2234 have_disk_underrun_displayed = true;
2235 MessageDialog msg (*editor,
2236 (_("The disk system on your computer\n\
2237 was not able to keep up with Ardour.\n\
2239 Specifically, it failed to read data from disk\n\
2240 quickly enough to keep up with playback.\n")));
2242 have_disk_underrun_displayed = false;
2247 ARDOUR_UI::disk_underrun_message_gone ()
2249 have_disk_underrun_displayed = false;
2253 ARDOUR_UI::disk_overrun_message_gone ()
2255 have_disk_underrun_displayed = false;
2259 ARDOUR_UI::pending_state_dialog ()
2261 ArdourDialog dialog ("pending state dialog");
2263 This session appears to have been in\n\
2264 middle of recording when ardour or\n\
2265 the computer was shutdown.\n\
2267 Ardour can recover any captured audio for\n\
2268 you, or it can ignore it. Please decide\n\
2269 what you would like to do.\n"));
2271 dialog.get_vbox()->pack_start (message);
2272 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2273 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2275 dialog.set_position (WIN_POS_CENTER);
2278 switch (dialog.run ()) {
2279 case RESPONSE_ACCEPT:
2287 ARDOUR_UI::disconnect_from_jack ()
2290 if( engine->disconnect_from_jack ()) {
2291 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2295 update_sample_rate (0);
2300 ARDOUR_UI::reconnect_to_jack ()
2303 if (engine->reconnect_to_jack ()) {
2304 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2308 update_sample_rate (0);
2313 ARDOUR_UI::set_jack_buffer_size (nframes_t nframes)
2315 engine->request_buffer_size (nframes);
2316 update_sample_rate (0);
2320 ARDOUR_UI::cmdline_new_session (string path)
2322 if (path[0] != '/') {
2323 char buf[PATH_MAX+1];
2326 getcwd (buf, sizeof (buf));
2335 _will_create_new_session_automatically = false; /* done it */
2336 return FALSE; /* don't call it again */
2340 ARDOUR_UI::use_config ()
2342 Glib::RefPtr<Action> act;
2344 switch (Config->get_native_file_data_format ()) {
2346 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2349 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2354 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2355 ract->set_active ();
2358 switch (Config->get_native_file_header_format ()) {
2360 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2363 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2366 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2369 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2372 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2375 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2378 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2383 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2384 ract->set_active ();
2389 ARDOUR_UI::update_transport_clocks (nframes_t pos)
2391 primary_clock.set (pos);
2392 secondary_clock.set (pos);
2394 if (big_clock_window) {
2395 big_clock.set (pos);
2400 ARDOUR_UI::record_state_changed ()
2402 if (!session || !big_clock_window) {
2403 /* why bother - the clock isn't visible */
2407 switch (session->record_status()) {
2408 case Session::Recording:
2409 big_clock.set_name ("BigClockRecording");
2412 big_clock.set_name ("BigClockNonRecording");
2418 ARDOUR_UI::set_keybindings_path (string path)
2420 keybindings_path = path;
2424 ARDOUR_UI::save_keybindings ()
2426 if (can_save_keybindings) {
2427 AccelMap::save (keybindings_path);
2432 ARDOUR_UI::first_idle ()
2434 can_save_keybindings = true;
2439 ARDOUR_UI::store_clock_modes ()
2441 XMLNode* node = new XMLNode(X_("ClockModes"));
2443 for (vector<AudioClock*>::iterator x = AudioClock::clocks.begin(); x != AudioClock::clocks.end(); ++x) {
2444 node->add_property ((*x)->name().c_str(), enum_2_string ((*x)->mode()));
2447 session->add_extra_xml (*node);
2448 session->set_dirty ();