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)
875 boost::shared_ptr<Route> route;
878 warning << _("You cannot add a track without a session already loaded.") << endmsg;
884 if ((route = session->new_midi_track (/*mode*/)) == 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;
895 MessageDialog msg (*editor,
896 _("There are insufficient JACK ports available\n\
897 to create a new track or bus.\n\
898 You should save Ardour, exit and\n\
899 restart JACK with more ports."));
906 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
908 boost::shared_ptr<Route> route;
911 warning << _("You cannot add a track without a session already loaded.") << endmsg;
917 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
918 error << _("could not create new audio track") << endmsg;
921 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
922 error << _("could not create new audio bus") << endmsg;
927 if (need_control_room_outs) {
933 route->set_stereo_control_outs (control_lr_channels);
934 route->control_outs()->set_stereo_pan (pans, this);
936 #endif /* CONTROLOUTS */
940 MessageDialog msg (*editor,
941 _("There are insufficient JACK ports available\n\
942 to create a new track or bus.\n\
943 You should save Ardour, exit and\n\
944 restart JACK with more ports."));
950 ARDOUR_UI::diskstream_added (Diskstream* ds)
955 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
957 jack_nframes_t _preroll;
960 _preroll = session->convert_to_frames_at (new_position, session->preroll);
962 if (new_position > _preroll) {
963 new_position -= _preroll;
968 session->request_locate (new_position);
973 ARDOUR_UI::transport_goto_start ()
976 session->goto_start();
979 /* force displayed area in editor to start no matter
980 what "follow playhead" setting is.
984 editor->reposition_x_origin (session->current_start_frame());
990 ARDOUR_UI::transport_goto_zero ()
993 session->request_locate (0);
996 /* force displayed area in editor to start no matter
997 what "follow playhead" setting is.
1001 editor->reposition_x_origin (0);
1007 ARDOUR_UI::transport_goto_end ()
1010 jack_nframes_t frame = session->current_end_frame();
1011 session->request_locate (frame);
1013 /* force displayed area in editor to start no matter
1014 what "follow playhead" setting is.
1018 editor->reposition_x_origin (frame);
1024 ARDOUR_UI::transport_stop ()
1030 if (session->is_auditioning()) {
1031 session->cancel_audition ();
1035 if (session->get_auto_loop()) {
1036 session->request_auto_loop (false);
1039 session->request_stop ();
1043 ARDOUR_UI::transport_stop_and_forget_capture ()
1046 session->request_stop (true);
1051 ARDOUR_UI::remove_last_capture()
1054 editor->remove_last_capture();
1059 ARDOUR_UI::transport_record ()
1062 switch (session->record_status()) {
1063 case Session::Disabled:
1064 if (session->ntracks() == 0) {
1065 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1066 MessageDialog msg (*editor, txt);
1070 session->maybe_enable_record ();
1072 case Session::Recording:
1073 case Session::Enabled:
1074 session->disable_record (true);
1080 ARDOUR_UI::transport_roll ()
1088 rolling = session->transport_rolling ();
1090 if (session->get_auto_loop()) {
1091 session->request_auto_loop (false);
1092 auto_loop_button.set_active (false);
1093 roll_button.set_active (true);
1094 } else if (session->get_play_range ()) {
1095 session->request_play_range (false);
1096 play_selection_button.set_active (false);
1097 } else if (rolling) {
1098 session->request_locate (session->last_transport_start(), true);
1101 session->request_transport_speed (1.0f);
1105 ARDOUR_UI::transport_loop()
1108 if (session->get_auto_loop()) {
1109 if (session->transport_rolling()) {
1110 Location * looploc = session->locations()->auto_loop_location();
1112 session->request_locate (looploc->start(), true);
1117 session->request_auto_loop (true);
1123 ARDOUR_UI::transport_play_selection ()
1129 if (!session->get_play_range()) {
1130 session->request_stop ();
1133 editor->play_selection ();
1137 ARDOUR_UI::transport_rewind (int option)
1139 float current_transport_speed;
1142 current_transport_speed = session->transport_speed();
1144 if (current_transport_speed >= 0.0f) {
1147 session->request_transport_speed (-1.0f);
1150 session->request_transport_speed (-4.0f);
1153 session->request_transport_speed (-0.5f);
1158 session->request_transport_speed (current_transport_speed * 1.5f);
1164 ARDOUR_UI::transport_forward (int option)
1166 float current_transport_speed;
1169 current_transport_speed = session->transport_speed();
1171 if (current_transport_speed <= 0.0f) {
1174 session->request_transport_speed (1.0f);
1177 session->request_transport_speed (4.0f);
1180 session->request_transport_speed (0.5f);
1185 session->request_transport_speed (current_transport_speed * 1.5f);
1191 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1197 boost::shared_ptr<Route> r;
1199 if ((r = session->route_by_remote_id (dstream)) != 0) {
1203 if ((t = dynamic_cast<Track*>(r.get())) != 0) {
1204 t->diskstream().set_record_enabled (!t->diskstream().record_enabled(), this);
1213 ARDOUR_UI::queue_transport_change ()
1215 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1219 ARDOUR_UI::map_transport_state ()
1221 float sp = session->transport_speed();
1224 transport_rolling ();
1225 } else if (sp < 0.0f) {
1226 transport_rewinding ();
1227 } else if (sp > 0.0f) {
1228 transport_forwarding ();
1230 transport_stopped ();
1235 ARDOUR_UI::allow_local_only ()
1241 ARDOUR_UI::allow_mmc_only ()
1247 ARDOUR_UI::allow_mmc_and_local ()
1253 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1255 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1256 (int) adj.get_value()].c_str());
1260 ARDOUR_UI::engine_stopped ()
1262 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1263 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1264 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1269 ARDOUR_UI::engine_running ()
1271 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1272 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1273 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1277 ARDOUR_UI::engine_halted ()
1279 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1281 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1282 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1284 update_sample_rate (0);
1286 MessageDialog msg (*editor,
1288 JACK has either been shutdown or it\n\
1289 disconnected Ardour because Ardour\n\
1290 was not fast enough. You can save the\n\
1291 session and/or try to reconnect to JACK ."));
1296 ARDOUR_UI::do_engine_start ()
1302 catch (AudioEngine::PortRegistrationFailure& err) {
1304 error << _("Unable to create all required ports")
1312 error << _("Unable to start the session running")
1322 ARDOUR_UI::start_engine ()
1324 if (do_engine_start () == 0) {
1325 if (session && _session_is_new) {
1326 /* we need to retain initial visual
1327 settings for a new session
1329 session->save_state ("");
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() == 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() == 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) {
1506 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1511 ARDOUR_UI::restore_state (string name)
1514 if (name.length() == 0) {
1515 name = session->name();
1517 session->restore_state (name);
1522 ARDOUR_UI::primary_clock_value_changed ()
1525 session->request_locate (primary_clock.current_time ());
1530 ARDOUR_UI::secondary_clock_value_changed ()
1533 session->request_locate (secondary_clock.current_time ());
1538 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1540 if (session && dstream && dstream->record_enabled()) {
1542 Session::RecordState rs;
1544 rs = session->record_status ();
1547 case Session::Disabled:
1548 case Session::Enabled:
1549 if (w->get_state() != STATE_SELECTED) {
1550 w->set_state (STATE_SELECTED);
1554 case Session::Recording:
1555 if (w->get_state() != STATE_ACTIVE) {
1556 w->set_state (STATE_ACTIVE);
1562 if (w->get_state() != STATE_NORMAL) {
1563 w->set_state (STATE_NORMAL);
1569 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1575 switch (session->record_status()) {
1576 case Session::Enabled:
1578 rec_button.set_state (1);
1580 rec_button.set_state (0);
1584 case Session::Recording:
1585 rec_button.set_state (2);
1589 rec_button.set_state (0);
1595 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1603 ARDOUR_UI::start_keyboard_prefix ()
1605 keyboard->start_prefix();
1609 ARDOUR_UI::save_template ()
1612 ArdourPrompter prompter (true);
1615 prompter.set_name (X_("Prompter"));
1616 prompter.set_prompt (_("Name for mix template:"));
1617 prompter.set_initial_text(session->name() + _("-template"));
1618 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1619 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1621 switch (prompter.run()) {
1622 case RESPONSE_ACCEPT:
1623 prompter.get_result (name);
1625 if (name.length()) {
1626 session->save_template (name);
1636 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1638 m_new_session_dialog->show();
1639 m_new_session_dialog->set_modal(true);
1640 m_new_session_dialog->set_name(predetermined_path);
1641 m_new_session_dialog->reset_recent();
1643 int response = Gtk::RESPONSE_CANCEL;
1646 response = m_new_session_dialog->run ();
1647 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1651 } else if (response == Gtk::RESPONSE_NONE) {
1652 /* Clear was pressed */
1653 m_new_session_dialog->reset();
1655 } else if (response == Gtk::RESPONSE_YES) {
1656 /* YES == OPEN, but there's no enum for that */
1657 std::string session_name = m_new_session_dialog->session_name();
1658 std::string session_path = m_new_session_dialog->session_folder();
1659 load_session (session_path, session_name);
1662 } else if (response == Gtk::RESPONSE_OK) {
1663 if (m_new_session_dialog->get_current_page() == 1) {
1665 /* XXX this is a bit of a hack..
1666 i really want the new sesion dialog to return RESPONSE_YES
1667 if we're on page 1 (the load page)
1668 Unfortunately i can't see how atm..
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);
1676 _session_is_new = true;
1678 std::string session_name = m_new_session_dialog->session_name();
1679 std::string session_path = m_new_session_dialog->session_folder();
1682 //XXX This is needed because session constructor wants a
1683 //non-existant path. hopefully this will be fixed at some point.
1685 session_path = Glib::build_filename(session_path, session_name);
1687 std::string template_name = m_new_session_dialog->session_template_name();
1689 if (m_new_session_dialog->use_session_template()) {
1691 load_session (session_path, session_name, &template_name);
1697 Session::AutoConnectOption iconnect;
1698 Session::AutoConnectOption oconnect;
1700 if (m_new_session_dialog->create_control_bus()) {
1701 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1706 if (m_new_session_dialog->create_master_bus()) {
1707 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1712 if (m_new_session_dialog->connect_inputs()) {
1713 iconnect = Session::AutoConnectPhysical;
1715 iconnect = Session::AutoConnectOption (0);
1718 /// @todo some minor tweaks.
1720 if (m_new_session_dialog->connect_outs_to_master()) {
1721 oconnect = Session::AutoConnectMaster;
1722 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1723 oconnect = Session::AutoConnectPhysical;
1725 oconnect = Session::AutoConnectOption (0);
1728 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1729 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1731 build_session (session_path,
1739 engine->frame_rate() * 60 * 5);
1744 } while (response == Gtk::RESPONSE_NONE);
1745 m_new_session_dialog->hide();
1751 ARDOUR_UI::close_session()
1758 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1760 Session *new_session;
1762 session_loaded = false;
1763 x = unload_session ();
1771 /* if it already exists, we must have write access */
1773 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1774 MessageDialog msg (*editor, _("\
1775 You do not have write access to this session.\n\
1776 This prevents the session from being loaded."));
1782 new_session = new Session (*engine, path, snap_name, mix_template);
1787 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1791 connect_to_session (new_session);
1793 //if (engine->running()) {
1794 //mixer->show_window();
1796 session_loaded = true;
1801 ARDOUR_UI::make_session_clean ()
1804 session->set_clean ();
1813 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1814 uint32_t control_channels,
1815 uint32_t master_channels,
1816 Session::AutoConnectOption input_connect,
1817 Session::AutoConnectOption output_connect,
1820 jack_nframes_t initial_length)
1822 Session *new_session;
1825 session_loaded = false;
1826 x = unload_session ();
1833 _session_is_new = true;
1836 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1837 control_channels, master_channels, nphysin, nphysout, initial_length);
1842 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1846 connect_to_session (new_session);
1848 //if (engine->running()) {
1849 //mixer->show_window();
1851 session_loaded = true;
1859 editor->show_window ();
1863 if (session && mixer) {
1864 // mixer->show_window ();
1873 ARDOUR_UI::show_splash ()
1876 about = new About();
1882 ARDOUR_UI::hide_splash ()
1890 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1894 removed = rep.paths.size();
1897 MessageDialog msgd (*editor,
1898 _("No audio files were ready for cleanup"),
1901 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1902 msgd.set_secondary_text (_("If this seems suprising, \n\
1903 check for any existing snapshots.\n\
1904 These may still include regions that\n\
1905 require some unused files to continue to exist."));
1911 ArdourDialog results (_("ardour: cleanup"), true, false);
1913 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1914 CleanupResultsModelColumns() {
1918 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1919 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1923 CleanupResultsModelColumns results_columns;
1924 Glib::RefPtr<Gtk::ListStore> results_model;
1925 Gtk::TreeView results_display;
1927 results_model = ListStore::create (results_columns);
1928 results_display.set_model (results_model);
1929 results_display.append_column (list_title, results_columns.visible_name);
1931 results_display.set_name ("CleanupResultsList");
1932 results_display.set_headers_visible (true);
1933 results_display.set_headers_clickable (false);
1934 results_display.set_reorderable (false);
1936 Gtk::ScrolledWindow list_scroller;
1939 Gtk::HBox dhbox; // the hbox for the image and text
1940 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1941 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1943 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1945 if (rep.space < 1048576.0f) {
1947 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1949 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1953 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1955 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1959 dhbox.pack_start (*dimage, true, false, 5);
1960 dhbox.pack_start (txt, true, false, 5);
1962 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1963 TreeModel::Row row = *(results_model->append());
1964 row[results_columns.visible_name] = *i;
1965 row[results_columns.fullpath] = *i;
1968 list_scroller.add (results_display);
1969 list_scroller.set_size_request (-1, 150);
1970 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
1972 dvbox.pack_start (dhbox, true, false, 5);
1973 dvbox.pack_start (list_scroller, true, false, 5);
1974 ddhbox.pack_start (dvbox, true, false, 5);
1976 results.get_vbox()->pack_start (ddhbox, true, false, 5);
1977 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
1978 results.set_default_response (RESPONSE_CLOSE);
1979 results.set_position (Gtk::WIN_POS_MOUSE);
1980 results.show_all_children ();
1981 results.set_resizable (false);
1988 ARDOUR_UI::cleanup ()
1991 /* shouldn't happen: menu item is insensitive */
1996 MessageDialog checker (_("Are you sure you want to cleanup?"),
1998 Gtk::MESSAGE_QUESTION,
1999 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2001 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2002 ALL undo/redo information will be lost if you cleanup.\n\
2003 After cleanup, unused audio files will be moved to a \
2004 \"dead sounds\" location."));
2006 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2007 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2008 checker.set_default_response (RESPONSE_CANCEL);
2010 checker.set_name (_("CleanupDialog"));
2011 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2012 checker.set_position (Gtk::WIN_POS_MOUSE);
2014 switch (checker.run()) {
2015 case RESPONSE_ACCEPT:
2021 Session::cleanup_report rep;
2023 editor->prepare_for_cleanup ();
2025 if (session->cleanup_sources (rep)) {
2029 display_cleanup_results (rep,
2032 The following %1 %2 not in use and \n\
2033 have been moved to:\n\
2035 Flushing the wastebasket will \n\
2036 release an additional\n\
2037 %4 %5bytes of disk space.\n"
2042 ARDOUR_UI::flush_trash ()
2045 /* shouldn't happen: menu item is insensitive */
2049 Session::cleanup_report rep;
2051 if (session->cleanup_trash_sources (rep)) {
2055 display_cleanup_results (rep,
2057 _("The following %1 %2 deleted from\n\
2059 releasing %4 %5bytes of disk space"));
2063 ARDOUR_UI::add_route ()
2071 if (add_route_dialog == 0) {
2072 add_route_dialog = new AddRouteDialog;
2073 editor->ensure_float (*add_route_dialog);
2076 if (add_route_dialog->is_visible()) {
2077 /* we're already doing this */
2081 ResponseType r = (ResponseType) add_route_dialog->run ();
2083 add_route_dialog->hide();
2086 case RESPONSE_ACCEPT:
2093 if ((count = add_route_dialog->count()) <= 0) {
2097 uint32_t input_chan = add_route_dialog->channels ();
2098 uint32_t output_chan;
2099 string name_template = add_route_dialog->name_template ();
2100 bool track = add_route_dialog->track ();
2102 Session::AutoConnectOption oac = session->get_output_auto_connect();
2104 if (oac & Session::AutoConnectMaster) {
2105 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2107 output_chan = input_chan;
2110 /* XXX do something with name template */
2113 if (track && add_route_dialog->midi()) {
2114 session_add_midi_track();
2115 } else if (add_route_dialog->midi()) {
2116 session_add_midi_bus();
2118 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2120 session_add_audio_bus (input_chan, output_chan);
2124 while (Main::events_pending()) {
2131 ARDOUR_UI::mixer_settings () const
2136 node = session->instant_xml(X_("Mixer"), session->path());
2138 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2142 node = new XMLNode (X_("Mixer"));
2149 ARDOUR_UI::editor_settings () const
2154 node = session->instant_xml(X_("Editor"), session->path());
2156 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2160 node = new XMLNode (X_("Editor"));
2166 ARDOUR_UI::keyboard_settings () const
2170 node = Config->extra_xml(X_("Keyboard"));
2173 node = new XMLNode (X_("Keyboard"));
2179 ARDOUR_UI::halt_on_xrun_message ()
2181 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2183 MessageDialog msg (*editor,
2184 _("Recording was stopped because your system could not keep up."));
2189 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::AudioFileSource*>* deletion_list)
2191 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2193 for (list<AudioFileSource*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2197 delete deletion_list;
2201 ARDOUR_UI::disk_overrun_handler ()
2203 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2205 if (!have_disk_overrun_displayed) {
2206 have_disk_overrun_displayed = true;
2207 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2208 The disk system on your computer\n\
2209 was not able to keep up with Ardour.\n\
2211 Specifically, it failed to write data to disk\n\
2212 quickly enough to keep up with recording.\n"));
2214 have_disk_overrun_displayed = false;
2219 ARDOUR_UI::disk_underrun_handler ()
2221 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2223 if (!have_disk_underrun_displayed) {
2224 have_disk_underrun_displayed = true;
2225 MessageDialog msg (*editor,
2226 (_("The disk system on your computer\n\
2227 was not able to keep up with Ardour.\n\
2229 Specifically, it failed to read data from disk\n\
2230 quickly enough to keep up with playback.\n")));
2232 have_disk_underrun_displayed = false;
2237 ARDOUR_UI::disk_underrun_message_gone ()
2239 have_disk_underrun_displayed = false;
2243 ARDOUR_UI::disk_overrun_message_gone ()
2245 have_disk_underrun_displayed = false;
2249 ARDOUR_UI::pending_state_dialog ()
2251 ArdourDialog dialog ("pending state dialog");
2253 This session appears to have been in\n\
2254 middle of recording when ardour or\n\
2255 the computer was shutdown.\n\
2257 Ardour can recover any captured audio for\n\
2258 you, or it can ignore it. Please decide\n\
2259 what you would like to do.\n"));
2261 dialog.get_vbox()->pack_start (message);
2262 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2263 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2265 dialog.set_position (WIN_POS_CENTER);
2268 switch (dialog.run ()) {
2269 case RESPONSE_ACCEPT:
2277 ARDOUR_UI::disconnect_from_jack ()
2280 if( engine->disconnect_from_jack ()) {
2281 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2285 update_sample_rate (0);
2290 ARDOUR_UI::reconnect_to_jack ()
2293 if (engine->reconnect_to_jack ()) {
2294 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2298 update_sample_rate (0);
2303 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2305 engine->request_buffer_size (nframes);
2306 update_sample_rate (0);
2310 ARDOUR_UI::cmdline_new_session (string path)
2312 if (path[0] != '/') {
2313 char buf[PATH_MAX+1];
2316 getcwd (buf, sizeof (buf));
2323 new_session (false, path);
2325 _will_create_new_session_automatically = false; /* done it */
2326 return FALSE; /* don't call it again */
2330 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2332 Glib::RefPtr<Action> act;
2336 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2339 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2342 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2345 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2348 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2351 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2354 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2359 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2360 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2361 Config->set_native_file_header_format (hf);
2363 session->reset_native_file_format ();
2370 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2372 Glib::RefPtr<Action> act;
2376 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2379 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2384 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2386 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2387 Config->set_native_file_data_format (sf);
2389 session->reset_native_file_format ();
2396 ARDOUR_UI::use_config ()
2398 Glib::RefPtr<Action> act;
2400 switch (Config->get_native_file_data_format ()) {
2402 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2405 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2410 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2411 ract->set_active ();
2414 switch (Config->get_native_file_header_format ()) {
2416 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2419 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2422 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2425 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2428 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2431 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2434 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2439 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2440 ract->set_active ();