2 Copyright (C) 1999-2002 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
31 #include <gtkmm/messagedialog.h>
32 #include <gtkmm/accelmap.h>
34 #include <pbd/error.h>
35 #include <pbd/compose.h>
36 #include <pbd/pathscanner.h>
37 #include <pbd/failed_constructor.h>
38 #include <gtkmm2ext/gtk_ui.h>
39 #include <gtkmm2ext/utils.h>
40 #include <gtkmm2ext/click_box.h>
41 #include <gtkmm2ext/fastmeter.h>
42 #include <gtkmm2ext/stop_signal.h>
43 #include <gtkmm2ext/popup.h>
45 #include <midi++/port.h>
46 #include <midi++/mmc.h>
48 #include <ardour/ardour.h>
49 #include <ardour/port.h>
50 #include <ardour/audioengine.h>
51 #include <ardour/playlist.h>
52 #include <ardour/utils.h>
53 #include <ardour/audio_diskstream.h>
54 #include <ardour/audiofilesource.h>
55 #include <ardour/recent_sessions.h>
56 #include <ardour/session_route.h>
57 #include <ardour/port.h>
58 #include <ardour/audio_track.h>
59 #include <ardour/midi_track.h>
62 #include "ardour_ui.h"
63 #include "public_editor.h"
64 #include "audio_clock.h"
69 #include "keyboard_target.h"
70 #include "add_route_dialog.h"
71 #include "new_session_dialog.h"
74 #include "gui_thread.h"
75 #include "color_manager.h"
79 using namespace ARDOUR;
81 using namespace Gtkmm2ext;
85 ARDOUR_UI *ARDOUR_UI::theArdourUI = 0;
87 sigc::signal<void,bool> ARDOUR_UI::Blink;
88 sigc::signal<void> ARDOUR_UI::RapidScreenUpdate;
89 sigc::signal<void> ARDOUR_UI::SuperRapidScreenUpdate;
90 sigc::signal<void,jack_nframes_t> ARDOUR_UI::Clock;
92 ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
94 : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile),
96 primary_clock (X_("TransportClockDisplay"), true, false, true),
97 secondary_clock (X_("SecondaryClockDisplay"), true, false, true),
98 preroll_clock (X_("PreRollClock"), true, true),
99 postroll_clock (X_("PostRollClock"), true, true),
103 adjuster_table (3, 3),
107 preroll_button (_("pre\nroll")),
108 postroll_button (_("post\nroll")),
112 big_clock ("BigClockDisplay", true),
116 time_master_button (_("time\nmaster")),
118 shuttle_units_button (_("% ")),
120 punch_in_button (_("Punch In")),
121 punch_out_button (_("Punch Out")),
122 auto_return_button (_("Auto Return")),
123 auto_play_button (_("Autuo Play")),
124 auto_input_button (_("Auto Input")),
125 click_button (_("Click")),
126 auditioning_alert_button (_("AUDITION")),
127 solo_alert_button (_("SOLO")),
130 using namespace Gtk::Menu_Helpers;
136 if (theArdourUI == 0) {
142 color_manager = new ColorManager();
144 std::string color_file = ARDOUR::find_config_file("ardour.colors");
146 color_manager->load (color_file);
151 _session_is_new = false;
152 big_clock_window = 0;
153 session_selector_window = 0;
154 last_key_press_time = 0;
155 connection_editor = 0;
156 add_route_dialog = 0;
161 open_session_selector = 0;
162 have_configure_timeout = false;
163 have_disk_overrun_displayed = false;
164 have_disk_underrun_displayed = false;
165 _will_create_new_session_automatically = false;
166 session_loaded = false;
167 last_speed_displayed = -1.0f;
169 last_configure_time.tv_sec = 0;
170 last_configure_time.tv_usec = 0;
172 shuttle_grabbed = false;
174 shuttle_max_speed = 8.0f;
176 set_shuttle_units (Percentage);
177 set_shuttle_behaviour (Sprung);
179 shuttle_style_menu = 0;
180 shuttle_unit_menu = 0;
182 gettimeofday (&last_peak_grab, 0);
183 gettimeofday (&last_shuttle_request, 0);
185 ARDOUR::AudioDiskstream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
186 ARDOUR::Diskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
187 ARDOUR::Diskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
189 /* handle pending state with a dialog */
191 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
193 /* have to wait for AudioEngine and Configuration before proceeding */
197 ARDOUR_UI::set_engine (AudioEngine& e)
201 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
202 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
203 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
204 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
206 ActionManager::init ();
207 new_session_dialog = new NewSessionDialog();
211 keyboard = new Keyboard;
213 if (setup_windows ()) {
214 throw failed_constructor ();
217 if (GTK_ARDOUR::show_key_actions) {
218 vector<string> names;
219 vector<string> paths;
221 vector<AccelKey> bindings;
223 ActionManager::get_all_actions (names, paths, keys, bindings);
225 vector<string>::iterator n;
226 vector<string>::iterator k;
227 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
228 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
234 /* start with timecode, metering enabled
237 blink_timeout_tag = -1;
239 /* the global configuration object is now valid */
243 /* this being a GUI and all, we want peakfiles */
245 AudioFileSource::set_build_peakfiles (true);
246 AudioFileSource::set_build_missing_peakfiles (true);
248 if (AudioSource::start_peak_thread ()) {
249 throw failed_constructor();
252 /* start the time-of-day-clock */
254 update_wall_clock ();
255 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
257 update_disk_space ();
259 update_sample_rate (engine->frame_rate());
261 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
262 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
265 ARDOUR_UI::~ARDOUR_UI ()
267 save_ardour_state ();
281 if (add_route_dialog) {
282 delete add_route_dialog;
285 AudioSource::stop_peak_thread ();
289 ARDOUR_UI::configure_timeout ()
294 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
295 /* no configure events yet */
299 gettimeofday (&now, 0);
300 timersub (&now, &last_configure_time, &diff);
302 /* force a gap of 0.5 seconds since the last configure event
305 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
308 have_configure_timeout = false;
309 save_ardour_state ();
315 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
317 if (have_configure_timeout) {
318 gettimeofday (&last_configure_time, 0);
320 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
321 have_configure_timeout = true;
328 ARDOUR_UI::save_ardour_state ()
330 if (!keyboard || !mixer || !editor) {
334 /* XXX this is all a bit dubious. add_extra_xml() uses
335 a different lifetime model from add_instant_xml().
338 XMLNode* node = new XMLNode (keyboard->get_state());
339 Config->add_extra_xml (*node);
340 Config->save_state();
342 XMLNode enode(static_cast<Stateful*>(editor)->get_state());
343 XMLNode mnode(mixer->get_state());
346 session->add_instant_xml (enode, session->path());
347 session->add_instant_xml (mnode, session->path());
349 Config->add_instant_xml (enode, get_user_ardour_path());
350 Config->add_instant_xml (mnode, get_user_ardour_path());
355 AccelMap::save ("ardour.saved_bindings");
359 ARDOUR_UI::startup ()
361 /* Once the UI is up and running, start the audio engine. Doing
362 this before the UI is up and running can cause problems
363 when not running with SCHED_FIFO, because the amount of
364 CPU and disk work needed to get the UI started can interfere
365 with the scheduling of the audio thread.
368 Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
374 if (session && session->dirty()) {
375 switch (ask_about_saving_session(_("quit"))) {
380 /* use the default name */
381 if (save_state_canfail ("")) {
382 /* failed - don't quit */
383 MessageDialog msg (*editor,
385 Ardour was unable to save your session.\n\n\
386 If you still wish to quit, please use the\n\n\
387 \"Just quit\" option."));
396 Config->save_state();
401 ARDOUR_UI::ask_about_saving_session (const string & what)
403 ArdourDialog window (_("ardour: save session?"));
404 Gtk::HBox dhbox; // the hbox for the image and text
405 Gtk::Label prompt_label;
406 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
410 msg = string_compose(_("Don't %1"), what);
411 window.add_button (msg, RESPONSE_REJECT);
412 msg = string_compose(_("Just %1"), what);
413 window.add_button (msg, RESPONSE_APPLY);
414 msg = string_compose(_("Save and %1"), what);
415 window.add_button (msg, RESPONSE_ACCEPT);
417 window.set_default_response (RESPONSE_ACCEPT);
419 Gtk::Button noquit_button (msg);
420 noquit_button.set_name ("EditorGTKButton");
425 if (session->snap_name() == session->name()) {
428 type = _("snapshot");
430 prompt = string_compose(_("The %1\"%2\"\nhas not been saved.\n\nAny changes made this time\nwill be lost unless you save it.\n\nWhat do you want to do?"),
431 type, session->snap_name());
433 prompt_label.set_text (prompt);
434 prompt_label.set_name (X_("PrompterLabel"));
435 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
437 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
439 dhbox.set_homogeneous (false);
440 dhbox.pack_start (*dimage, false, false, 5);
441 dhbox.pack_start (prompt_label, true, false, 5);
442 window.get_vbox()->pack_start (dhbox);
444 window.set_name (_("Prompter"));
445 window.set_position (Gtk::WIN_POS_MOUSE);
446 window.set_modal (true);
447 window.set_resizable (false);
450 save_the_session = 0;
452 editor->ensure_float (window);
454 ResponseType r = (ResponseType) window.run();
459 case RESPONSE_ACCEPT: // save and get out of here
461 case RESPONSE_APPLY: // get out of here
471 ARDOUR_UI::every_second ()
474 update_buffer_load ();
475 update_disk_space ();
480 ARDOUR_UI::every_point_one_seconds ()
482 update_speed_display ();
483 RapidScreenUpdate(); /* EMIT_SIGNAL */
488 ARDOUR_UI::every_point_zero_one_seconds ()
490 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
495 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
499 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
501 if (!engine->connected()) {
503 snprintf (buf, sizeof (buf), _("disconnected"));
507 jack_nframes_t rate = engine->frame_rate();
509 if (fmod (rate, 1000.0) != 0.0) {
510 snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"),
511 (float) rate/1000.0f,
512 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
514 snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"),
516 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
520 sample_rate_label.set_text (buf);
524 ARDOUR_UI::update_cpu_load ()
527 snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
528 cpu_load_label.set_text (buf);
532 ARDOUR_UI::update_buffer_load ()
537 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
538 session->playback_load(), session->capture_load());
539 buffer_load_label.set_text (buf);
541 buffer_load_label.set_text ("");
546 ARDOUR_UI::count_recenabled_diskstreams (Route& route)
548 Track* track = dynamic_cast<Track*>(&route);
549 if (track && track->diskstream()->record_enabled()) {
550 rec_enabled_diskstreams++;
555 ARDOUR_UI::update_disk_space()
561 jack_nframes_t frames = session->available_capture_duration();
564 if (frames == max_frames) {
565 strcpy (buf, _("Disk: 24hrs+"));
570 jack_nframes_t fr = session->frame_rate();
572 if (session->actively_recording()){
574 rec_enabled_diskstreams = 0;
575 session->foreach_route (this, &ARDOUR_UI::count_recenabled_diskstreams);
577 if (rec_enabled_diskstreams) {
578 frames /= rec_enabled_diskstreams;
583 /* hmmm. shall we divide by the route count? or the diskstream count?
584 or what? for now, do nothing ...
589 hrs = frames / (fr * 3600);
590 frames -= hrs * fr * 3600;
591 mins = frames / (fr * 60);
592 frames -= mins * fr * 60;
595 snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
598 disk_space_label.set_text (buf);
602 ARDOUR_UI::update_wall_clock ()
609 tm_now = localtime (&now);
611 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
612 wall_clock_label.set_text (buf);
617 ARDOUR_UI::control_methods_adjusted ()
622 which_method = (int) online_control_button->adjustment.get_value();
623 switch (which_method) {
625 allow_mmc_and_local ();
634 fatal << _("programming error: impossible control method") << endmsg;
640 ARDOUR_UI::mmc_device_id_adjusted ()
645 int dev_id = (int) mmc_id_button->adjustment.get_value();
646 mmc->set_device_id (dev_id);
652 ARDOUR_UI::session_menu (GdkEventButton *ev)
654 session_popup_menu->popup (0, 0);
659 ARDOUR_UI::redisplay_recent_sessions ()
661 vector<string *> *sessions;
662 vector<string *>::iterator i;
663 RecentSessionsSorter cmp;
665 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
666 recent_session_model->clear ();
669 ARDOUR::read_recent_sessions (rs);
672 recent_session_display.set_model (recent_session_model);
676 /* sort them alphabetically */
677 sort (rs.begin(), rs.end(), cmp);
678 sessions = new vector<string*>;
680 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
681 sessions->push_back (new string ((*i).second));
684 for (i = sessions->begin(); i != sessions->end(); ++i) {
686 vector<string*>* states;
687 vector<const gchar*> item;
688 string fullpath = *(*i);
690 /* remove any trailing / */
692 if (fullpath[fullpath.length()-1] == '/') {
693 fullpath = fullpath.substr (0, fullpath.length()-1);
696 /* now get available states for this session */
698 if ((states = Session::possible_states (fullpath)) == 0) {
703 TreeModel::Row row = *(recent_session_model->append());
705 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
706 row[recent_session_columns.fullpath] = fullpath;
708 if (states->size() > 1) {
710 /* add the children */
712 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
714 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
716 child_row[recent_session_columns.visible_name] = **i2;
717 child_row[recent_session_columns.fullpath] = fullpath;
726 recent_session_display.set_model (recent_session_model);
731 ARDOUR_UI::build_session_selector ()
733 session_selector_window = new ArdourDialog ("session selector");
735 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
737 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
738 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
739 session_selector_window->set_default_response (RESPONSE_ACCEPT);
740 recent_session_model = TreeStore::create (recent_session_columns);
741 recent_session_display.set_model (recent_session_model);
742 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
743 recent_session_display.set_headers_visible (false);
744 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
746 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
748 scroller->add (recent_session_display);
749 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
751 session_selector_window->set_name ("SessionSelectorWindow");
752 session_selector_window->set_size_request (200, 400);
753 session_selector_window->get_vbox()->pack_start (*scroller);
754 session_selector_window->show_all_children();
758 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
760 session_selector_window->response (RESPONSE_ACCEPT);
764 ARDOUR_UI::open_recent_session ()
766 /* popup selector window */
768 if (session_selector_window == 0) {
769 build_session_selector ();
772 redisplay_recent_sessions ();
774 ResponseType r = (ResponseType) session_selector_window->run ();
776 session_selector_window->hide();
779 case RESPONSE_ACCEPT:
785 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
787 if (i == recent_session_model->children().end()) {
791 Glib::ustring path = (*i)[recent_session_columns.fullpath];
792 Glib::ustring state = (*i)[recent_session_columns.visible_name];
794 _session_is_new = false;
796 load_session (path, state);
800 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
804 if (stat (info.filename.c_str(), &statbuf) != 0) {
808 if (!S_ISDIR(statbuf.st_mode)) {
814 string session_file = info.filename;
816 session_file += Glib::path_get_basename (info.filename);
817 session_file += ".ardour";
819 if (stat (session_file.c_str(), &statbuf) != 0) {
823 return S_ISREG (statbuf.st_mode);
827 ARDOUR_UI::open_session ()
829 /* popup selector window */
831 if (open_session_selector == 0) {
833 /* ardour sessions are folders */
835 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
836 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
837 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
839 FileFilter session_filter;
840 session_filter.add_pattern ("*.ardour");
841 session_filter.set_name (_("Ardour sessions"));
842 open_session_selector->add_filter (session_filter);
843 open_session_selector->set_filter (session_filter);
846 int response = open_session_selector->run();
847 open_session_selector->hide ();
850 case RESPONSE_ACCEPT:
853 open_session_selector->hide();
857 open_session_selector->hide();
858 string session_path = open_session_selector->get_filename();
862 if (session_path.length() > 0) {
863 if (Session::find_session (session_path, path, name, isnew) == 0) {
864 _session_is_new = isnew;
865 load_session (path, name);
872 ARDOUR_UI::session_add_midi_route (bool disk, uint32_t how_many)
874 list<boost::shared_ptr<MidiTrack> > tracks;
877 warning << _("You cannot add a track without a session already loaded.") << endmsg;
884 tracks = session->new_midi_track (ARDOUR::Normal, how_many);
886 if (tracks.size() != how_many) {
888 error << _("could not create a new midi track") << endmsg;
890 error << string_compose (_("could not create %1 new midi tracks"), how_many) << endmsg;
894 if ((route = session->new_midi_route ()) == 0) {
895 error << _("could not create new midi bus") << endmsg;
901 MessageDialog msg (*editor,
902 _("There are insufficient JACK ports available\n\
903 to create a new track or bus.\n\
904 You should save Ardour, exit and\n\
905 restart JACK with more ports."));
912 ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many)
914 list<boost::shared_ptr<AudioTrack> > tracks;
915 Session::RouteList routes;
918 warning << _("You cannot add a track or bus without a session already loaded.") << endmsg;
924 tracks = session->new_audio_track (input_channels, output_channels, mode, how_many);
926 if (tracks.size() != how_many) {
928 error << _("could not create a new audio track") << endmsg;
930 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
936 routes = session->new_audio_route (input_channels, output_channels, how_many);
938 if (routes.size() != how_many) {
940 error << _("could not create a new audio track") << endmsg;
942 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
948 if (need_control_room_outs) {
954 route->set_stereo_control_outs (control_lr_channels);
955 route->control_outs()->set_stereo_pan (pans, this);
957 #endif /* CONTROLOUTS */
961 MessageDialog msg (*editor,
962 _("There are insufficient JACK ports available\n\
963 to create a new track or bus.\n\
964 You should save Ardour, exit and\n\
965 restart JACK with more ports."));
971 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
973 jack_nframes_t _preroll;
976 _preroll = session->convert_to_frames_at (new_position, session->preroll);
978 if (new_position > _preroll) {
979 new_position -= _preroll;
984 session->request_locate (new_position);
989 ARDOUR_UI::transport_goto_start ()
992 session->goto_start();
995 /* force displayed area in editor to start no matter
996 what "follow playhead" setting is.
1000 editor->reposition_x_origin (session->current_start_frame());
1006 ARDOUR_UI::transport_goto_zero ()
1009 session->request_locate (0);
1012 /* force displayed area in editor to start no matter
1013 what "follow playhead" setting is.
1017 editor->reposition_x_origin (0);
1023 ARDOUR_UI::transport_goto_end ()
1026 jack_nframes_t frame = session->current_end_frame();
1027 session->request_locate (frame);
1029 /* force displayed area in editor to start no matter
1030 what "follow playhead" setting is.
1034 editor->reposition_x_origin (frame);
1040 ARDOUR_UI::transport_stop ()
1046 if (session->is_auditioning()) {
1047 session->cancel_audition ();
1051 if (session->get_auto_loop()) {
1052 session->request_auto_loop (false);
1055 session->request_stop ();
1059 ARDOUR_UI::transport_stop_and_forget_capture ()
1062 session->request_stop (true);
1067 ARDOUR_UI::remove_last_capture()
1070 editor->remove_last_capture();
1075 ARDOUR_UI::transport_record ()
1078 switch (session->record_status()) {
1079 case Session::Disabled:
1080 if (session->ntracks() == 0) {
1081 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1082 MessageDialog msg (*editor, txt);
1086 session->maybe_enable_record ();
1088 case Session::Recording:
1089 case Session::Enabled:
1090 session->disable_record (true);
1096 ARDOUR_UI::transport_roll ()
1104 rolling = session->transport_rolling ();
1106 if (session->get_auto_loop()) {
1107 session->request_auto_loop (false);
1108 auto_loop_button.set_active (false);
1109 roll_button.set_active (true);
1110 } else if (session->get_play_range ()) {
1111 session->request_play_range (false);
1112 play_selection_button.set_active (false);
1113 } else if (rolling) {
1114 session->request_locate (session->last_transport_start(), true);
1117 session->request_transport_speed (1.0f);
1121 ARDOUR_UI::transport_loop()
1124 if (session->get_auto_loop()) {
1125 if (session->transport_rolling()) {
1126 Location * looploc = session->locations()->auto_loop_location();
1128 session->request_locate (looploc->start(), true);
1133 session->request_auto_loop (true);
1139 ARDOUR_UI::transport_play_selection ()
1145 if (!session->get_play_range()) {
1146 session->request_stop ();
1149 editor->play_selection ();
1153 ARDOUR_UI::transport_rewind (int option)
1155 float current_transport_speed;
1158 current_transport_speed = session->transport_speed();
1160 if (current_transport_speed >= 0.0f) {
1163 session->request_transport_speed (-1.0f);
1166 session->request_transport_speed (-4.0f);
1169 session->request_transport_speed (-0.5f);
1174 session->request_transport_speed (current_transport_speed * 1.5f);
1180 ARDOUR_UI::transport_forward (int option)
1182 float current_transport_speed;
1185 current_transport_speed = session->transport_speed();
1187 if (current_transport_speed <= 0.0f) {
1190 session->request_transport_speed (1.0f);
1193 session->request_transport_speed (4.0f);
1196 session->request_transport_speed (0.5f);
1201 session->request_transport_speed (current_transport_speed * 1.5f);
1207 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1213 boost::shared_ptr<Route> r;
1215 if ((r = session->route_by_remote_id (dstream)) != 0) {
1219 if ((t = dynamic_cast<Track*>(r.get())) != 0) {
1220 t->diskstream()->set_record_enabled (!t->diskstream()->record_enabled());
1229 ARDOUR_UI::queue_transport_change ()
1231 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1235 ARDOUR_UI::map_transport_state ()
1237 float sp = session->transport_speed();
1240 transport_rolling ();
1241 } else if (sp < 0.0f) {
1242 transport_rewinding ();
1243 } else if (sp > 0.0f) {
1244 transport_forwarding ();
1246 transport_stopped ();
1251 ARDOUR_UI::allow_local_only ()
1257 ARDOUR_UI::allow_mmc_only ()
1263 ARDOUR_UI::allow_mmc_and_local ()
1269 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1271 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1272 (int) adj.get_value()].c_str());
1276 ARDOUR_UI::engine_stopped ()
1278 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1279 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1280 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1285 ARDOUR_UI::engine_running ()
1287 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1288 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1289 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1293 ARDOUR_UI::engine_halted ()
1295 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1297 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1298 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1300 update_sample_rate (0);
1302 MessageDialog msg (*editor,
1304 JACK has either been shutdown or it\n\
1305 disconnected Ardour because Ardour\n\
1306 was not fast enough. You can save the\n\
1307 session and/or try to reconnect to JACK ."));
1312 ARDOUR_UI::do_engine_start ()
1318 catch (AudioEngine::PortRegistrationFailure& err) {
1320 error << _("Unable to create all required ports")
1328 error << _("Unable to start the session running")
1338 ARDOUR_UI::start_engine ()
1340 if (do_engine_start () == 0) {
1341 if (session && _session_is_new) {
1342 /* we need to retain initial visual
1343 settings for a new session
1345 session->save_state ("");
1348 /* there is too much going on, in too many threads, for us to
1349 end up with a clean session. So wait 1 second after loading,
1350 and fix it up. its ugly, but until i come across a better
1351 solution, its what we have.
1354 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1361 ARDOUR_UI::update_clocks ()
1363 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1367 ARDOUR_UI::start_clocking ()
1369 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1373 ARDOUR_UI::stop_clocking ()
1375 clock_signal_connection.disconnect ();
1379 ARDOUR_UI::toggle_clocking ()
1382 if (clock_button.get_active()) {
1391 ARDOUR_UI::_blink (void *arg)
1394 ((ARDOUR_UI *) arg)->blink ();
1401 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1405 ARDOUR_UI::start_blinking ()
1407 /* Start the blink signal. Everybody with a blinking widget
1408 uses Blink to drive the widget's state.
1411 if (blink_timeout_tag < 0) {
1413 blink_timeout_tag = g_timeout_add (240, _blink, this);
1418 ARDOUR_UI::stop_blinking ()
1420 if (blink_timeout_tag >= 0) {
1421 g_source_remove (blink_timeout_tag);
1422 blink_timeout_tag = -1;
1427 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1433 if (io.n_inputs().get_total() == 0) {
1438 /* XXX we're not handling multiple ports yet. */
1440 const char **connections = io.input(0)->get_connections();
1442 if (connections == 0 || connections[0] == '\0') {
1445 buf = connections[0];
1452 if (io.n_outputs().get_total() == 0) {
1457 /* XXX we're not handling multiple ports yet. */
1459 const char **connections = io.output(0)->get_connections();
1461 if (connections == 0 || connections[0] == '\0') {
1464 buf = connections[0];
1472 ARDOUR_UI::snapshot_session ()
1474 ArdourPrompter prompter (true);
1481 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1483 prompter.set_name ("Prompter");
1484 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1485 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1486 prompter.set_prompt (_("Name of New Snapshot"));
1487 prompter.set_initial_text (now);
1489 switch (prompter.run()) {
1490 case RESPONSE_ACCEPT:
1491 prompter.get_result (snapname);
1492 if (snapname.length()){
1493 save_state (snapname);
1503 ARDOUR_UI::save_state (const string & name)
1505 (void) save_state_canfail (name);
1509 ARDOUR_UI::save_state_canfail (string name)
1514 if (name.length() == 0) {
1515 name = session->snap_name();
1518 if ((ret = session->save_state (name)) != 0) {
1522 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1527 ARDOUR_UI::restore_state (string name)
1530 if (name.length() == 0) {
1531 name = session->name();
1533 session->restore_state (name);
1538 ARDOUR_UI::primary_clock_value_changed ()
1541 session->request_locate (primary_clock.current_time ());
1546 ARDOUR_UI::secondary_clock_value_changed ()
1549 session->request_locate (secondary_clock.current_time ());
1554 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1556 if (session && dstream && dstream->record_enabled()) {
1558 Session::RecordState rs;
1560 rs = session->record_status ();
1563 case Session::Disabled:
1564 case Session::Enabled:
1565 if (w->get_state() != STATE_SELECTED) {
1566 w->set_state (STATE_SELECTED);
1570 case Session::Recording:
1571 if (w->get_state() != STATE_ACTIVE) {
1572 w->set_state (STATE_ACTIVE);
1578 if (w->get_state() != STATE_NORMAL) {
1579 w->set_state (STATE_NORMAL);
1585 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1591 switch (session->record_status()) {
1592 case Session::Enabled:
1594 rec_button.set_state (1);
1596 rec_button.set_state (0);
1600 case Session::Recording:
1601 rec_button.set_state (2);
1605 rec_button.set_state (0);
1611 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1619 ARDOUR_UI::start_keyboard_prefix ()
1621 keyboard->start_prefix();
1625 ARDOUR_UI::save_template ()
1628 ArdourPrompter prompter (true);
1631 prompter.set_name (X_("Prompter"));
1632 prompter.set_prompt (_("Name for mix template:"));
1633 prompter.set_initial_text(session->name() + _("-template"));
1634 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1635 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1637 switch (prompter.run()) {
1638 case RESPONSE_ACCEPT:
1639 prompter.get_result (name);
1641 if (name.length()) {
1642 session->save_template (name);
1652 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1654 string session_name;
1655 string session_path;
1657 int response = Gtk::RESPONSE_NONE;
1659 new_session_dialog->set_modal(true);
1660 new_session_dialog->set_name(predetermined_path);
1661 new_session_dialog->reset_recent();
1662 new_session_dialog->show();
1664 //Glib::RefPtr<Gdk::Window> nsd_window = new_session_dialog->get_window();
1667 response = new_session_dialog->run ();
1668 //nsd_window ->set_cursor(Gdk::Cursor(Gdk::WATCH));
1669 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1673 } else if (response == Gtk::RESPONSE_NONE) {
1674 /* Clear was pressed */
1675 new_session_dialog->reset();
1677 } else if (response == Gtk::RESPONSE_YES) {
1679 /* YES == OPEN, but there's no enum for that */
1681 session_name = new_session_dialog->session_name();
1683 if (session_name.empty()) {
1684 response = Gtk::RESPONSE_NONE;
1685 cerr << "session name is empty\n";
1689 if (session_name[0] == '/' ||
1690 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1691 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1692 load_session (Glib::path_get_dirname (session_name), session_name);
1694 session_path = new_session_dialog->session_folder();
1695 load_session (session_path, session_name);
1698 } else if (response == Gtk::RESPONSE_OK) {
1700 if (new_session_dialog->get_current_page() == 1) {
1702 /* XXX this is a bit of a hack..
1703 i really want the new sesion dialog to return RESPONSE_YES
1704 if we're on page 1 (the load page)
1705 Unfortunately i can't see how atm..
1708 if (session_name.empty()) {
1709 response = Gtk::RESPONSE_NONE;
1710 cerr << "session name is empty 2\n";
1714 if (session_name[0] == '/' ||
1715 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1716 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1717 load_session (Glib::path_get_dirname (session_name), session_name);
1719 session_path = new_session_dialog->session_folder();
1720 load_session (session_path, session_name);
1725 _session_is_new = true;
1727 session_name = new_session_dialog->session_name();
1729 if (session_name.empty()) {
1730 response = Gtk::RESPONSE_NONE;
1731 cerr << "session name is empty 3\n";
1735 if (session_name[0] == '/' ||
1736 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1737 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1739 session_path = Glib::path_get_dirname (session_name);
1740 session_name = Glib::path_get_basename (session_name);
1744 std::string session_path = new_session_dialog->session_folder();
1748 //XXX This is needed because session constructor wants a
1749 //non-existant path. hopefully this will be fixed at some point.
1751 session_path = Glib::build_filename (session_path, session_name);
1753 std::string template_name = new_session_dialog->session_template_name();
1755 if (new_session_dialog->use_session_template()) {
1757 load_session (session_path, session_name, &template_name);
1763 Session::AutoConnectOption iconnect;
1764 Session::AutoConnectOption oconnect;
1766 if (new_session_dialog->create_control_bus()) {
1767 cchns = (uint32_t) new_session_dialog->control_channel_count();
1772 if (new_session_dialog->create_master_bus()) {
1773 mchns = (uint32_t) new_session_dialog->master_channel_count();
1778 if (new_session_dialog->connect_inputs()) {
1779 iconnect = Session::AutoConnectPhysical;
1781 iconnect = Session::AutoConnectOption (0);
1784 /// @todo some minor tweaks.
1786 if (new_session_dialog->connect_outs_to_master()) {
1787 oconnect = Session::AutoConnectMaster;
1788 } else if (new_session_dialog->connect_outs_to_physical()) {
1789 oconnect = Session::AutoConnectPhysical;
1791 oconnect = Session::AutoConnectOption (0);
1794 uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
1795 uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count();
1797 build_session (session_path,
1805 engine->frame_rate() * 60 * 5);
1810 } while (response == Gtk::RESPONSE_NONE);
1813 new_session_dialog->get_window()->set_cursor();
1814 new_session_dialog->hide();
1818 ARDOUR_UI::close_session()
1825 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1827 Session *new_session;
1829 session_loaded = false;
1830 x = unload_session ();
1838 /* if it already exists, we must have write access */
1840 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1841 MessageDialog msg (*editor, _("\
1842 You do not have write access to this session.\n\
1843 This prevents the session from being loaded."));
1849 new_session = new Session (*engine, path, snap_name, mix_template);
1854 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1858 connect_to_session (new_session);
1860 session_loaded = true;
1865 ARDOUR_UI::make_session_clean ()
1868 session->set_clean ();
1877 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1878 uint32_t control_channels,
1879 uint32_t master_channels,
1880 Session::AutoConnectOption input_connect,
1881 Session::AutoConnectOption output_connect,
1884 jack_nframes_t initial_length)
1886 Session *new_session;
1889 session_loaded = false;
1890 x = unload_session ();
1897 _session_is_new = true;
1900 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1901 control_channels, master_channels, nphysin, nphysout, initial_length);
1906 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1910 connect_to_session (new_session);
1912 session_loaded = true;
1920 editor->show_window ();
1935 ARDOUR_UI::show_splash ()
1938 about = new About();
1944 ARDOUR_UI::hide_splash ()
1947 about->get_window()->set_cursor ();
1953 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1957 removed = rep.paths.size();
1960 MessageDialog msgd (*editor,
1961 _("No audio files were ready for cleanup"),
1964 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1965 msgd.set_secondary_text (_("If this seems suprising, \n\
1966 check for any existing snapshots.\n\
1967 These may still include regions that\n\
1968 require some unused files to continue to exist."));
1974 ArdourDialog results (_("ardour: cleanup"), true, false);
1976 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1977 CleanupResultsModelColumns() {
1981 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1982 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1986 CleanupResultsModelColumns results_columns;
1987 Glib::RefPtr<Gtk::ListStore> results_model;
1988 Gtk::TreeView results_display;
1990 results_model = ListStore::create (results_columns);
1991 results_display.set_model (results_model);
1992 results_display.append_column (list_title, results_columns.visible_name);
1994 results_display.set_name ("CleanupResultsList");
1995 results_display.set_headers_visible (true);
1996 results_display.set_headers_clickable (false);
1997 results_display.set_reorderable (false);
1999 Gtk::ScrolledWindow list_scroller;
2002 Gtk::HBox dhbox; // the hbox for the image and text
2003 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
2004 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
2006 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
2008 if (rep.space < 1048576.0f) {
2010 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
2012 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
2016 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
2018 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
2022 dhbox.pack_start (*dimage, true, false, 5);
2023 dhbox.pack_start (txt, true, false, 5);
2025 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
2026 TreeModel::Row row = *(results_model->append());
2027 row[results_columns.visible_name] = *i;
2028 row[results_columns.fullpath] = *i;
2031 list_scroller.add (results_display);
2032 list_scroller.set_size_request (-1, 150);
2033 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2035 dvbox.pack_start (dhbox, true, false, 5);
2036 dvbox.pack_start (list_scroller, true, false, 5);
2037 ddhbox.pack_start (dvbox, true, false, 5);
2039 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2040 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2041 results.set_default_response (RESPONSE_CLOSE);
2042 results.set_position (Gtk::WIN_POS_MOUSE);
2043 results.show_all_children ();
2044 results.set_resizable (false);
2051 ARDOUR_UI::cleanup ()
2054 /* shouldn't happen: menu item is insensitive */
2059 MessageDialog checker (_("Are you sure you want to cleanup?"),
2061 Gtk::MESSAGE_QUESTION,
2062 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2064 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2065 ALL undo/redo information will be lost if you cleanup.\n\
2066 After cleanup, unused audio files will be moved to a \
2067 \"dead sounds\" location."));
2069 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2070 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2071 checker.set_default_response (RESPONSE_CANCEL);
2073 checker.set_name (_("CleanupDialog"));
2074 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2075 checker.set_position (Gtk::WIN_POS_MOUSE);
2077 switch (checker.run()) {
2078 case RESPONSE_ACCEPT:
2084 Session::cleanup_report rep;
2086 editor->prepare_for_cleanup ();
2088 if (session->cleanup_sources (rep)) {
2092 display_cleanup_results (rep,
2095 The following %1 %2 not in use and \n\
2096 have been moved to:\n\
2098 Flushing the wastebasket will \n\
2099 release an additional\n\
2100 %4 %5bytes of disk space.\n"
2105 ARDOUR_UI::flush_trash ()
2108 /* shouldn't happen: menu item is insensitive */
2112 Session::cleanup_report rep;
2114 if (session->cleanup_trash_sources (rep)) {
2118 display_cleanup_results (rep,
2120 _("The following %1 %2 deleted from\n\
2122 releasing %4 %5bytes of disk space"));
2126 ARDOUR_UI::add_route ()
2134 if (add_route_dialog == 0) {
2135 add_route_dialog = new AddRouteDialog;
2136 editor->ensure_float (*add_route_dialog);
2139 if (add_route_dialog->is_visible()) {
2140 /* we're already doing this */
2144 ResponseType r = (ResponseType) add_route_dialog->run ();
2146 add_route_dialog->hide();
2149 case RESPONSE_ACCEPT:
2156 if ((count = add_route_dialog->count()) <= 0) {
2160 uint32_t input_chan = add_route_dialog->channels ();
2161 uint32_t output_chan;
2162 string name_template = add_route_dialog->name_template ();
2163 bool track = add_route_dialog->track ();
2165 Session::AutoConnectOption oac = session->get_output_auto_connect();
2167 if (oac & Session::AutoConnectMaster) {
2168 output_chan = (session->master_out() ? session->master_out()->n_inputs().get(DataType::AUDIO) : input_chan);
2170 output_chan = input_chan;
2173 /* XXX do something with name template */
2175 if (add_route_dialog->type() == ARDOUR::DataType::MIDI) {
2177 session_add_midi_track(count);
2179 MessageDialog msg (*editor,
2180 _("Sorry, MIDI Busses are not supported at this time."));
2182 //session_add_midi_bus();
2186 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
2188 session_add_audio_bus (input_chan, output_chan, count);
2194 ARDOUR_UI::mixer_settings () const
2199 node = session->instant_xml(X_("Mixer"), session->path());
2201 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2205 node = new XMLNode (X_("Mixer"));
2212 ARDOUR_UI::editor_settings () const
2217 node = session->instant_xml(X_("Editor"), session->path());
2219 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2223 node = new XMLNode (X_("Editor"));
2229 ARDOUR_UI::keyboard_settings () const
2233 node = Config->extra_xml(X_("Keyboard"));
2236 node = new XMLNode (X_("Keyboard"));
2242 ARDOUR_UI::halt_on_xrun_message ()
2244 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2246 MessageDialog msg (*editor,
2247 _("Recording was stopped because your system could not keep up."));
2252 ARDOUR_UI::delete_sources_in_the_right_thread (list<boost::shared_ptr<ARDOUR::Source> >* deletion_list)
2254 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2256 for (list<boost::shared_ptr<Source> >::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2257 (*i)->drop_references ();
2260 delete deletion_list;
2264 ARDOUR_UI::disk_overrun_handler ()
2266 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2268 if (!have_disk_overrun_displayed) {
2269 have_disk_overrun_displayed = true;
2270 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2271 The disk system on your computer\n\
2272 was not able to keep up with Ardour.\n\
2274 Specifically, it failed to write data to disk\n\
2275 quickly enough to keep up with recording.\n"));
2277 have_disk_overrun_displayed = false;
2282 ARDOUR_UI::disk_underrun_handler ()
2284 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2286 if (!have_disk_underrun_displayed) {
2287 have_disk_underrun_displayed = true;
2288 MessageDialog msg (*editor,
2289 (_("The disk system on your computer\n\
2290 was not able to keep up with Ardour.\n\
2292 Specifically, it failed to read data from disk\n\
2293 quickly enough to keep up with playback.\n")));
2295 have_disk_underrun_displayed = false;
2300 ARDOUR_UI::disk_underrun_message_gone ()
2302 have_disk_underrun_displayed = false;
2306 ARDOUR_UI::disk_overrun_message_gone ()
2308 have_disk_underrun_displayed = false;
2312 ARDOUR_UI::pending_state_dialog ()
2314 ArdourDialog dialog ("pending state dialog");
2316 This session appears to have been in\n\
2317 middle of recording when ardour or\n\
2318 the computer was shutdown.\n\
2320 Ardour can recover any captured audio for\n\
2321 you, or it can ignore it. Please decide\n\
2322 what you would like to do.\n"));
2324 dialog.get_vbox()->pack_start (message);
2325 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2326 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2328 dialog.set_position (WIN_POS_CENTER);
2331 switch (dialog.run ()) {
2332 case RESPONSE_ACCEPT:
2340 ARDOUR_UI::disconnect_from_jack ()
2343 if( engine->disconnect_from_jack ()) {
2344 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2348 update_sample_rate (0);
2353 ARDOUR_UI::reconnect_to_jack ()
2356 if (engine->reconnect_to_jack ()) {
2357 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2361 update_sample_rate (0);
2366 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2368 engine->request_buffer_size (nframes);
2369 update_sample_rate (0);
2373 ARDOUR_UI::cmdline_new_session (string path)
2375 if (path[0] != '/') {
2376 char buf[PATH_MAX+1];
2379 getcwd (buf, sizeof (buf));
2386 new_session (false, path);
2388 _will_create_new_session_automatically = false; /* done it */
2389 return FALSE; /* don't call it again */
2393 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2395 Glib::RefPtr<Action> act;
2399 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2402 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2405 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2408 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2411 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2414 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2417 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2422 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2423 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2424 Config->set_native_file_header_format (hf);
2426 session->reset_native_file_format ();
2433 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2435 Glib::RefPtr<Action> act;
2439 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2442 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2447 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2449 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2450 Config->set_native_file_data_format (sf);
2452 session->reset_native_file_format ();
2459 ARDOUR_UI::use_config ()
2461 Glib::RefPtr<Action> act;
2463 switch (Config->get_native_file_data_format ()) {
2465 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2468 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2473 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2474 ract->set_active ();
2477 switch (Config->get_native_file_header_format ()) {
2479 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2482 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2485 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2488 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2491 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2494 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2497 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2502 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2503 ract->set_active ();