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_diskstream.h>
57 #include <ardour/port.h>
58 #include <ardour/audio_track.h>
61 #include "ardour_ui.h"
62 #include "public_editor.h"
63 #include "audio_clock.h"
68 #include "keyboard_target.h"
69 #include "add_route_dialog.h"
70 #include "new_session_dialog.h"
73 #include "gui_thread.h"
74 #include "color_manager.h"
78 using namespace ARDOUR;
80 using namespace Gtkmm2ext;
84 ARDOUR_UI *ARDOUR_UI::theArdourUI = 0;
86 sigc::signal<void,bool> ARDOUR_UI::Blink;
87 sigc::signal<void> ARDOUR_UI::RapidScreenUpdate;
88 sigc::signal<void> ARDOUR_UI::SuperRapidScreenUpdate;
89 sigc::signal<void,jack_nframes_t> ARDOUR_UI::Clock;
91 ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
93 : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile),
95 primary_clock (X_("TransportClockDisplay"), true, false, true),
96 secondary_clock (X_("SecondaryClockDisplay"), true, false, true),
97 preroll_clock (X_("PreRollClock"), true, true),
98 postroll_clock (X_("PostRollClock"), true, true),
102 adjuster_table (3, 3),
106 preroll_button (_("pre\nroll")),
107 postroll_button (_("post\nroll")),
111 big_clock ("BigClockDisplay", true),
115 time_master_button (_("time\nmaster")),
117 shuttle_units_button (_("% ")),
119 punch_in_button (_("punch\nin")),
120 punch_out_button (_("punch\nout")),
121 auto_return_button (_("auto\nreturn")),
122 auto_play_button (_("auto\nplay")),
123 auto_input_button (_("auto\ninput")),
124 click_button (_("click")),
125 auditioning_alert_button (_("AUDITIONING")),
126 solo_alert_button (_("SOLO")),
130 using namespace Gtk::Menu_Helpers;
136 if (theArdourUI == 0) {
140 ActionManager::init ();
144 color_manager = new ColorManager();
146 std::string color_file = ARDOUR::find_config_file("ardour.colors");
148 color_manager->load (color_file);
150 m_new_session_dialog = new NewSessionDialog();
154 _session_is_new = false;
155 big_clock_window = 0;
156 session_selector_window = 0;
157 last_key_press_time = 0;
158 connection_editor = 0;
159 add_route_dialog = 0;
164 open_session_selector = 0;
165 have_configure_timeout = false;
166 have_disk_overrun_displayed = false;
167 have_disk_underrun_displayed = false;
168 _will_create_new_session_automatically = false;
169 session_loaded = false;
170 last_speed_displayed = -1.0f;
172 last_configure_time.tv_sec = 0;
173 last_configure_time.tv_usec = 0;
175 shuttle_grabbed = false;
177 shuttle_max_speed = 8.0f;
179 set_shuttle_units (Percentage);
180 set_shuttle_behaviour (Sprung);
182 shuttle_style_menu = 0;
183 shuttle_unit_menu = 0;
185 gettimeofday (&last_peak_grab, 0);
186 gettimeofday (&last_shuttle_request, 0);
188 ARDOUR::AudioDiskstream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
189 ARDOUR::AudioDiskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
190 ARDOUR::AudioDiskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
192 /* handle pending state with a dialog */
194 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
196 /* have to wait for AudioEngine and Configuration before proceeding */
200 ARDOUR_UI::set_engine (AudioEngine& e)
204 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
205 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
206 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
207 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
211 keyboard = new Keyboard;
213 if (setup_windows ()) {
214 throw failed_constructor ();
217 if (GTK_ARDOUR::show_key_actions) {
218 vector<string> names;
219 vector<string> paths;
221 vector<AccelKey> bindings;
223 ActionManager::get_all_actions (names, paths, keys, bindings);
225 vector<string>::iterator n;
226 vector<string>::iterator k;
227 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
228 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
234 /* start with timecode, metering enabled
237 blink_timeout_tag = -1;
239 /* the global configuration object is now valid */
243 /* this being a GUI and all, we want peakfiles */
245 AudioFileSource::set_build_peakfiles (true);
246 AudioFileSource::set_build_missing_peakfiles (true);
248 if (AudioSource::start_peak_thread ()) {
249 throw failed_constructor();
252 /* start the time-of-day-clock */
254 update_wall_clock ();
255 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
257 update_disk_space ();
259 update_sample_rate (engine->frame_rate());
261 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
262 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
265 ARDOUR_UI::~ARDOUR_UI ()
267 save_ardour_state ();
281 if (add_route_dialog) {
282 delete add_route_dialog;
285 AudioSource::stop_peak_thread ();
289 ARDOUR_UI::configure_timeout ()
294 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
295 /* no configure events yet */
299 gettimeofday (&now, 0);
300 timersub (&now, &last_configure_time, &diff);
302 /* force a gap of 0.5 seconds since the last configure event
305 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
308 have_configure_timeout = false;
309 save_ardour_state ();
315 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
317 if (have_configure_timeout) {
318 gettimeofday (&last_configure_time, 0);
320 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
321 have_configure_timeout = true;
328 ARDOUR_UI::save_ardour_state ()
330 if (!keyboard || !mixer || !editor) {
334 /* XXX this is all a bit dubious. add_extra_xml() uses
335 a different lifetime model from add_instant_xml().
338 XMLNode* node = new XMLNode (keyboard->get_state());
339 Config->add_extra_xml (*node);
340 Config->save_state();
342 XMLNode& enode (static_cast<Stateful*>(editor)->get_state());
343 XMLNode& mnode (mixer->get_state());
346 session->add_instant_xml(enode, session->path());
347 session->add_instant_xml(mnode, session->path());
349 Config->add_instant_xml(enode, get_user_ardour_path());
350 Config->add_instant_xml(mnode, get_user_ardour_path());
355 AccelMap::save ("ardour.saved_bindings");
359 ARDOUR_UI::startup ()
361 /* Once the UI is up and running, start the audio engine. Doing
362 this before the UI is up and running can cause problems
363 when not running with SCHED_FIFO, because the amount of
364 CPU and disk work needed to get the UI started can interfere
365 with the scheduling of the audio thread.
368 Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
374 if (session && session->dirty()) {
375 switch (ask_about_saving_session(_("quit"))) {
380 /* use the default name */
381 if (save_state_canfail ("")) {
382 /* failed - don't quit */
383 MessageDialog msg (*editor,
385 Ardour was unable to save your session.\n\n\
386 If you still wish to quit, please use the\n\n\
387 \"Just quit\" option."));
396 Config->save_state();
401 ARDOUR_UI::ask_about_saving_session (const string & what)
403 ArdourDialog window (_("ardour: save session?"));
404 Gtk::HBox dhbox; // the hbox for the image and text
405 Gtk::Label prompt_label;
406 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
410 msg = string_compose(_("Don't %1"), what);
411 window.add_button (msg, RESPONSE_REJECT);
412 msg = string_compose(_("Just %1"), what);
413 window.add_button (msg, RESPONSE_APPLY);
414 msg = string_compose(_("Save and %1"), what);
415 window.add_button (msg, RESPONSE_ACCEPT);
417 window.set_default_response (RESPONSE_ACCEPT);
419 Gtk::Button noquit_button (msg);
420 noquit_button.set_name ("EditorGTKButton");
425 if (session->snap_name() == session->name()) {
428 type = _("snapshot");
430 prompt = string_compose(_("The %1\"%2\"\nhas not been saved.\n\nAny changes made this time\nwill be lost unless you save it.\n\nWhat do you want to do?"),
431 type, session->snap_name());
433 prompt_label.set_text (prompt);
434 prompt_label.set_name (X_("PrompterLabel"));
435 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
437 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
439 dhbox.set_homogeneous (false);
440 dhbox.pack_start (*dimage, false, false, 5);
441 dhbox.pack_start (prompt_label, true, false, 5);
442 window.get_vbox()->pack_start (dhbox);
444 window.set_name (_("Prompter"));
445 window.set_position (Gtk::WIN_POS_MOUSE);
446 window.set_modal (true);
447 window.set_resizable (false);
450 save_the_session = 0;
452 editor->ensure_float (window);
454 ResponseType r = (ResponseType) window.run();
459 case RESPONSE_ACCEPT: // save and get out of here
461 case RESPONSE_APPLY: // get out of here
471 ARDOUR_UI::every_second ()
474 update_buffer_load ();
475 update_disk_space ();
480 ARDOUR_UI::every_point_one_seconds ()
482 update_speed_display ();
483 RapidScreenUpdate(); /* EMIT_SIGNAL */
488 ARDOUR_UI::every_point_zero_one_seconds ()
490 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
495 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
499 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
501 if (!engine->connected()) {
503 snprintf (buf, sizeof (buf), _("disconnected"));
507 jack_nframes_t rate = engine->frame_rate();
509 if (fmod (rate, 1000.0) != 0.0) {
510 snprintf (buf, sizeof (buf), _("SR: %.1f kHz / %4.1f msecs"),
511 (float) rate/1000.0f,
512 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
514 snprintf (buf, sizeof (buf), _("SR: %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 Load: %.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 (AudioDiskstream& ds)
548 if (ds.record_enabled()) {
549 rec_enabled_diskstreams++;
554 ARDOUR_UI::update_disk_space()
560 jack_nframes_t frames = session->available_capture_duration();
563 if (frames == max_frames) {
564 strcpy (buf, _("space: 24hrs+"));
569 jack_nframes_t fr = session->frame_rate();
571 if (session->actively_recording()){
573 rec_enabled_diskstreams = 0;
574 session->foreach_audio_diskstream (this, &ARDOUR_UI::count_recenabled_diskstreams);
576 if (rec_enabled_diskstreams) {
577 frames /= rec_enabled_diskstreams;
582 /* hmmm. shall we divide by the route count? or the diskstream count?
583 or what? for now, do nothing ...
588 hrs = frames / (fr * 3600);
589 frames -= hrs * fr * 3600;
590 mins = frames / (fr * 60);
591 frames -= mins * fr * 60;
594 snprintf (buf, sizeof(buf), _("space: %02dh:%02dm:%02ds"), hrs, mins, secs);
597 disk_space_label.set_text (buf);
601 ARDOUR_UI::update_wall_clock ()
608 tm_now = localtime (&now);
610 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
611 wall_clock_label.set_text (buf);
616 ARDOUR_UI::control_methods_adjusted ()
621 which_method = (int) online_control_button->adjustment.get_value();
622 switch (which_method) {
624 allow_mmc_and_local ();
633 fatal << _("programming error: impossible control method") << endmsg;
639 ARDOUR_UI::mmc_device_id_adjusted ()
644 int dev_id = (int) mmc_id_button->adjustment.get_value();
645 mmc->set_device_id (dev_id);
651 ARDOUR_UI::session_menu (GdkEventButton *ev)
653 session_popup_menu->popup (0, 0);
658 ARDOUR_UI::redisplay_recent_sessions ()
660 vector<string *> *sessions;
661 vector<string *>::iterator i;
662 RecentSessionsSorter cmp;
664 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
665 recent_session_model->clear ();
668 ARDOUR::read_recent_sessions (rs);
671 recent_session_display.set_model (recent_session_model);
675 /* sort them alphabetically */
676 sort (rs.begin(), rs.end(), cmp);
677 sessions = new vector<string*>;
679 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
680 sessions->push_back (new string ((*i).second));
683 for (i = sessions->begin(); i != sessions->end(); ++i) {
685 vector<string*>* states;
686 vector<const gchar*> item;
687 string fullpath = *(*i);
689 /* remove any trailing / */
691 if (fullpath[fullpath.length()-1] == '/') {
692 fullpath = fullpath.substr (0, fullpath.length()-1);
695 /* now get available states for this session */
697 if ((states = Session::possible_states (fullpath)) == 0) {
702 TreeModel::Row row = *(recent_session_model->append());
704 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
705 row[recent_session_columns.fullpath] = fullpath;
707 if (states->size() > 1) {
709 /* add the children */
711 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
713 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
715 child_row[recent_session_columns.visible_name] = **i2;
716 child_row[recent_session_columns.fullpath] = fullpath;
725 recent_session_display.set_model (recent_session_model);
730 ARDOUR_UI::build_session_selector ()
732 session_selector_window = new ArdourDialog ("session selector");
734 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
736 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
737 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
738 session_selector_window->set_default_response (RESPONSE_ACCEPT);
739 recent_session_model = TreeStore::create (recent_session_columns);
740 recent_session_display.set_model (recent_session_model);
741 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
742 recent_session_display.set_headers_visible (false);
743 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
745 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
747 scroller->add (recent_session_display);
748 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
750 session_selector_window->set_name ("SessionSelectorWindow");
751 session_selector_window->set_size_request (200, 400);
752 session_selector_window->get_vbox()->pack_start (*scroller);
753 session_selector_window->show_all_children();
757 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
759 session_selector_window->response (RESPONSE_ACCEPT);
763 ARDOUR_UI::open_recent_session ()
765 /* popup selector window */
767 if (session_selector_window == 0) {
768 build_session_selector ();
771 redisplay_recent_sessions ();
773 ResponseType r = (ResponseType) session_selector_window->run ();
775 session_selector_window->hide();
778 case RESPONSE_ACCEPT:
784 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
786 if (i == recent_session_model->children().end()) {
790 Glib::ustring path = (*i)[recent_session_columns.fullpath];
791 Glib::ustring state = (*i)[recent_session_columns.visible_name];
793 _session_is_new = false;
795 load_session (path, state);
799 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
803 if (stat (info.filename.c_str(), &statbuf) != 0) {
807 if (!S_ISDIR(statbuf.st_mode)) {
813 string session_file = info.filename;
815 session_file += Glib::path_get_basename (info.filename);
816 session_file += ".ardour";
818 if (stat (session_file.c_str(), &statbuf) != 0) {
822 return S_ISREG (statbuf.st_mode);
826 ARDOUR_UI::open_session ()
828 /* popup selector window */
830 if (open_session_selector == 0) {
832 /* ardour sessions are folders */
834 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
835 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
836 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
838 FileFilter session_filter;
839 session_filter.add_pattern ("*.ardour");
840 session_filter.set_name (_("Ardour sessions"));
841 open_session_selector->add_filter (session_filter);
842 open_session_selector->set_filter (session_filter);
845 int response = open_session_selector->run();
846 open_session_selector->hide ();
849 case RESPONSE_ACCEPT:
852 open_session_selector->hide();
856 open_session_selector->hide();
857 string session_path = open_session_selector->get_filename();
861 if (session_path.length() > 0) {
862 if (Session::find_session (session_path, path, name, isnew) == 0) {
863 _session_is_new = isnew;
864 load_session (path, name);
871 ARDOUR_UI::session_add_midi_track ()
873 cerr << _("Patience is a virtue.\n");
877 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
882 warning << _("You cannot add a track without a session already loaded.") << endmsg;
888 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
889 error << _("could not create new audio track") << endmsg;
892 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
893 error << _("could not create new audio bus") << endmsg;
898 if (need_control_room_outs) {
904 route->set_stereo_control_outs (control_lr_channels);
905 route->control_outs()->set_stereo_pan (pans, this);
907 #endif /* CONTROLOUTS */
911 MessageDialog msg (*editor,
912 _("There are insufficient JACK ports available\n\
913 to create a new track or bus.\n\
914 You should save Ardour, exit and\n\
915 restart JACK with more ports."));
921 ARDOUR_UI::diskstream_added (AudioDiskstream* ds)
926 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
928 jack_nframes_t _preroll;
931 _preroll = session->convert_to_frames_at (new_position, session->preroll);
933 if (new_position > _preroll) {
934 new_position -= _preroll;
939 session->request_locate (new_position);
944 ARDOUR_UI::transport_goto_start ()
947 session->goto_start();
950 /* force displayed area in editor to start no matter
951 what "follow playhead" setting is.
955 editor->reposition_x_origin (session->current_start_frame());
961 ARDOUR_UI::transport_goto_zero ()
964 session->request_locate (0);
967 /* force displayed area in editor to start no matter
968 what "follow playhead" setting is.
972 editor->reposition_x_origin (0);
978 ARDOUR_UI::transport_goto_end ()
981 jack_nframes_t frame = session->current_end_frame();
982 session->request_locate (frame);
984 /* force displayed area in editor to start no matter
985 what "follow playhead" setting is.
989 editor->reposition_x_origin (frame);
995 ARDOUR_UI::transport_stop ()
1001 if (session->is_auditioning()) {
1002 session->cancel_audition ();
1006 if (session->get_auto_loop()) {
1007 session->request_auto_loop (false);
1010 session->request_stop ();
1014 ARDOUR_UI::transport_stop_and_forget_capture ()
1017 session->request_stop (true);
1022 ARDOUR_UI::remove_last_capture()
1025 editor->remove_last_capture();
1030 ARDOUR_UI::transport_record ()
1033 switch (session->record_status()) {
1034 case Session::Disabled:
1035 if (session->ntracks() == 0) {
1036 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1037 MessageDialog msg (*editor, txt);
1041 session->maybe_enable_record ();
1043 case Session::Recording:
1044 case Session::Enabled:
1045 session->disable_record (true);
1051 ARDOUR_UI::transport_roll ()
1059 rolling = session->transport_rolling ();
1061 if (session->get_auto_loop()) {
1062 session->request_auto_loop (false);
1063 auto_loop_button.set_active (false);
1064 roll_button.set_active (true);
1065 } else if (session->get_play_range ()) {
1066 session->request_play_range (false);
1067 play_selection_button.set_active (false);
1068 } else if (rolling) {
1069 session->request_locate (session->last_transport_start(), true);
1072 session->request_transport_speed (1.0f);
1076 ARDOUR_UI::transport_loop()
1079 if (session->get_auto_loop()) {
1080 if (session->transport_rolling()) {
1081 Location * looploc = session->locations()->auto_loop_location();
1083 session->request_locate (looploc->start(), true);
1088 session->request_auto_loop (true);
1094 ARDOUR_UI::transport_play_selection ()
1100 if (!session->get_play_range()) {
1101 session->request_stop ();
1104 editor->play_selection ();
1108 ARDOUR_UI::transport_rewind (int option)
1110 float current_transport_speed;
1113 current_transport_speed = session->transport_speed();
1115 if (current_transport_speed >= 0.0f) {
1118 session->request_transport_speed (-1.0f);
1121 session->request_transport_speed (-4.0f);
1124 session->request_transport_speed (-0.5f);
1129 session->request_transport_speed (current_transport_speed * 1.5f);
1135 ARDOUR_UI::transport_forward (int option)
1137 float current_transport_speed;
1140 current_transport_speed = session->transport_speed();
1142 if (current_transport_speed <= 0.0f) {
1145 session->request_transport_speed (1.0f);
1148 session->request_transport_speed (4.0f);
1151 session->request_transport_speed (0.5f);
1156 session->request_transport_speed (current_transport_speed * 1.5f);
1162 ARDOUR_UI::toggle_monitor_enable (guint32 dstream)
1168 AudioDiskstream *ds;
1170 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1171 Port *port = ds->io()->input (0);
1172 port->request_monitor_input (!port->monitoring_input());
1177 ARDOUR_UI::toggle_record_enable (guint32 dstream)
1183 AudioDiskstream *ds;
1185 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1186 ds->set_record_enabled (!ds->record_enabled(), this);
1191 ARDOUR_UI::queue_transport_change ()
1193 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1197 ARDOUR_UI::map_transport_state ()
1199 float sp = session->transport_speed();
1202 transport_rolling ();
1203 } else if (sp < 0.0f) {
1204 transport_rewinding ();
1205 } else if (sp > 0.0f) {
1206 transport_forwarding ();
1208 transport_stopped ();
1213 ARDOUR_UI::allow_local_only ()
1219 ARDOUR_UI::allow_mmc_only ()
1225 ARDOUR_UI::allow_mmc_and_local ()
1231 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1233 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1234 (int) adj.get_value()].c_str());
1238 ARDOUR_UI::engine_stopped ()
1240 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1241 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1242 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1247 ARDOUR_UI::engine_running ()
1249 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1250 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1251 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1255 ARDOUR_UI::engine_halted ()
1257 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1259 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1260 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1262 update_sample_rate (0);
1264 MessageDialog msg (*editor,
1266 JACK has either been shutdown or it\n\
1267 disconnected Ardour because Ardour\n\
1268 was not fast enough. You can save the\n\
1269 session and/or try to reconnect to JACK ."));
1274 ARDOUR_UI::do_engine_start ()
1280 catch (AudioEngine::PortRegistrationFailure& err) {
1282 error << _("Unable to create all required ports")
1290 error << _("Unable to start the session running")
1300 ARDOUR_UI::start_engine ()
1302 if (do_engine_start () == 0) {
1303 if (session && _session_is_new) {
1304 /* we need to retain initial visual
1305 settings for a new session
1307 session->save_state ("");
1310 /* there is too much going on, in too many threads, for us to
1311 end up with a clean session. So wait 1 second after loading,
1312 and fix it up. its ugly, but until i come across a better
1313 solution, its what we have.
1316 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1323 ARDOUR_UI::update_clocks ()
1325 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1329 ARDOUR_UI::start_clocking ()
1331 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1335 ARDOUR_UI::stop_clocking ()
1337 clock_signal_connection.disconnect ();
1341 ARDOUR_UI::toggle_clocking ()
1344 if (clock_button.get_active()) {
1353 ARDOUR_UI::_blink (void *arg)
1356 ((ARDOUR_UI *) arg)->blink ();
1363 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1367 ARDOUR_UI::start_blinking ()
1369 /* Start the blink signal. Everybody with a blinking widget
1370 uses Blink to drive the widget's state.
1373 if (blink_timeout_tag < 0) {
1375 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1380 ARDOUR_UI::stop_blinking ()
1382 if (blink_timeout_tag >= 0) {
1383 gtk_timeout_remove (blink_timeout_tag);
1384 blink_timeout_tag = -1;
1390 ARDOUR_UI::add_diskstream_to_menu (AudioDiskstream& dstream)
1392 using namespace Gtk;
1393 using namespace Menu_Helpers;
1395 if (dstream.hidden()) {
1399 MenuList& items = diskstream_menu->items();
1400 items.push_back (MenuElem (dstream.name(), bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), (gint32) dstream.id())));
1404 ARDOUR_UI::diskstream_selected (gint32 id)
1406 selected_dstream = id;
1411 ARDOUR_UI::select_diskstream (GdkEventButton *ev)
1413 using namespace Gtk;
1414 using namespace Menu_Helpers;
1420 diskstream_menu = new Menu();
1421 diskstream_menu->set_name ("ArdourContextMenu");
1422 using namespace Gtk;
1423 using namespace Menu_Helpers;
1425 MenuList& items = diskstream_menu->items();
1426 items.push_back (MenuElem (_("No Stream"), (bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), -1))));
1428 session->foreach_audio_diskstream (this, &ARDOUR_UI::add_diskstream_to_menu);
1431 diskstream_menu->popup (ev->button, ev->time);
1433 diskstream_menu->popup (0, 0);
1436 selected_dstream = -1;
1440 delete diskstream_menu;
1442 return selected_dstream;
1446 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1452 if (io.n_inputs() == 0) {
1457 /* XXX we're not handling multiple ports yet. */
1459 const char **connections = io.input(0)->get_connections();
1461 if (connections == 0 || connections[0] == '\0') {
1464 buf = connections[0];
1471 if (io.n_outputs() == 0) {
1476 /* XXX we're not handling multiple ports yet. */
1478 const char **connections = io.output(0)->get_connections();
1480 if (connections == 0 || connections[0] == '\0') {
1483 buf = connections[0];
1491 ARDOUR_UI::snapshot_session ()
1493 ArdourPrompter prompter (true);
1500 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1502 prompter.set_name ("Prompter");
1503 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1504 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1505 prompter.set_prompt (_("Name of New Snapshot"));
1506 prompter.set_initial_text (now);
1508 switch (prompter.run()) {
1509 case RESPONSE_ACCEPT:
1510 prompter.get_result (snapname);
1511 if (snapname.length()){
1512 save_state (snapname);
1522 ARDOUR_UI::save_state (const string & name)
1524 (void) save_state_canfail (name);
1528 ARDOUR_UI::save_state_canfail (string name)
1533 if (name.length() == 0) {
1534 name = session->snap_name();
1537 if ((ret = session->save_state (name)) != 0) {
1541 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1546 ARDOUR_UI::restore_state (string name)
1549 if (name.length() == 0) {
1550 name = session->name();
1552 session->restore_state (name);
1557 ARDOUR_UI::primary_clock_value_changed ()
1560 session->request_locate (primary_clock.current_time ());
1565 ARDOUR_UI::secondary_clock_value_changed ()
1568 session->request_locate (secondary_clock.current_time ());
1573 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1575 if (session && dstream && dstream->record_enabled()) {
1577 Session::RecordState rs;
1579 rs = session->record_status ();
1582 case Session::Disabled:
1583 case Session::Enabled:
1584 if (w->get_state() != STATE_SELECTED) {
1585 w->set_state (STATE_SELECTED);
1589 case Session::Recording:
1590 if (w->get_state() != STATE_ACTIVE) {
1591 w->set_state (STATE_ACTIVE);
1597 if (w->get_state() != STATE_NORMAL) {
1598 w->set_state (STATE_NORMAL);
1604 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1610 switch (session->record_status()) {
1611 case Session::Enabled:
1613 rec_button.set_state (1);
1615 rec_button.set_state (0);
1619 case Session::Recording:
1620 rec_button.set_state (2);
1624 rec_button.set_state (0);
1630 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1638 ARDOUR_UI::start_keyboard_prefix ()
1640 keyboard->start_prefix();
1644 ARDOUR_UI::save_template ()
1647 ArdourPrompter prompter (true);
1650 prompter.set_name (X_("Prompter"));
1651 prompter.set_prompt (_("Name for mix template:"));
1652 prompter.set_initial_text(session->name() + _("-template"));
1653 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1654 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1656 switch (prompter.run()) {
1657 case RESPONSE_ACCEPT:
1658 prompter.get_result (name);
1660 if (name.length()) {
1661 session->save_template (name);
1671 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1673 m_new_session_dialog->show();
1674 m_new_session_dialog->set_modal(true);
1675 m_new_session_dialog->set_name(predetermined_path);
1676 m_new_session_dialog->reset_recent();
1678 int response = Gtk::RESPONSE_CANCEL;
1681 response = m_new_session_dialog->run ();
1682 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1686 } else if (response == Gtk::RESPONSE_NONE) {
1687 /* Clear was pressed */
1688 m_new_session_dialog->reset();
1690 } else if (response == Gtk::RESPONSE_YES) {
1691 /* YES == OPEN, but there's no enum for that */
1692 std::string session_name = m_new_session_dialog->session_name();
1693 std::string session_path = m_new_session_dialog->session_folder();
1694 load_session (session_path, session_name);
1697 } else if (response == Gtk::RESPONSE_OK) {
1698 if (m_new_session_dialog->get_current_page() == 1) {
1700 /* XXX this is a bit of a hack..
1701 i really want the new sesion dialog to return RESPONSE_YES
1702 if we're on page 1 (the load page)
1703 Unfortunately i can't see how atm..
1705 std::string session_name = m_new_session_dialog->session_name();
1706 std::string session_path = m_new_session_dialog->session_folder();
1707 load_session (session_path, session_name);
1711 _session_is_new = true;
1713 std::string session_name = m_new_session_dialog->session_name();
1714 std::string session_path = m_new_session_dialog->session_folder();
1717 //XXX This is needed because session constructor wants a
1718 //non-existant path. hopefully this will be fixed at some point.
1720 session_path = Glib::build_filename(session_path, session_name);
1722 std::string template_name = m_new_session_dialog->session_template_name();
1724 if (m_new_session_dialog->use_session_template()) {
1726 load_session (session_path, session_name, &template_name);
1732 Session::AutoConnectOption iconnect;
1733 Session::AutoConnectOption oconnect;
1735 if (m_new_session_dialog->create_control_bus()) {
1736 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1741 if (m_new_session_dialog->create_master_bus()) {
1742 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1747 if (m_new_session_dialog->connect_inputs()) {
1748 iconnect = Session::AutoConnectPhysical;
1750 iconnect = Session::AutoConnectOption (0);
1753 /// @todo some minor tweaks.
1755 if (m_new_session_dialog->connect_outs_to_master()) {
1756 oconnect = Session::AutoConnectMaster;
1757 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1758 oconnect = Session::AutoConnectPhysical;
1760 oconnect = Session::AutoConnectOption (0);
1763 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1764 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1766 build_session (session_path,
1774 engine->frame_rate() * 60 * 5);
1779 } while (response == Gtk::RESPONSE_NONE);
1780 m_new_session_dialog->hide();
1786 ARDOUR_UI::close_session()
1793 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1795 Session *new_session;
1797 session_loaded = false;
1798 x = unload_session ();
1806 /* if it already exists, we must have write access */
1808 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1809 MessageDialog msg (*editor, _("\
1810 You do not have write access to this session.\n\
1811 This prevents the session from being loaded."));
1817 new_session = new Session (*engine, path, snap_name, mix_template);
1822 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1826 connect_to_session (new_session);
1828 //if (engine->running()) {
1829 //mixer->show_window();
1831 session_loaded = true;
1836 ARDOUR_UI::make_session_clean ()
1839 session->set_clean ();
1848 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1849 uint32_t control_channels,
1850 uint32_t master_channels,
1851 Session::AutoConnectOption input_connect,
1852 Session::AutoConnectOption output_connect,
1855 jack_nframes_t initial_length)
1857 Session *new_session;
1860 session_loaded = false;
1861 x = unload_session ();
1868 _session_is_new = true;
1871 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1872 control_channels, master_channels, nphysin, nphysout, initial_length);
1877 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1881 connect_to_session (new_session);
1883 //if (engine->running()) {
1884 //mixer->show_window();
1886 session_loaded = true;
1894 editor->show_window ();
1898 if (session && mixer) {
1899 // mixer->show_window ();
1908 ARDOUR_UI::show_splash ()
1911 about = new About();
1917 ARDOUR_UI::hide_splash ()
1925 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1929 removed = rep.paths.size();
1932 MessageDialog msgd (*editor,
1933 _("No audio files were ready for cleanup"),
1936 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1937 msgd.set_secondary_text (_("If this seems suprising, \n\
1938 check for any existing snapshots.\n\
1939 These may still include regions that\n\
1940 require some unused files to continue to exist."));
1946 ArdourDialog results (_("ardour: cleanup"), true, false);
1948 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1949 CleanupResultsModelColumns() {
1953 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1954 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1958 CleanupResultsModelColumns results_columns;
1959 Glib::RefPtr<Gtk::ListStore> results_model;
1960 Gtk::TreeView results_display;
1962 results_model = ListStore::create (results_columns);
1963 results_display.set_model (results_model);
1964 results_display.append_column (list_title, results_columns.visible_name);
1966 results_display.set_name ("CleanupResultsList");
1967 results_display.set_headers_visible (true);
1968 results_display.set_headers_clickable (false);
1969 results_display.set_reorderable (false);
1971 Gtk::ScrolledWindow list_scroller;
1974 Gtk::HBox dhbox; // the hbox for the image and text
1975 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1976 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1978 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1980 if (rep.space < 1048576.0f) {
1982 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1984 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1988 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1990 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1994 dhbox.pack_start (*dimage, true, false, 5);
1995 dhbox.pack_start (txt, true, false, 5);
1997 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1998 TreeModel::Row row = *(results_model->append());
1999 row[results_columns.visible_name] = *i;
2000 row[results_columns.fullpath] = *i;
2003 list_scroller.add (results_display);
2004 list_scroller.set_size_request (-1, 150);
2005 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2007 dvbox.pack_start (dhbox, true, false, 5);
2008 dvbox.pack_start (list_scroller, true, false, 5);
2009 ddhbox.pack_start (dvbox, true, false, 5);
2011 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2012 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2013 results.set_default_response (RESPONSE_CLOSE);
2014 results.set_position (Gtk::WIN_POS_MOUSE);
2015 results.show_all_children ();
2016 results.set_resizable (false);
2023 ARDOUR_UI::cleanup ()
2026 /* shouldn't happen: menu item is insensitive */
2031 MessageDialog checker (_("Are you sure you want to cleanup?"),
2033 Gtk::MESSAGE_QUESTION,
2034 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2036 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2037 ALL undo/redo information will be lost if you cleanup.\n\
2038 After cleanup, unused audio files will be moved to a \
2039 \"dead sounds\" location."));
2041 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2042 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2043 checker.set_default_response (RESPONSE_CANCEL);
2045 checker.set_name (_("CleanupDialog"));
2046 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2047 checker.set_position (Gtk::WIN_POS_MOUSE);
2049 switch (checker.run()) {
2050 case RESPONSE_ACCEPT:
2056 Session::cleanup_report rep;
2058 editor->prepare_for_cleanup ();
2060 if (session->cleanup_sources (rep)) {
2064 display_cleanup_results (rep,
2067 The following %1 %2 not in use and \n\
2068 have been moved to:\n\
2070 Flushing the wastebasket will \n\
2071 release an additional\n\
2072 %4 %5bytes of disk space.\n"
2077 ARDOUR_UI::flush_trash ()
2080 /* shouldn't happen: menu item is insensitive */
2084 Session::cleanup_report rep;
2086 if (session->cleanup_trash_sources (rep)) {
2090 display_cleanup_results (rep,
2092 _("The following %1 %2 deleted from\n\
2094 releasing %4 %5bytes of disk space"));
2098 ARDOUR_UI::add_route ()
2106 if (add_route_dialog == 0) {
2107 add_route_dialog = new AddRouteDialog;
2108 editor->ensure_float (*add_route_dialog);
2111 if (add_route_dialog->is_visible()) {
2112 /* we're already doing this */
2116 ResponseType r = (ResponseType) add_route_dialog->run ();
2118 add_route_dialog->hide();
2121 case RESPONSE_ACCEPT:
2128 if ((count = add_route_dialog->count()) <= 0) {
2132 uint32_t input_chan = add_route_dialog->channels ();
2133 uint32_t output_chan;
2134 string name_template = add_route_dialog->name_template ();
2135 bool track = add_route_dialog->track ();
2137 Session::AutoConnectOption oac = session->get_output_auto_connect();
2139 if (oac & Session::AutoConnectMaster) {
2140 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2142 output_chan = input_chan;
2145 /* XXX do something with name template */
2149 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2151 session_add_audio_bus (input_chan, output_chan);
2155 while (Main::events_pending()) {
2162 ARDOUR_UI::mixer_settings () const
2167 node = session->instant_xml(X_("Mixer"), session->path());
2169 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2173 node = new XMLNode (X_("Mixer"));
2180 ARDOUR_UI::editor_settings () const
2185 node = session->instant_xml(X_("Editor"), session->path());
2187 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2191 node = new XMLNode (X_("Editor"));
2197 ARDOUR_UI::keyboard_settings () const
2201 node = Config->extra_xml(X_("Keyboard"));
2204 node = new XMLNode (X_("Keyboard"));
2210 ARDOUR_UI::halt_on_xrun_message ()
2212 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2214 MessageDialog msg (*editor,
2215 _("Recording was stopped because your system could not keep up."));
2220 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::AudioFileSource*>* deletion_list)
2222 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2224 for (list<AudioFileSource*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2228 delete deletion_list;
2232 ARDOUR_UI::disk_overrun_handler ()
2234 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2236 if (!have_disk_overrun_displayed) {
2237 have_disk_overrun_displayed = true;
2238 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2239 The disk system on your computer\n\
2240 was not able to keep up with Ardour.\n\
2242 Specifically, it failed to write data to disk\n\
2243 quickly enough to keep up with recording.\n"));
2245 have_disk_overrun_displayed = false;
2250 ARDOUR_UI::disk_underrun_handler ()
2252 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2254 if (!have_disk_underrun_displayed) {
2255 have_disk_underrun_displayed = true;
2256 MessageDialog msg (*editor,
2257 (_("The disk system on your computer\n\
2258 was not able to keep up with Ardour.\n\
2260 Specifically, it failed to read data from disk\n\
2261 quickly enough to keep up with playback.\n")));
2263 have_disk_underrun_displayed = false;
2268 ARDOUR_UI::disk_underrun_message_gone ()
2270 have_disk_underrun_displayed = false;
2274 ARDOUR_UI::disk_overrun_message_gone ()
2276 have_disk_underrun_displayed = false;
2280 ARDOUR_UI::pending_state_dialog ()
2282 ArdourDialog dialog ("pending state dialog");
2284 This session appears to have been in\n\
2285 middle of recording when ardour or\n\
2286 the computer was shutdown.\n\
2288 Ardour can recover any captured audio for\n\
2289 you, or it can ignore it. Please decide\n\
2290 what you would like to do.\n"));
2292 dialog.get_vbox()->pack_start (message);
2293 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2294 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2296 dialog.set_position (WIN_POS_CENTER);
2299 switch (dialog.run ()) {
2300 case RESPONSE_ACCEPT:
2308 ARDOUR_UI::disconnect_from_jack ()
2311 if( engine->disconnect_from_jack ()) {
2312 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2316 update_sample_rate (0);
2321 ARDOUR_UI::reconnect_to_jack ()
2324 if (engine->reconnect_to_jack ()) {
2325 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2329 update_sample_rate (0);
2334 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2336 engine->request_buffer_size (nframes);
2337 update_sample_rate (0);
2341 ARDOUR_UI::cmdline_new_session (string path)
2343 if (path[0] != '/') {
2344 char buf[PATH_MAX+1];
2347 getcwd (buf, sizeof (buf));
2354 new_session (false, path);
2356 _will_create_new_session_automatically = false; /* done it */
2357 return FALSE; /* don't call it again */
2361 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2363 Glib::RefPtr<Action> act;
2367 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2370 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2373 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2376 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2379 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2382 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2385 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2390 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2391 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2392 Config->set_native_file_header_format (hf);
2394 session->reset_native_file_format ();
2401 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2403 Glib::RefPtr<Action> act;
2407 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2410 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2415 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2417 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2418 Config->set_native_file_data_format (sf);
2420 session->reset_native_file_format ();
2427 ARDOUR_UI::use_config ()
2429 Glib::RefPtr<Action> act;
2431 switch (Config->get_native_file_data_format ()) {
2433 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2436 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2441 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2442 ract->set_active ();
2445 switch (Config->get_native_file_header_format ()) {
2447 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2450 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2453 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2456 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2459 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2462 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2465 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2470 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2471 ract->set_active ();