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;
1801 x = unload_session ();
1809 /* if it already exists, we must have write access */
1811 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1812 MessageDialog msg (*editor, _("You do not have write access to this session.\n"
1813 "This prevents the session from being loaded."));
1819 new_session = new Session (*engine, path, snap_name, mix_template);
1824 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1828 connect_to_session (new_session);
1830 Config->set_current_owner (ConfigVariableBase::Interface);
1832 session_loaded = true;
1834 goto_editor_window ();
1837 session->set_clean ();
1844 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1845 uint32_t control_channels,
1846 uint32_t master_channels,
1847 AutoConnectOption input_connect,
1848 AutoConnectOption output_connect,
1851 nframes_t initial_length)
1853 Session *new_session;
1856 session_loaded = false;
1857 x = unload_session ();
1864 _session_is_new = true;
1867 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1868 control_channels, master_channels, nphysin, nphysout, initial_length);
1873 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1877 connect_to_session (new_session);
1879 session_loaded = true;
1887 editor->show_window ();
1898 ARDOUR_UI::show_splash ()
1901 about = new About();
1902 about->signal_response().connect(mem_fun (*this, &ARDOUR_UI::about_signal_response) );
1909 ARDOUR_UI::about_signal_response(int response)
1915 ARDOUR_UI::hide_splash ()
1918 about->get_window()->set_cursor ();
1924 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1928 removed = rep.paths.size();
1931 MessageDialog msgd (*editor,
1932 _("No audio files were ready for cleanup"),
1935 (Gtk::ButtonsType)(Gtk::BUTTONS_OK) );
1936 msgd.set_secondary_text (_("If this seems suprising, \n\
1937 check for any existing snapshots.\n\
1938 These may still include regions that\n\
1939 require some unused files to continue to exist."));
1945 ArdourDialog results (_("ardour: cleanup"), true, false);
1947 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1948 CleanupResultsModelColumns() {
1952 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1953 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1957 CleanupResultsModelColumns results_columns;
1958 Glib::RefPtr<Gtk::ListStore> results_model;
1959 Gtk::TreeView results_display;
1961 results_model = ListStore::create (results_columns);
1962 results_display.set_model (results_model);
1963 results_display.append_column (list_title, results_columns.visible_name);
1965 results_display.set_name ("CleanupResultsList");
1966 results_display.set_headers_visible (true);
1967 results_display.set_headers_clickable (false);
1968 results_display.set_reorderable (false);
1970 Gtk::ScrolledWindow list_scroller;
1973 Gtk::HBox dhbox; // the hbox for the image and text
1974 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1975 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1977 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1979 if (rep.space < 1048576.0f) {
1981 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1983 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1987 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1989 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1993 dhbox.pack_start (*dimage, true, false, 5);
1994 dhbox.pack_start (txt, true, false, 5);
1996 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1997 TreeModel::Row row = *(results_model->append());
1998 row[results_columns.visible_name] = *i;
1999 row[results_columns.fullpath] = *i;
2002 list_scroller.add (results_display);
2003 list_scroller.set_size_request (-1, 150);
2004 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2006 dvbox.pack_start (dhbox, true, false, 5);
2007 dvbox.pack_start (list_scroller, true, false, 5);
2008 ddhbox.pack_start (dvbox, true, false, 5);
2010 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2011 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2012 results.set_default_response (RESPONSE_CLOSE);
2013 results.set_position (Gtk::WIN_POS_MOUSE);
2014 results.show_all_children ();
2015 results.set_resizable (false);
2022 ARDOUR_UI::cleanup ()
2025 /* shouldn't happen: menu item is insensitive */
2030 MessageDialog checker (_("Are you sure you want to cleanup?"),
2032 Gtk::MESSAGE_QUESTION,
2033 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2035 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2036 ALL undo/redo information will be lost if you cleanup.\n\
2037 After cleanup, unused audio files will be moved to a \
2038 \"dead sounds\" location."));
2040 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2041 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2042 checker.set_default_response (RESPONSE_CANCEL);
2044 checker.set_name (_("CleanupDialog"));
2045 checker.set_wmclass (X_("ardour_cleanup"), "Ardour");
2046 checker.set_position (Gtk::WIN_POS_MOUSE);
2048 switch (checker.run()) {
2049 case RESPONSE_ACCEPT:
2055 Session::cleanup_report rep;
2057 editor->prepare_for_cleanup ();
2059 if (session->cleanup_sources (rep)) {
2063 display_cleanup_results (rep,
2066 The following %1 %2 not in use and \n\
2067 have been moved to:\n\
2069 Flushing the wastebasket will \n\
2070 release an additional\n\
2071 %4 %5bytes of disk space.\n"
2076 ARDOUR_UI::flush_trash ()
2079 /* shouldn't happen: menu item is insensitive */
2083 Session::cleanup_report rep;
2085 if (session->cleanup_trash_sources (rep)) {
2089 display_cleanup_results (rep,
2091 _("The following %1 %2 deleted from\n\
2093 releasing %4 %5bytes of disk space"));
2097 ARDOUR_UI::add_route ()
2105 if (add_route_dialog == 0) {
2106 add_route_dialog = new AddRouteDialog;
2107 editor->ensure_float (*add_route_dialog);
2110 if (add_route_dialog->is_visible()) {
2111 /* we're already doing this */
2115 ResponseType r = (ResponseType) add_route_dialog->run ();
2117 add_route_dialog->hide();
2120 case RESPONSE_ACCEPT:
2127 if ((count = add_route_dialog->count()) <= 0) {
2131 uint32_t input_chan = add_route_dialog->channels ();
2132 uint32_t output_chan;
2133 string name_template = add_route_dialog->name_template ();
2134 bool track = add_route_dialog->track ();
2136 AutoConnectOption oac = Config->get_output_auto_connect();
2138 if (oac & AutoConnectMaster) {
2139 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2141 output_chan = input_chan;
2144 /* XXX do something with name template */
2147 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
2149 session_add_audio_bus (input_chan, output_chan, count);
2154 ARDOUR_UI::mixer_settings () const
2159 node = session->instant_xml(X_("Mixer"), session->path());
2161 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2165 node = new XMLNode (X_("Mixer"));
2172 ARDOUR_UI::editor_settings () const
2177 node = session->instant_xml(X_("Editor"), session->path());
2179 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2183 node = new XMLNode (X_("Editor"));
2189 ARDOUR_UI::keyboard_settings () const
2193 node = Config->extra_xml(X_("Keyboard"));
2196 node = new XMLNode (X_("Keyboard"));
2202 ARDOUR_UI::halt_on_xrun_message ()
2204 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2206 MessageDialog msg (*editor,
2207 _("Recording was stopped because your system could not keep up."));
2212 ARDOUR_UI::disk_overrun_handler ()
2214 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2216 if (!have_disk_overrun_displayed) {
2217 have_disk_overrun_displayed = true;
2218 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2219 The disk system on your computer\n\
2220 was not able to keep up with Ardour.\n\
2222 Specifically, it failed to write data to disk\n\
2223 quickly enough to keep up with recording.\n"));
2225 have_disk_overrun_displayed = false;
2230 ARDOUR_UI::disk_underrun_handler ()
2232 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2234 if (!have_disk_underrun_displayed) {
2235 have_disk_underrun_displayed = true;
2236 MessageDialog msg (*editor,
2237 (_("The disk system on your computer\n\
2238 was not able to keep up with Ardour.\n\
2240 Specifically, it failed to read data from disk\n\
2241 quickly enough to keep up with playback.\n")));
2243 have_disk_underrun_displayed = false;
2248 ARDOUR_UI::disk_underrun_message_gone ()
2250 have_disk_underrun_displayed = false;
2254 ARDOUR_UI::disk_overrun_message_gone ()
2256 have_disk_underrun_displayed = false;
2260 ARDOUR_UI::pending_state_dialog ()
2262 ArdourDialog dialog ("pending state dialog");
2264 This session appears to have been in\n\
2265 middle of recording when ardour or\n\
2266 the computer was shutdown.\n\
2268 Ardour can recover any captured audio for\n\
2269 you, or it can ignore it. Please decide\n\
2270 what you would like to do.\n"));
2272 dialog.get_vbox()->pack_start (message);
2273 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2274 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2276 dialog.set_position (WIN_POS_CENTER);
2279 switch (dialog.run ()) {
2280 case RESPONSE_ACCEPT:
2288 ARDOUR_UI::disconnect_from_jack ()
2291 if( engine->disconnect_from_jack ()) {
2292 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2296 update_sample_rate (0);
2301 ARDOUR_UI::reconnect_to_jack ()
2304 if (engine->reconnect_to_jack ()) {
2305 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2309 update_sample_rate (0);
2314 ARDOUR_UI::set_jack_buffer_size (nframes_t nframes)
2316 engine->request_buffer_size (nframes);
2317 update_sample_rate (0);
2321 ARDOUR_UI::cmdline_new_session (string path)
2323 if (path[0] != '/') {
2324 char buf[PATH_MAX+1];
2327 getcwd (buf, sizeof (buf));
2336 _will_create_new_session_automatically = false; /* done it */
2337 return FALSE; /* don't call it again */
2341 ARDOUR_UI::use_config ()
2343 Glib::RefPtr<Action> act;
2345 switch (Config->get_native_file_data_format ()) {
2347 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2350 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2355 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2356 ract->set_active ();
2359 switch (Config->get_native_file_header_format ()) {
2361 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2364 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2367 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2370 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2373 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2376 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2379 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2384 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2385 ract->set_active ();
2390 ARDOUR_UI::update_transport_clocks (nframes_t pos)
2392 primary_clock.set (pos);
2393 secondary_clock.set (pos);
2395 if (big_clock_window) {
2396 big_clock.set (pos);
2401 ARDOUR_UI::record_state_changed ()
2403 if (!session || !big_clock_window) {
2404 /* why bother - the clock isn't visible */
2408 switch (session->record_status()) {
2409 case Session::Recording:
2410 big_clock.set_widget_name ("BigClockRecording");
2413 big_clock.set_widget_name ("BigClockNonRecording");
2419 ARDOUR_UI::set_keybindings_path (string path)
2421 keybindings_path = path;
2425 ARDOUR_UI::save_keybindings ()
2427 if (can_save_keybindings) {
2428 AccelMap::save (keybindings_path);
2433 ARDOUR_UI::first_idle ()
2435 can_save_keybindings = true;
2440 ARDOUR_UI::store_clock_modes ()
2442 XMLNode* node = new XMLNode(X_("ClockModes"));
2444 for (vector<AudioClock*>::iterator x = AudioClock::clocks.begin(); x != AudioClock::clocks.end(); ++x) {
2445 node->add_property ((*x)->name().c_str(), enum_2_string ((*x)->mode()));
2448 session->add_extra_xml (*node);
2449 session->set_dirty ();