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")),
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 (Route* route)
549 Track* track = dynamic_cast<Track*>(route);
550 if (track && track->diskstream().record_enabled()) {
551 rec_enabled_diskstreams++;
556 ARDOUR_UI::update_disk_space()
562 jack_nframes_t frames = session->available_capture_duration();
565 if (frames == max_frames) {
566 strcpy (buf, _("Disk: 24hrs+"));
571 jack_nframes_t fr = session->frame_rate();
573 if (session->actively_recording()){
575 rec_enabled_diskstreams = 0;
576 session->foreach_route (this, &ARDOUR_UI::count_recenabled_diskstreams);
578 if (rec_enabled_diskstreams) {
579 frames /= rec_enabled_diskstreams;
584 /* hmmm. shall we divide by the route count? or the diskstream count?
585 or what? for now, do nothing ...
590 hrs = frames / (fr * 3600);
591 frames -= hrs * fr * 3600;
592 mins = frames / (fr * 60);
593 frames -= mins * fr * 60;
596 snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
599 disk_space_label.set_text (buf);
603 ARDOUR_UI::update_wall_clock ()
610 tm_now = localtime (&now);
612 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
613 wall_clock_label.set_text (buf);
618 ARDOUR_UI::control_methods_adjusted ()
623 which_method = (int) online_control_button->adjustment.get_value();
624 switch (which_method) {
626 allow_mmc_and_local ();
635 fatal << _("programming error: impossible control method") << endmsg;
641 ARDOUR_UI::mmc_device_id_adjusted ()
646 int dev_id = (int) mmc_id_button->adjustment.get_value();
647 mmc->set_device_id (dev_id);
653 ARDOUR_UI::session_menu (GdkEventButton *ev)
655 session_popup_menu->popup (0, 0);
660 ARDOUR_UI::redisplay_recent_sessions ()
662 vector<string *> *sessions;
663 vector<string *>::iterator i;
664 RecentSessionsSorter cmp;
666 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
667 recent_session_model->clear ();
670 ARDOUR::read_recent_sessions (rs);
673 recent_session_display.set_model (recent_session_model);
677 /* sort them alphabetically */
678 sort (rs.begin(), rs.end(), cmp);
679 sessions = new vector<string*>;
681 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
682 sessions->push_back (new string ((*i).second));
685 for (i = sessions->begin(); i != sessions->end(); ++i) {
687 vector<string*>* states;
688 vector<const gchar*> item;
689 string fullpath = *(*i);
691 /* remove any trailing / */
693 if (fullpath[fullpath.length()-1] == '/') {
694 fullpath = fullpath.substr (0, fullpath.length()-1);
697 /* now get available states for this session */
699 if ((states = Session::possible_states (fullpath)) == 0) {
704 TreeModel::Row row = *(recent_session_model->append());
706 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
707 row[recent_session_columns.fullpath] = fullpath;
709 if (states->size() > 1) {
711 /* add the children */
713 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
715 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
717 child_row[recent_session_columns.visible_name] = **i2;
718 child_row[recent_session_columns.fullpath] = fullpath;
727 recent_session_display.set_model (recent_session_model);
732 ARDOUR_UI::build_session_selector ()
734 session_selector_window = new ArdourDialog ("session selector");
736 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
738 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
739 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
740 session_selector_window->set_default_response (RESPONSE_ACCEPT);
741 recent_session_model = TreeStore::create (recent_session_columns);
742 recent_session_display.set_model (recent_session_model);
743 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
744 recent_session_display.set_headers_visible (false);
745 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
747 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
749 scroller->add (recent_session_display);
750 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
752 session_selector_window->set_name ("SessionSelectorWindow");
753 session_selector_window->set_size_request (200, 400);
754 session_selector_window->get_vbox()->pack_start (*scroller);
755 session_selector_window->show_all_children();
759 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
761 session_selector_window->response (RESPONSE_ACCEPT);
765 ARDOUR_UI::open_recent_session ()
767 /* popup selector window */
769 if (session_selector_window == 0) {
770 build_session_selector ();
773 redisplay_recent_sessions ();
775 ResponseType r = (ResponseType) session_selector_window->run ();
777 session_selector_window->hide();
780 case RESPONSE_ACCEPT:
786 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
788 if (i == recent_session_model->children().end()) {
792 Glib::ustring path = (*i)[recent_session_columns.fullpath];
793 Glib::ustring state = (*i)[recent_session_columns.visible_name];
795 _session_is_new = false;
797 load_session (path, state);
801 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
805 if (stat (info.filename.c_str(), &statbuf) != 0) {
809 if (!S_ISDIR(statbuf.st_mode)) {
815 string session_file = info.filename;
817 session_file += Glib::path_get_basename (info.filename);
818 session_file += ".ardour";
820 if (stat (session_file.c_str(), &statbuf) != 0) {
824 return S_ISREG (statbuf.st_mode);
828 ARDOUR_UI::open_session ()
830 /* popup selector window */
832 if (open_session_selector == 0) {
834 /* ardour sessions are folders */
836 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
837 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
838 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
840 FileFilter session_filter;
841 session_filter.add_pattern ("*.ardour");
842 session_filter.set_name (_("Ardour sessions"));
843 open_session_selector->add_filter (session_filter);
844 open_session_selector->set_filter (session_filter);
847 int response = open_session_selector->run();
848 open_session_selector->hide ();
851 case RESPONSE_ACCEPT:
854 open_session_selector->hide();
858 open_session_selector->hide();
859 string session_path = open_session_selector->get_filename();
863 if (session_path.length() > 0) {
864 if (Session::find_session (session_path, path, name, isnew) == 0) {
865 _session_is_new = isnew;
866 load_session (path, name);
873 ARDOUR_UI::session_add_midi_route (bool disk)
878 warning << _("You cannot add a track without a session already loaded.") << endmsg;
884 if ((route = session->new_midi_track ()) == 0) {
885 error << _("could not create new MIDI track") << endmsg;
888 if ((route = session->new_midi_route ()) == 0) {
889 error << _("could not create new MIDI bus") << endmsg;
894 if (need_control_room_outs) {
900 route->set_stereo_control_outs (control_lr_channels);
901 route->control_outs()->set_stereo_pan (pans, this);
903 #endif /* CONTROLOUTS */
908 MessageDialog msg (*editor,
909 _("There are insufficient JACK ports available\n\
910 to create a new track or bus.\n\
911 You should save Ardour, exit and\n\
912 restart JACK with more ports."));
919 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
924 warning << _("You cannot add a track without a session already loaded.") << endmsg;
930 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
931 error << _("could not create new audio track") << endmsg;
934 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
935 error << _("could not create new audio bus") << endmsg;
940 if (need_control_room_outs) {
946 route->set_stereo_control_outs (control_lr_channels);
947 route->control_outs()->set_stereo_pan (pans, this);
949 #endif /* CONTROLOUTS */
953 MessageDialog msg (*editor,
954 _("There are insufficient JACK ports available\n\
955 to create a new track or bus.\n\
956 You should save Ardour, exit and\n\
957 restart JACK with more ports."));
963 ARDOUR_UI::diskstream_added (Diskstream* ds)
968 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
970 jack_nframes_t _preroll;
973 _preroll = session->convert_to_frames_at (new_position, session->preroll);
975 if (new_position > _preroll) {
976 new_position -= _preroll;
981 session->request_locate (new_position);
986 ARDOUR_UI::transport_goto_start ()
989 session->goto_start();
992 /* force displayed area in editor to start no matter
993 what "follow playhead" setting is.
997 editor->reposition_x_origin (session->current_start_frame());
1003 ARDOUR_UI::transport_goto_zero ()
1006 session->request_locate (0);
1009 /* force displayed area in editor to start no matter
1010 what "follow playhead" setting is.
1014 editor->reposition_x_origin (0);
1020 ARDOUR_UI::transport_goto_end ()
1023 jack_nframes_t frame = session->current_end_frame();
1024 session->request_locate (frame);
1026 /* force displayed area in editor to start no matter
1027 what "follow playhead" setting is.
1031 editor->reposition_x_origin (frame);
1037 ARDOUR_UI::transport_stop ()
1043 if (session->is_auditioning()) {
1044 session->cancel_audition ();
1048 if (session->get_auto_loop()) {
1049 session->request_auto_loop (false);
1052 session->request_stop ();
1056 ARDOUR_UI::transport_stop_and_forget_capture ()
1059 session->request_stop (true);
1064 ARDOUR_UI::remove_last_capture()
1067 editor->remove_last_capture();
1072 ARDOUR_UI::transport_record ()
1075 switch (session->record_status()) {
1076 case Session::Disabled:
1077 if (session->ntracks() == 0) {
1078 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1079 MessageDialog msg (*editor, txt);
1083 session->maybe_enable_record ();
1085 case Session::Recording:
1086 case Session::Enabled:
1087 session->disable_record (true);
1093 ARDOUR_UI::transport_roll ()
1101 rolling = session->transport_rolling ();
1103 if (session->get_auto_loop()) {
1104 session->request_auto_loop (false);
1105 auto_loop_button.set_active (false);
1106 roll_button.set_active (true);
1107 } else if (session->get_play_range ()) {
1108 session->request_play_range (false);
1109 play_selection_button.set_active (false);
1110 } else if (rolling) {
1111 session->request_locate (session->last_transport_start(), true);
1114 session->request_transport_speed (1.0f);
1118 ARDOUR_UI::transport_loop()
1121 if (session->get_auto_loop()) {
1122 if (session->transport_rolling()) {
1123 Location * looploc = session->locations()->auto_loop_location();
1125 session->request_locate (looploc->start(), true);
1130 session->request_auto_loop (true);
1136 ARDOUR_UI::transport_play_selection ()
1142 if (!session->get_play_range()) {
1143 session->request_stop ();
1146 editor->play_selection ();
1150 ARDOUR_UI::transport_rewind (int option)
1152 float current_transport_speed;
1155 current_transport_speed = session->transport_speed();
1157 if (current_transport_speed >= 0.0f) {
1160 session->request_transport_speed (-1.0f);
1163 session->request_transport_speed (-4.0f);
1166 session->request_transport_speed (-0.5f);
1171 session->request_transport_speed (current_transport_speed * 1.5f);
1177 ARDOUR_UI::transport_forward (int option)
1179 float current_transport_speed;
1182 current_transport_speed = session->transport_speed();
1184 if (current_transport_speed <= 0.0f) {
1187 session->request_transport_speed (1.0f);
1190 session->request_transport_speed (4.0f);
1193 session->request_transport_speed (0.5f);
1198 session->request_transport_speed (current_transport_speed * 1.5f);
1204 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1212 if ((r = session->route_by_remote_id (dstream)) != 0) {
1216 if ((t = dynamic_cast<Track*>(r)) != 0) {
1217 t->diskstream().set_record_enabled (!t->diskstream().record_enabled(), this);
1226 ARDOUR_UI::queue_transport_change ()
1228 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1232 ARDOUR_UI::map_transport_state ()
1234 float sp = session->transport_speed();
1237 transport_rolling ();
1238 } else if (sp < 0.0f) {
1239 transport_rewinding ();
1240 } else if (sp > 0.0f) {
1241 transport_forwarding ();
1243 transport_stopped ();
1248 ARDOUR_UI::allow_local_only ()
1254 ARDOUR_UI::allow_mmc_only ()
1260 ARDOUR_UI::allow_mmc_and_local ()
1266 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1268 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1269 (int) adj.get_value()].c_str());
1273 ARDOUR_UI::engine_stopped ()
1275 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1276 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1277 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1282 ARDOUR_UI::engine_running ()
1284 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1285 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1286 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1290 ARDOUR_UI::engine_halted ()
1292 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1294 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1295 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1297 update_sample_rate (0);
1299 MessageDialog msg (*editor,
1301 JACK has either been shutdown or it\n\
1302 disconnected Ardour because Ardour\n\
1303 was not fast enough. You can save the\n\
1304 session and/or try to reconnect to JACK ."));
1309 ARDOUR_UI::do_engine_start ()
1315 catch (AudioEngine::PortRegistrationFailure& err) {
1317 error << _("Unable to create all required ports")
1325 error << _("Unable to start the session running")
1335 ARDOUR_UI::start_engine ()
1337 if (do_engine_start () == 0) {
1338 if (session && _session_is_new) {
1339 /* we need to retain initial visual
1340 settings for a new session
1342 session->save_state ("");
1345 /* there is too much going on, in too many threads, for us to
1346 end up with a clean session. So wait 1 second after loading,
1347 and fix it up. its ugly, but until i come across a better
1348 solution, its what we have.
1351 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1358 ARDOUR_UI::update_clocks ()
1360 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1364 ARDOUR_UI::start_clocking ()
1366 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1370 ARDOUR_UI::stop_clocking ()
1372 clock_signal_connection.disconnect ();
1376 ARDOUR_UI::toggle_clocking ()
1379 if (clock_button.get_active()) {
1388 ARDOUR_UI::_blink (void *arg)
1391 ((ARDOUR_UI *) arg)->blink ();
1398 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1402 ARDOUR_UI::start_blinking ()
1404 /* Start the blink signal. Everybody with a blinking widget
1405 uses Blink to drive the widget's state.
1408 if (blink_timeout_tag < 0) {
1410 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1415 ARDOUR_UI::stop_blinking ()
1417 if (blink_timeout_tag >= 0) {
1418 gtk_timeout_remove (blink_timeout_tag);
1419 blink_timeout_tag = -1;
1424 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1430 if (io.n_inputs() == 0) {
1435 /* XXX we're not handling multiple ports yet. */
1437 const char **connections = io.input(0)->get_connections();
1439 if (connections == 0 || connections[0] == '\0') {
1442 buf = connections[0];
1449 if (io.n_outputs() == 0) {
1454 /* XXX we're not handling multiple ports yet. */
1456 const char **connections = io.output(0)->get_connections();
1458 if (connections == 0 || connections[0] == '\0') {
1461 buf = connections[0];
1469 ARDOUR_UI::snapshot_session ()
1471 ArdourPrompter prompter (true);
1478 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1480 prompter.set_name ("Prompter");
1481 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1482 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1483 prompter.set_prompt (_("Name of New Snapshot"));
1484 prompter.set_initial_text (now);
1486 switch (prompter.run()) {
1487 case RESPONSE_ACCEPT:
1488 prompter.get_result (snapname);
1489 if (snapname.length()){
1490 save_state (snapname);
1500 ARDOUR_UI::save_state (const string & name)
1502 (void) save_state_canfail (name);
1506 ARDOUR_UI::save_state_canfail (string name)
1511 if (name.length() == 0) {
1512 name = session->snap_name();
1515 if ((ret = session->save_state (name)) != 0) {
1519 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1524 ARDOUR_UI::restore_state (string name)
1527 if (name.length() == 0) {
1528 name = session->name();
1530 session->restore_state (name);
1535 ARDOUR_UI::primary_clock_value_changed ()
1538 session->request_locate (primary_clock.current_time ());
1543 ARDOUR_UI::secondary_clock_value_changed ()
1546 session->request_locate (secondary_clock.current_time ());
1551 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1553 if (session && dstream && dstream->record_enabled()) {
1555 Session::RecordState rs;
1557 rs = session->record_status ();
1560 case Session::Disabled:
1561 case Session::Enabled:
1562 if (w->get_state() != STATE_SELECTED) {
1563 w->set_state (STATE_SELECTED);
1567 case Session::Recording:
1568 if (w->get_state() != STATE_ACTIVE) {
1569 w->set_state (STATE_ACTIVE);
1575 if (w->get_state() != STATE_NORMAL) {
1576 w->set_state (STATE_NORMAL);
1582 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1588 switch (session->record_status()) {
1589 case Session::Enabled:
1591 rec_button.set_state (1);
1593 rec_button.set_state (0);
1597 case Session::Recording:
1598 rec_button.set_state (2);
1602 rec_button.set_state (0);
1608 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1616 ARDOUR_UI::start_keyboard_prefix ()
1618 keyboard->start_prefix();
1622 ARDOUR_UI::save_template ()
1625 ArdourPrompter prompter (true);
1628 prompter.set_name (X_("Prompter"));
1629 prompter.set_prompt (_("Name for mix template:"));
1630 prompter.set_initial_text(session->name() + _("-template"));
1631 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1632 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1634 switch (prompter.run()) {
1635 case RESPONSE_ACCEPT:
1636 prompter.get_result (name);
1638 if (name.length()) {
1639 session->save_template (name);
1649 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1651 m_new_session_dialog->show();
1652 m_new_session_dialog->set_modal(true);
1653 m_new_session_dialog->set_name(predetermined_path);
1654 m_new_session_dialog->reset_recent();
1656 int response = Gtk::RESPONSE_CANCEL;
1659 response = m_new_session_dialog->run ();
1660 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1664 } else if (response == Gtk::RESPONSE_NONE) {
1665 /* Clear was pressed */
1666 m_new_session_dialog->reset();
1668 } else if (response == Gtk::RESPONSE_YES) {
1669 /* YES == OPEN, but there's no enum for that */
1670 std::string session_name = m_new_session_dialog->session_name();
1671 std::string session_path = m_new_session_dialog->session_folder();
1672 load_session (session_path, session_name);
1675 } else if (response == Gtk::RESPONSE_OK) {
1676 if (m_new_session_dialog->get_current_page() == 1) {
1678 /* XXX this is a bit of a hack..
1679 i really want the new sesion dialog to return RESPONSE_YES
1680 if we're on page 1 (the load page)
1681 Unfortunately i can't see how atm..
1683 std::string session_name = m_new_session_dialog->session_name();
1684 std::string session_path = m_new_session_dialog->session_folder();
1685 load_session (session_path, session_name);
1689 _session_is_new = true;
1691 std::string session_name = m_new_session_dialog->session_name();
1692 std::string session_path = m_new_session_dialog->session_folder();
1695 //XXX This is needed because session constructor wants a
1696 //non-existant path. hopefully this will be fixed at some point.
1698 session_path = Glib::build_filename(session_path, session_name);
1700 std::string template_name = m_new_session_dialog->session_template_name();
1702 if (m_new_session_dialog->use_session_template()) {
1704 load_session (session_path, session_name, &template_name);
1710 Session::AutoConnectOption iconnect;
1711 Session::AutoConnectOption oconnect;
1713 if (m_new_session_dialog->create_control_bus()) {
1714 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1719 if (m_new_session_dialog->create_master_bus()) {
1720 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1725 if (m_new_session_dialog->connect_inputs()) {
1726 iconnect = Session::AutoConnectPhysical;
1728 iconnect = Session::AutoConnectOption (0);
1731 /// @todo some minor tweaks.
1733 if (m_new_session_dialog->connect_outs_to_master()) {
1734 oconnect = Session::AutoConnectMaster;
1735 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1736 oconnect = Session::AutoConnectPhysical;
1738 oconnect = Session::AutoConnectOption (0);
1741 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1742 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1744 build_session (session_path,
1752 engine->frame_rate() * 60 * 5);
1757 } while (response == Gtk::RESPONSE_NONE);
1758 m_new_session_dialog->hide();
1764 ARDOUR_UI::close_session()
1771 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1773 Session *new_session;
1775 session_loaded = false;
1776 x = unload_session ();
1784 /* if it already exists, we must have write access */
1786 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1787 MessageDialog msg (*editor, _("\
1788 You do not have write access to this session.\n\
1789 This prevents the session from being loaded."));
1795 new_session = new Session (*engine, path, snap_name, mix_template);
1800 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1804 connect_to_session (new_session);
1806 //if (engine->running()) {
1807 //mixer->show_window();
1809 session_loaded = true;
1814 ARDOUR_UI::make_session_clean ()
1817 session->set_clean ();
1826 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1827 uint32_t control_channels,
1828 uint32_t master_channels,
1829 Session::AutoConnectOption input_connect,
1830 Session::AutoConnectOption output_connect,
1833 jack_nframes_t initial_length)
1835 Session *new_session;
1838 session_loaded = false;
1839 x = unload_session ();
1846 _session_is_new = true;
1849 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1850 control_channels, master_channels, nphysin, nphysout, initial_length);
1855 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1859 connect_to_session (new_session);
1861 //if (engine->running()) {
1862 //mixer->show_window();
1864 session_loaded = true;
1872 editor->show_window ();
1876 if (session && mixer) {
1877 // mixer->show_window ();
1886 ARDOUR_UI::show_splash ()
1889 about = new About();
1895 ARDOUR_UI::hide_splash ()
1903 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1907 removed = rep.paths.size();
1910 MessageDialog msgd (*editor,
1911 _("No audio files were ready for cleanup"),
1914 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1915 msgd.set_secondary_text (_("If this seems suprising, \n\
1916 check for any existing snapshots.\n\
1917 These may still include regions that\n\
1918 require some unused files to continue to exist."));
1924 ArdourDialog results (_("ardour: cleanup"), true, false);
1926 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1927 CleanupResultsModelColumns() {
1931 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1932 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1936 CleanupResultsModelColumns results_columns;
1937 Glib::RefPtr<Gtk::ListStore> results_model;
1938 Gtk::TreeView results_display;
1940 results_model = ListStore::create (results_columns);
1941 results_display.set_model (results_model);
1942 results_display.append_column (list_title, results_columns.visible_name);
1944 results_display.set_name ("CleanupResultsList");
1945 results_display.set_headers_visible (true);
1946 results_display.set_headers_clickable (false);
1947 results_display.set_reorderable (false);
1949 Gtk::ScrolledWindow list_scroller;
1952 Gtk::HBox dhbox; // the hbox for the image and text
1953 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1954 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1956 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1958 if (rep.space < 1048576.0f) {
1960 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1962 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1966 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1968 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1972 dhbox.pack_start (*dimage, true, false, 5);
1973 dhbox.pack_start (txt, true, false, 5);
1975 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1976 TreeModel::Row row = *(results_model->append());
1977 row[results_columns.visible_name] = *i;
1978 row[results_columns.fullpath] = *i;
1981 list_scroller.add (results_display);
1982 list_scroller.set_size_request (-1, 150);
1983 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
1985 dvbox.pack_start (dhbox, true, false, 5);
1986 dvbox.pack_start (list_scroller, true, false, 5);
1987 ddhbox.pack_start (dvbox, true, false, 5);
1989 results.get_vbox()->pack_start (ddhbox, true, false, 5);
1990 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
1991 results.set_default_response (RESPONSE_CLOSE);
1992 results.set_position (Gtk::WIN_POS_MOUSE);
1993 results.show_all_children ();
1994 results.set_resizable (false);
2001 ARDOUR_UI::cleanup ()
2004 /* shouldn't happen: menu item is insensitive */
2009 MessageDialog checker (_("Are you sure you want to cleanup?"),
2011 Gtk::MESSAGE_QUESTION,
2012 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2014 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2015 ALL undo/redo information will be lost if you cleanup.\n\
2016 After cleanup, unused audio files will be moved to a \
2017 \"dead sounds\" location."));
2019 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2020 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2021 checker.set_default_response (RESPONSE_CANCEL);
2023 checker.set_name (_("CleanupDialog"));
2024 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2025 checker.set_position (Gtk::WIN_POS_MOUSE);
2027 switch (checker.run()) {
2028 case RESPONSE_ACCEPT:
2034 Session::cleanup_report rep;
2036 editor->prepare_for_cleanup ();
2038 if (session->cleanup_sources (rep)) {
2042 display_cleanup_results (rep,
2045 The following %1 %2 not in use and \n\
2046 have been moved to:\n\
2048 Flushing the wastebasket will \n\
2049 release an additional\n\
2050 %4 %5bytes of disk space.\n"
2055 ARDOUR_UI::flush_trash ()
2058 /* shouldn't happen: menu item is insensitive */
2062 Session::cleanup_report rep;
2064 if (session->cleanup_trash_sources (rep)) {
2068 display_cleanup_results (rep,
2070 _("The following %1 %2 deleted from\n\
2072 releasing %4 %5bytes of disk space"));
2076 ARDOUR_UI::add_route ()
2084 if (add_route_dialog == 0) {
2085 add_route_dialog = new AddRouteDialog;
2086 editor->ensure_float (*add_route_dialog);
2089 if (add_route_dialog->is_visible()) {
2090 /* we're already doing this */
2094 ResponseType r = (ResponseType) add_route_dialog->run ();
2096 add_route_dialog->hide();
2099 case RESPONSE_ACCEPT:
2106 if ((count = add_route_dialog->count()) <= 0) {
2110 uint32_t input_chan = add_route_dialog->channels ();
2111 uint32_t output_chan;
2112 string name_template = add_route_dialog->name_template ();
2113 bool track = add_route_dialog->track ();
2115 Session::AutoConnectOption oac = session->get_output_auto_connect();
2117 if (oac & Session::AutoConnectMaster) {
2118 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2120 output_chan = input_chan;
2123 /* XXX do something with name template */
2126 if (track && add_route_dialog->midi()) {
2127 session_add_midi_track();
2128 } else if (add_route_dialog->midi()) {
2129 session_add_midi_bus();
2131 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2133 session_add_audio_bus (input_chan, output_chan);
2137 while (Main::events_pending()) {
2144 ARDOUR_UI::mixer_settings () const
2149 node = session->instant_xml(X_("Mixer"), session->path());
2151 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2155 node = new XMLNode (X_("Mixer"));
2162 ARDOUR_UI::editor_settings () const
2167 node = session->instant_xml(X_("Editor"), session->path());
2169 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2173 node = new XMLNode (X_("Editor"));
2179 ARDOUR_UI::keyboard_settings () const
2183 node = Config->extra_xml(X_("Keyboard"));
2186 node = new XMLNode (X_("Keyboard"));
2192 ARDOUR_UI::halt_on_xrun_message ()
2194 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2196 MessageDialog msg (*editor,
2197 _("Recording was stopped because your system could not keep up."));
2202 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::AudioFileSource*>* deletion_list)
2204 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2206 for (list<AudioFileSource*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2210 delete deletion_list;
2214 ARDOUR_UI::disk_overrun_handler ()
2216 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2218 if (!have_disk_overrun_displayed) {
2219 have_disk_overrun_displayed = true;
2220 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2221 The disk system on your computer\n\
2222 was not able to keep up with Ardour.\n\
2224 Specifically, it failed to write data to disk\n\
2225 quickly enough to keep up with recording.\n"));
2227 have_disk_overrun_displayed = false;
2232 ARDOUR_UI::disk_underrun_handler ()
2234 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2236 if (!have_disk_underrun_displayed) {
2237 have_disk_underrun_displayed = true;
2238 MessageDialog msg (*editor,
2239 (_("The disk system on your computer\n\
2240 was not able to keep up with Ardour.\n\
2242 Specifically, it failed to read data from disk\n\
2243 quickly enough to keep up with playback.\n")));
2245 have_disk_underrun_displayed = false;
2250 ARDOUR_UI::disk_underrun_message_gone ()
2252 have_disk_underrun_displayed = false;
2256 ARDOUR_UI::disk_overrun_message_gone ()
2258 have_disk_underrun_displayed = false;
2262 ARDOUR_UI::pending_state_dialog ()
2264 ArdourDialog dialog ("pending state dialog");
2266 This session appears to have been in\n\
2267 middle of recording when ardour or\n\
2268 the computer was shutdown.\n\
2270 Ardour can recover any captured audio for\n\
2271 you, or it can ignore it. Please decide\n\
2272 what you would like to do.\n"));
2274 dialog.get_vbox()->pack_start (message);
2275 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2276 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2278 dialog.set_position (WIN_POS_CENTER);
2281 switch (dialog.run ()) {
2282 case RESPONSE_ACCEPT:
2290 ARDOUR_UI::disconnect_from_jack ()
2293 if( engine->disconnect_from_jack ()) {
2294 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2298 update_sample_rate (0);
2303 ARDOUR_UI::reconnect_to_jack ()
2306 if (engine->reconnect_to_jack ()) {
2307 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2311 update_sample_rate (0);
2316 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2318 engine->request_buffer_size (nframes);
2319 update_sample_rate (0);
2323 ARDOUR_UI::cmdline_new_session (string path)
2325 if (path[0] != '/') {
2326 char buf[PATH_MAX+1];
2329 getcwd (buf, sizeof (buf));
2336 new_session (false, path);
2338 _will_create_new_session_automatically = false; /* done it */
2339 return FALSE; /* don't call it again */
2343 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2345 Glib::RefPtr<Action> act;
2349 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2352 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2355 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2358 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2361 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2364 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2367 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2372 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2373 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2374 Config->set_native_file_header_format (hf);
2376 session->reset_native_file_format ();
2383 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2385 Glib::RefPtr<Action> act;
2389 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2392 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2397 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2399 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2400 Config->set_native_file_data_format (sf);
2402 session->reset_native_file_format ();
2409 ARDOUR_UI::use_config ()
2411 Glib::RefPtr<Action> act;
2413 switch (Config->get_native_file_data_format ()) {
2415 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2418 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2423 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2424 ract->set_active ();
2427 switch (Config->get_native_file_header_format ()) {
2429 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2432 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2435 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2438 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2441 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2444 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2447 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2452 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2453 ract->set_active ();