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;
79 using namespace Gtkmm2ext;
83 ARDOUR_UI *ARDOUR_UI::theArdourUI = 0;
85 sigc::signal<void,bool> ARDOUR_UI::Blink;
86 sigc::signal<void> ARDOUR_UI::RapidScreenUpdate;
87 sigc::signal<void> ARDOUR_UI::SuperRapidScreenUpdate;
88 sigc::signal<void,jack_nframes_t> ARDOUR_UI::Clock;
90 ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
92 : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile),
94 primary_clock (X_("TransportClockDisplay"), true, false, true),
95 secondary_clock (X_("SecondaryClockDisplay"), true, false, true),
96 preroll_clock (X_("PreRollClock"), true, true),
97 postroll_clock (X_("PostRollClock"), true, true),
101 adjuster_table (3, 3),
105 preroll_button (_("pre\nroll")),
106 postroll_button (_("post\nroll")),
110 big_clock ("BigClockDisplay", true),
114 time_master_button (_("time\nmaster")),
116 shuttle_units_button (_("% ")),
118 punch_in_button (_("punch\nin")),
119 punch_out_button (_("punch\nout")),
120 auto_return_button (_("auto\nreturn")),
121 auto_play_button (_("auto\nplay")),
122 auto_input_button (_("auto\ninput")),
123 click_button (_("click")),
124 auditioning_alert_button (_("AUDITIONING")),
125 solo_alert_button (_("SOLO")),
129 using namespace Gtk::Menu_Helpers;
135 if (theArdourUI == 0) {
139 ActionManager::init ();
143 color_manager = new ColorManager();
145 std::string color_file = ARDOUR::find_config_file("ardour.colors");
147 color_manager->load (color_file);
149 m_new_session_dialog = new NewSessionDialog();
153 _session_is_new = false;
154 big_clock_window = 0;
155 session_selector_window = 0;
156 last_key_press_time = 0;
157 connection_editor = 0;
158 add_route_dialog = 0;
163 open_session_selector = 0;
164 have_configure_timeout = false;
165 have_disk_overrun_displayed = false;
166 have_disk_underrun_displayed = false;
167 _will_create_new_session_automatically = false;
168 session_loaded = false;
169 last_speed_displayed = -1.0f;
171 last_configure_time.tv_sec = 0;
172 last_configure_time.tv_usec = 0;
174 shuttle_grabbed = false;
176 shuttle_max_speed = 8.0f;
178 set_shuttle_units (Percentage);
179 set_shuttle_behaviour (Sprung);
181 shuttle_style_menu = 0;
182 shuttle_unit_menu = 0;
184 gettimeofday (&last_peak_grab, 0);
185 gettimeofday (&last_shuttle_request, 0);
187 ARDOUR::AudioDiskstream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
188 ARDOUR::AudioDiskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
189 ARDOUR::AudioDiskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
191 /* handle pending state with a dialog */
193 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
195 /* have to wait for AudioEngine and Configuration before proceeding */
199 ARDOUR_UI::set_engine (AudioEngine& e)
203 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
204 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
205 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
206 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
210 keyboard = new Keyboard;
212 if (setup_windows ()) {
213 throw failed_constructor ();
216 if (GTK_ARDOUR::show_key_actions) {
217 vector<string> names;
218 vector<string> paths;
220 vector<AccelKey> bindings;
222 ActionManager::get_all_actions (names, paths, keys, bindings);
224 vector<string>::iterator n;
225 vector<string>::iterator k;
226 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
227 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
233 /* start with timecode, metering enabled
236 blink_timeout_tag = -1;
238 /* the global configuration object is now valid */
242 /* this being a GUI and all, we want peakfiles */
244 AudioFileSource::set_build_peakfiles (true);
245 AudioFileSource::set_build_missing_peakfiles (true);
247 if (AudioSource::start_peak_thread ()) {
248 throw failed_constructor();
251 /* start the time-of-day-clock */
253 update_wall_clock ();
254 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
256 update_disk_space ();
258 update_sample_rate (engine->frame_rate());
260 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
261 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
264 ARDOUR_UI::~ARDOUR_UI ()
266 save_ardour_state ();
280 if (add_route_dialog) {
281 delete add_route_dialog;
284 AudioSource::stop_peak_thread ();
288 ARDOUR_UI::configure_timeout ()
293 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
294 /* no configure events yet */
298 gettimeofday (&now, 0);
299 timersub (&now, &last_configure_time, &diff);
301 /* force a gap of 0.5 seconds since the last configure event
304 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
307 have_configure_timeout = false;
308 save_ardour_state ();
314 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
316 if (have_configure_timeout) {
317 gettimeofday (&last_configure_time, 0);
319 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
320 have_configure_timeout = true;
327 ARDOUR_UI::save_ardour_state ()
329 if (!keyboard || !mixer || !editor) {
333 /* XXX this is all a bit dubious. add_extra_xml() uses
334 a different lifetime model from add_instant_xml().
337 XMLNode* node = new XMLNode (keyboard->get_state());
338 Config->add_extra_xml (*node);
339 Config->save_state();
341 XMLNode& enode (static_cast<Stateful*>(editor)->get_state());
342 XMLNode& mnode (mixer->get_state());
345 session->add_instant_xml(enode, session->path());
346 session->add_instant_xml(mnode, session->path());
348 Config->add_instant_xml(enode, get_user_ardour_path());
349 Config->add_instant_xml(mnode, get_user_ardour_path());
354 AccelMap::save ("ardour.saved_bindings");
358 ARDOUR_UI::startup ()
360 /* Once the UI is up and running, start the audio engine. Doing
361 this before the UI is up and running can cause problems
362 when not running with SCHED_FIFO, because the amount of
363 CPU and disk work needed to get the UI started can interfere
364 with the scheduling of the audio thread.
367 Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
373 if (session && session->dirty()) {
374 switch (ask_about_saving_session(_("quit"))) {
379 /* use the default name */
380 if (save_state_canfail ("")) {
381 /* failed - don't quit */
382 MessageDialog msg (*editor,
384 Ardour was unable to save your session.\n\n\
385 If you still wish to quit, please use the\n\n\
386 \"Just quit\" option."));
395 Config->save_state();
400 ARDOUR_UI::ask_about_saving_session (const string & what)
402 ArdourDialog window (_("ardour: save session?"));
403 Gtk::HBox dhbox; // the hbox for the image and text
404 Gtk::Label prompt_label;
405 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
409 msg = string_compose(_("Don't %1"), what);
410 window.add_button (msg, RESPONSE_REJECT);
411 msg = string_compose(_("Just %1"), what);
412 window.add_button (msg, RESPONSE_APPLY);
413 msg = string_compose(_("Save and %1"), what);
414 window.add_button (msg, RESPONSE_ACCEPT);
416 window.set_default_response (RESPONSE_ACCEPT);
418 Gtk::Button noquit_button (msg);
419 noquit_button.set_name ("EditorGTKButton");
424 if (session->snap_name() == session->name()) {
427 type = _("snapshot");
429 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?"),
430 type, session->snap_name());
432 prompt_label.set_text (prompt);
433 prompt_label.set_name (X_("PrompterLabel"));
434 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
436 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
438 dhbox.set_homogeneous (false);
439 dhbox.pack_start (*dimage, false, false, 5);
440 dhbox.pack_start (prompt_label, true, false, 5);
441 window.get_vbox()->pack_start (dhbox);
443 window.set_name (_("Prompter"));
444 window.set_position (Gtk::WIN_POS_MOUSE);
445 window.set_modal (true);
446 window.set_resizable (false);
449 save_the_session = 0;
451 editor->ensure_float (window);
453 ResponseType r = (ResponseType) window.run();
458 case RESPONSE_ACCEPT: // save and get out of here
460 case RESPONSE_APPLY: // get out of here
470 ARDOUR_UI::every_second ()
473 update_buffer_load ();
474 update_disk_space ();
479 ARDOUR_UI::every_point_one_seconds ()
481 update_speed_display ();
482 RapidScreenUpdate(); /* EMIT_SIGNAL */
487 ARDOUR_UI::every_point_zero_one_seconds ()
489 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
494 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
498 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
500 if (!engine->connected()) {
502 snprintf (buf, sizeof (buf), _("disconnected"));
506 jack_nframes_t rate = engine->frame_rate();
508 if (fmod (rate, 1000.0) != 0.0) {
509 snprintf (buf, sizeof (buf), _("SR: %.1f kHz / %4.1f msecs"),
510 (float) rate/1000.0f,
511 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
513 snprintf (buf, sizeof (buf), _("SR: %u kHz / %4.1f msecs"),
515 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
519 sample_rate_label.set_text (buf);
523 ARDOUR_UI::update_cpu_load ()
526 snprintf (buf, sizeof (buf), _("DSP Load: %.1f%%"), engine->get_cpu_load());
527 cpu_load_label.set_text (buf);
531 ARDOUR_UI::update_buffer_load ()
536 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
537 session->playback_load(), session->capture_load());
538 buffer_load_label.set_text (buf);
540 buffer_load_label.set_text ("");
545 ARDOUR_UI::count_recenabled_diskstreams (AudioDiskstream& ds)
547 if (ds.record_enabled()) {
548 rec_enabled_diskstreams++;
553 ARDOUR_UI::update_disk_space()
559 jack_nframes_t frames = session->available_capture_duration();
562 if (frames == max_frames) {
563 strcpy (buf, _("space: 24hrs+"));
568 jack_nframes_t fr = session->frame_rate();
570 if (session->actively_recording()){
572 rec_enabled_diskstreams = 0;
573 session->foreach_audio_diskstream (this, &ARDOUR_UI::count_recenabled_diskstreams);
575 if (rec_enabled_diskstreams) {
576 frames /= rec_enabled_diskstreams;
581 /* hmmm. shall we divide by the route count? or the diskstream count?
582 or what? for now, do nothing ...
587 hrs = frames / (fr * 3600);
588 frames -= hrs * fr * 3600;
589 mins = frames / (fr * 60);
590 frames -= mins * fr * 60;
593 snprintf (buf, sizeof(buf), _("space: %02dh:%02dm:%02ds"), hrs, mins, secs);
596 disk_space_label.set_text (buf);
600 ARDOUR_UI::update_wall_clock ()
607 tm_now = localtime (&now);
609 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
610 wall_clock_label.set_text (buf);
615 ARDOUR_UI::control_methods_adjusted ()
620 which_method = (int) online_control_button->adjustment.get_value();
621 switch (which_method) {
623 allow_mmc_and_local ();
632 fatal << _("programming error: impossible control method") << endmsg;
638 ARDOUR_UI::mmc_device_id_adjusted ()
643 int dev_id = (int) mmc_id_button->adjustment.get_value();
644 mmc->set_device_id (dev_id);
650 ARDOUR_UI::session_menu (GdkEventButton *ev)
652 session_popup_menu->popup (0, 0);
657 ARDOUR_UI::redisplay_recent_sessions ()
659 vector<string *> *sessions;
660 vector<string *>::iterator i;
661 RecentSessionsSorter cmp;
663 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
664 recent_session_model->clear ();
667 ARDOUR::read_recent_sessions (rs);
670 recent_session_display.set_model (recent_session_model);
674 /* sort them alphabetically */
675 sort (rs.begin(), rs.end(), cmp);
676 sessions = new vector<string*>;
678 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
679 sessions->push_back (new string ((*i).second));
682 for (i = sessions->begin(); i != sessions->end(); ++i) {
684 vector<string*>* states;
685 vector<const gchar*> item;
686 string fullpath = *(*i);
688 /* remove any trailing / */
690 if (fullpath[fullpath.length()-1] == '/') {
691 fullpath = fullpath.substr (0, fullpath.length()-1);
694 /* now get available states for this session */
696 if ((states = Session::possible_states (fullpath)) == 0) {
701 TreeModel::Row row = *(recent_session_model->append());
703 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
704 row[recent_session_columns.fullpath] = fullpath;
706 if (states->size() > 1) {
708 /* add the children */
710 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
712 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
714 child_row[recent_session_columns.visible_name] = **i2;
715 child_row[recent_session_columns.fullpath] = fullpath;
724 recent_session_display.set_model (recent_session_model);
729 ARDOUR_UI::build_session_selector ()
731 session_selector_window = new ArdourDialog ("session selector");
733 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
735 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
736 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
737 session_selector_window->set_default_response (RESPONSE_ACCEPT);
738 recent_session_model = TreeStore::create (recent_session_columns);
739 recent_session_display.set_model (recent_session_model);
740 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
741 recent_session_display.set_headers_visible (false);
742 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
744 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
746 scroller->add (recent_session_display);
747 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
749 session_selector_window->set_name ("SessionSelectorWindow");
750 session_selector_window->set_size_request (200, 400);
751 session_selector_window->get_vbox()->pack_start (*scroller);
752 session_selector_window->show_all_children();
756 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
758 session_selector_window->response (RESPONSE_ACCEPT);
762 ARDOUR_UI::open_recent_session ()
764 /* popup selector window */
766 if (session_selector_window == 0) {
767 build_session_selector ();
770 redisplay_recent_sessions ();
772 ResponseType r = (ResponseType) session_selector_window->run ();
774 session_selector_window->hide();
777 case RESPONSE_ACCEPT:
783 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
785 if (i == recent_session_model->children().end()) {
789 Glib::ustring path = (*i)[recent_session_columns.fullpath];
790 Glib::ustring state = (*i)[recent_session_columns.visible_name];
792 _session_is_new = false;
794 load_session (path, state);
798 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
802 if (stat (info.filename.c_str(), &statbuf) != 0) {
806 if (!S_ISDIR(statbuf.st_mode)) {
812 string session_file = info.filename;
814 session_file += Glib::path_get_basename (info.filename);
815 session_file += ".ardour";
817 if (stat (session_file.c_str(), &statbuf) != 0) {
821 return S_ISREG (statbuf.st_mode);
825 ARDOUR_UI::open_session ()
827 /* popup selector window */
829 if (open_session_selector == 0) {
831 /* ardour sessions are folders */
833 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
834 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
835 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
837 FileFilter session_filter;
838 session_filter.add_pattern ("*.ardour");
839 session_filter.set_name (_("Ardour sessions"));
840 open_session_selector->add_filter (session_filter);
841 open_session_selector->set_filter (session_filter);
844 int response = open_session_selector->run();
845 open_session_selector->hide ();
848 case RESPONSE_ACCEPT:
851 open_session_selector->hide();
855 open_session_selector->hide();
856 string session_path = open_session_selector->get_filename();
860 if (session_path.length() > 0) {
861 if (Session::find_session (session_path, path, name, isnew) == 0) {
862 _session_is_new = isnew;
863 load_session (path, name);
870 ARDOUR_UI::session_add_midi_track ()
872 cerr << _("Patience is a virtue.\n");
876 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
881 warning << _("You cannot add a track without a session already loaded.") << endmsg;
887 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
888 error << _("could not create new audio track") << endmsg;
891 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
892 error << _("could not create new audio bus") << endmsg;
897 if (need_control_room_outs) {
903 route->set_stereo_control_outs (control_lr_channels);
904 route->control_outs()->set_stereo_pan (pans, this);
906 #endif /* CONTROLOUTS */
910 MessageDialog msg (*editor,
911 _("There are insufficient JACK ports available\n\
912 to create a new track or bus.\n\
913 You should save Ardour, exit and\n\
914 restart JACK with more ports."));
920 ARDOUR_UI::diskstream_added (AudioDiskstream* ds)
925 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
927 jack_nframes_t _preroll;
930 _preroll = session->convert_to_frames_at (new_position, session->preroll);
932 if (new_position > _preroll) {
933 new_position -= _preroll;
938 session->request_locate (new_position);
943 ARDOUR_UI::transport_goto_start ()
946 session->goto_start();
949 /* force displayed area in editor to start no matter
950 what "follow playhead" setting is.
954 editor->reposition_x_origin (session->current_start_frame());
960 ARDOUR_UI::transport_goto_zero ()
963 session->request_locate (0);
966 /* force displayed area in editor to start no matter
967 what "follow playhead" setting is.
971 editor->reposition_x_origin (0);
977 ARDOUR_UI::transport_goto_end ()
980 jack_nframes_t frame = session->current_end_frame();
981 session->request_locate (frame);
983 /* force displayed area in editor to start no matter
984 what "follow playhead" setting is.
988 editor->reposition_x_origin (frame);
994 ARDOUR_UI::transport_stop ()
1000 if (session->is_auditioning()) {
1001 session->cancel_audition ();
1005 if (session->get_auto_loop()) {
1006 session->request_auto_loop (false);
1009 session->request_stop ();
1013 ARDOUR_UI::transport_stop_and_forget_capture ()
1016 session->request_stop (true);
1021 ARDOUR_UI::remove_last_capture()
1024 editor->remove_last_capture();
1029 ARDOUR_UI::transport_record ()
1032 switch (session->record_status()) {
1033 case Session::Disabled:
1034 if (session->ntracks() == 0) {
1035 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1036 MessageDialog msg (*editor, txt);
1040 session->maybe_enable_record ();
1042 case Session::Recording:
1043 case Session::Enabled:
1044 session->disable_record (true);
1050 ARDOUR_UI::transport_roll ()
1058 rolling = session->transport_rolling ();
1060 if (session->get_auto_loop()) {
1061 session->request_auto_loop (false);
1062 auto_loop_button.set_active (false);
1063 roll_button.set_active (true);
1064 } else if (session->get_play_range ()) {
1065 session->request_play_range (false);
1066 play_selection_button.set_active (false);
1067 } else if (rolling) {
1068 session->request_locate (session->last_transport_start(), true);
1071 session->request_transport_speed (1.0f);
1075 ARDOUR_UI::transport_loop()
1078 if (session->get_auto_loop()) {
1079 if (session->transport_rolling()) {
1080 Location * looploc = session->locations()->auto_loop_location();
1082 session->request_locate (looploc->start(), true);
1087 session->request_auto_loop (true);
1093 ARDOUR_UI::transport_play_selection ()
1099 if (!session->get_play_range()) {
1100 session->request_stop ();
1103 editor->play_selection ();
1107 ARDOUR_UI::transport_rewind (int option)
1109 float current_transport_speed;
1112 current_transport_speed = session->transport_speed();
1114 if (current_transport_speed >= 0.0f) {
1117 session->request_transport_speed (-1.0f);
1120 session->request_transport_speed (-4.0f);
1123 session->request_transport_speed (-0.5f);
1128 session->request_transport_speed (current_transport_speed * 1.5f);
1134 ARDOUR_UI::transport_forward (int option)
1136 float current_transport_speed;
1139 current_transport_speed = session->transport_speed();
1141 if (current_transport_speed <= 0.0f) {
1144 session->request_transport_speed (1.0f);
1147 session->request_transport_speed (4.0f);
1150 session->request_transport_speed (0.5f);
1155 session->request_transport_speed (current_transport_speed * 1.5f);
1161 ARDOUR_UI::toggle_monitor_enable (guint32 dstream)
1167 AudioDiskstream *ds;
1169 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1170 Port *port = ds->io()->input (0);
1171 port->request_monitor_input (!port->monitoring_input());
1176 ARDOUR_UI::toggle_record_enable (guint32 dstream)
1182 AudioDiskstream *ds;
1184 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1185 ds->set_record_enabled (!ds->record_enabled(), this);
1190 ARDOUR_UI::queue_transport_change ()
1192 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1196 ARDOUR_UI::map_transport_state ()
1198 float sp = session->transport_speed();
1201 transport_rolling ();
1202 } else if (sp < 0.0f) {
1203 transport_rewinding ();
1204 } else if (sp > 0.0f) {
1205 transport_forwarding ();
1207 transport_stopped ();
1212 ARDOUR_UI::allow_local_only ()
1218 ARDOUR_UI::allow_mmc_only ()
1224 ARDOUR_UI::allow_mmc_and_local ()
1230 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1232 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1233 (int) adj.get_value()].c_str());
1237 ARDOUR_UI::engine_stopped ()
1239 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1240 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1241 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1246 ARDOUR_UI::engine_running ()
1248 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1249 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1250 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1254 ARDOUR_UI::engine_halted ()
1256 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1258 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1259 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1261 update_sample_rate (0);
1263 MessageDialog msg (*editor,
1265 JACK has either been shutdown or it\n\
1266 disconnected Ardour because Ardour\n\
1267 was not fast enough. You can save the\n\
1268 session and/or try to reconnect to JACK ."));
1273 ARDOUR_UI::do_engine_start ()
1279 catch (AudioEngine::PortRegistrationFailure& err) {
1281 error << _("Unable to create all required ports")
1289 error << _("Unable to start the session running")
1299 ARDOUR_UI::start_engine ()
1301 if (do_engine_start () == 0) {
1302 if (session && _session_is_new) {
1303 /* we need to retain initial visual
1304 settings for a new session
1306 session->save_state ("");
1309 /* there is too much going on, in too many threads, for us to
1310 end up with a clean session. So wait 1 second after loading,
1311 and fix it up. its ugly, but until i come across a better
1312 solution, its what we have.
1315 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1322 ARDOUR_UI::update_clocks ()
1324 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1328 ARDOUR_UI::start_clocking ()
1330 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1334 ARDOUR_UI::stop_clocking ()
1336 clock_signal_connection.disconnect ();
1340 ARDOUR_UI::toggle_clocking ()
1343 if (clock_button.get_active()) {
1352 ARDOUR_UI::_blink (void *arg)
1355 ((ARDOUR_UI *) arg)->blink ();
1362 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1366 ARDOUR_UI::start_blinking ()
1368 /* Start the blink signal. Everybody with a blinking widget
1369 uses Blink to drive the widget's state.
1372 if (blink_timeout_tag < 0) {
1374 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1379 ARDOUR_UI::stop_blinking ()
1381 if (blink_timeout_tag >= 0) {
1382 gtk_timeout_remove (blink_timeout_tag);
1383 blink_timeout_tag = -1;
1389 ARDOUR_UI::add_diskstream_to_menu (AudioDiskstream& dstream)
1391 using namespace Gtk;
1392 using namespace Menu_Helpers;
1394 if (dstream.hidden()) {
1398 MenuList& items = diskstream_menu->items();
1399 items.push_back (MenuElem (dstream.name(), bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), (gint32) dstream.id())));
1403 ARDOUR_UI::diskstream_selected (gint32 id)
1405 selected_dstream = id;
1410 ARDOUR_UI::select_diskstream (GdkEventButton *ev)
1412 using namespace Gtk;
1413 using namespace Menu_Helpers;
1419 diskstream_menu = new Menu();
1420 diskstream_menu->set_name ("ArdourContextMenu");
1421 using namespace Gtk;
1422 using namespace Menu_Helpers;
1424 MenuList& items = diskstream_menu->items();
1425 items.push_back (MenuElem (_("No Stream"), (bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), -1))));
1427 session->foreach_audio_diskstream (this, &ARDOUR_UI::add_diskstream_to_menu);
1430 diskstream_menu->popup (ev->button, ev->time);
1432 diskstream_menu->popup (0, 0);
1435 selected_dstream = -1;
1439 delete diskstream_menu;
1441 return selected_dstream;
1445 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1451 if (io.n_inputs() == 0) {
1456 /* XXX we're not handling multiple ports yet. */
1458 const char **connections = io.input(0)->get_connections();
1460 if (connections == 0 || connections[0] == '\0') {
1463 buf = connections[0];
1470 if (io.n_outputs() == 0) {
1475 /* XXX we're not handling multiple ports yet. */
1477 const char **connections = io.output(0)->get_connections();
1479 if (connections == 0 || connections[0] == '\0') {
1482 buf = connections[0];
1490 ARDOUR_UI::snapshot_session ()
1492 ArdourPrompter prompter (true);
1499 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1501 prompter.set_name ("Prompter");
1502 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1503 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1504 prompter.set_prompt (_("Name of New Snapshot"));
1505 prompter.set_initial_text (now);
1507 switch (prompter.run()) {
1508 case RESPONSE_ACCEPT:
1509 prompter.get_result (snapname);
1510 if (snapname.length()){
1511 save_state (snapname);
1521 ARDOUR_UI::save_state (const string & name)
1523 (void) save_state_canfail (name);
1527 ARDOUR_UI::save_state_canfail (string name)
1532 if (name.length() == 0) {
1533 name = session->snap_name();
1536 if ((ret = session->save_state (name)) != 0) {
1540 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1545 ARDOUR_UI::restore_state (string name)
1548 if (name.length() == 0) {
1549 name = session->name();
1551 session->restore_state (name);
1556 ARDOUR_UI::primary_clock_value_changed ()
1559 session->request_locate (primary_clock.current_time ());
1564 ARDOUR_UI::secondary_clock_value_changed ()
1567 session->request_locate (secondary_clock.current_time ());
1572 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1574 if (session && dstream && dstream->record_enabled()) {
1576 Session::RecordState rs;
1578 rs = session->record_status ();
1581 case Session::Disabled:
1582 case Session::Enabled:
1583 if (w->get_state() != STATE_SELECTED) {
1584 w->set_state (STATE_SELECTED);
1588 case Session::Recording:
1589 if (w->get_state() != STATE_ACTIVE) {
1590 w->set_state (STATE_ACTIVE);
1596 if (w->get_state() != STATE_NORMAL) {
1597 w->set_state (STATE_NORMAL);
1603 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1609 switch (session->record_status()) {
1610 case Session::Enabled:
1612 rec_button.set_state (1);
1614 rec_button.set_state (0);
1618 case Session::Recording:
1619 rec_button.set_state (2);
1623 rec_button.set_state (0);
1629 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1637 ARDOUR_UI::start_keyboard_prefix ()
1639 keyboard->start_prefix();
1643 ARDOUR_UI::save_template ()
1646 ArdourPrompter prompter (true);
1649 prompter.set_name (X_("Prompter"));
1650 prompter.set_prompt (_("Name for mix template:"));
1651 prompter.set_initial_text(session->name() + _("-template"));
1652 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1653 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1655 switch (prompter.run()) {
1656 case RESPONSE_ACCEPT:
1657 prompter.get_result (name);
1659 if (name.length()) {
1660 session->save_template (name);
1670 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1672 m_new_session_dialog->show();
1673 m_new_session_dialog->set_modal(true);
1674 m_new_session_dialog->set_name(predetermined_path);
1675 m_new_session_dialog->reset_recent();
1677 int response = Gtk::RESPONSE_CANCEL;
1680 response = m_new_session_dialog->run ();
1681 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1685 } else if (response == Gtk::RESPONSE_NONE) {
1686 /* Clear was pressed */
1687 m_new_session_dialog->reset();
1689 } else if (response == Gtk::RESPONSE_YES) {
1690 /* YES == OPEN, but there's no enum for that */
1691 std::string session_name = m_new_session_dialog->session_name();
1692 std::string session_path = m_new_session_dialog->session_folder();
1693 load_session (session_path, session_name);
1696 } else if (response == Gtk::RESPONSE_OK) {
1697 if (m_new_session_dialog->get_current_page() == 1) {
1699 /* XXX this is a bit of a hack..
1700 i really want the new sesion dialog to return RESPONSE_YES
1701 if we're on page 1 (the load page)
1702 Unfortunately i can't see how atm..
1704 std::string session_name = m_new_session_dialog->session_name();
1705 std::string session_path = m_new_session_dialog->session_folder();
1706 load_session (session_path, session_name);
1710 _session_is_new = true;
1712 std::string session_name = m_new_session_dialog->session_name();
1713 std::string session_path = m_new_session_dialog->session_folder();
1716 //XXX This is needed because session constructor wants a
1717 //non-existant path. hopefully this will be fixed at some point.
1719 session_path = Glib::build_filename(session_path, session_name);
1721 std::string template_name = m_new_session_dialog->session_template_name();
1723 if (m_new_session_dialog->use_session_template()) {
1725 load_session (session_path, session_name, &template_name);
1731 Session::AutoConnectOption iconnect;
1732 Session::AutoConnectOption oconnect;
1734 if (m_new_session_dialog->create_control_bus()) {
1735 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1740 if (m_new_session_dialog->create_master_bus()) {
1741 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1746 if (m_new_session_dialog->connect_inputs()) {
1747 iconnect = Session::AutoConnectPhysical;
1749 iconnect = Session::AutoConnectOption (0);
1752 /// @todo some minor tweaks.
1754 if (m_new_session_dialog->connect_outs_to_master()) {
1755 oconnect = Session::AutoConnectMaster;
1756 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1757 oconnect = Session::AutoConnectPhysical;
1759 oconnect = Session::AutoConnectOption (0);
1762 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1763 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1765 build_session (session_path,
1773 engine->frame_rate() * 60 * 5);
1778 } while (response == Gtk::RESPONSE_NONE);
1779 m_new_session_dialog->hide();
1785 ARDOUR_UI::close_session()
1792 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1794 Session *new_session;
1796 session_loaded = false;
1797 x = unload_session ();
1805 /* if it already exists, we must have write access */
1807 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1808 MessageDialog msg (*editor, _("\
1809 You do not have write access to this session.\n\
1810 This prevents the session from being loaded."));
1816 new_session = new Session (*engine, path, snap_name, mix_template);
1821 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1825 connect_to_session (new_session);
1827 //if (engine->running()) {
1828 //mixer->show_window();
1830 session_loaded = true;
1835 ARDOUR_UI::make_session_clean ()
1838 session->set_clean ();
1847 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1848 uint32_t control_channels,
1849 uint32_t master_channels,
1850 Session::AutoConnectOption input_connect,
1851 Session::AutoConnectOption output_connect,
1854 jack_nframes_t initial_length)
1856 Session *new_session;
1859 session_loaded = false;
1860 x = unload_session ();
1867 _session_is_new = true;
1870 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1871 control_channels, master_channels, nphysin, nphysout, initial_length);
1876 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1880 connect_to_session (new_session);
1882 //if (engine->running()) {
1883 //mixer->show_window();
1885 session_loaded = true;
1893 editor->show_window ();
1897 if (session && mixer) {
1898 // mixer->show_window ();
1907 ARDOUR_UI::show_splash ()
1910 about = new About();
1916 ARDOUR_UI::hide_splash ()
1924 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1928 removed = rep.paths.size();
1931 MessageDialog msgd (*editor,
1932 _("No audio files were ready for cleanup"),
1935 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1936 msgd.set_secondary_text (_("If this seems suprising, \n\
1937 check for any existing snapshots.\n\
1938 These may still include regions that\n\
1939 require some unused files to continue to exist."));
1945 ArdourDialog results (_("ardour: cleanup"), true, false);
1947 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1948 CleanupResultsModelColumns() {
1952 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1953 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1957 CleanupResultsModelColumns results_columns;
1958 Glib::RefPtr<Gtk::ListStore> results_model;
1959 Gtk::TreeView results_display;
1961 results_model = ListStore::create (results_columns);
1962 results_display.set_model (results_model);
1963 results_display.append_column (list_title, results_columns.visible_name);
1965 results_display.set_name ("CleanupResultsList");
1966 results_display.set_headers_visible (true);
1967 results_display.set_headers_clickable (false);
1968 results_display.set_reorderable (false);
1970 Gtk::ScrolledWindow list_scroller;
1973 Gtk::HBox dhbox; // the hbox for the image and text
1974 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1975 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1977 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1979 if (rep.space < 1048576.0f) {
1981 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1983 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1987 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1989 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1993 dhbox.pack_start (*dimage, true, false, 5);
1994 dhbox.pack_start (txt, true, false, 5);
1996 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1997 TreeModel::Row row = *(results_model->append());
1998 row[results_columns.visible_name] = *i;
1999 row[results_columns.fullpath] = *i;
2002 list_scroller.add (results_display);
2003 list_scroller.set_size_request (-1, 150);
2004 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2006 dvbox.pack_start (dhbox, true, false, 5);
2007 dvbox.pack_start (list_scroller, true, false, 5);
2008 ddhbox.pack_start (dvbox, true, false, 5);
2010 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2011 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2012 results.set_default_response (RESPONSE_CLOSE);
2013 results.set_position (Gtk::WIN_POS_MOUSE);
2014 results.show_all_children ();
2015 results.set_resizable (false);
2022 ARDOUR_UI::cleanup ()
2025 /* shouldn't happen: menu item is insensitive */
2030 MessageDialog checker (_("Are you sure you want to cleanup?"),
2032 Gtk::MESSAGE_QUESTION,
2033 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2035 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2036 ALL undo/redo information will be lost if you cleanup.\n\
2037 After cleanup, unused audio files will be moved to a \
2038 \"dead sounds\" location."));
2040 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2041 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2042 checker.set_default_response (RESPONSE_CANCEL);
2044 checker.set_name (_("CleanupDialog"));
2045 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2046 checker.set_position (Gtk::WIN_POS_MOUSE);
2048 switch (checker.run()) {
2049 case RESPONSE_ACCEPT:
2055 Session::cleanup_report rep;
2057 editor->prepare_for_cleanup ();
2059 if (session->cleanup_sources (rep)) {
2063 display_cleanup_results (rep,
2066 The following %1 %2 not in use and \n\
2067 have been moved to:\n\
2069 Flushing the wastebasket will \n\
2070 release an additional\n\
2071 %4 %5bytes of disk space.\n"
2076 ARDOUR_UI::flush_trash ()
2079 /* shouldn't happen: menu item is insensitive */
2083 Session::cleanup_report rep;
2085 if (session->cleanup_trash_sources (rep)) {
2089 display_cleanup_results (rep,
2091 _("The following %1 %2 deleted from\n\
2093 releasing %4 %5bytes of disk space"));
2097 ARDOUR_UI::add_route ()
2105 if (add_route_dialog == 0) {
2106 add_route_dialog = new AddRouteDialog;
2107 editor->ensure_float (*add_route_dialog);
2110 if (add_route_dialog->is_visible()) {
2111 /* we're already doing this */
2115 ResponseType r = (ResponseType) add_route_dialog->run ();
2117 add_route_dialog->hide();
2120 case RESPONSE_ACCEPT:
2127 if ((count = add_route_dialog->count()) <= 0) {
2131 uint32_t input_chan = add_route_dialog->channels ();
2132 uint32_t output_chan;
2133 string name_template = add_route_dialog->name_template ();
2134 bool track = add_route_dialog->track ();
2136 Session::AutoConnectOption oac = session->get_output_auto_connect();
2138 if (oac & Session::AutoConnectMaster) {
2139 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2141 output_chan = input_chan;
2144 /* XXX do something with name template */
2148 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2150 session_add_audio_bus (input_chan, output_chan);
2154 while (Main::events_pending()) {
2161 ARDOUR_UI::mixer_settings () const
2166 node = session->instant_xml(X_("Mixer"), session->path());
2168 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2172 node = new XMLNode (X_("Mixer"));
2179 ARDOUR_UI::editor_settings () const
2184 node = session->instant_xml(X_("Editor"), session->path());
2186 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2190 node = new XMLNode (X_("Editor"));
2196 ARDOUR_UI::keyboard_settings () const
2200 node = Config->extra_xml(X_("Keyboard"));
2203 node = new XMLNode (X_("Keyboard"));
2209 ARDOUR_UI::halt_on_xrun_message ()
2211 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2213 MessageDialog msg (*editor,
2214 _("Recording was stopped because your system could not keep up."));
2219 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::AudioFileSource*>* deletion_list)
2221 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2223 for (list<AudioFileSource*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2227 delete deletion_list;
2231 ARDOUR_UI::disk_overrun_handler ()
2233 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2235 if (!have_disk_overrun_displayed) {
2236 have_disk_overrun_displayed = true;
2237 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2238 The disk system on your computer\n\
2239 was not able to keep up with Ardour.\n\
2241 Specifically, it failed to write data to disk\n\
2242 quickly enough to keep up with recording.\n"));
2244 have_disk_overrun_displayed = false;
2249 ARDOUR_UI::disk_underrun_handler ()
2251 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2253 if (!have_disk_underrun_displayed) {
2254 have_disk_underrun_displayed = true;
2255 MessageDialog msg (*editor,
2256 (_("The disk system on your computer\n\
2257 was not able to keep up with Ardour.\n\
2259 Specifically, it failed to read data from disk\n\
2260 quickly enough to keep up with playback.\n")));
2262 have_disk_underrun_displayed = false;
2267 ARDOUR_UI::disk_underrun_message_gone ()
2269 have_disk_underrun_displayed = false;
2273 ARDOUR_UI::disk_overrun_message_gone ()
2275 have_disk_underrun_displayed = false;
2279 ARDOUR_UI::pending_state_dialog ()
2281 ArdourDialog dialog ("pending state dialog");
2283 This session appears to have been in\n\
2284 middle of recording when ardour or\n\
2285 the computer was shutdown.\n\
2287 Ardour can recover any captured audio for\n\
2288 you, or it can ignore it. Please decide\n\
2289 what you would like to do.\n"));
2291 dialog.get_vbox()->pack_start (message);
2292 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2293 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2295 dialog.set_position (WIN_POS_CENTER);
2298 switch (dialog.run ()) {
2299 case RESPONSE_ACCEPT:
2307 ARDOUR_UI::disconnect_from_jack ()
2310 if( engine->disconnect_from_jack ()) {
2311 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2315 update_sample_rate (0);
2320 ARDOUR_UI::reconnect_to_jack ()
2323 if (engine->reconnect_to_jack ()) {
2324 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2328 update_sample_rate (0);
2333 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2335 engine->request_buffer_size (nframes);
2336 update_sample_rate (0);
2340 ARDOUR_UI::cmdline_new_session (string path)
2342 if (path[0] != '/') {
2343 char buf[PATH_MAX+1];
2346 getcwd (buf, sizeof (buf));
2353 new_session (false, path);
2355 _will_create_new_session_automatically = false; /* done it */
2356 return FALSE; /* don't call it again */
2360 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2362 Glib::RefPtr<Action> act;
2366 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2369 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2372 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2375 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2378 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2381 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2384 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2389 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2390 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2391 Config->set_native_file_header_format (hf);
2393 session->reset_native_file_format ();
2400 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2402 Glib::RefPtr<Action> act;
2406 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2409 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2414 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2416 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2417 Config->set_native_file_data_format (sf);
2419 session->reset_native_file_format ();
2426 ARDOUR_UI::use_config ()
2428 Glib::RefPtr<Action> act;
2430 switch (Config->get_native_file_data_format ()) {
2432 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2435 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2440 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2441 ract->set_active ();
2444 switch (Config->get_native_file_header_format ()) {
2446 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2449 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2452 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2455 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2458 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2461 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2464 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2469 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2470 ract->set_active ();