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_route.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")),
130 using namespace Gtk::Menu_Helpers;
136 if (theArdourUI == 0) {
140 ActionManager::init ();
144 color_manager = new ColorManager();
146 std::string color_file = ARDOUR::find_config_file("ardour.colors");
148 color_manager->load (color_file);
150 m_new_session_dialog = new NewSessionDialog();
154 _session_is_new = false;
155 big_clock_window = 0;
156 session_selector_window = 0;
157 last_key_press_time = 0;
158 connection_editor = 0;
159 add_route_dialog = 0;
164 open_session_selector = 0;
165 have_configure_timeout = false;
166 have_disk_overrun_displayed = false;
167 have_disk_underrun_displayed = false;
168 _will_create_new_session_automatically = false;
169 session_loaded = false;
170 last_speed_displayed = -1.0f;
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 set_shuttle_units (Percentage);
180 set_shuttle_behaviour (Sprung);
182 shuttle_style_menu = 0;
183 shuttle_unit_menu = 0;
185 gettimeofday (&last_peak_grab, 0);
186 gettimeofday (&last_shuttle_request, 0);
188 ARDOUR::AudioDiskstream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
189 ARDOUR::Diskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
190 ARDOUR::Diskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
192 /* handle pending state with a dialog */
194 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
196 /* have to wait for AudioEngine and Configuration before proceeding */
200 ARDOUR_UI::set_engine (AudioEngine& e)
204 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
205 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
206 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
207 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
211 keyboard = new Keyboard;
213 if (setup_windows ()) {
214 throw failed_constructor ();
217 if (GTK_ARDOUR::show_key_actions) {
218 vector<string> names;
219 vector<string> paths;
221 vector<AccelKey> bindings;
223 ActionManager::get_all_actions (names, paths, keys, bindings);
225 vector<string>::iterator n;
226 vector<string>::iterator k;
227 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
228 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
234 /* start with timecode, metering enabled
237 blink_timeout_tag = -1;
239 /* the global configuration object is now valid */
243 /* this being a GUI and all, we want peakfiles */
245 AudioFileSource::set_build_peakfiles (true);
246 AudioFileSource::set_build_missing_peakfiles (true);
248 if (AudioSource::start_peak_thread ()) {
249 throw failed_constructor();
252 /* start the time-of-day-clock */
254 update_wall_clock ();
255 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
257 update_disk_space ();
259 update_sample_rate (engine->frame_rate());
261 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
262 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
265 ARDOUR_UI::~ARDOUR_UI ()
267 save_ardour_state ();
281 if (add_route_dialog) {
282 delete add_route_dialog;
285 AudioSource::stop_peak_thread ();
289 ARDOUR_UI::configure_timeout ()
294 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
295 /* no configure events yet */
299 gettimeofday (&now, 0);
300 timersub (&now, &last_configure_time, &diff);
302 /* force a gap of 0.5 seconds since the last configure event
305 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
308 have_configure_timeout = false;
309 save_ardour_state ();
315 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
317 if (have_configure_timeout) {
318 gettimeofday (&last_configure_time, 0);
320 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
321 have_configure_timeout = true;
328 ARDOUR_UI::save_ardour_state ()
330 if (!keyboard || !mixer || !editor) {
334 /* XXX this is all a bit dubious. add_extra_xml() uses
335 a different lifetime model from add_instant_xml().
338 XMLNode* node = new XMLNode (keyboard->get_state());
339 Config->add_extra_xml (*node);
340 Config->save_state();
342 XMLNode enode(static_cast<Stateful*>(editor)->get_state());
343 XMLNode mnode(mixer->get_state());
346 session->add_instant_xml (enode, session->path());
347 session->add_instant_xml (mnode, session->path());
349 Config->add_instant_xml (enode, get_user_ardour_path());
350 Config->add_instant_xml (mnode, get_user_ardour_path());
355 AccelMap::save ("ardour.saved_bindings");
359 ARDOUR_UI::startup ()
361 /* Once the UI is up and running, start the audio engine. Doing
362 this before the UI is up and running can cause problems
363 when not running with SCHED_FIFO, because the amount of
364 CPU and disk work needed to get the UI started can interfere
365 with the scheduling of the audio thread.
368 Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
374 if (session && session->dirty()) {
375 switch (ask_about_saving_session(_("quit"))) {
380 /* use the default name */
381 if (save_state_canfail ("")) {
382 /* failed - don't quit */
383 MessageDialog msg (*editor,
385 Ardour was unable to save your session.\n\n\
386 If you still wish to quit, please use the\n\n\
387 \"Just quit\" option."));
396 Config->save_state();
401 ARDOUR_UI::ask_about_saving_session (const string & what)
403 ArdourDialog window (_("ardour: save session?"));
404 Gtk::HBox dhbox; // the hbox for the image and text
405 Gtk::Label prompt_label;
406 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
410 msg = string_compose(_("Don't %1"), what);
411 window.add_button (msg, RESPONSE_REJECT);
412 msg = string_compose(_("Just %1"), what);
413 window.add_button (msg, RESPONSE_APPLY);
414 msg = string_compose(_("Save and %1"), what);
415 window.add_button (msg, RESPONSE_ACCEPT);
417 window.set_default_response (RESPONSE_ACCEPT);
419 Gtk::Button noquit_button (msg);
420 noquit_button.set_name ("EditorGTKButton");
425 if (session->snap_name() == session->name()) {
428 type = _("snapshot");
430 prompt = string_compose(_("The %1\"%2\"\nhas not been saved.\n\nAny changes made this time\nwill be lost unless you save it.\n\nWhat do you want to do?"),
431 type, session->snap_name());
433 prompt_label.set_text (prompt);
434 prompt_label.set_name (X_("PrompterLabel"));
435 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
437 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
439 dhbox.set_homogeneous (false);
440 dhbox.pack_start (*dimage, false, false, 5);
441 dhbox.pack_start (prompt_label, true, false, 5);
442 window.get_vbox()->pack_start (dhbox);
444 window.set_name (_("Prompter"));
445 window.set_position (Gtk::WIN_POS_MOUSE);
446 window.set_modal (true);
447 window.set_resizable (false);
450 save_the_session = 0;
452 editor->ensure_float (window);
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 (jack_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 jack_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_diskstreams (Route& route)
548 Track* track = dynamic_cast<Track*>(&route);
549 if (track && track->diskstream().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_route (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), _("Disk: %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)
874 boost::shared_ptr<Route> route;
877 warning << _("You cannot add a track without a session already loaded.") << endmsg;
883 if ((route = session->new_midi_track (/*mode*/)) == 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;
894 MessageDialog msg (*editor,
895 _("There are insufficient JACK ports available\n\
896 to create a new track or bus.\n\
897 You should save Ardour, exit and\n\
898 restart JACK with more ports."));
905 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
907 boost::shared_ptr<Route> route;
910 warning << _("You cannot add a track without a session already loaded.") << endmsg;
916 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
917 error << _("could not create new audio track") << endmsg;
920 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
921 error << _("could not create new audio bus") << endmsg;
926 if (need_control_room_outs) {
932 route->set_stereo_control_outs (control_lr_channels);
933 route->control_outs()->set_stereo_pan (pans, this);
935 #endif /* CONTROLOUTS */
939 MessageDialog msg (*editor,
940 _("There are insufficient JACK ports available\n\
941 to create a new track or bus.\n\
942 You should save Ardour, exit and\n\
943 restart JACK with more ports."));
949 ARDOUR_UI::diskstream_added (Diskstream* ds)
954 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
956 jack_nframes_t _preroll;
959 _preroll = session->convert_to_frames_at (new_position, session->preroll);
961 if (new_position > _preroll) {
962 new_position -= _preroll;
967 session->request_locate (new_position);
972 ARDOUR_UI::transport_goto_start ()
975 session->goto_start();
978 /* force displayed area in editor to start no matter
979 what "follow playhead" setting is.
983 editor->reposition_x_origin (session->current_start_frame());
989 ARDOUR_UI::transport_goto_zero ()
992 session->request_locate (0);
995 /* force displayed area in editor to start no matter
996 what "follow playhead" setting is.
1000 editor->reposition_x_origin (0);
1006 ARDOUR_UI::transport_goto_end ()
1009 jack_nframes_t frame = session->current_end_frame();
1010 session->request_locate (frame);
1012 /* force displayed area in editor to start no matter
1013 what "follow playhead" setting is.
1017 editor->reposition_x_origin (frame);
1023 ARDOUR_UI::transport_stop ()
1029 if (session->is_auditioning()) {
1030 session->cancel_audition ();
1034 if (session->get_auto_loop()) {
1035 session->request_auto_loop (false);
1038 session->request_stop ();
1042 ARDOUR_UI::transport_stop_and_forget_capture ()
1045 session->request_stop (true);
1050 ARDOUR_UI::remove_last_capture()
1053 editor->remove_last_capture();
1058 ARDOUR_UI::transport_record ()
1061 switch (session->record_status()) {
1062 case Session::Disabled:
1063 if (session->ntracks() == 0) {
1064 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1065 MessageDialog msg (*editor, txt);
1069 session->maybe_enable_record ();
1071 case Session::Recording:
1072 case Session::Enabled:
1073 session->disable_record (true);
1079 ARDOUR_UI::transport_roll ()
1087 rolling = session->transport_rolling ();
1089 if (session->get_auto_loop()) {
1090 session->request_auto_loop (false);
1091 auto_loop_button.set_active (false);
1092 roll_button.set_active (true);
1093 } else if (session->get_play_range ()) {
1094 session->request_play_range (false);
1095 play_selection_button.set_active (false);
1096 } else if (rolling) {
1097 session->request_locate (session->last_transport_start(), true);
1100 session->request_transport_speed (1.0f);
1104 ARDOUR_UI::transport_loop()
1107 if (session->get_auto_loop()) {
1108 if (session->transport_rolling()) {
1109 Location * looploc = session->locations()->auto_loop_location();
1111 session->request_locate (looploc->start(), true);
1116 session->request_auto_loop (true);
1122 ARDOUR_UI::transport_play_selection ()
1128 if (!session->get_play_range()) {
1129 session->request_stop ();
1132 editor->play_selection ();
1136 ARDOUR_UI::transport_rewind (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::transport_forward (int option)
1165 float current_transport_speed;
1168 current_transport_speed = session->transport_speed();
1170 if (current_transport_speed <= 0.0f) {
1173 session->request_transport_speed (1.0f);
1176 session->request_transport_speed (4.0f);
1179 session->request_transport_speed (0.5f);
1184 session->request_transport_speed (current_transport_speed * 1.5f);
1190 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1196 boost::shared_ptr<Route> r;
1198 if ((r = session->route_by_remote_id (dstream)) != 0) {
1202 if ((t = dynamic_cast<Track*>(r.get())) != 0) {
1203 t->diskstream().set_record_enabled (!t->diskstream().record_enabled());
1212 ARDOUR_UI::queue_transport_change ()
1214 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1218 ARDOUR_UI::map_transport_state ()
1220 float sp = session->transport_speed();
1223 transport_rolling ();
1224 } else if (sp < 0.0f) {
1225 transport_rewinding ();
1226 } else if (sp > 0.0f) {
1227 transport_forwarding ();
1229 transport_stopped ();
1234 ARDOUR_UI::allow_local_only ()
1240 ARDOUR_UI::allow_mmc_only ()
1246 ARDOUR_UI::allow_mmc_and_local ()
1252 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1254 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1255 (int) adj.get_value()].c_str());
1259 ARDOUR_UI::engine_stopped ()
1261 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1262 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1263 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1268 ARDOUR_UI::engine_running ()
1270 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1271 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1272 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1276 ARDOUR_UI::engine_halted ()
1278 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1280 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1281 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1283 update_sample_rate (0);
1285 MessageDialog msg (*editor,
1287 JACK has either been shutdown or it\n\
1288 disconnected Ardour because Ardour\n\
1289 was not fast enough. You can save the\n\
1290 session and/or try to reconnect to JACK ."));
1295 ARDOUR_UI::do_engine_start ()
1301 catch (AudioEngine::PortRegistrationFailure& err) {
1303 error << _("Unable to create all required ports")
1311 error << _("Unable to start the session running")
1321 ARDOUR_UI::start_engine ()
1323 if (do_engine_start () == 0) {
1324 if (session && _session_is_new) {
1325 /* we need to retain initial visual
1326 settings for a new session
1328 session->save_state ("");
1329 session->save_history ("");
1332 /* there is too much going on, in too many threads, for us to
1333 end up with a clean session. So wait 1 second after loading,
1334 and fix it up. its ugly, but until i come across a better
1335 solution, its what we have.
1338 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1345 ARDOUR_UI::update_clocks ()
1347 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1351 ARDOUR_UI::start_clocking ()
1353 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1357 ARDOUR_UI::stop_clocking ()
1359 clock_signal_connection.disconnect ();
1363 ARDOUR_UI::toggle_clocking ()
1366 if (clock_button.get_active()) {
1375 ARDOUR_UI::_blink (void *arg)
1378 ((ARDOUR_UI *) arg)->blink ();
1385 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1389 ARDOUR_UI::start_blinking ()
1391 /* Start the blink signal. Everybody with a blinking widget
1392 uses Blink to drive the widget's state.
1395 if (blink_timeout_tag < 0) {
1397 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1402 ARDOUR_UI::stop_blinking ()
1404 if (blink_timeout_tag >= 0) {
1405 gtk_timeout_remove (blink_timeout_tag);
1406 blink_timeout_tag = -1;
1411 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1417 if (io.n_inputs().get_total() == 0) {
1422 /* XXX we're not handling multiple ports yet. */
1424 const char **connections = io.input(0)->get_connections();
1426 if (connections == 0 || connections[0] == '\0') {
1429 buf = connections[0];
1436 if (io.n_outputs().get_total() == 0) {
1441 /* XXX we're not handling multiple ports yet. */
1443 const char **connections = io.output(0)->get_connections();
1445 if (connections == 0 || connections[0] == '\0') {
1448 buf = connections[0];
1456 ARDOUR_UI::snapshot_session ()
1458 ArdourPrompter prompter (true);
1465 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1467 prompter.set_name ("Prompter");
1468 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1469 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1470 prompter.set_prompt (_("Name of New Snapshot"));
1471 prompter.set_initial_text (now);
1473 switch (prompter.run()) {
1474 case RESPONSE_ACCEPT:
1475 prompter.get_result (snapname);
1476 if (snapname.length()){
1477 save_state (snapname);
1487 ARDOUR_UI::save_state (const string & name)
1489 (void) save_state_canfail (name);
1493 ARDOUR_UI::save_state_canfail (string name)
1498 if (name.length() == 0) {
1499 name = session->snap_name();
1502 if ((ret = session->save_state (name)) != 0) {
1503 session->save_history (name);
1507 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1512 ARDOUR_UI::restore_state (string name)
1515 if (name.length() == 0) {
1516 name = session->name();
1518 session->restore_state (name);
1523 ARDOUR_UI::primary_clock_value_changed ()
1526 session->request_locate (primary_clock.current_time ());
1531 ARDOUR_UI::secondary_clock_value_changed ()
1534 session->request_locate (secondary_clock.current_time ());
1539 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1541 if (session && dstream && dstream->record_enabled()) {
1543 Session::RecordState rs;
1545 rs = session->record_status ();
1548 case Session::Disabled:
1549 case Session::Enabled:
1550 if (w->get_state() != STATE_SELECTED) {
1551 w->set_state (STATE_SELECTED);
1555 case Session::Recording:
1556 if (w->get_state() != STATE_ACTIVE) {
1557 w->set_state (STATE_ACTIVE);
1563 if (w->get_state() != STATE_NORMAL) {
1564 w->set_state (STATE_NORMAL);
1570 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1576 switch (session->record_status()) {
1577 case Session::Enabled:
1579 rec_button.set_state (1);
1581 rec_button.set_state (0);
1585 case Session::Recording:
1586 rec_button.set_state (2);
1590 rec_button.set_state (0);
1596 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1604 ARDOUR_UI::start_keyboard_prefix ()
1606 keyboard->start_prefix();
1610 ARDOUR_UI::save_template ()
1613 ArdourPrompter prompter (true);
1616 prompter.set_name (X_("Prompter"));
1617 prompter.set_prompt (_("Name for mix template:"));
1618 prompter.set_initial_text(session->name() + _("-template"));
1619 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1620 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1622 switch (prompter.run()) {
1623 case RESPONSE_ACCEPT:
1624 prompter.get_result (name);
1626 if (name.length()) {
1627 session->save_template (name);
1637 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1639 m_new_session_dialog->show();
1640 m_new_session_dialog->set_modal(true);
1641 m_new_session_dialog->set_name(predetermined_path);
1642 m_new_session_dialog->reset_recent();
1644 int response = Gtk::RESPONSE_CANCEL;
1647 response = m_new_session_dialog->run ();
1648 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1652 } else if (response == Gtk::RESPONSE_NONE) {
1653 /* Clear was pressed */
1654 m_new_session_dialog->reset();
1656 } else if (response == Gtk::RESPONSE_YES) {
1657 /* YES == OPEN, but there's no enum for that */
1658 std::string session_name = m_new_session_dialog->session_name();
1659 std::string session_path = m_new_session_dialog->session_folder();
1660 load_session (session_path, session_name);
1663 } else if (response == Gtk::RESPONSE_OK) {
1664 if (m_new_session_dialog->get_current_page() == 1) {
1666 /* XXX this is a bit of a hack..
1667 i really want the new sesion dialog to return RESPONSE_YES
1668 if we're on page 1 (the load page)
1669 Unfortunately i can't see how atm..
1671 std::string session_name = m_new_session_dialog->session_name();
1672 std::string session_path = m_new_session_dialog->session_folder();
1673 load_session (session_path, session_name);
1677 _session_is_new = true;
1679 std::string session_name = m_new_session_dialog->session_name();
1680 std::string session_path = m_new_session_dialog->session_folder();
1683 //XXX This is needed because session constructor wants a
1684 //non-existant path. hopefully this will be fixed at some point.
1686 session_path = Glib::build_filename(session_path, session_name);
1688 std::string template_name = m_new_session_dialog->session_template_name();
1690 if (m_new_session_dialog->use_session_template()) {
1692 load_session (session_path, session_name, &template_name);
1698 Session::AutoConnectOption iconnect;
1699 Session::AutoConnectOption oconnect;
1701 if (m_new_session_dialog->create_control_bus()) {
1702 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1707 if (m_new_session_dialog->create_master_bus()) {
1708 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1713 if (m_new_session_dialog->connect_inputs()) {
1714 iconnect = Session::AutoConnectPhysical;
1716 iconnect = Session::AutoConnectOption (0);
1719 /// @todo some minor tweaks.
1721 if (m_new_session_dialog->connect_outs_to_master()) {
1722 oconnect = Session::AutoConnectMaster;
1723 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1724 oconnect = Session::AutoConnectPhysical;
1726 oconnect = Session::AutoConnectOption (0);
1729 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1730 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1732 build_session (session_path,
1740 engine->frame_rate() * 60 * 5);
1745 } while (response == Gtk::RESPONSE_NONE);
1746 m_new_session_dialog->hide();
1752 ARDOUR_UI::close_session()
1759 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1761 Session *new_session;
1763 session_loaded = false;
1764 x = unload_session ();
1772 /* if it already exists, we must have write access */
1774 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1775 MessageDialog msg (*editor, _("\
1776 You do not have write access to this session.\n\
1777 This prevents the session from being loaded."));
1783 new_session = new Session (*engine, path, snap_name, mix_template);
1788 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1792 connect_to_session (new_session);
1794 //if (engine->running()) {
1795 //mixer->show_window();
1797 session_loaded = true;
1802 ARDOUR_UI::make_session_clean ()
1805 session->set_clean ();
1814 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1815 uint32_t control_channels,
1816 uint32_t master_channels,
1817 Session::AutoConnectOption input_connect,
1818 Session::AutoConnectOption output_connect,
1821 jack_nframes_t initial_length)
1823 Session *new_session;
1826 session_loaded = false;
1827 x = unload_session ();
1834 _session_is_new = true;
1837 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1838 control_channels, master_channels, nphysin, nphysout, initial_length);
1843 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1847 connect_to_session (new_session);
1849 //if (engine->running()) {
1850 //mixer->show_window();
1852 session_loaded = true;
1860 editor->show_window ();
1864 if (session && mixer) {
1865 // mixer->show_window ();
1874 ARDOUR_UI::show_splash ()
1877 about = new About();
1883 ARDOUR_UI::hide_splash ()
1891 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1895 removed = rep.paths.size();
1898 MessageDialog msgd (*editor,
1899 _("No audio files were ready for cleanup"),
1902 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1903 msgd.set_secondary_text (_("If this seems suprising, \n\
1904 check for any existing snapshots.\n\
1905 These may still include regions that\n\
1906 require some unused files to continue to exist."));
1912 ArdourDialog results (_("ardour: cleanup"), true, false);
1914 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1915 CleanupResultsModelColumns() {
1919 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1920 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1924 CleanupResultsModelColumns results_columns;
1925 Glib::RefPtr<Gtk::ListStore> results_model;
1926 Gtk::TreeView results_display;
1928 results_model = ListStore::create (results_columns);
1929 results_display.set_model (results_model);
1930 results_display.append_column (list_title, results_columns.visible_name);
1932 results_display.set_name ("CleanupResultsList");
1933 results_display.set_headers_visible (true);
1934 results_display.set_headers_clickable (false);
1935 results_display.set_reorderable (false);
1937 Gtk::ScrolledWindow list_scroller;
1940 Gtk::HBox dhbox; // the hbox for the image and text
1941 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1942 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1944 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1946 if (rep.space < 1048576.0f) {
1948 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1950 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1954 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1956 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1960 dhbox.pack_start (*dimage, true, false, 5);
1961 dhbox.pack_start (txt, true, false, 5);
1963 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1964 TreeModel::Row row = *(results_model->append());
1965 row[results_columns.visible_name] = *i;
1966 row[results_columns.fullpath] = *i;
1969 list_scroller.add (results_display);
1970 list_scroller.set_size_request (-1, 150);
1971 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
1973 dvbox.pack_start (dhbox, true, false, 5);
1974 dvbox.pack_start (list_scroller, true, false, 5);
1975 ddhbox.pack_start (dvbox, true, false, 5);
1977 results.get_vbox()->pack_start (ddhbox, true, false, 5);
1978 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
1979 results.set_default_response (RESPONSE_CLOSE);
1980 results.set_position (Gtk::WIN_POS_MOUSE);
1981 results.show_all_children ();
1982 results.set_resizable (false);
1989 ARDOUR_UI::cleanup ()
1992 /* shouldn't happen: menu item is insensitive */
1997 MessageDialog checker (_("Are you sure you want to cleanup?"),
1999 Gtk::MESSAGE_QUESTION,
2000 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2002 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2003 ALL undo/redo information will be lost if you cleanup.\n\
2004 After cleanup, unused audio files will be moved to a \
2005 \"dead sounds\" location."));
2007 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2008 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2009 checker.set_default_response (RESPONSE_CANCEL);
2011 checker.set_name (_("CleanupDialog"));
2012 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2013 checker.set_position (Gtk::WIN_POS_MOUSE);
2015 switch (checker.run()) {
2016 case RESPONSE_ACCEPT:
2022 Session::cleanup_report rep;
2024 editor->prepare_for_cleanup ();
2026 if (session->cleanup_sources (rep)) {
2030 display_cleanup_results (rep,
2033 The following %1 %2 not in use and \n\
2034 have been moved to:\n\
2036 Flushing the wastebasket will \n\
2037 release an additional\n\
2038 %4 %5bytes of disk space.\n"
2043 ARDOUR_UI::flush_trash ()
2046 /* shouldn't happen: menu item is insensitive */
2050 Session::cleanup_report rep;
2052 if (session->cleanup_trash_sources (rep)) {
2056 display_cleanup_results (rep,
2058 _("The following %1 %2 deleted from\n\
2060 releasing %4 %5bytes of disk space"));
2064 ARDOUR_UI::add_route ()
2072 if (add_route_dialog == 0) {
2073 add_route_dialog = new AddRouteDialog;
2074 editor->ensure_float (*add_route_dialog);
2077 if (add_route_dialog->is_visible()) {
2078 /* we're already doing this */
2082 ResponseType r = (ResponseType) add_route_dialog->run ();
2084 add_route_dialog->hide();
2087 case RESPONSE_ACCEPT:
2094 if ((count = add_route_dialog->count()) <= 0) {
2098 uint32_t input_chan = add_route_dialog->channels ();
2099 uint32_t output_chan;
2100 string name_template = add_route_dialog->name_template ();
2101 bool track = add_route_dialog->track ();
2103 Session::AutoConnectOption oac = session->get_output_auto_connect();
2105 if (oac & Session::AutoConnectMaster) {
2106 output_chan = (session->master_out() ? session->master_out()->n_inputs().get(DataType::AUDIO) : input_chan);
2108 output_chan = input_chan;
2111 /* XXX do something with name template */
2114 if (add_route_dialog->type() == ARDOUR::DataType::MIDI) {
2116 session_add_midi_track();
2118 MessageDialog msg (*editor,
2119 _("Sorry, MIDI Busses are not supported at this time."));
2121 //session_add_midi_bus();
2124 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2126 session_add_audio_bus (input_chan, output_chan);
2130 while (Main::events_pending()) {
2137 ARDOUR_UI::mixer_settings () const
2142 node = session->instant_xml(X_("Mixer"), session->path());
2144 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2148 node = new XMLNode (X_("Mixer"));
2155 ARDOUR_UI::editor_settings () const
2160 node = session->instant_xml(X_("Editor"), session->path());
2162 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2166 node = new XMLNode (X_("Editor"));
2172 ARDOUR_UI::keyboard_settings () const
2176 node = Config->extra_xml(X_("Keyboard"));
2179 node = new XMLNode (X_("Keyboard"));
2185 ARDOUR_UI::halt_on_xrun_message ()
2187 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2189 MessageDialog msg (*editor,
2190 _("Recording was stopped because your system could not keep up."));
2195 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::Source*>* deletion_list)
2197 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2199 for (list<Source*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2203 delete deletion_list;
2207 ARDOUR_UI::disk_overrun_handler ()
2209 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2211 if (!have_disk_overrun_displayed) {
2212 have_disk_overrun_displayed = true;
2213 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2214 The disk system on your computer\n\
2215 was not able to keep up with Ardour.\n\
2217 Specifically, it failed to write data to disk\n\
2218 quickly enough to keep up with recording.\n"));
2220 have_disk_overrun_displayed = false;
2225 ARDOUR_UI::disk_underrun_handler ()
2227 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2229 if (!have_disk_underrun_displayed) {
2230 have_disk_underrun_displayed = true;
2231 MessageDialog msg (*editor,
2232 (_("The disk system on your computer\n\
2233 was not able to keep up with Ardour.\n\
2235 Specifically, it failed to read data from disk\n\
2236 quickly enough to keep up with playback.\n")));
2238 have_disk_underrun_displayed = false;
2243 ARDOUR_UI::disk_underrun_message_gone ()
2245 have_disk_underrun_displayed = false;
2249 ARDOUR_UI::disk_overrun_message_gone ()
2251 have_disk_underrun_displayed = false;
2255 ARDOUR_UI::pending_state_dialog ()
2257 ArdourDialog dialog ("pending state dialog");
2259 This session appears to have been in\n\
2260 middle of recording when ardour or\n\
2261 the computer was shutdown.\n\
2263 Ardour can recover any captured audio for\n\
2264 you, or it can ignore it. Please decide\n\
2265 what you would like to do.\n"));
2267 dialog.get_vbox()->pack_start (message);
2268 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2269 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2271 dialog.set_position (WIN_POS_CENTER);
2274 switch (dialog.run ()) {
2275 case RESPONSE_ACCEPT:
2283 ARDOUR_UI::disconnect_from_jack ()
2286 if( engine->disconnect_from_jack ()) {
2287 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2291 update_sample_rate (0);
2296 ARDOUR_UI::reconnect_to_jack ()
2299 if (engine->reconnect_to_jack ()) {
2300 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2304 update_sample_rate (0);
2309 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2311 engine->request_buffer_size (nframes);
2312 update_sample_rate (0);
2316 ARDOUR_UI::cmdline_new_session (string path)
2318 if (path[0] != '/') {
2319 char buf[PATH_MAX+1];
2322 getcwd (buf, sizeof (buf));
2329 new_session (false, path);
2331 _will_create_new_session_automatically = false; /* done it */
2332 return FALSE; /* don't call it again */
2336 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2338 Glib::RefPtr<Action> act;
2342 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2345 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2348 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2351 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2354 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2357 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2360 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2365 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2366 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2367 Config->set_native_file_header_format (hf);
2369 session->reset_native_file_format ();
2376 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2378 Glib::RefPtr<Action> act;
2382 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2385 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2390 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2392 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2393 Config->set_native_file_data_format (sf);
2395 session->reset_native_file_format ();
2402 ARDOUR_UI::use_config ()
2404 Glib::RefPtr<Action> act;
2406 switch (Config->get_native_file_data_format ()) {
2408 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2411 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2416 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2417 ract->set_active ();
2420 switch (Config->get_native_file_header_format ()) {
2422 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2425 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2428 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2431 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2434 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2437 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2440 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2445 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2446 ract->set_active ();