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 int response = Gtk::RESPONSE_NONE;
1656 new_session_dialog->set_modal(true);
1657 new_session_dialog->set_name(predetermined_path);
1658 new_session_dialog->reset_recent();
1659 new_session_dialog->show();
1661 //Glib::RefPtr<Gdk::Window> nsd_window = new_session_dialog->get_window();
1664 response = new_session_dialog->run ();
1665 //nsd_window ->set_cursor(Gdk::Cursor(Gdk::WATCH));
1666 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1670 } else if (response == Gtk::RESPONSE_NONE) {
1671 /* Clear was pressed */
1672 new_session_dialog->reset();
1674 } else if (response == Gtk::RESPONSE_YES) {
1675 /* YES == OPEN, but there's no enum for that */
1677 std::string session_name = new_session_dialog->session_name();
1678 std::string session_path = new_session_dialog->session_folder();
1679 load_session (session_path, session_name);
1682 } else if (response == Gtk::RESPONSE_OK) {
1683 if (new_session_dialog->get_current_page() == 1) {
1685 /* XXX this is a bit of a hack..
1686 i really want the new sesion dialog to return RESPONSE_YES
1687 if we're on page 1 (the load page)
1688 Unfortunately i can't see how atm..
1691 std::string session_name = new_session_dialog->session_name();
1692 std::string session_path = new_session_dialog->session_folder();
1693 load_session (session_path, session_name);
1697 _session_is_new = true;
1699 std::string session_name = new_session_dialog->session_name();
1700 std::string session_path = new_session_dialog->session_folder();
1703 //XXX This is needed because session constructor wants a
1704 //non-existant path. hopefully this will be fixed at some point.
1706 session_path = Glib::build_filename(session_path, session_name);
1708 std::string template_name = new_session_dialog->session_template_name();
1710 if (new_session_dialog->use_session_template()) {
1712 load_session (session_path, session_name, &template_name);
1718 Session::AutoConnectOption iconnect;
1719 Session::AutoConnectOption oconnect;
1721 if (new_session_dialog->create_control_bus()) {
1722 cchns = (uint32_t) new_session_dialog->control_channel_count();
1727 if (new_session_dialog->create_master_bus()) {
1728 mchns = (uint32_t) new_session_dialog->master_channel_count();
1733 if (new_session_dialog->connect_inputs()) {
1734 iconnect = Session::AutoConnectPhysical;
1736 iconnect = Session::AutoConnectOption (0);
1739 /// @todo some minor tweaks.
1741 if (new_session_dialog->connect_outs_to_master()) {
1742 oconnect = Session::AutoConnectMaster;
1743 } else if (new_session_dialog->connect_outs_to_physical()) {
1744 oconnect = Session::AutoConnectPhysical;
1746 oconnect = Session::AutoConnectOption (0);
1749 uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
1750 uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count();
1752 build_session (session_path,
1760 engine->frame_rate() * 60 * 5);
1765 } while (response == Gtk::RESPONSE_NONE);
1767 new_session_dialog->get_window()->set_cursor();
1769 new_session_dialog->hide();
1773 ARDOUR_UI::close_session()
1780 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1782 Session *new_session;
1784 session_loaded = false;
1785 x = unload_session ();
1793 /* if it already exists, we must have write access */
1795 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1796 MessageDialog msg (*editor, _("\
1797 You do not have write access to this session.\n\
1798 This prevents the session from being loaded."));
1804 new_session = new Session (*engine, path, snap_name, mix_template);
1809 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1813 connect_to_session (new_session);
1815 session_loaded = true;
1820 ARDOUR_UI::make_session_clean ()
1823 session->set_clean ();
1832 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1833 uint32_t control_channels,
1834 uint32_t master_channels,
1835 Session::AutoConnectOption input_connect,
1836 Session::AutoConnectOption output_connect,
1839 jack_nframes_t initial_length)
1841 Session *new_session;
1844 session_loaded = false;
1845 x = unload_session ();
1852 _session_is_new = true;
1855 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1856 control_channels, master_channels, nphysin, nphysout, initial_length);
1861 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1865 connect_to_session (new_session);
1867 session_loaded = true;
1875 editor->show_window ();
1885 ARDOUR_UI::show_splash ()
1888 about = new About();
1894 ARDOUR_UI::hide_splash ()
1897 about->get_window()->set_cursor ();
1903 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1907 removed = rep.paths.size();
1910 MessageDialog msgd (*editor,
1911 _("No audio files were ready for cleanup"),
1914 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1915 msgd.set_secondary_text (_("If this seems suprising, \n\
1916 check for any existing snapshots.\n\
1917 These may still include regions that\n\
1918 require some unused files to continue to exist."));
1924 ArdourDialog results (_("ardour: cleanup"), true, false);
1926 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1927 CleanupResultsModelColumns() {
1931 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1932 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1936 CleanupResultsModelColumns results_columns;
1937 Glib::RefPtr<Gtk::ListStore> results_model;
1938 Gtk::TreeView results_display;
1940 results_model = ListStore::create (results_columns);
1941 results_display.set_model (results_model);
1942 results_display.append_column (list_title, results_columns.visible_name);
1944 results_display.set_name ("CleanupResultsList");
1945 results_display.set_headers_visible (true);
1946 results_display.set_headers_clickable (false);
1947 results_display.set_reorderable (false);
1949 Gtk::ScrolledWindow list_scroller;
1952 Gtk::HBox dhbox; // the hbox for the image and text
1953 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1954 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1956 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1958 if (rep.space < 1048576.0f) {
1960 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1962 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1966 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1968 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1972 dhbox.pack_start (*dimage, true, false, 5);
1973 dhbox.pack_start (txt, true, false, 5);
1975 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1976 TreeModel::Row row = *(results_model->append());
1977 row[results_columns.visible_name] = *i;
1978 row[results_columns.fullpath] = *i;
1981 list_scroller.add (results_display);
1982 list_scroller.set_size_request (-1, 150);
1983 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
1985 dvbox.pack_start (dhbox, true, false, 5);
1986 dvbox.pack_start (list_scroller, true, false, 5);
1987 ddhbox.pack_start (dvbox, true, false, 5);
1989 results.get_vbox()->pack_start (ddhbox, true, false, 5);
1990 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
1991 results.set_default_response (RESPONSE_CLOSE);
1992 results.set_position (Gtk::WIN_POS_MOUSE);
1993 results.show_all_children ();
1994 results.set_resizable (false);
2001 ARDOUR_UI::cleanup ()
2004 /* shouldn't happen: menu item is insensitive */
2009 MessageDialog checker (_("Are you sure you want to cleanup?"),
2011 Gtk::MESSAGE_QUESTION,
2012 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2014 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2015 ALL undo/redo information will be lost if you cleanup.\n\
2016 After cleanup, unused audio files will be moved to a \
2017 \"dead sounds\" location."));
2019 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2020 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2021 checker.set_default_response (RESPONSE_CANCEL);
2023 checker.set_name (_("CleanupDialog"));
2024 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2025 checker.set_position (Gtk::WIN_POS_MOUSE);
2027 switch (checker.run()) {
2028 case RESPONSE_ACCEPT:
2034 Session::cleanup_report rep;
2036 editor->prepare_for_cleanup ();
2038 if (session->cleanup_sources (rep)) {
2042 display_cleanup_results (rep,
2045 The following %1 %2 not in use and \n\
2046 have been moved to:\n\
2048 Flushing the wastebasket will \n\
2049 release an additional\n\
2050 %4 %5bytes of disk space.\n"
2055 ARDOUR_UI::flush_trash ()
2058 /* shouldn't happen: menu item is insensitive */
2062 Session::cleanup_report rep;
2064 if (session->cleanup_trash_sources (rep)) {
2068 display_cleanup_results (rep,
2070 _("The following %1 %2 deleted from\n\
2072 releasing %4 %5bytes of disk space"));
2076 ARDOUR_UI::add_route ()
2084 if (add_route_dialog == 0) {
2085 add_route_dialog = new AddRouteDialog;
2086 editor->ensure_float (*add_route_dialog);
2089 if (add_route_dialog->is_visible()) {
2090 /* we're already doing this */
2094 ResponseType r = (ResponseType) add_route_dialog->run ();
2096 add_route_dialog->hide();
2099 case RESPONSE_ACCEPT:
2106 if ((count = add_route_dialog->count()) <= 0) {
2110 uint32_t input_chan = add_route_dialog->channels ();
2111 uint32_t output_chan;
2112 string name_template = add_route_dialog->name_template ();
2113 bool track = add_route_dialog->track ();
2115 Session::AutoConnectOption oac = session->get_output_auto_connect();
2117 if (oac & Session::AutoConnectMaster) {
2118 output_chan = (session->master_out() ? session->master_out()->n_inputs().get(DataType::AUDIO) : input_chan);
2120 output_chan = input_chan;
2123 /* XXX do something with name template */
2125 if (add_route_dialog->type() == ARDOUR::DataType::MIDI) {
2127 session_add_midi_track(count);
2129 MessageDialog msg (*editor,
2130 _("Sorry, MIDI Busses are not supported at this time."));
2132 //session_add_midi_bus();
2136 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
2138 session_add_audio_bus (input_chan, output_chan, count);
2144 ARDOUR_UI::mixer_settings () const
2149 node = session->instant_xml(X_("Mixer"), session->path());
2151 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2155 node = new XMLNode (X_("Mixer"));
2162 ARDOUR_UI::editor_settings () const
2167 node = session->instant_xml(X_("Editor"), session->path());
2169 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2173 node = new XMLNode (X_("Editor"));
2179 ARDOUR_UI::keyboard_settings () const
2183 node = Config->extra_xml(X_("Keyboard"));
2186 node = new XMLNode (X_("Keyboard"));
2192 ARDOUR_UI::halt_on_xrun_message ()
2194 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2196 MessageDialog msg (*editor,
2197 _("Recording was stopped because your system could not keep up."));
2202 ARDOUR_UI::delete_sources_in_the_right_thread (list<boost::shared_ptr<ARDOUR::Source> >* deletion_list)
2204 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2206 for (list<boost::shared_ptr<Source> >::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2207 (*i)->drop_references ();
2210 delete deletion_list;
2214 ARDOUR_UI::disk_overrun_handler ()
2216 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2218 if (!have_disk_overrun_displayed) {
2219 have_disk_overrun_displayed = true;
2220 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2221 The disk system on your computer\n\
2222 was not able to keep up with Ardour.\n\
2224 Specifically, it failed to write data to disk\n\
2225 quickly enough to keep up with recording.\n"));
2227 have_disk_overrun_displayed = false;
2232 ARDOUR_UI::disk_underrun_handler ()
2234 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2236 if (!have_disk_underrun_displayed) {
2237 have_disk_underrun_displayed = true;
2238 MessageDialog msg (*editor,
2239 (_("The disk system on your computer\n\
2240 was not able to keep up with Ardour.\n\
2242 Specifically, it failed to read data from disk\n\
2243 quickly enough to keep up with playback.\n")));
2245 have_disk_underrun_displayed = false;
2250 ARDOUR_UI::disk_underrun_message_gone ()
2252 have_disk_underrun_displayed = false;
2256 ARDOUR_UI::disk_overrun_message_gone ()
2258 have_disk_underrun_displayed = false;
2262 ARDOUR_UI::pending_state_dialog ()
2264 ArdourDialog dialog ("pending state dialog");
2266 This session appears to have been in\n\
2267 middle of recording when ardour or\n\
2268 the computer was shutdown.\n\
2270 Ardour can recover any captured audio for\n\
2271 you, or it can ignore it. Please decide\n\
2272 what you would like to do.\n"));
2274 dialog.get_vbox()->pack_start (message);
2275 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2276 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2278 dialog.set_position (WIN_POS_CENTER);
2281 switch (dialog.run ()) {
2282 case RESPONSE_ACCEPT:
2290 ARDOUR_UI::disconnect_from_jack ()
2293 if( engine->disconnect_from_jack ()) {
2294 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2298 update_sample_rate (0);
2303 ARDOUR_UI::reconnect_to_jack ()
2306 if (engine->reconnect_to_jack ()) {
2307 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2311 update_sample_rate (0);
2316 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2318 engine->request_buffer_size (nframes);
2319 update_sample_rate (0);
2323 ARDOUR_UI::cmdline_new_session (string path)
2325 if (path[0] != '/') {
2326 char buf[PATH_MAX+1];
2329 getcwd (buf, sizeof (buf));
2336 new_session (false, path);
2338 _will_create_new_session_automatically = false; /* done it */
2339 return FALSE; /* don't call it again */
2343 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2345 Glib::RefPtr<Action> act;
2349 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2352 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2355 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2358 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2361 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2364 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2367 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2372 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2373 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2374 Config->set_native_file_header_format (hf);
2376 session->reset_native_file_format ();
2383 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2385 Glib::RefPtr<Action> act;
2389 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2392 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2397 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2399 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2400 Config->set_native_file_data_format (sf);
2402 session->reset_native_file_format ();
2409 ARDOUR_UI::use_config ()
2411 Glib::RefPtr<Action> act;
2413 switch (Config->get_native_file_data_format ()) {
2415 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2418 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2423 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2424 ract->set_active ();
2427 switch (Config->get_native_file_header_format ()) {
2429 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2432 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2435 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2438 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2441 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2444 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2447 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2452 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2453 ract->set_active ();