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 /* listen to clock mode changes */
253 AudioClock::ModeChanged.connect (mem_fun (*this, &ARDOUR_UI::store_clock_modes));
255 /* start the time-of-day-clock */
257 update_wall_clock ();
258 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
260 update_disk_space ();
262 update_sample_rate (engine->frame_rate());
264 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
265 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
268 ARDOUR_UI::~ARDOUR_UI ()
270 save_ardour_state ();
284 if (add_route_dialog) {
285 delete add_route_dialog;
288 AudioSource::stop_peak_thread ();
292 ARDOUR_UI::configure_timeout ()
297 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
298 /* no configure events yet */
302 gettimeofday (&now, 0);
303 timersub (&now, &last_configure_time, &diff);
305 /* force a gap of 0.5 seconds since the last configure event
308 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
311 have_configure_timeout = false;
312 save_ardour_state ();
318 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
320 if (have_configure_timeout) {
321 gettimeofday (&last_configure_time, 0);
323 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
324 have_configure_timeout = true;
331 ARDOUR_UI::save_ardour_state ()
333 if (!keyboard || !mixer || !editor) {
337 /* XXX this is all a bit dubious. add_extra_xml() uses
338 a different lifetime model from add_instant_xml().
341 XMLNode* node = new XMLNode (keyboard->get_state());
342 Config->add_extra_xml (*node);
343 Config->save_state();
345 XMLNode enode(static_cast<Stateful*>(editor)->get_state());
346 XMLNode mnode(mixer->get_state());
349 session->add_instant_xml (enode, session->path());
350 session->add_instant_xml (mnode, session->path());
352 Config->add_instant_xml (enode, get_user_ardour_path());
353 Config->add_instant_xml (mnode, get_user_ardour_path());
360 ARDOUR_UI::startup ()
368 if (session && session->dirty()) {
369 switch (ask_about_saving_session(_("quit"))) {
374 /* use the default name */
375 if (save_state_canfail ("")) {
376 /* failed - don't quit */
377 MessageDialog msg (*editor,
379 Ardour was unable to save your session.\n\n\
380 If you still wish to quit, please use the\n\n\
381 \"Just quit\" option."));
392 session->set_deletion_in_progress ();
395 Config->save_state();
400 ARDOUR_UI::ask_about_saving_session (const string & what)
402 ArdourDialog window (_("ardour: save session?"));
403 Gtk::HBox dhbox; // the hbox for the image and text
404 Gtk::Label prompt_label;
405 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
409 msg = string_compose(_("Don't %1"), what);
410 window.add_button (msg, RESPONSE_REJECT);
411 msg = string_compose(_("Just %1"), what);
412 window.add_button (msg, RESPONSE_APPLY);
413 msg = string_compose(_("Save and %1"), what);
414 window.add_button (msg, RESPONSE_ACCEPT);
416 window.set_default_response (RESPONSE_ACCEPT);
418 Gtk::Button noquit_button (msg);
419 noquit_button.set_name ("EditorGTKButton");
424 if (session->snap_name() == session->name()) {
427 type = _("snapshot");
429 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?"),
430 type, session->snap_name());
432 prompt_label.set_text (prompt);
433 prompt_label.set_name (X_("PrompterLabel"));
434 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
436 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
438 dhbox.set_homogeneous (false);
439 dhbox.pack_start (*dimage, false, false, 5);
440 dhbox.pack_start (prompt_label, true, false, 5);
441 window.get_vbox()->pack_start (dhbox);
443 window.set_name (_("Prompter"));
444 window.set_position (Gtk::WIN_POS_MOUSE);
445 window.set_modal (true);
446 window.set_resizable (false);
449 save_the_session = 0;
451 window.set_keep_above (true);
454 ResponseType r = (ResponseType) window.run();
459 case RESPONSE_ACCEPT: // save and get out of here
461 case RESPONSE_APPLY: // get out of here
471 ARDOUR_UI::every_second ()
474 update_buffer_load ();
475 update_disk_space ();
480 ARDOUR_UI::every_point_one_seconds ()
482 update_speed_display ();
483 RapidScreenUpdate(); /* EMIT_SIGNAL */
488 ARDOUR_UI::every_point_zero_one_seconds ()
490 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
495 ARDOUR_UI::update_sample_rate (nframes_t ignored)
499 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
501 if (!engine->connected()) {
503 snprintf (buf, sizeof (buf), _("disconnected"));
507 nframes_t rate = engine->frame_rate();
509 if (fmod (rate, 1000.0) != 0.0) {
510 snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"),
511 (float) rate/1000.0f,
512 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
514 snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"),
516 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
520 sample_rate_label.set_text (buf);
524 ARDOUR_UI::update_cpu_load ()
527 snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
528 cpu_load_label.set_text (buf);
532 ARDOUR_UI::update_buffer_load ()
537 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
538 session->playback_load(), session->capture_load());
539 buffer_load_label.set_text (buf);
541 buffer_load_label.set_text ("");
546 ARDOUR_UI::count_recenabled_streams (Route& route)
548 Track* track = dynamic_cast<Track*>(&route);
549 if (track && track->diskstream()->record_enabled()) {
550 rec_enabled_streams += track->n_inputs();
555 ARDOUR_UI::update_disk_space()
561 nframes_t frames = session->available_capture_duration();
564 if (frames == max_frames) {
565 strcpy (buf, _("Disk: 24hrs+"));
570 nframes_t fr = session->frame_rate();
572 rec_enabled_streams = 0;
573 session->foreach_route (this, &ARDOUR_UI::count_recenabled_streams);
575 if (rec_enabled_streams) {
576 frames /= rec_enabled_streams;
579 hrs = frames / (fr * 3600);
580 frames -= hrs * fr * 3600;
581 mins = frames / (fr * 60);
582 frames -= mins * fr * 60;
585 snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
588 disk_space_label.set_text (buf);
592 ARDOUR_UI::update_wall_clock ()
599 tm_now = localtime (&now);
601 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
602 wall_clock_label.set_text (buf);
607 ARDOUR_UI::control_methods_adjusted ()
612 which_method = (int) online_control_button->adjustment.get_value();
613 switch (which_method) {
615 allow_mmc_and_local ();
624 fatal << _("programming error: impossible control method") << endmsg;
630 ARDOUR_UI::mmc_device_id_adjusted ()
635 int dev_id = (int) mmc_id_button->adjustment.get_value();
636 mmc->set_device_id (dev_id);
642 ARDOUR_UI::session_menu (GdkEventButton *ev)
644 session_popup_menu->popup (0, 0);
649 ARDOUR_UI::redisplay_recent_sessions ()
651 vector<string *> *sessions;
652 vector<string *>::iterator i;
653 RecentSessionsSorter cmp;
655 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
656 recent_session_model->clear ();
659 ARDOUR::read_recent_sessions (rs);
662 recent_session_display.set_model (recent_session_model);
666 /* sort them alphabetically */
667 sort (rs.begin(), rs.end(), cmp);
668 sessions = new vector<string*>;
670 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
671 sessions->push_back (new string ((*i).second));
674 for (i = sessions->begin(); i != sessions->end(); ++i) {
676 vector<string*>* states;
677 vector<const gchar*> item;
678 string fullpath = *(*i);
680 /* remove any trailing / */
682 if (fullpath[fullpath.length()-1] == '/') {
683 fullpath = fullpath.substr (0, fullpath.length()-1);
686 /* now get available states for this session */
688 if ((states = Session::possible_states (fullpath)) == 0) {
693 TreeModel::Row row = *(recent_session_model->append());
695 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
696 row[recent_session_columns.fullpath] = fullpath;
698 if (states->size() > 1) {
700 /* add the children */
702 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
704 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
706 child_row[recent_session_columns.visible_name] = **i2;
707 child_row[recent_session_columns.fullpath] = fullpath;
716 recent_session_display.set_model (recent_session_model);
721 ARDOUR_UI::build_session_selector ()
723 session_selector_window = new ArdourDialog ("session selector");
725 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
727 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
728 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
729 session_selector_window->set_default_response (RESPONSE_ACCEPT);
730 recent_session_model = TreeStore::create (recent_session_columns);
731 recent_session_display.set_model (recent_session_model);
732 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
733 recent_session_display.set_headers_visible (false);
734 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
736 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
738 scroller->add (recent_session_display);
739 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
741 session_selector_window->set_name ("SessionSelectorWindow");
742 session_selector_window->set_size_request (200, 400);
743 session_selector_window->get_vbox()->pack_start (*scroller);
744 session_selector_window->show_all_children();
748 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
750 session_selector_window->response (RESPONSE_ACCEPT);
754 ARDOUR_UI::open_recent_session ()
756 /* popup selector window */
758 if (session_selector_window == 0) {
759 build_session_selector ();
762 redisplay_recent_sessions ();
764 ResponseType r = (ResponseType) session_selector_window->run ();
766 session_selector_window->hide();
769 case RESPONSE_ACCEPT:
775 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
777 if (i == recent_session_model->children().end()) {
781 Glib::ustring path = (*i)[recent_session_columns.fullpath];
782 Glib::ustring state = (*i)[recent_session_columns.visible_name];
784 _session_is_new = false;
786 load_session (path, state);
790 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
794 if (stat (info.filename.c_str(), &statbuf) != 0) {
798 if (!S_ISDIR(statbuf.st_mode)) {
804 string session_file = info.filename;
806 session_file += Glib::path_get_basename (info.filename);
807 session_file += ".ardour";
809 if (stat (session_file.c_str(), &statbuf) != 0) {
813 return S_ISREG (statbuf.st_mode);
817 ARDOUR_UI::open_session ()
819 /* popup selector window */
821 if (open_session_selector == 0) {
823 /* ardour sessions are folders */
825 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
826 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
827 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
829 FileFilter session_filter;
830 session_filter.add_pattern ("*.ardour");
831 session_filter.set_name (_("Ardour sessions"));
832 open_session_selector->add_filter (session_filter);
833 open_session_selector->set_filter (session_filter);
836 int response = open_session_selector->run();
837 open_session_selector->hide ();
840 case RESPONSE_ACCEPT:
843 open_session_selector->hide();
847 open_session_selector->hide();
848 string session_path = open_session_selector->get_filename();
852 if (session_path.length() > 0) {
853 if (Session::find_session (session_path, path, name, isnew) == 0) {
854 _session_is_new = isnew;
855 load_session (path, name);
862 ARDOUR_UI::session_add_midi_track ()
864 cerr << _("Patience is a virtue.\n");
868 ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many)
870 list<boost::shared_ptr<AudioTrack> > tracks;
871 Session::RouteList routes;
874 warning << _("You cannot add a track or bus without a session already loaded.") << endmsg;
880 tracks = session->new_audio_track (input_channels, output_channels, mode, how_many);
882 if (tracks.size() != how_many) {
884 error << _("could not create a new audio track") << endmsg;
886 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
892 routes = session->new_audio_route (input_channels, output_channels, how_many);
894 if (routes.size() != how_many) {
896 error << _("could not create a new audio track") << endmsg;
898 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
904 if (need_control_room_outs) {
910 route->set_stereo_control_outs (control_lr_channels);
911 route->control_outs()->set_stereo_pan (pans, this);
913 #endif /* CONTROLOUTS */
917 MessageDialog msg (*editor,
918 _("There are insufficient JACK ports available\n\
919 to create a new track or bus.\n\
920 You should save Ardour, exit and\n\
921 restart JACK with more ports."));
927 ARDOUR_UI::do_transport_locate (nframes_t new_position)
929 nframes_t _preroll = 0;
932 // XXX CONFIG_CHANGE FIX - requires AnyTime handling
933 // _preroll = session->convert_to_frames_at (new_position, Config->get_preroll());
935 if (new_position > _preroll) {
936 new_position -= _preroll;
941 session->request_locate (new_position);
946 ARDOUR_UI::transport_goto_start ()
949 session->goto_start();
952 /* force displayed area in editor to start no matter
953 what "follow playhead" setting is.
957 editor->reposition_x_origin (session->current_start_frame());
963 ARDOUR_UI::transport_goto_zero ()
966 session->request_locate (0);
969 /* force displayed area in editor to start no matter
970 what "follow playhead" setting is.
974 editor->reposition_x_origin (0);
980 ARDOUR_UI::transport_goto_end ()
983 nframes_t frame = session->current_end_frame();
984 session->request_locate (frame);
986 /* force displayed area in editor to start no matter
987 what "follow playhead" setting is.
991 editor->reposition_x_origin (frame);
997 ARDOUR_UI::transport_stop ()
1003 if (session->is_auditioning()) {
1004 session->cancel_audition ();
1008 if (session->get_play_loop ()) {
1009 session->request_play_loop (false);
1012 session->request_stop ();
1016 ARDOUR_UI::transport_stop_and_forget_capture ()
1019 session->request_stop (true);
1024 ARDOUR_UI::remove_last_capture()
1027 editor->remove_last_capture();
1032 ARDOUR_UI::transport_record ()
1035 switch (session->record_status()) {
1036 case Session::Disabled:
1037 if (session->ntracks() == 0) {
1038 MessageDialog msg (*editor, _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu."));
1042 session->maybe_enable_record ();
1044 case Session::Recording:
1045 case Session::Enabled:
1046 session->disable_record (true);
1052 ARDOUR_UI::transport_roll ()
1060 rolling = session->transport_rolling ();
1062 if (session->get_play_loop()) {
1063 session->request_play_loop (false);
1064 auto_loop_button.set_active (false);
1065 roll_button.set_active (true);
1066 } else if (session->get_play_range ()) {
1067 session->request_play_range (false);
1068 play_selection_button.set_active (false);
1069 } else if (rolling) {
1070 session->request_locate (session->last_transport_start(), true);
1073 session->request_transport_speed (1.0f);
1077 ARDOUR_UI::transport_loop()
1080 if (session->get_play_loop()) {
1081 if (session->transport_rolling()) {
1082 Location * looploc = session->locations()->auto_loop_location();
1084 session->request_locate (looploc->start(), true);
1089 session->request_play_loop (true);
1095 ARDOUR_UI::transport_play_selection ()
1101 if (!session->get_play_range()) {
1102 session->request_stop ();
1105 editor->play_selection ();
1109 ARDOUR_UI::transport_rewind (int option)
1111 float current_transport_speed;
1114 current_transport_speed = session->transport_speed();
1116 if (current_transport_speed >= 0.0f) {
1119 session->request_transport_speed (-1.0f);
1122 session->request_transport_speed (-4.0f);
1125 session->request_transport_speed (-0.5f);
1130 session->request_transport_speed (current_transport_speed * 1.5f);
1136 ARDOUR_UI::transport_forward (int option)
1138 float current_transport_speed;
1141 current_transport_speed = session->transport_speed();
1143 if (current_transport_speed <= 0.0f) {
1146 session->request_transport_speed (1.0f);
1149 session->request_transport_speed (4.0f);
1152 session->request_transport_speed (0.5f);
1157 session->request_transport_speed (current_transport_speed * 1.5f);
1163 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1169 boost::shared_ptr<Route> r;
1171 if ((r = session->route_by_remote_id (dstream)) != 0) {
1175 if ((t = dynamic_cast<Track*>(r.get())) != 0) {
1176 t->diskstream()->set_record_enabled (!t->diskstream()->record_enabled());
1185 ARDOUR_UI::queue_transport_change ()
1187 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1191 ARDOUR_UI::map_transport_state ()
1193 float sp = session->transport_speed();
1196 transport_rolling ();
1197 } else if (sp < 0.0f) {
1198 transport_rewinding ();
1199 } else if (sp > 0.0f) {
1200 transport_forwarding ();
1202 transport_stopped ();
1207 ARDOUR_UI::allow_local_only ()
1213 ARDOUR_UI::allow_mmc_only ()
1219 ARDOUR_UI::allow_mmc_and_local ()
1225 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1227 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1228 (int) adj.get_value()].c_str());
1232 ARDOUR_UI::engine_stopped ()
1234 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1235 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1236 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1240 ARDOUR_UI::engine_running ()
1242 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1243 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1244 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1248 ARDOUR_UI::engine_halted ()
1250 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1252 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1253 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1255 update_sample_rate (0);
1257 MessageDialog msg (*editor,
1259 JACK has either been shutdown or it\n\
1260 disconnected Ardour because Ardour\n\
1261 was not fast enough. You can save the\n\
1262 session and/or try to reconnect to JACK ."));
1267 ARDOUR_UI::do_engine_start ()
1275 error << _("Unable to start the session running")
1285 ARDOUR_UI::start_engine ()
1287 if (do_engine_start () == 0) {
1288 if (session && _session_is_new) {
1289 /* we need to retain initial visual
1290 settings for a new session
1292 session->save_state ("");
1300 ARDOUR_UI::update_clocks ()
1302 if (!editor || !editor->dragging_playhead()) {
1303 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1308 ARDOUR_UI::start_clocking ()
1310 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1314 ARDOUR_UI::stop_clocking ()
1316 clock_signal_connection.disconnect ();
1320 ARDOUR_UI::toggle_clocking ()
1323 if (clock_button.get_active()) {
1332 ARDOUR_UI::_blink (void *arg)
1335 ((ARDOUR_UI *) arg)->blink ();
1342 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1346 ARDOUR_UI::start_blinking ()
1348 /* Start the blink signal. Everybody with a blinking widget
1349 uses Blink to drive the widget's state.
1352 if (blink_timeout_tag < 0) {
1354 blink_timeout_tag = g_timeout_add (240, _blink, this);
1359 ARDOUR_UI::stop_blinking ()
1361 if (blink_timeout_tag >= 0) {
1362 g_source_remove (blink_timeout_tag);
1363 blink_timeout_tag = -1;
1368 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1374 if (io.n_inputs() == 0) {
1379 /* XXX we're not handling multiple ports yet. */
1381 const char **connections = io.input(0)->get_connections();
1383 if (connections == 0 || connections[0] == '\0') {
1386 buf = connections[0];
1393 if (io.n_outputs() == 0) {
1398 /* XXX we're not handling multiple ports yet. */
1400 const char **connections = io.output(0)->get_connections();
1402 if (connections == 0 || connections[0] == '\0') {
1405 buf = connections[0];
1413 ARDOUR_UI::snapshot_session ()
1415 ArdourPrompter prompter (true);
1422 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1424 prompter.set_name ("Prompter");
1425 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1426 prompter.set_prompt (_("Name of New Snapshot"));
1427 prompter.set_initial_text (now);
1429 switch (prompter.run()) {
1430 case RESPONSE_ACCEPT:
1431 prompter.get_result (snapname);
1432 if (snapname.length()){
1433 save_state (snapname);
1443 ARDOUR_UI::save_state (const string & name)
1445 (void) save_state_canfail (name);
1449 ARDOUR_UI::save_state_canfail (string name)
1454 if (name.length() == 0) {
1455 name = session->snap_name();
1458 if ((ret = session->save_state (name)) != 0) {
1462 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1467 ARDOUR_UI::restore_state (string name)
1470 if (name.length() == 0) {
1471 name = session->name();
1473 session->restore_state (name);
1478 ARDOUR_UI::primary_clock_value_changed ()
1481 session->request_locate (primary_clock.current_time ());
1486 ARDOUR_UI::secondary_clock_value_changed ()
1489 session->request_locate (secondary_clock.current_time ());
1494 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1496 if (session && dstream && dstream->record_enabled()) {
1498 Session::RecordState rs;
1500 rs = session->record_status ();
1503 case Session::Disabled:
1504 case Session::Enabled:
1505 if (w->get_state() != STATE_SELECTED) {
1506 w->set_state (STATE_SELECTED);
1510 case Session::Recording:
1511 if (w->get_state() != STATE_ACTIVE) {
1512 w->set_state (STATE_ACTIVE);
1518 if (w->get_state() != STATE_NORMAL) {
1519 w->set_state (STATE_NORMAL);
1525 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1531 switch (session->record_status()) {
1532 case Session::Enabled:
1534 rec_button.set_state (1);
1536 rec_button.set_state (0);
1540 case Session::Recording:
1541 rec_button.set_state (2);
1545 rec_button.set_state (0);
1551 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1559 ARDOUR_UI::start_keyboard_prefix ()
1561 keyboard->start_prefix();
1565 ARDOUR_UI::save_template ()
1568 ArdourPrompter prompter (true);
1571 prompter.set_name (X_("Prompter"));
1572 prompter.set_prompt (_("Name for mix template:"));
1573 prompter.set_initial_text(session->name() + _("-template"));
1574 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1576 switch (prompter.run()) {
1577 case RESPONSE_ACCEPT:
1578 prompter.get_result (name);
1580 if (name.length()) {
1581 session->save_template (name);
1591 ARDOUR_UI::new_session (std::string predetermined_path)
1593 string session_name;
1594 string session_path;
1596 int response = Gtk::RESPONSE_NONE;
1598 new_session_dialog->set_modal(true);
1599 new_session_dialog->set_name (predetermined_path);
1600 new_session_dialog->reset_recent();
1601 new_session_dialog->show();
1604 response = new_session_dialog->run ();
1606 _session_is_new = false;
1608 if (response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1613 new_session_dialog->hide ();
1616 } else if (response == Gtk::RESPONSE_NONE) {
1618 /* Clear was pressed */
1619 new_session_dialog->reset();
1621 } else if (response == Gtk::RESPONSE_YES) {
1623 /* YES == OPEN, but there's no enum for that */
1625 session_name = new_session_dialog->session_name();
1627 if (session_name.empty()) {
1628 response = Gtk::RESPONSE_NONE;
1632 if (session_name[0] == '/' ||
1633 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1634 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1635 load_session (Glib::path_get_dirname (session_name), session_name);
1637 session_path = new_session_dialog->session_folder();
1638 load_session (session_path, session_name);
1641 } else if (response == Gtk::RESPONSE_OK) {
1643 session_name = new_session_dialog->session_name();
1645 if (new_session_dialog->get_current_page() == 1) {
1647 /* XXX this is a bit of a hack..
1648 i really want the new sesion dialog to return RESPONSE_YES
1649 if we're on page 1 (the load page)
1650 Unfortunately i can't see how atm..
1653 if (session_name.empty()) {
1654 response = Gtk::RESPONSE_NONE;
1658 if (session_name[0] == '/' ||
1659 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1660 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1661 load_session (Glib::path_get_dirname (session_name), session_name);
1663 session_path = new_session_dialog->session_folder();
1664 load_session (session_path, session_name);
1669 if (session_name.empty()) {
1670 response = Gtk::RESPONSE_NONE;
1674 if (session_name[0] == '/' ||
1675 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1676 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1678 session_path = Glib::path_get_dirname (session_name);
1679 session_name = Glib::path_get_basename (session_name);
1683 session_path = new_session_dialog->session_folder();
1687 //XXX This is needed because session constructor wants a
1688 //non-existant path. hopefully this will be fixed at some point.
1690 session_path = Glib::build_filename (session_path, session_name);
1692 if (g_file_test (session_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) {
1694 Glib::ustring str = string_compose (_("This session\n%1\nalready exists. Do you want to open it?"), session_path);
1696 MessageDialog msg (str,
1698 Gtk::MESSAGE_WARNING,
1699 Gtk::BUTTONS_YES_NO,
1703 msg.set_name (X_("CleanupDialog"));
1704 msg.set_wmclass (X_("existing_session"), "Ardour");
1705 msg.set_position (Gtk::WIN_POS_MOUSE);
1707 switch (msg.run()) {
1709 load_session (session_path, session_name);
1713 response = RESPONSE_NONE;
1714 new_session_dialog->reset ();
1719 _session_is_new = true;
1721 std::string template_name = new_session_dialog->session_template_name();
1723 if (new_session_dialog->use_session_template()) {
1725 load_session (session_path, session_name, &template_name);
1731 AutoConnectOption iconnect;
1732 AutoConnectOption oconnect;
1734 if (new_session_dialog->create_control_bus()) {
1735 cchns = (uint32_t) new_session_dialog->control_channel_count();
1740 if (new_session_dialog->create_master_bus()) {
1741 mchns = (uint32_t) new_session_dialog->master_channel_count();
1746 if (new_session_dialog->connect_inputs()) {
1747 iconnect = AutoConnectPhysical;
1749 iconnect = AutoConnectOption (0);
1752 /// @todo some minor tweaks.
1754 if (new_session_dialog->connect_outs_to_master()) {
1755 oconnect = AutoConnectMaster;
1756 } else if (new_session_dialog->connect_outs_to_physical()) {
1757 oconnect = AutoConnectPhysical;
1759 oconnect = AutoConnectOption (0);
1762 uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
1763 uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count();
1765 build_session (session_path,
1773 engine->frame_rate() * 60 * 5);
1778 } while (response == Gtk::RESPONSE_NONE);
1782 new_session_dialog->get_window()->set_cursor();
1783 new_session_dialog->hide();
1787 ARDOUR_UI::close_session()
1794 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1796 Session *new_session;
1798 session_loaded = false;
1799 x = unload_session ();
1807 /* if it already exists, we must have write access */
1809 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1810 MessageDialog msg (*editor, _("You do not have write access to this session.\n"
1811 "This prevents the session from being loaded."));
1817 new_session = new Session (*engine, path, snap_name, mix_template);
1822 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1826 connect_to_session (new_session);
1828 Config->set_current_owner (ConfigVariableBase::Interface);
1830 session_loaded = true;
1832 goto_editor_window ();
1835 session->set_clean ();
1842 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1843 uint32_t control_channels,
1844 uint32_t master_channels,
1845 AutoConnectOption input_connect,
1846 AutoConnectOption output_connect,
1849 nframes_t initial_length)
1851 Session *new_session;
1854 session_loaded = false;
1855 x = unload_session ();
1862 _session_is_new = true;
1865 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1866 control_channels, master_channels, nphysin, nphysout, initial_length);
1871 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1875 connect_to_session (new_session);
1877 session_loaded = true;
1885 editor->show_window ();
1896 ARDOUR_UI::show_splash ()
1899 about = new About();
1900 about->signal_response().connect(mem_fun (*this, &ARDOUR_UI::about_signal_response) );
1907 ARDOUR_UI::about_signal_response(int response)
1913 ARDOUR_UI::hide_splash ()
1916 about->get_window()->set_cursor ();
1922 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1926 removed = rep.paths.size();
1929 MessageDialog msgd (*editor,
1930 _("No audio files were ready for cleanup"),
1933 (Gtk::ButtonsType)(Gtk::BUTTONS_OK) );
1934 msgd.set_secondary_text (_("If this seems suprising, \n\
1935 check for any existing snapshots.\n\
1936 These may still include regions that\n\
1937 require some unused files to continue to exist."));
1943 ArdourDialog results (_("ardour: cleanup"), true, false);
1945 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1946 CleanupResultsModelColumns() {
1950 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1951 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1955 CleanupResultsModelColumns results_columns;
1956 Glib::RefPtr<Gtk::ListStore> results_model;
1957 Gtk::TreeView results_display;
1959 results_model = ListStore::create (results_columns);
1960 results_display.set_model (results_model);
1961 results_display.append_column (list_title, results_columns.visible_name);
1963 results_display.set_name ("CleanupResultsList");
1964 results_display.set_headers_visible (true);
1965 results_display.set_headers_clickable (false);
1966 results_display.set_reorderable (false);
1968 Gtk::ScrolledWindow list_scroller;
1971 Gtk::HBox dhbox; // the hbox for the image and text
1972 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1973 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1975 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1977 if (rep.space < 1048576.0f) {
1979 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1981 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1985 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1987 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1991 dhbox.pack_start (*dimage, true, false, 5);
1992 dhbox.pack_start (txt, true, false, 5);
1994 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1995 TreeModel::Row row = *(results_model->append());
1996 row[results_columns.visible_name] = *i;
1997 row[results_columns.fullpath] = *i;
2000 list_scroller.add (results_display);
2001 list_scroller.set_size_request (-1, 150);
2002 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2004 dvbox.pack_start (dhbox, true, false, 5);
2005 dvbox.pack_start (list_scroller, true, false, 5);
2006 ddhbox.pack_start (dvbox, true, false, 5);
2008 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2009 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2010 results.set_default_response (RESPONSE_CLOSE);
2011 results.set_position (Gtk::WIN_POS_MOUSE);
2012 results.show_all_children ();
2013 results.set_resizable (false);
2020 ARDOUR_UI::cleanup ()
2023 /* shouldn't happen: menu item is insensitive */
2028 MessageDialog checker (_("Are you sure you want to cleanup?"),
2030 Gtk::MESSAGE_QUESTION,
2031 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2033 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2034 ALL undo/redo information will be lost if you cleanup.\n\
2035 After cleanup, unused audio files will be moved to a \
2036 \"dead sounds\" location."));
2038 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2039 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2040 checker.set_default_response (RESPONSE_CANCEL);
2042 checker.set_name (_("CleanupDialog"));
2043 checker.set_wmclass (X_("ardour_cleanup"), "Ardour");
2044 checker.set_position (Gtk::WIN_POS_MOUSE);
2046 switch (checker.run()) {
2047 case RESPONSE_ACCEPT:
2053 Session::cleanup_report rep;
2055 editor->prepare_for_cleanup ();
2057 if (session->cleanup_sources (rep)) {
2061 display_cleanup_results (rep,
2064 The following %1 %2 not in use and \n\
2065 have been moved to:\n\
2067 Flushing the wastebasket will \n\
2068 release an additional\n\
2069 %4 %5bytes of disk space.\n"
2074 ARDOUR_UI::flush_trash ()
2077 /* shouldn't happen: menu item is insensitive */
2081 Session::cleanup_report rep;
2083 if (session->cleanup_trash_sources (rep)) {
2087 display_cleanup_results (rep,
2089 _("The following %1 %2 deleted from\n\
2091 releasing %4 %5bytes of disk space"));
2095 ARDOUR_UI::add_route ()
2103 if (add_route_dialog == 0) {
2104 add_route_dialog = new AddRouteDialog;
2105 editor->ensure_float (*add_route_dialog);
2108 if (add_route_dialog->is_visible()) {
2109 /* we're already doing this */
2113 ResponseType r = (ResponseType) add_route_dialog->run ();
2115 add_route_dialog->hide();
2118 case RESPONSE_ACCEPT:
2125 if ((count = add_route_dialog->count()) <= 0) {
2129 uint32_t input_chan = add_route_dialog->channels ();
2130 uint32_t output_chan;
2131 string name_template = add_route_dialog->name_template ();
2132 bool track = add_route_dialog->track ();
2134 AutoConnectOption oac = Config->get_output_auto_connect();
2136 if (oac & AutoConnectMaster) {
2137 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2139 output_chan = input_chan;
2142 /* XXX do something with name template */
2145 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
2147 session_add_audio_bus (input_chan, output_chan, count);
2152 ARDOUR_UI::mixer_settings () const
2157 node = session->instant_xml(X_("Mixer"), session->path());
2159 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2163 node = new XMLNode (X_("Mixer"));
2170 ARDOUR_UI::editor_settings () const
2175 node = session->instant_xml(X_("Editor"), session->path());
2177 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2181 node = new XMLNode (X_("Editor"));
2187 ARDOUR_UI::keyboard_settings () const
2191 node = Config->extra_xml(X_("Keyboard"));
2194 node = new XMLNode (X_("Keyboard"));
2200 ARDOUR_UI::halt_on_xrun_message ()
2202 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2204 MessageDialog msg (*editor,
2205 _("Recording was stopped because your system could not keep up."));
2210 ARDOUR_UI::disk_overrun_handler ()
2212 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2214 if (!have_disk_overrun_displayed) {
2215 have_disk_overrun_displayed = true;
2216 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2217 The disk system on your computer\n\
2218 was not able to keep up with Ardour.\n\
2220 Specifically, it failed to write data to disk\n\
2221 quickly enough to keep up with recording.\n"));
2223 have_disk_overrun_displayed = false;
2228 ARDOUR_UI::disk_underrun_handler ()
2230 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2232 if (!have_disk_underrun_displayed) {
2233 have_disk_underrun_displayed = true;
2234 MessageDialog msg (*editor,
2235 (_("The disk system on your computer\n\
2236 was not able to keep up with Ardour.\n\
2238 Specifically, it failed to read data from disk\n\
2239 quickly enough to keep up with playback.\n")));
2241 have_disk_underrun_displayed = false;
2246 ARDOUR_UI::disk_underrun_message_gone ()
2248 have_disk_underrun_displayed = false;
2252 ARDOUR_UI::disk_overrun_message_gone ()
2254 have_disk_underrun_displayed = false;
2258 ARDOUR_UI::pending_state_dialog ()
2260 ArdourDialog dialog ("pending state dialog");
2262 This session appears to have been in\n\
2263 middle of recording when ardour or\n\
2264 the computer was shutdown.\n\
2266 Ardour can recover any captured audio for\n\
2267 you, or it can ignore it. Please decide\n\
2268 what you would like to do.\n"));
2270 dialog.get_vbox()->pack_start (message);
2271 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2272 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2274 dialog.set_position (WIN_POS_CENTER);
2277 switch (dialog.run ()) {
2278 case RESPONSE_ACCEPT:
2286 ARDOUR_UI::disconnect_from_jack ()
2289 if( engine->disconnect_from_jack ()) {
2290 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2294 update_sample_rate (0);
2299 ARDOUR_UI::reconnect_to_jack ()
2302 if (engine->reconnect_to_jack ()) {
2303 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2307 update_sample_rate (0);
2312 ARDOUR_UI::set_jack_buffer_size (nframes_t nframes)
2314 engine->request_buffer_size (nframes);
2315 update_sample_rate (0);
2319 ARDOUR_UI::cmdline_new_session (string path)
2321 if (path[0] != '/') {
2322 char buf[PATH_MAX+1];
2325 getcwd (buf, sizeof (buf));
2334 _will_create_new_session_automatically = false; /* done it */
2335 return FALSE; /* don't call it again */
2339 ARDOUR_UI::use_config ()
2341 Glib::RefPtr<Action> act;
2343 switch (Config->get_native_file_data_format ()) {
2345 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2348 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2353 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2354 ract->set_active ();
2357 switch (Config->get_native_file_header_format ()) {
2359 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2362 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2365 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2368 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2371 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2374 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2377 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2382 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2383 ract->set_active ();
2388 ARDOUR_UI::update_transport_clocks (nframes_t pos)
2390 primary_clock.set (pos);
2391 secondary_clock.set (pos);
2393 if (big_clock_window) {
2394 big_clock.set (pos);
2399 ARDOUR_UI::record_state_changed ()
2401 if (!session || !big_clock_window) {
2402 /* why bother - the clock isn't visible */
2406 switch (session->record_status()) {
2407 case Session::Recording:
2408 big_clock.set_name ("BigClockRecording");
2411 big_clock.set_name ("BigClockNonRecording");
2417 ARDOUR_UI::set_keybindings_path (string path)
2419 keybindings_path = path;
2423 ARDOUR_UI::save_keybindings ()
2425 if (can_save_keybindings) {
2426 AccelMap::save (keybindings_path);
2431 ARDOUR_UI::first_idle ()
2433 can_save_keybindings = true;
2438 ARDOUR_UI::store_clock_modes ()
2440 XMLNode* node = new XMLNode(X_("ClockModes"));
2442 for (vector<AudioClock*>::iterator x = AudioClock::clocks.begin(); x != AudioClock::clocks.end(); ++x) {
2443 node->add_property ((*x)->name().c_str(), enum_2_string ((*x)->mode()));
2446 session->add_extra_xml (*node);
2447 session->set_dirty ();