2 Copyright (C) 1999-2002 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
31 #include <gtkmm/messagedialog.h>
32 #include <gtkmm/accelmap.h>
34 #include <pbd/error.h>
35 #include <pbd/compose.h>
36 #include <pbd/pathscanner.h>
37 #include <pbd/failed_constructor.h>
38 #include <gtkmm2ext/gtk_ui.h>
39 #include <gtkmm2ext/utils.h>
40 #include <gtkmm2ext/click_box.h>
41 #include <gtkmm2ext/fastmeter.h>
42 #include <gtkmm2ext/stop_signal.h>
43 #include <gtkmm2ext/popup.h>
45 #include <midi++/port.h>
46 #include <midi++/mmc.h>
48 #include <ardour/ardour.h>
49 #include <ardour/port.h>
50 #include <ardour/audioengine.h>
51 #include <ardour/playlist.h>
52 #include <ardour/utils.h>
53 #include <ardour/audio_diskstream.h>
54 #include <ardour/audiofilesource.h>
55 #include <ardour/recent_sessions.h>
56 #include <ardour/session_diskstream.h>
57 #include <ardour/port.h>
58 #include <ardour/audio_track.h>
59 #include <ardour/midi_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,jack_nframes_t> ARDOUR_UI::Clock;
92 ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
94 : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile),
96 primary_clock (X_("TransportClockDisplay"), true, false, true),
97 secondary_clock (X_("SecondaryClockDisplay"), true, false, true),
98 preroll_clock (X_("PreRollClock"), true, true),
99 postroll_clock (X_("PostRollClock"), true, true),
103 adjuster_table (3, 3),
107 preroll_button (_("pre\nroll")),
108 postroll_button (_("post\nroll")),
112 big_clock ("BigClockDisplay", 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")),
131 using namespace Gtk::Menu_Helpers;
137 if (theArdourUI == 0) {
141 ActionManager::init ();
145 color_manager = new ColorManager();
147 std::string color_file = ARDOUR::find_config_file("ardour.colors");
149 color_manager->load (color_file);
151 m_new_session_dialog = new NewSessionDialog();
155 _session_is_new = false;
156 big_clock_window = 0;
157 session_selector_window = 0;
158 last_key_press_time = 0;
159 connection_editor = 0;
160 add_route_dialog = 0;
165 open_session_selector = 0;
166 have_configure_timeout = false;
167 have_disk_overrun_displayed = false;
168 have_disk_underrun_displayed = false;
169 _will_create_new_session_automatically = false;
170 session_loaded = false;
171 last_speed_displayed = -1.0f;
173 last_configure_time.tv_sec = 0;
174 last_configure_time.tv_usec = 0;
176 shuttle_grabbed = false;
178 shuttle_max_speed = 8.0f;
180 set_shuttle_units (Percentage);
181 set_shuttle_behaviour (Sprung);
183 shuttle_style_menu = 0;
184 shuttle_unit_menu = 0;
186 gettimeofday (&last_peak_grab, 0);
187 gettimeofday (&last_shuttle_request, 0);
189 ARDOUR::AudioDiskstream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
190 ARDOUR::AudioDiskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
191 ARDOUR::AudioDiskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
193 /* handle pending state with a dialog */
195 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
197 /* have to wait for AudioEngine and Configuration before proceeding */
201 ARDOUR_UI::set_engine (AudioEngine& e)
205 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
206 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
207 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
208 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
212 keyboard = new Keyboard;
214 if (setup_windows ()) {
215 throw failed_constructor ();
218 if (GTK_ARDOUR::show_key_actions) {
219 vector<string> names;
220 vector<string> paths;
222 vector<AccelKey> bindings;
224 ActionManager::get_all_actions (names, paths, keys, bindings);
226 vector<string>::iterator n;
227 vector<string>::iterator k;
228 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
229 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
235 /* start with timecode, metering enabled
238 blink_timeout_tag = -1;
240 /* the global configuration object is now valid */
244 /* this being a GUI and all, we want peakfiles */
246 AudioFileSource::set_build_peakfiles (true);
247 AudioFileSource::set_build_missing_peakfiles (true);
249 if (AudioSource::start_peak_thread ()) {
250 throw failed_constructor();
253 /* start the time-of-day-clock */
255 update_wall_clock ();
256 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
258 update_disk_space ();
260 update_sample_rate (engine->frame_rate());
262 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
263 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
266 ARDOUR_UI::~ARDOUR_UI ()
268 save_ardour_state ();
282 if (add_route_dialog) {
283 delete add_route_dialog;
286 AudioSource::stop_peak_thread ();
290 ARDOUR_UI::configure_timeout ()
295 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
296 /* no configure events yet */
300 gettimeofday (&now, 0);
301 timersub (&now, &last_configure_time, &diff);
303 /* force a gap of 0.5 seconds since the last configure event
306 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
309 have_configure_timeout = false;
310 save_ardour_state ();
316 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
318 if (have_configure_timeout) {
319 gettimeofday (&last_configure_time, 0);
321 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
322 have_configure_timeout = true;
329 ARDOUR_UI::save_ardour_state ()
331 if (!keyboard || !mixer || !editor) {
335 /* XXX this is all a bit dubious. add_extra_xml() uses
336 a different lifetime model from add_instant_xml().
339 XMLNode* node = new XMLNode (keyboard->get_state());
340 Config->add_extra_xml (*node);
341 Config->save_state();
343 XMLNode& enode (static_cast<Stateful*>(editor)->get_state());
344 XMLNode& mnode (mixer->get_state());
347 session->add_instant_xml(enode, session->path());
348 session->add_instant_xml(mnode, session->path());
350 Config->add_instant_xml(enode, get_user_ardour_path());
351 Config->add_instant_xml(mnode, get_user_ardour_path());
356 AccelMap::save ("ardour.saved_bindings");
360 ARDOUR_UI::startup ()
362 /* Once the UI is up and running, start the audio engine. Doing
363 this before the UI is up and running can cause problems
364 when not running with SCHED_FIFO, because the amount of
365 CPU and disk work needed to get the UI started can interfere
366 with the scheduling of the audio thread.
369 Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
375 if (session && session->dirty()) {
376 switch (ask_about_saving_session(_("quit"))) {
381 /* use the default name */
382 if (save_state_canfail ("")) {
383 /* failed - don't quit */
384 MessageDialog msg (*editor,
386 Ardour was unable to save your session.\n\n\
387 If you still wish to quit, please use the\n\n\
388 \"Just quit\" option."));
397 Config->save_state();
402 ARDOUR_UI::ask_about_saving_session (const string & what)
404 ArdourDialog window (_("ardour: save session?"));
405 Gtk::HBox dhbox; // the hbox for the image and text
406 Gtk::Label prompt_label;
407 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
411 msg = string_compose(_("Don't %1"), what);
412 window.add_button (msg, RESPONSE_REJECT);
413 msg = string_compose(_("Just %1"), what);
414 window.add_button (msg, RESPONSE_APPLY);
415 msg = string_compose(_("Save and %1"), what);
416 window.add_button (msg, RESPONSE_ACCEPT);
418 window.set_default_response (RESPONSE_ACCEPT);
420 Gtk::Button noquit_button (msg);
421 noquit_button.set_name ("EditorGTKButton");
426 if (session->snap_name() == session->name()) {
429 type = _("snapshot");
431 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?"),
432 type, session->snap_name());
434 prompt_label.set_text (prompt);
435 prompt_label.set_name (X_("PrompterLabel"));
436 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
438 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
440 dhbox.set_homogeneous (false);
441 dhbox.pack_start (*dimage, false, false, 5);
442 dhbox.pack_start (prompt_label, true, false, 5);
443 window.get_vbox()->pack_start (dhbox);
445 window.set_name (_("Prompter"));
446 window.set_position (Gtk::WIN_POS_MOUSE);
447 window.set_modal (true);
448 window.set_resizable (false);
451 save_the_session = 0;
453 editor->ensure_float (window);
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 (jack_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 jack_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_diskstreams (Diskstream& ds)
549 if (ds.record_enabled()) {
550 rec_enabled_diskstreams++;
555 ARDOUR_UI::update_disk_space()
561 jack_nframes_t frames = session->available_capture_duration();
564 if (frames == max_frames) {
565 strcpy (buf, _("Disk: 24hrs+"));
570 jack_nframes_t fr = session->frame_rate();
572 if (session->actively_recording()){
574 rec_enabled_diskstreams = 0;
575 session->foreach_diskstream (this, &ARDOUR_UI::count_recenabled_diskstreams);
577 if (rec_enabled_diskstreams) {
578 frames /= rec_enabled_diskstreams;
583 /* hmmm. shall we divide by the route count? or the diskstream count?
584 or what? for now, do nothing ...
589 hrs = frames / (fr * 3600);
590 frames -= hrs * fr * 3600;
591 mins = frames / (fr * 60);
592 frames -= mins * fr * 60;
595 snprintf (buf, sizeof(buf), _("Space: %02dh:%02dm:%02ds"), hrs, mins, secs);
598 disk_space_label.set_text (buf);
602 ARDOUR_UI::update_wall_clock ()
609 tm_now = localtime (&now);
611 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
612 wall_clock_label.set_text (buf);
617 ARDOUR_UI::control_methods_adjusted ()
622 which_method = (int) online_control_button->adjustment.get_value();
623 switch (which_method) {
625 allow_mmc_and_local ();
634 fatal << _("programming error: impossible control method") << endmsg;
640 ARDOUR_UI::mmc_device_id_adjusted ()
645 int dev_id = (int) mmc_id_button->adjustment.get_value();
646 mmc->set_device_id (dev_id);
652 ARDOUR_UI::session_menu (GdkEventButton *ev)
654 session_popup_menu->popup (0, 0);
659 ARDOUR_UI::redisplay_recent_sessions ()
661 vector<string *> *sessions;
662 vector<string *>::iterator i;
663 RecentSessionsSorter cmp;
665 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
666 recent_session_model->clear ();
669 ARDOUR::read_recent_sessions (rs);
672 recent_session_display.set_model (recent_session_model);
676 /* sort them alphabetically */
677 sort (rs.begin(), rs.end(), cmp);
678 sessions = new vector<string*>;
680 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
681 sessions->push_back (new string ((*i).second));
684 for (i = sessions->begin(); i != sessions->end(); ++i) {
686 vector<string*>* states;
687 vector<const gchar*> item;
688 string fullpath = *(*i);
690 /* remove any trailing / */
692 if (fullpath[fullpath.length()-1] == '/') {
693 fullpath = fullpath.substr (0, fullpath.length()-1);
696 /* now get available states for this session */
698 if ((states = Session::possible_states (fullpath)) == 0) {
703 TreeModel::Row row = *(recent_session_model->append());
705 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
706 row[recent_session_columns.fullpath] = fullpath;
708 if (states->size() > 1) {
710 /* add the children */
712 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
714 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
716 child_row[recent_session_columns.visible_name] = **i2;
717 child_row[recent_session_columns.fullpath] = fullpath;
726 recent_session_display.set_model (recent_session_model);
731 ARDOUR_UI::build_session_selector ()
733 session_selector_window = new ArdourDialog ("session selector");
735 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
737 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
738 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
739 session_selector_window->set_default_response (RESPONSE_ACCEPT);
740 recent_session_model = TreeStore::create (recent_session_columns);
741 recent_session_display.set_model (recent_session_model);
742 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
743 recent_session_display.set_headers_visible (false);
744 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
746 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
748 scroller->add (recent_session_display);
749 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
751 session_selector_window->set_name ("SessionSelectorWindow");
752 session_selector_window->set_size_request (200, 400);
753 session_selector_window->get_vbox()->pack_start (*scroller);
754 session_selector_window->show_all_children();
758 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
760 session_selector_window->response (RESPONSE_ACCEPT);
764 ARDOUR_UI::open_recent_session ()
766 /* popup selector window */
768 if (session_selector_window == 0) {
769 build_session_selector ();
772 redisplay_recent_sessions ();
774 ResponseType r = (ResponseType) session_selector_window->run ();
776 session_selector_window->hide();
779 case RESPONSE_ACCEPT:
785 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
787 if (i == recent_session_model->children().end()) {
791 Glib::ustring path = (*i)[recent_session_columns.fullpath];
792 Glib::ustring state = (*i)[recent_session_columns.visible_name];
794 _session_is_new = false;
796 load_session (path, state);
800 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
804 if (stat (info.filename.c_str(), &statbuf) != 0) {
808 if (!S_ISDIR(statbuf.st_mode)) {
814 string session_file = info.filename;
816 session_file += Glib::path_get_basename (info.filename);
817 session_file += ".ardour";
819 if (stat (session_file.c_str(), &statbuf) != 0) {
823 return S_ISREG (statbuf.st_mode);
827 ARDOUR_UI::open_session ()
829 /* popup selector window */
831 if (open_session_selector == 0) {
833 /* ardour sessions are folders */
835 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
836 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
837 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
839 FileFilter session_filter;
840 session_filter.add_pattern ("*.ardour");
841 session_filter.set_name (_("Ardour sessions"));
842 open_session_selector->add_filter (session_filter);
843 open_session_selector->set_filter (session_filter);
846 int response = open_session_selector->run();
847 open_session_selector->hide ();
850 case RESPONSE_ACCEPT:
853 open_session_selector->hide();
857 open_session_selector->hide();
858 string session_path = open_session_selector->get_filename();
862 if (session_path.length() > 0) {
863 if (Session::find_session (session_path, path, name, isnew) == 0) {
864 _session_is_new = isnew;
865 load_session (path, name);
872 ARDOUR_UI::session_add_midi_route (bool disk)
877 warning << _("You cannot add a track without a session already loaded.") << endmsg;
883 if ((route = session->new_midi_track ()) == 0) {
884 error << _("could not create new MIDI track") << endmsg;
887 if ((route = session->new_midi_route ()) == 0) {
888 error << _("could not create new MIDI bus") << endmsg;
893 if (need_control_room_outs) {
899 route->set_stereo_control_outs (control_lr_channels);
900 route->control_outs()->set_stereo_pan (pans, this);
902 #endif /* CONTROLOUTS */
907 MessageDialog msg (*editor,
908 _("There are insufficient JACK ports available\n\
909 to create a new track or bus.\n\
910 You should save Ardour, exit and\n\
911 restart JACK with more ports."));
918 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
923 warning << _("You cannot add a track without a session already loaded.") << endmsg;
929 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
930 error << _("could not create new audio track") << endmsg;
933 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
934 error << _("could not create new audio bus") << endmsg;
939 if (need_control_room_outs) {
945 route->set_stereo_control_outs (control_lr_channels);
946 route->control_outs()->set_stereo_pan (pans, this);
948 #endif /* CONTROLOUTS */
952 MessageDialog msg (*editor,
953 _("There are insufficient JACK ports available\n\
954 to create a new track or bus.\n\
955 You should save Ardour, exit and\n\
956 restart JACK with more ports."));
962 ARDOUR_UI::diskstream_added (Diskstream* ds)
967 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
969 jack_nframes_t _preroll;
972 _preroll = session->convert_to_frames_at (new_position, session->preroll);
974 if (new_position > _preroll) {
975 new_position -= _preroll;
980 session->request_locate (new_position);
985 ARDOUR_UI::transport_goto_start ()
988 session->goto_start();
991 /* force displayed area in editor to start no matter
992 what "follow playhead" setting is.
996 editor->reposition_x_origin (session->current_start_frame());
1002 ARDOUR_UI::transport_goto_zero ()
1005 session->request_locate (0);
1008 /* force displayed area in editor to start no matter
1009 what "follow playhead" setting is.
1013 editor->reposition_x_origin (0);
1019 ARDOUR_UI::transport_goto_end ()
1022 jack_nframes_t frame = session->current_end_frame();
1023 session->request_locate (frame);
1025 /* force displayed area in editor to start no matter
1026 what "follow playhead" setting is.
1030 editor->reposition_x_origin (frame);
1036 ARDOUR_UI::transport_stop ()
1042 if (session->is_auditioning()) {
1043 session->cancel_audition ();
1047 if (session->get_auto_loop()) {
1048 session->request_auto_loop (false);
1051 session->request_stop ();
1055 ARDOUR_UI::transport_stop_and_forget_capture ()
1058 session->request_stop (true);
1063 ARDOUR_UI::remove_last_capture()
1066 editor->remove_last_capture();
1071 ARDOUR_UI::transport_record ()
1074 switch (session->record_status()) {
1075 case Session::Disabled:
1076 if (session->ntracks() == 0) {
1077 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1078 MessageDialog msg (*editor, txt);
1082 session->maybe_enable_record ();
1084 case Session::Recording:
1085 case Session::Enabled:
1086 session->disable_record (true);
1092 ARDOUR_UI::transport_roll ()
1100 rolling = session->transport_rolling ();
1102 if (session->get_auto_loop()) {
1103 session->request_auto_loop (false);
1104 auto_loop_button.set_active (false);
1105 roll_button.set_active (true);
1106 } else if (session->get_play_range ()) {
1107 session->request_play_range (false);
1108 play_selection_button.set_active (false);
1109 } else if (rolling) {
1110 session->request_locate (session->last_transport_start(), true);
1113 session->request_transport_speed (1.0f);
1117 ARDOUR_UI::transport_loop()
1120 if (session->get_auto_loop()) {
1121 if (session->transport_rolling()) {
1122 Location * looploc = session->locations()->auto_loop_location();
1124 session->request_locate (looploc->start(), true);
1129 session->request_auto_loop (true);
1135 ARDOUR_UI::transport_play_selection ()
1141 if (!session->get_play_range()) {
1142 session->request_stop ();
1145 editor->play_selection ();
1149 ARDOUR_UI::transport_rewind (int option)
1151 float current_transport_speed;
1154 current_transport_speed = session->transport_speed();
1156 if (current_transport_speed >= 0.0f) {
1159 session->request_transport_speed (-1.0f);
1162 session->request_transport_speed (-4.0f);
1165 session->request_transport_speed (-0.5f);
1170 session->request_transport_speed (current_transport_speed * 1.5f);
1176 ARDOUR_UI::transport_forward (int option)
1178 float current_transport_speed;
1181 current_transport_speed = session->transport_speed();
1183 if (current_transport_speed <= 0.0f) {
1186 session->request_transport_speed (1.0f);
1189 session->request_transport_speed (4.0f);
1192 session->request_transport_speed (0.5f);
1197 session->request_transport_speed (current_transport_speed * 1.5f);
1203 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1211 if ((r = session->route_by_remote_id (dstream)) != 0) {
1215 if ((at = dynamic_cast<AudioTrack*>(r)) != 0) {
1216 at->disk_stream().set_record_enabled (!at->disk_stream().record_enabled(), this);
1225 ARDOUR_UI::queue_transport_change ()
1227 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1231 ARDOUR_UI::map_transport_state ()
1233 float sp = session->transport_speed();
1236 transport_rolling ();
1237 } else if (sp < 0.0f) {
1238 transport_rewinding ();
1239 } else if (sp > 0.0f) {
1240 transport_forwarding ();
1242 transport_stopped ();
1247 ARDOUR_UI::allow_local_only ()
1253 ARDOUR_UI::allow_mmc_only ()
1259 ARDOUR_UI::allow_mmc_and_local ()
1265 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1267 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1268 (int) adj.get_value()].c_str());
1272 ARDOUR_UI::engine_stopped ()
1274 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1275 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1276 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1281 ARDOUR_UI::engine_running ()
1283 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1284 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1285 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1289 ARDOUR_UI::engine_halted ()
1291 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1293 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1294 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1296 update_sample_rate (0);
1298 MessageDialog msg (*editor,
1300 JACK has either been shutdown or it\n\
1301 disconnected Ardour because Ardour\n\
1302 was not fast enough. You can save the\n\
1303 session and/or try to reconnect to JACK ."));
1308 ARDOUR_UI::do_engine_start ()
1314 catch (AudioEngine::PortRegistrationFailure& err) {
1316 error << _("Unable to create all required ports")
1324 error << _("Unable to start the session running")
1334 ARDOUR_UI::start_engine ()
1336 if (do_engine_start () == 0) {
1337 if (session && _session_is_new) {
1338 /* we need to retain initial visual
1339 settings for a new session
1341 session->save_state ("");
1344 /* there is too much going on, in too many threads, for us to
1345 end up with a clean session. So wait 1 second after loading,
1346 and fix it up. its ugly, but until i come across a better
1347 solution, its what we have.
1350 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1357 ARDOUR_UI::update_clocks ()
1359 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1363 ARDOUR_UI::start_clocking ()
1365 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1369 ARDOUR_UI::stop_clocking ()
1371 clock_signal_connection.disconnect ();
1375 ARDOUR_UI::toggle_clocking ()
1378 if (clock_button.get_active()) {
1387 ARDOUR_UI::_blink (void *arg)
1390 ((ARDOUR_UI *) arg)->blink ();
1397 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1401 ARDOUR_UI::start_blinking ()
1403 /* Start the blink signal. Everybody with a blinking widget
1404 uses Blink to drive the widget's state.
1407 if (blink_timeout_tag < 0) {
1409 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1414 ARDOUR_UI::stop_blinking ()
1416 if (blink_timeout_tag >= 0) {
1417 gtk_timeout_remove (blink_timeout_tag);
1418 blink_timeout_tag = -1;
1423 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1429 if (io.n_inputs() == 0) {
1434 /* XXX we're not handling multiple ports yet. */
1436 const char **connections = io.input(0)->get_connections();
1438 if (connections == 0 || connections[0] == '\0') {
1441 buf = connections[0];
1448 if (io.n_outputs() == 0) {
1453 /* XXX we're not handling multiple ports yet. */
1455 const char **connections = io.output(0)->get_connections();
1457 if (connections == 0 || connections[0] == '\0') {
1460 buf = connections[0];
1468 ARDOUR_UI::snapshot_session ()
1470 ArdourPrompter prompter (true);
1477 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1479 prompter.set_name ("Prompter");
1480 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1481 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1482 prompter.set_prompt (_("Name of New Snapshot"));
1483 prompter.set_initial_text (now);
1485 switch (prompter.run()) {
1486 case RESPONSE_ACCEPT:
1487 prompter.get_result (snapname);
1488 if (snapname.length()){
1489 save_state (snapname);
1499 ARDOUR_UI::save_state (const string & name)
1501 (void) save_state_canfail (name);
1505 ARDOUR_UI::save_state_canfail (string name)
1510 if (name.length() == 0) {
1511 name = session->snap_name();
1514 if ((ret = session->save_state (name)) != 0) {
1518 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1523 ARDOUR_UI::restore_state (string name)
1526 if (name.length() == 0) {
1527 name = session->name();
1529 session->restore_state (name);
1534 ARDOUR_UI::primary_clock_value_changed ()
1537 session->request_locate (primary_clock.current_time ());
1542 ARDOUR_UI::secondary_clock_value_changed ()
1545 session->request_locate (secondary_clock.current_time ());
1550 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1552 if (session && dstream && dstream->record_enabled()) {
1554 Session::RecordState rs;
1556 rs = session->record_status ();
1559 case Session::Disabled:
1560 case Session::Enabled:
1561 if (w->get_state() != STATE_SELECTED) {
1562 w->set_state (STATE_SELECTED);
1566 case Session::Recording:
1567 if (w->get_state() != STATE_ACTIVE) {
1568 w->set_state (STATE_ACTIVE);
1574 if (w->get_state() != STATE_NORMAL) {
1575 w->set_state (STATE_NORMAL);
1581 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1587 switch (session->record_status()) {
1588 case Session::Enabled:
1590 rec_button.set_state (1);
1592 rec_button.set_state (0);
1596 case Session::Recording:
1597 rec_button.set_state (2);
1601 rec_button.set_state (0);
1607 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1615 ARDOUR_UI::start_keyboard_prefix ()
1617 keyboard->start_prefix();
1621 ARDOUR_UI::save_template ()
1624 ArdourPrompter prompter (true);
1627 prompter.set_name (X_("Prompter"));
1628 prompter.set_prompt (_("Name for mix template:"));
1629 prompter.set_initial_text(session->name() + _("-template"));
1630 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1631 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1633 switch (prompter.run()) {
1634 case RESPONSE_ACCEPT:
1635 prompter.get_result (name);
1637 if (name.length()) {
1638 session->save_template (name);
1648 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1650 m_new_session_dialog->show();
1651 m_new_session_dialog->set_modal(true);
1652 m_new_session_dialog->set_name(predetermined_path);
1653 m_new_session_dialog->reset_recent();
1655 int response = Gtk::RESPONSE_CANCEL;
1658 response = m_new_session_dialog->run ();
1659 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1663 } else if (response == Gtk::RESPONSE_NONE) {
1664 /* Clear was pressed */
1665 m_new_session_dialog->reset();
1667 } else if (response == Gtk::RESPONSE_YES) {
1668 /* YES == OPEN, but there's no enum for that */
1669 std::string session_name = m_new_session_dialog->session_name();
1670 std::string session_path = m_new_session_dialog->session_folder();
1671 load_session (session_path, session_name);
1674 } else if (response == Gtk::RESPONSE_OK) {
1675 if (m_new_session_dialog->get_current_page() == 1) {
1677 /* XXX this is a bit of a hack..
1678 i really want the new sesion dialog to return RESPONSE_YES
1679 if we're on page 1 (the load page)
1680 Unfortunately i can't see how atm..
1682 std::string session_name = m_new_session_dialog->session_name();
1683 std::string session_path = m_new_session_dialog->session_folder();
1684 load_session (session_path, session_name);
1688 _session_is_new = true;
1690 std::string session_name = m_new_session_dialog->session_name();
1691 std::string session_path = m_new_session_dialog->session_folder();
1694 //XXX This is needed because session constructor wants a
1695 //non-existant path. hopefully this will be fixed at some point.
1697 session_path = Glib::build_filename(session_path, session_name);
1699 std::string template_name = m_new_session_dialog->session_template_name();
1701 if (m_new_session_dialog->use_session_template()) {
1703 load_session (session_path, session_name, &template_name);
1709 Session::AutoConnectOption iconnect;
1710 Session::AutoConnectOption oconnect;
1712 if (m_new_session_dialog->create_control_bus()) {
1713 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1718 if (m_new_session_dialog->create_master_bus()) {
1719 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1724 if (m_new_session_dialog->connect_inputs()) {
1725 iconnect = Session::AutoConnectPhysical;
1727 iconnect = Session::AutoConnectOption (0);
1730 /// @todo some minor tweaks.
1732 if (m_new_session_dialog->connect_outs_to_master()) {
1733 oconnect = Session::AutoConnectMaster;
1734 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1735 oconnect = Session::AutoConnectPhysical;
1737 oconnect = Session::AutoConnectOption (0);
1740 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1741 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1743 build_session (session_path,
1751 engine->frame_rate() * 60 * 5);
1756 } while (response == Gtk::RESPONSE_NONE);
1757 m_new_session_dialog->hide();
1763 ARDOUR_UI::close_session()
1770 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1772 Session *new_session;
1774 session_loaded = false;
1775 x = unload_session ();
1783 /* if it already exists, we must have write access */
1785 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1786 MessageDialog msg (*editor, _("\
1787 You do not have write access to this session.\n\
1788 This prevents the session from being loaded."));
1794 new_session = new Session (*engine, path, snap_name, mix_template);
1799 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1803 connect_to_session (new_session);
1805 //if (engine->running()) {
1806 //mixer->show_window();
1808 session_loaded = true;
1813 ARDOUR_UI::make_session_clean ()
1816 session->set_clean ();
1825 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1826 uint32_t control_channels,
1827 uint32_t master_channels,
1828 Session::AutoConnectOption input_connect,
1829 Session::AutoConnectOption output_connect,
1832 jack_nframes_t initial_length)
1834 Session *new_session;
1837 session_loaded = false;
1838 x = unload_session ();
1845 _session_is_new = true;
1848 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1849 control_channels, master_channels, nphysin, nphysout, initial_length);
1854 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1858 connect_to_session (new_session);
1860 //if (engine->running()) {
1861 //mixer->show_window();
1863 session_loaded = true;
1871 editor->show_window ();
1875 if (session && mixer) {
1876 // mixer->show_window ();
1885 ARDOUR_UI::show_splash ()
1888 about = new About();
1894 ARDOUR_UI::hide_splash ()
1902 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1906 removed = rep.paths.size();
1909 MessageDialog msgd (*editor,
1910 _("No audio files were ready for cleanup"),
1913 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1914 msgd.set_secondary_text (_("If this seems suprising, \n\
1915 check for any existing snapshots.\n\
1916 These may still include regions that\n\
1917 require some unused files to continue to exist."));
1923 ArdourDialog results (_("ardour: cleanup"), true, false);
1925 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1926 CleanupResultsModelColumns() {
1930 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1931 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1935 CleanupResultsModelColumns results_columns;
1936 Glib::RefPtr<Gtk::ListStore> results_model;
1937 Gtk::TreeView results_display;
1939 results_model = ListStore::create (results_columns);
1940 results_display.set_model (results_model);
1941 results_display.append_column (list_title, results_columns.visible_name);
1943 results_display.set_name ("CleanupResultsList");
1944 results_display.set_headers_visible (true);
1945 results_display.set_headers_clickable (false);
1946 results_display.set_reorderable (false);
1948 Gtk::ScrolledWindow list_scroller;
1951 Gtk::HBox dhbox; // the hbox for the image and text
1952 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1953 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1955 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1957 if (rep.space < 1048576.0f) {
1959 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1961 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1965 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1967 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1971 dhbox.pack_start (*dimage, true, false, 5);
1972 dhbox.pack_start (txt, true, false, 5);
1974 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1975 TreeModel::Row row = *(results_model->append());
1976 row[results_columns.visible_name] = *i;
1977 row[results_columns.fullpath] = *i;
1980 list_scroller.add (results_display);
1981 list_scroller.set_size_request (-1, 150);
1982 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
1984 dvbox.pack_start (dhbox, true, false, 5);
1985 dvbox.pack_start (list_scroller, true, false, 5);
1986 ddhbox.pack_start (dvbox, true, false, 5);
1988 results.get_vbox()->pack_start (ddhbox, true, false, 5);
1989 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
1990 results.set_default_response (RESPONSE_CLOSE);
1991 results.set_position (Gtk::WIN_POS_MOUSE);
1992 results.show_all_children ();
1993 results.set_resizable (false);
2000 ARDOUR_UI::cleanup ()
2003 /* shouldn't happen: menu item is insensitive */
2008 MessageDialog checker (_("Are you sure you want to cleanup?"),
2010 Gtk::MESSAGE_QUESTION,
2011 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2013 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2014 ALL undo/redo information will be lost if you cleanup.\n\
2015 After cleanup, unused audio files will be moved to a \
2016 \"dead sounds\" location."));
2018 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2019 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2020 checker.set_default_response (RESPONSE_CANCEL);
2022 checker.set_name (_("CleanupDialog"));
2023 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2024 checker.set_position (Gtk::WIN_POS_MOUSE);
2026 switch (checker.run()) {
2027 case RESPONSE_ACCEPT:
2033 Session::cleanup_report rep;
2035 editor->prepare_for_cleanup ();
2037 if (session->cleanup_sources (rep)) {
2041 display_cleanup_results (rep,
2044 The following %1 %2 not in use and \n\
2045 have been moved to:\n\
2047 Flushing the wastebasket will \n\
2048 release an additional\n\
2049 %4 %5bytes of disk space.\n"
2054 ARDOUR_UI::flush_trash ()
2057 /* shouldn't happen: menu item is insensitive */
2061 Session::cleanup_report rep;
2063 if (session->cleanup_trash_sources (rep)) {
2067 display_cleanup_results (rep,
2069 _("The following %1 %2 deleted from\n\
2071 releasing %4 %5bytes of disk space"));
2075 ARDOUR_UI::add_route ()
2083 if (add_route_dialog == 0) {
2084 add_route_dialog = new AddRouteDialog;
2085 editor->ensure_float (*add_route_dialog);
2088 if (add_route_dialog->is_visible()) {
2089 /* we're already doing this */
2093 ResponseType r = (ResponseType) add_route_dialog->run ();
2095 add_route_dialog->hide();
2098 case RESPONSE_ACCEPT:
2105 if ((count = add_route_dialog->count()) <= 0) {
2109 uint32_t input_chan = add_route_dialog->channels ();
2110 uint32_t output_chan;
2111 string name_template = add_route_dialog->name_template ();
2112 bool track = add_route_dialog->track ();
2114 Session::AutoConnectOption oac = session->get_output_auto_connect();
2116 if (oac & Session::AutoConnectMaster) {
2117 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2119 output_chan = input_chan;
2122 /* XXX do something with name template */
2125 if (track && add_route_dialog->midi()) {
2126 session_add_midi_track();
2127 } else if (add_route_dialog->midi()) {
2128 session_add_midi_bus();
2130 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2132 session_add_audio_bus (input_chan, output_chan);
2136 while (Main::events_pending()) {
2143 ARDOUR_UI::mixer_settings () const
2148 node = session->instant_xml(X_("Mixer"), session->path());
2150 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2154 node = new XMLNode (X_("Mixer"));
2161 ARDOUR_UI::editor_settings () const
2166 node = session->instant_xml(X_("Editor"), session->path());
2168 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2172 node = new XMLNode (X_("Editor"));
2178 ARDOUR_UI::keyboard_settings () const
2182 node = Config->extra_xml(X_("Keyboard"));
2185 node = new XMLNode (X_("Keyboard"));
2191 ARDOUR_UI::halt_on_xrun_message ()
2193 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2195 MessageDialog msg (*editor,
2196 _("Recording was stopped because your system could not keep up."));
2201 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::AudioFileSource*>* deletion_list)
2203 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2205 for (list<AudioFileSource*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2209 delete deletion_list;
2213 ARDOUR_UI::disk_overrun_handler ()
2215 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2217 if (!have_disk_overrun_displayed) {
2218 have_disk_overrun_displayed = true;
2219 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2220 The disk system on your computer\n\
2221 was not able to keep up with Ardour.\n\
2223 Specifically, it failed to write data to disk\n\
2224 quickly enough to keep up with recording.\n"));
2226 have_disk_overrun_displayed = false;
2231 ARDOUR_UI::disk_underrun_handler ()
2233 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2235 if (!have_disk_underrun_displayed) {
2236 have_disk_underrun_displayed = true;
2237 MessageDialog msg (*editor,
2238 (_("The disk system on your computer\n\
2239 was not able to keep up with Ardour.\n\
2241 Specifically, it failed to read data from disk\n\
2242 quickly enough to keep up with playback.\n")));
2244 have_disk_underrun_displayed = false;
2249 ARDOUR_UI::disk_underrun_message_gone ()
2251 have_disk_underrun_displayed = false;
2255 ARDOUR_UI::disk_overrun_message_gone ()
2257 have_disk_underrun_displayed = false;
2261 ARDOUR_UI::pending_state_dialog ()
2263 ArdourDialog dialog ("pending state dialog");
2265 This session appears to have been in\n\
2266 middle of recording when ardour or\n\
2267 the computer was shutdown.\n\
2269 Ardour can recover any captured audio for\n\
2270 you, or it can ignore it. Please decide\n\
2271 what you would like to do.\n"));
2273 dialog.get_vbox()->pack_start (message);
2274 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2275 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2277 dialog.set_position (WIN_POS_CENTER);
2280 switch (dialog.run ()) {
2281 case RESPONSE_ACCEPT:
2289 ARDOUR_UI::disconnect_from_jack ()
2292 if( engine->disconnect_from_jack ()) {
2293 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2297 update_sample_rate (0);
2302 ARDOUR_UI::reconnect_to_jack ()
2305 if (engine->reconnect_to_jack ()) {
2306 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2310 update_sample_rate (0);
2315 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2317 engine->request_buffer_size (nframes);
2318 update_sample_rate (0);
2322 ARDOUR_UI::cmdline_new_session (string path)
2324 if (path[0] != '/') {
2325 char buf[PATH_MAX+1];
2328 getcwd (buf, sizeof (buf));
2335 new_session (false, path);
2337 _will_create_new_session_automatically = false; /* done it */
2338 return FALSE; /* don't call it again */
2342 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2344 Glib::RefPtr<Action> act;
2348 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2351 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2354 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2357 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2360 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2363 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2366 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2371 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2372 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2373 Config->set_native_file_header_format (hf);
2375 session->reset_native_file_format ();
2382 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2384 Glib::RefPtr<Action> act;
2388 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2391 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2396 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2398 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2399 Config->set_native_file_data_format (sf);
2401 session->reset_native_file_format ();
2408 ARDOUR_UI::use_config ()
2410 Glib::RefPtr<Action> act;
2412 switch (Config->get_native_file_data_format ()) {
2414 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2417 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2422 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2423 ract->set_active ();
2426 switch (Config->get_native_file_header_format ()) {
2428 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2431 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2434 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2437 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2440 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2443 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2446 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2451 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2452 ract->set_active ();