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/basename.h>
37 #include <pbd/pathscanner.h>
38 #include <pbd/failed_constructor.h>
39 #include <gtkmm2ext/gtk_ui.h>
40 #include <gtkmm2ext/utils.h>
41 #include <gtkmm2ext/click_box.h>
42 #include <gtkmm2ext/fastmeter.h>
43 #include <gtkmm2ext/stop_signal.h>
44 #include <gtkmm2ext/popup.h>
46 #include <midi++/port.h>
47 #include <midi++/mmc.h>
49 #include <ardour/ardour.h>
50 #include <ardour/port.h>
51 #include <ardour/audioengine.h>
52 #include <ardour/playlist.h>
53 #include <ardour/utils.h>
54 #include <ardour/diskstream.h>
55 #include <ardour/filesource.h>
56 #include <ardour/recent_sessions.h>
57 #include <ardour/session_diskstream.h>
58 #include <ardour/port.h>
59 #include <ardour/audio_track.h>
62 #include "ardour_ui.h"
63 #include "public_editor.h"
64 #include "audio_clock.h"
69 #include "keyboard_target.h"
70 #include "add_route_dialog.h"
71 #include "new_session_dialog.h"
74 #include "gui_thread.h"
75 #include "color_manager.h"
79 using namespace ARDOUR;
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 = 0;
151 m_new_session_dialog_ref = NewSessionDialogFactory::create();
152 m_new_session_dialog_ref->get_widget_derived (NewSessionDialogFactory::top_level_widget_name(), m_new_session_dialog);
156 _session_is_new = false;
157 big_clock_window = 0;
158 session_selector_window = 0;
159 last_key_press_time = 0;
160 connection_editor = 0;
161 add_route_dialog = 0;
166 open_session_selector = 0;
167 have_configure_timeout = false;
168 have_disk_overrun_displayed = false;
169 have_disk_underrun_displayed = false;
170 _will_create_new_session_automatically = false;
171 session_loaded = false;
172 last_speed_displayed = -1.0f;
174 last_configure_time.tv_sec = 0;
175 last_configure_time.tv_usec = 0;
177 shuttle_grabbed = false;
179 shuttle_max_speed = 8.0f;
181 set_shuttle_units (Percentage);
182 set_shuttle_behaviour (Sprung);
184 shuttle_style_menu = 0;
185 shuttle_unit_menu = 0;
187 gettimeofday (&last_peak_grab, 0);
188 gettimeofday (&last_shuttle_request, 0);
190 ARDOUR::DiskStream::CannotRecordNoInput.connect (mem_fun(*this, &ARDOUR_UI::cannot_record_no_input));
191 ARDOUR::DiskStream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
192 ARDOUR::DiskStream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
193 ARDOUR::DiskStream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
195 /* handle pending state with a dialog */
197 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
199 /* have to wait for AudioEngine and Configuration before proceeding */
203 ARDOUR_UI::cannot_record_no_input (DiskStream* ds)
205 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::cannot_record_no_input), ds));
207 string msg = string_compose (_("\
208 You cannot record-enable\n\
210 because it has no input connections.\n\
211 You would be wasting space recording silence."),
214 MessageDialog message (*editor, msg);
219 ARDOUR_UI::set_engine (AudioEngine& e)
223 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
224 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
225 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
226 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
230 keyboard = new Keyboard;
234 meter_path = ARDOUR::find_data_file("v_meter_strip.xpm", "pixmaps");
235 if (meter_path.empty()) {
236 error << _("no vertical meter strip image found") << endmsg;
239 FastMeter::set_vertical_xpm (meter_path);
241 meter_path = ARDOUR::find_data_file("h_meter_strip.xpm", "pixmaps");
242 if (meter_path.empty()) {
243 error << _("no horizontal meter strip image found") << endmsg;
246 FastMeter::set_horizontal_xpm (meter_path);
248 if (setup_windows ()) {
249 throw failed_constructor ();
252 if (GTK_ARDOUR::show_key_actions) {
253 vector<string> names;
254 vector<string> paths;
256 vector<AccelKey> bindings;
258 ActionManager::get_all_actions (names, paths, keys, bindings);
260 vector<string>::iterator n;
261 vector<string>::iterator k;
262 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
263 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
269 /* start with timecode, metering enabled
272 blink_timeout_tag = -1;
274 /* the global configuration object is now valid */
278 /* this being a GUI and all, we want peakfiles */
280 FileSource::set_build_peakfiles (true);
281 FileSource::set_build_missing_peakfiles (true);
283 if (Source::start_peak_thread ()) {
284 throw failed_constructor();
287 /* start the time-of-day-clock */
289 update_wall_clock ();
290 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
292 update_disk_space ();
294 update_sample_rate (engine->frame_rate());
296 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
297 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
300 ARDOUR_UI::~ARDOUR_UI ()
302 save_ardour_state ();
316 if (add_route_dialog) {
317 delete add_route_dialog;
320 Source::stop_peak_thread ();
324 ARDOUR_UI::configure_timeout ()
329 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
330 /* no configure events yet */
334 gettimeofday (&now, 0);
335 timersub (&now, &last_configure_time, &diff);
337 /* force a gap of 0.5 seconds since the last configure event
340 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
343 have_configure_timeout = false;
344 save_ardour_state ();
350 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
352 if (have_configure_timeout) {
353 gettimeofday (&last_configure_time, 0);
355 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
356 have_configure_timeout = true;
363 ARDOUR_UI::save_ardour_state ()
365 if (!keyboard || !mixer || !editor) {
369 /* XXX this is all a bit dubious. add_extra_xml() uses
370 a different lifetime model from add_instant_xml().
373 XMLNode* node = new XMLNode (keyboard->get_state());
374 Config->add_extra_xml (*node);
375 Config->save_state();
377 XMLNode& enode (static_cast<Stateful*>(editor)->get_state());
378 XMLNode& mnode (mixer->get_state());
381 session->add_instant_xml(enode, session->path());
382 session->add_instant_xml(mnode, session->path());
384 Config->add_instant_xml(enode, get_user_ardour_path());
385 Config->add_instant_xml(mnode, get_user_ardour_path());
390 AccelMap::save ("ardour.saved_bindings");
394 ARDOUR_UI::startup ()
396 /* Once the UI is up and running, start the audio engine. Doing
397 this before the UI is up and running can cause problems
398 when not running with SCHED_FIFO, because the amount of
399 CPU and disk work needed to get the UI started can interfere
400 with the scheduling of the audio thread.
403 Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
409 if (session && session->dirty()) {
410 switch (ask_about_saving_session(_("quit"))) {
415 /* use the default name */
416 if (save_state_canfail ("")) {
417 /* failed - don't quit */
418 MessageDialog msg (*editor,
420 Ardour was unable to save your session.\n\n\
421 If you still wish to quit, please use the\n\n\
422 \"Just quit\" option."));
436 ARDOUR_UI::ask_about_saving_session (const string & what)
438 ArdourDialog window (_("ardour: save session?"));
439 Gtk::HBox dhbox; // the hbox for the image and text
440 Gtk::Label prompt_label;
441 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
445 msg = string_compose(_("Don't %1"), what);
446 window.add_button (msg, RESPONSE_REJECT);
447 msg = string_compose(_("Just %1"), what);
448 window.add_button (msg, RESPONSE_APPLY);
449 msg = string_compose(_("Save and %1"), what);
450 window.add_button (msg, RESPONSE_ACCEPT);
452 window.set_default_response (RESPONSE_ACCEPT);
454 Gtk::Button noquit_button (msg);
455 noquit_button.set_name ("EditorGTKButton");
460 if (session->snap_name() == session->name()) {
463 type = _("snapshot");
465 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?"),
466 type, session->snap_name());
468 prompt_label.set_text (prompt);
469 prompt_label.set_name (X_("PrompterLabel"));
470 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
472 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
474 dhbox.set_homogeneous (false);
475 dhbox.pack_start (*dimage, false, false, 5);
476 dhbox.pack_start (prompt_label, true, false, 5);
477 window.get_vbox()->pack_start (dhbox);
479 window.set_name (_("Prompter"));
480 window.set_position (Gtk::WIN_POS_MOUSE);
481 window.set_modal (true);
482 window.set_resizable (false);
485 save_the_session = 0;
487 editor->ensure_float (window);
489 ResponseType r = (ResponseType) window.run();
494 case RESPONSE_ACCEPT: // save and get out of here
496 case RESPONSE_APPLY: // get out of here
506 ARDOUR_UI::every_second ()
509 update_buffer_load ();
510 update_disk_space ();
515 ARDOUR_UI::every_point_one_seconds ()
517 update_speed_display ();
518 RapidScreenUpdate(); /* EMIT_SIGNAL */
523 ARDOUR_UI::every_point_zero_one_seconds ()
525 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
530 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
534 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
536 if (!engine->connected()) {
538 snprintf (buf, sizeof (buf), _("disconnected"));
542 jack_nframes_t rate = engine->frame_rate();
544 if (fmod (rate, 1000.0) != 0.0) {
545 snprintf (buf, sizeof (buf), _("SR: %.1f kHz / %4.1f msecs"),
546 (float) rate/1000.0f,
547 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
549 snprintf (buf, sizeof (buf), _("SR: %u kHz / %4.1f msecs"),
551 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
555 sample_rate_label.set_text (buf);
559 ARDOUR_UI::update_cpu_load ()
562 snprintf (buf, sizeof (buf), _("DSP Load: %.1f%%"), engine->get_cpu_load());
563 cpu_load_label.set_text (buf);
567 ARDOUR_UI::update_buffer_load ()
572 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
573 session->playback_load(), session->capture_load());
574 buffer_load_label.set_text (buf);
576 buffer_load_label.set_text ("");
581 ARDOUR_UI::count_recenabled_diskstreams (DiskStream& ds)
583 if (ds.record_enabled()) {
584 rec_enabled_diskstreams++;
589 ARDOUR_UI::update_disk_space()
595 jack_nframes_t frames = session->available_capture_duration();
598 if (frames == max_frames) {
599 strcpy (buf, _("space: 24hrs+"));
604 jack_nframes_t fr = session->frame_rate();
606 if (session->actively_recording()){
608 rec_enabled_diskstreams = 0;
609 session->foreach_diskstream (this, &ARDOUR_UI::count_recenabled_diskstreams);
611 if (rec_enabled_diskstreams) {
612 frames /= rec_enabled_diskstreams;
617 /* hmmm. shall we divide by the route count? or the diskstream count?
618 or what? for now, do nothing ...
623 hrs = frames / (fr * 3600);
624 frames -= hrs * fr * 3600;
625 mins = frames / (fr * 60);
626 frames -= mins * fr * 60;
629 snprintf (buf, sizeof(buf), _("space: %02dh:%02dm:%02ds"), hrs, mins, secs);
632 disk_space_label.set_text (buf);
636 ARDOUR_UI::update_wall_clock ()
643 tm_now = localtime (&now);
645 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
646 wall_clock_label.set_text (buf);
651 ARDOUR_UI::control_methods_adjusted ()
656 which_method = (int) online_control_button->adjustment.get_value();
657 switch (which_method) {
659 allow_mmc_and_local ();
668 fatal << _("programming error: impossible control method") << endmsg;
674 ARDOUR_UI::mmc_device_id_adjusted ()
679 int dev_id = (int) mmc_id_button->adjustment.get_value();
680 mmc->set_device_id (dev_id);
686 ARDOUR_UI::session_menu (GdkEventButton *ev)
688 session_popup_menu->popup (0, 0);
693 ARDOUR_UI::redisplay_recent_sessions ()
695 vector<string *> *sessions;
696 vector<string *>::iterator i;
697 RecentSessionsSorter cmp;
699 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
700 recent_session_model->clear ();
703 ARDOUR::read_recent_sessions (rs);
706 recent_session_display.set_model (recent_session_model);
710 /* sort them alphabetically */
711 sort (rs.begin(), rs.end(), cmp);
712 sessions = new vector<string*>;
714 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
715 sessions->push_back (new string ((*i).second));
718 for (i = sessions->begin(); i != sessions->end(); ++i) {
720 vector<string*>* states;
721 vector<const gchar*> item;
722 string fullpath = *(*i);
724 /* remove any trailing / */
726 if (fullpath[fullpath.length()-1] == '/') {
727 fullpath = fullpath.substr (0, fullpath.length()-1);
730 /* now get available states for this session */
732 if ((states = Session::possible_states (fullpath)) == 0) {
737 TreeModel::Row row = *(recent_session_model->append());
739 row[recent_session_columns.visible_name] = PBD::basename (fullpath);
740 row[recent_session_columns.fullpath] = fullpath;
742 if (states->size() > 1) {
744 /* add the children */
746 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
748 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
750 child_row[recent_session_columns.visible_name] = **i2;
751 child_row[recent_session_columns.fullpath] = fullpath;
760 recent_session_display.set_model (recent_session_model);
765 ARDOUR_UI::build_session_selector ()
767 session_selector_window = new ArdourDialog ("session selector");
769 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
771 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
772 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
773 session_selector_window->set_default_response (RESPONSE_ACCEPT);
774 recent_session_model = TreeStore::create (recent_session_columns);
775 recent_session_display.set_model (recent_session_model);
776 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
777 recent_session_display.set_headers_visible (false);
778 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
780 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
782 scroller->add (recent_session_display);
783 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
785 session_selector_window->set_name ("SessionSelectorWindow");
786 session_selector_window->set_size_request (200, 400);
787 session_selector_window->get_vbox()->pack_start (*scroller);
788 session_selector_window->show_all_children();
792 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
794 session_selector_window->response (RESPONSE_ACCEPT);
798 ARDOUR_UI::open_recent_session ()
800 /* popup selector window */
802 if (session_selector_window == 0) {
803 build_session_selector ();
806 redisplay_recent_sessions ();
808 ResponseType r = (ResponseType) session_selector_window->run ();
810 session_selector_window->hide();
813 case RESPONSE_ACCEPT:
819 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
821 if (i == recent_session_model->children().end()) {
825 Glib::ustring path = (*i)[recent_session_columns.fullpath];
826 Glib::ustring state = (*i)[recent_session_columns.visible_name];
828 _session_is_new = false;
830 load_session (path, state);
834 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
838 if (stat (info.filename.c_str(), &statbuf) != 0) {
842 if (!S_ISDIR(statbuf.st_mode)) {
846 string session_file = info.filename;
848 session_file += PBD::basename (info.filename);
849 session_file += ".ardour";
851 if (stat (session_file.c_str(), &statbuf) != 0) {
855 return S_ISREG (statbuf.st_mode);
859 ARDOUR_UI::open_session ()
861 /* popup selector window */
863 if (open_session_selector == 0) {
865 /* ardour sessions are folders */
867 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
868 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
869 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
871 FileFilter session_filter;
872 session_filter.add_pattern ("*.ardour");
873 session_filter.set_name (_("Ardour sessions"));
874 open_session_selector->add_filter (session_filter);
875 open_session_selector->set_filter (session_filter);
878 int response = open_session_selector->run();
879 open_session_selector->hide ();
882 case RESPONSE_ACCEPT:
885 open_session_selector->hide();
889 open_session_selector->hide();
890 string session_path = open_session_selector->get_filename();
894 if (session_path.length() > 0) {
895 if (Session::find_session (session_path, path, name, isnew) == 0) {
896 _session_is_new = isnew;
897 load_session (path, name);
904 ARDOUR_UI::session_add_midi_track ()
906 cerr << _("Patience is a virtue.\n");
910 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
915 warning << _("You cannot add a track without a session already loaded.") << endmsg;
921 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
922 error << _("could not create new audio track") << endmsg;
925 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
926 error << _("could not create new audio bus") << endmsg;
931 if (need_control_room_outs) {
937 route->set_stereo_control_outs (control_lr_channels);
938 route->control_outs()->set_stereo_pan (pans, this);
940 #endif /* CONTROLOUTS */
944 MessageDialog msg (*editor,
945 _("There are insufficient JACK ports available\n\
946 to create a new track or bus.\n\
947 You should save Ardour, exit and\n\
948 restart JACK with more ports."));
954 ARDOUR_UI::diskstream_added (DiskStream* ds)
959 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
961 jack_nframes_t _preroll;
964 _preroll = session->convert_to_frames_at (new_position, session->preroll);
966 if (new_position > _preroll) {
967 new_position -= _preroll;
972 session->request_locate (new_position);
977 ARDOUR_UI::transport_goto_start ()
980 session->goto_start();
983 /* force displayed area in editor to start no matter
984 what "follow playhead" setting is.
988 editor->reposition_x_origin (session->current_start_frame());
994 ARDOUR_UI::transport_goto_zero ()
997 session->request_locate (0);
1000 /* force displayed area in editor to start no matter
1001 what "follow playhead" setting is.
1005 editor->reposition_x_origin (0);
1011 ARDOUR_UI::transport_goto_end ()
1014 jack_nframes_t frame = session->current_end_frame();
1015 session->request_locate (frame);
1017 /* force displayed area in editor to start no matter
1018 what "follow playhead" setting is.
1022 editor->reposition_x_origin (frame);
1028 ARDOUR_UI::transport_stop ()
1034 if (session->is_auditioning()) {
1035 session->cancel_audition ();
1039 if (session->get_auto_loop()) {
1040 session->request_auto_loop (false);
1043 session->request_stop ();
1047 ARDOUR_UI::transport_stop_and_forget_capture ()
1050 session->request_stop (true);
1055 ARDOUR_UI::remove_last_capture()
1058 editor->remove_last_capture();
1063 ARDOUR_UI::transport_record ()
1066 switch (session->record_status()) {
1067 case Session::Disabled:
1068 if (session->ntracks() == 0) {
1069 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1070 MessageDialog msg (*editor, txt);
1074 session->maybe_enable_record ();
1076 case Session::Recording:
1077 case Session::Enabled:
1078 session->disable_record (true);
1084 ARDOUR_UI::transport_roll ()
1092 rolling = session->transport_rolling ();
1094 if (session->get_auto_loop()) {
1095 session->request_auto_loop (false);
1096 auto_loop_button.set_active (false);
1097 roll_button.set_active (true);
1098 } else if (session->get_play_range ()) {
1099 session->request_play_range (false);
1100 play_selection_button.set_active (false);
1101 } else if (rolling) {
1102 session->request_locate (session->last_transport_start(), true);
1105 session->request_transport_speed (1.0f);
1109 ARDOUR_UI::transport_loop()
1112 if (session->get_auto_loop()) {
1113 if (session->transport_rolling()) {
1114 Location * looploc = session->locations()->auto_loop_location();
1116 session->request_locate (looploc->start(), true);
1121 session->request_auto_loop (true);
1127 ARDOUR_UI::transport_play_selection ()
1133 if (!session->get_play_range()) {
1134 session->request_stop ();
1137 editor->play_selection ();
1141 ARDOUR_UI::transport_rewind (int option)
1143 float current_transport_speed;
1146 current_transport_speed = session->transport_speed();
1148 if (current_transport_speed >= 0.0f) {
1151 session->request_transport_speed (-1.0f);
1154 session->request_transport_speed (-4.0f);
1157 session->request_transport_speed (-0.5f);
1162 session->request_transport_speed (current_transport_speed * 1.5f);
1168 ARDOUR_UI::transport_forward (int option)
1170 float current_transport_speed;
1173 current_transport_speed = session->transport_speed();
1175 if (current_transport_speed <= 0.0f) {
1178 session->request_transport_speed (1.0f);
1181 session->request_transport_speed (4.0f);
1184 session->request_transport_speed (0.5f);
1189 session->request_transport_speed (current_transport_speed * 1.5f);
1195 ARDOUR_UI::toggle_monitor_enable (guint32 dstream)
1203 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1204 Port *port = ds->io()->input (0);
1205 port->request_monitor_input (!port->monitoring_input());
1210 ARDOUR_UI::toggle_record_enable (guint32 dstream)
1218 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1219 ds->set_record_enabled (!ds->record_enabled(), this);
1224 ARDOUR_UI::queue_transport_change ()
1226 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1230 ARDOUR_UI::map_transport_state ()
1232 float sp = session->transport_speed();
1235 transport_rolling ();
1236 } else if (sp < 0.0f) {
1237 transport_rewinding ();
1238 } else if (sp > 0.0f) {
1239 transport_forwarding ();
1241 transport_stopped ();
1246 ARDOUR_UI::allow_local_only ()
1252 ARDOUR_UI::allow_mmc_only ()
1258 ARDOUR_UI::allow_mmc_and_local ()
1264 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1266 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1267 (int) adj.get_value()].c_str());
1271 ARDOUR_UI::engine_stopped ()
1273 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1274 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1275 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1280 ARDOUR_UI::engine_running ()
1282 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1283 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1284 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1288 ARDOUR_UI::engine_halted ()
1290 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1292 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1293 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1295 update_sample_rate (0);
1297 MessageDialog msg (*editor,
1299 JACK has either been shutdown or it\n\
1300 disconnected Ardour because Ardour\n\
1301 was not fast enough. You can save the\n\
1302 session and/or try to reconnect to JACK ."));
1307 ARDOUR_UI::do_engine_start ()
1313 catch (AudioEngine::PortRegistrationFailure& err) {
1315 error << _("Unable to create all required ports")
1323 error << _("Unable to start the session running")
1333 ARDOUR_UI::start_engine ()
1335 if (do_engine_start () == 0) {
1336 if (session && _session_is_new) {
1337 /* we need to retain initial visual
1338 settings for a new session
1340 session->save_state ("");
1343 /* there is too much going on, in too many threads, for us to
1344 end up with a clean session. So wait 1 second after loading,
1345 and fix it up. its ugly, but until i come across a better
1346 solution, its what we have.
1349 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1356 ARDOUR_UI::update_clocks ()
1358 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1362 ARDOUR_UI::start_clocking ()
1364 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1368 ARDOUR_UI::stop_clocking ()
1370 clock_signal_connection.disconnect ();
1374 ARDOUR_UI::toggle_clocking ()
1377 if (clock_button.get_active()) {
1386 ARDOUR_UI::_blink (void *arg)
1389 ((ARDOUR_UI *) arg)->blink ();
1396 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1400 ARDOUR_UI::start_blinking ()
1402 /* Start the blink signal. Everybody with a blinking widget
1403 uses Blink to drive the widget's state.
1406 if (blink_timeout_tag < 0) {
1408 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1413 ARDOUR_UI::stop_blinking ()
1415 if (blink_timeout_tag >= 0) {
1416 gtk_timeout_remove (blink_timeout_tag);
1417 blink_timeout_tag = -1;
1423 ARDOUR_UI::add_diskstream_to_menu (DiskStream& dstream)
1425 using namespace Gtk;
1426 using namespace Menu_Helpers;
1428 if (dstream.hidden()) {
1432 MenuList& items = diskstream_menu->items();
1433 items.push_back (MenuElem (dstream.name(), bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), (gint32) dstream.id())));
1437 ARDOUR_UI::diskstream_selected (gint32 id)
1439 selected_dstream = id;
1444 ARDOUR_UI::select_diskstream (GdkEventButton *ev)
1446 using namespace Gtk;
1447 using namespace Menu_Helpers;
1453 diskstream_menu = new Menu();
1454 diskstream_menu->set_name ("ArdourContextMenu");
1455 using namespace Gtk;
1456 using namespace Menu_Helpers;
1458 MenuList& items = diskstream_menu->items();
1459 items.push_back (MenuElem (_("No Stream"), (bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), -1))));
1461 session->foreach_diskstream (this, &ARDOUR_UI::add_diskstream_to_menu);
1464 diskstream_menu->popup (ev->button, ev->time);
1466 diskstream_menu->popup (0, 0);
1469 selected_dstream = -1;
1473 delete diskstream_menu;
1475 return selected_dstream;
1479 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1485 if (io.n_inputs() == 0) {
1490 /* XXX we're not handling multiple ports yet. */
1492 const char **connections = io.input(0)->get_connections();
1494 if (connections == 0 || connections[0] == '\0') {
1497 buf = connections[0];
1504 if (io.n_outputs() == 0) {
1509 /* XXX we're not handling multiple ports yet. */
1511 const char **connections = io.output(0)->get_connections();
1513 if (connections == 0 || connections[0] == '\0') {
1516 buf = connections[0];
1524 ARDOUR_UI::snapshot_session ()
1526 ArdourPrompter prompter (true);
1533 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1535 prompter.set_name ("Prompter");
1536 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1537 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1538 prompter.set_prompt (_("Name of New Snapshot"));
1539 prompter.set_initial_text (now);
1541 switch (prompter.run()) {
1542 case RESPONSE_ACCEPT:
1543 prompter.get_result (snapname);
1544 if (snapname.length()){
1545 save_state (snapname);
1555 ARDOUR_UI::save_state (const string & name)
1557 (void) save_state_canfail (name);
1561 ARDOUR_UI::save_state_canfail (string name)
1566 if (name.length() == 0) {
1567 name = session->snap_name();
1570 if ((ret = session->save_state (name)) != 0) {
1574 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1579 ARDOUR_UI::restore_state (string name)
1582 if (name.length() == 0) {
1583 name = session->name();
1585 session->restore_state (name);
1590 ARDOUR_UI::primary_clock_value_changed ()
1593 session->request_locate (primary_clock.current_time ());
1598 ARDOUR_UI::secondary_clock_value_changed ()
1601 session->request_locate (secondary_clock.current_time ());
1606 ARDOUR_UI::rec_enable_button_blink (bool onoff, DiskStream *dstream, Widget *w)
1608 if (session && dstream && dstream->record_enabled()) {
1610 Session::RecordState rs;
1612 rs = session->record_status ();
1615 case Session::Disabled:
1616 case Session::Enabled:
1617 if (w->get_state() != STATE_SELECTED) {
1618 w->set_state (STATE_SELECTED);
1622 case Session::Recording:
1623 if (w->get_state() != STATE_ACTIVE) {
1624 w->set_state (STATE_ACTIVE);
1630 if (w->get_state() != STATE_NORMAL) {
1631 w->set_state (STATE_NORMAL);
1637 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1643 switch (session->record_status()) {
1644 case Session::Enabled:
1646 rec_button.set_state (1);
1648 rec_button.set_state (0);
1652 case Session::Recording:
1653 rec_button.set_state (2);
1657 rec_button.set_state (0);
1663 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1671 ARDOUR_UI::start_keyboard_prefix ()
1673 keyboard->start_prefix();
1677 ARDOUR_UI::save_template ()
1680 ArdourPrompter prompter (true);
1683 prompter.set_name (X_("Prompter"));
1684 prompter.set_prompt (_("Name for mix template:"));
1685 prompter.set_initial_text(session->name() + _("-template"));
1686 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1687 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1689 switch (prompter.run()) {
1690 case RESPONSE_ACCEPT:
1691 prompter.get_result (name);
1693 if (name.length()) {
1694 session->save_template (name);
1704 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1706 m_new_session_dialog->show_all();
1707 m_new_session_dialog->set_transient_for(*editor);
1708 m_new_session_dialog->set_name(predetermined_path);
1710 int response = Gtk::RESPONSE_CANCEL;
1713 response = m_new_session_dialog->run ();
1714 if(response == Gtk::RESPONSE_CANCEL) {
1717 } else if (response == Gtk::RESPONSE_YES) {
1718 /* YES == OPEN, but there's no enum for that */
1719 std::string session_name = m_new_session_dialog->session_name();
1720 std::string session_path = m_new_session_dialog->session_folder();
1721 load_session (session_path, session_name);
1724 } else if (response == Gtk::RESPONSE_OK) {
1725 if (m_new_session_dialog->get_current_page() == 1) {
1727 /* XXX this is a bit of a hack..
1728 i really want the new sesion dialog to return RESPONSE_YES
1729 if we're on page 1 (the load page)
1730 Unfortunately i can't see how atm..
1732 std::string session_name = m_new_session_dialog->session_name();
1733 std::string session_path = m_new_session_dialog->session_folder();
1734 load_session (session_path, session_name);
1738 _session_is_new = true;
1740 std::string session_name = m_new_session_dialog->session_name();
1741 std::string session_path = m_new_session_dialog->session_folder();
1744 XXX This is needed because session constructor wants a
1745 non-existant path. hopefully this will be fixed at some point.
1747 session_path = Glib::build_filename(session_path, session_name);
1749 std::string template_name = m_new_session_dialog->session_template_name();
1751 if (m_new_session_dialog->use_session_template()) {
1753 load_session (session_path, session_name, &template_name);
1759 Session::AutoConnectOption iconnect;
1760 Session::AutoConnectOption oconnect;
1762 if (m_new_session_dialog->create_control_bus()) {
1763 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1768 if (m_new_session_dialog->create_master_bus()) {
1769 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1774 if (m_new_session_dialog->connect_inputs()) {
1775 iconnect = Session::AutoConnectPhysical;
1777 iconnect = Session::AutoConnectOption (0);
1780 /// @todo some minor tweaks.
1782 if (m_new_session_dialog->connect_outs_to_master()) {
1783 oconnect = Session::AutoConnectMaster;
1784 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1785 oconnect = Session::AutoConnectPhysical;
1787 oconnect = Session::AutoConnectOption (0);
1790 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1791 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1793 build_session (session_path,
1801 engine->frame_rate() * 60 * 5);
1806 } while(response == Gtk::RESPONSE_HELP);
1807 m_new_session_dialog->hide_all();
1813 ARDOUR_UI::close_session()
1820 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1822 Session *new_session;
1824 session_loaded = false;
1825 x = unload_session ();
1833 /* if it already exists, we must have write access */
1835 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1836 MessageDialog msg (*editor, _("\
1837 You do not have write access to this session.\n\
1838 This prevents the session from being loaded."));
1844 new_session = new Session (*engine, path, snap_name, mix_template);
1849 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1853 connect_to_session (new_session);
1855 //if (engine->running()) {
1856 //mixer->show_window();
1858 session_loaded = true;
1863 ARDOUR_UI::make_session_clean ()
1866 session->set_clean ();
1875 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1876 uint32_t control_channels,
1877 uint32_t master_channels,
1878 Session::AutoConnectOption input_connect,
1879 Session::AutoConnectOption output_connect,
1882 jack_nframes_t initial_length)
1884 Session *new_session;
1887 session_loaded = false;
1888 x = unload_session ();
1895 _session_is_new = true;
1898 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1899 control_channels, master_channels, nphysin, nphysout, initial_length);
1904 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1908 connect_to_session (new_session);
1910 //if (engine->running()) {
1911 //mixer->show_window();
1913 session_loaded = true;
1921 editor->show_window ();
1925 if (session && mixer) {
1926 // mixer->show_window ();
1935 ARDOUR_UI::show_splash ()
1938 about = new About();
1944 ARDOUR_UI::hide_splash ()
1952 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1956 removed = rep.paths.size();
1959 MessageDialog msgd (*editor,
1960 _("No audio files were ready for cleanup"),
1963 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1964 msgd.set_secondary_text (_("If this seems suprising, \n\
1965 check for any existing snapshots.\n\
1966 These may still include regions that\n\
1967 require some unused files to continue to exist."));
1973 ArdourDialog results (_("ardour: cleanup"), true, false);
1975 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1976 CleanupResultsModelColumns() {
1980 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1981 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1985 CleanupResultsModelColumns results_columns;
1986 Glib::RefPtr<Gtk::ListStore> results_model;
1987 Gtk::TreeView results_display;
1989 results_model = ListStore::create (results_columns);
1990 results_display.set_model (results_model);
1991 results_display.append_column (list_title, results_columns.visible_name);
1993 results_display.set_name ("CleanupResultsList");
1994 results_display.set_headers_visible (true);
1995 results_display.set_headers_clickable (false);
1996 results_display.set_reorderable (false);
1998 Gtk::ScrolledWindow list_scroller;
2001 Gtk::HBox dhbox; // the hbox for the image and text
2002 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
2003 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
2005 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
2007 if (rep.space < 1048576.0f) {
2009 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
2011 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
2015 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
2017 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
2021 dhbox.pack_start (*dimage, true, false, 5);
2022 dhbox.pack_start (txt, true, false, 5);
2024 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
2025 TreeModel::Row row = *(results_model->append());
2026 row[results_columns.visible_name] = *i;
2027 row[results_columns.fullpath] = *i;
2030 list_scroller.add (results_display);
2031 list_scroller.set_size_request (-1, 150);
2032 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2034 dvbox.pack_start (dhbox, true, false, 5);
2035 dvbox.pack_start (list_scroller, true, false, 5);
2036 ddhbox.pack_start (dvbox, true, false, 5);
2038 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2039 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2040 results.set_default_response (RESPONSE_CLOSE);
2041 results.set_position (Gtk::WIN_POS_MOUSE);
2042 results.show_all_children ();
2043 results.set_resizable (false);
2050 ARDOUR_UI::cleanup ()
2053 /* shouldn't happen: menu item is insensitive */
2058 MessageDialog checker (_("Are you sure you want to cleanup?"),
2060 Gtk::MESSAGE_QUESTION,
2061 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2063 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2064 ALL undo/redo information will be lost if you cleanup.\n\
2065 After cleanup, unused audio files will be moved to a \
2066 \"dead sounds\" location."));
2068 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2069 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2070 checker.set_default_response (RESPONSE_CANCEL);
2072 checker.set_name (_("CleanupDialog"));
2073 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2074 checker.set_position (Gtk::WIN_POS_MOUSE);
2076 switch (checker.run()) {
2077 case RESPONSE_ACCEPT:
2083 Session::cleanup_report rep;
2085 editor->prepare_for_cleanup ();
2087 if (session->cleanup_sources (rep)) {
2091 display_cleanup_results (rep,
2094 The following %1 %2 not in use and \n\
2095 have been moved to:\n\
2097 Flushing the wastebasket will \n\
2098 release an additional\n\
2099 %4 %5bytes of disk space.\n"
2104 ARDOUR_UI::flush_trash ()
2107 /* shouldn't happen: menu item is insensitive */
2111 Session::cleanup_report rep;
2113 if (session->cleanup_trash_sources (rep)) {
2117 display_cleanup_results (rep,
2119 _("The following %1 %2 deleted from\n\
2121 releasing %4 %5bytes of disk space"));
2125 ARDOUR_UI::add_route ()
2133 if (add_route_dialog == 0) {
2134 add_route_dialog = new AddRouteDialog;
2135 editor->ensure_float (*add_route_dialog);
2138 if (add_route_dialog->is_visible()) {
2139 /* we're already doing this */
2143 ResponseType r = (ResponseType) add_route_dialog->run ();
2145 add_route_dialog->hide();
2148 case RESPONSE_ACCEPT:
2155 if ((count = add_route_dialog->count()) <= 0) {
2159 uint32_t input_chan = add_route_dialog->channels ();
2160 uint32_t output_chan;
2161 string name_template = add_route_dialog->name_template ();
2162 bool track = add_route_dialog->track ();
2164 Session::AutoConnectOption oac = session->get_output_auto_connect();
2166 if (oac & Session::AutoConnectMaster) {
2167 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2169 output_chan = input_chan;
2172 /* XXX do something with name template */
2176 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2178 session_add_audio_bus (input_chan, output_chan);
2182 while (Main::events_pending()) {
2189 ARDOUR_UI::mixer_settings () const
2194 node = session->instant_xml(X_("Mixer"), session->path());
2196 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2200 node = new XMLNode (X_("Mixer"));
2207 ARDOUR_UI::editor_settings () const
2212 node = session->instant_xml(X_("Editor"), session->path());
2214 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2218 node = new XMLNode (X_("Editor"));
2224 ARDOUR_UI::keyboard_settings () const
2228 node = Config->extra_xml(X_("Keyboard"));
2231 node = new XMLNode (X_("Keyboard"));
2237 ARDOUR_UI::halt_on_xrun_message ()
2239 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2241 MessageDialog msg (*editor,
2242 _("Recording was stopped because your system could not keep up."));
2247 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::Source*>* deletion_list)
2249 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2251 for (list<Source*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2255 delete deletion_list;
2259 ARDOUR_UI::disk_overrun_handler ()
2261 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2263 if (!have_disk_overrun_displayed) {
2264 have_disk_overrun_displayed = true;
2265 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2266 The disk system on your computer\n\
2267 was not able to keep up with Ardour.\n\
2269 Specifically, it failed to write data to disk\n\
2270 quickly enough to keep up with recording.\n"));
2272 have_disk_overrun_displayed = false;
2277 ARDOUR_UI::disk_underrun_handler ()
2279 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2281 if (!have_disk_underrun_displayed) {
2282 have_disk_underrun_displayed = true;
2283 MessageDialog msg (*editor,
2284 (_("The disk system on your computer\n\
2285 was not able to keep up with Ardour.\n\
2287 Specifically, it failed to read data from disk\n\
2288 quickly enough to keep up with playback.\n")));
2290 have_disk_underrun_displayed = false;
2295 ARDOUR_UI::disk_underrun_message_gone ()
2297 have_disk_underrun_displayed = false;
2301 ARDOUR_UI::disk_overrun_message_gone ()
2303 have_disk_underrun_displayed = false;
2307 ARDOUR_UI::pending_state_dialog ()
2309 ArdourDialog dialog ("pending state dialog");
2311 This session appears to have been in\n\
2312 middle of recording when ardour or\n\
2313 the computer was shutdown.\n\
2315 Ardour can recover any captured audio for\n\
2316 you, or it can ignore it. Please decide\n\
2317 what you would like to do.\n"));
2319 dialog.get_vbox()->pack_start (message);
2320 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2321 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2323 dialog.set_position (WIN_POS_CENTER);
2326 switch (dialog.run ()) {
2327 case RESPONSE_ACCEPT:
2335 ARDOUR_UI::disconnect_from_jack ()
2338 if( engine->disconnect_from_jack ()) {
2339 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2343 update_sample_rate (0);
2348 ARDOUR_UI::reconnect_to_jack ()
2351 if (engine->reconnect_to_jack ()) {
2352 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2356 update_sample_rate (0);
2361 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2363 engine->request_buffer_size (nframes);
2364 update_sample_rate (0);
2368 ARDOUR_UI::cmdline_new_session (string path)
2370 if (path[0] != '/') {
2371 char buf[PATH_MAX+1];
2374 getcwd (buf, sizeof (buf));
2381 new_session (false, path);
2383 _will_create_new_session_automatically = false; /* done it */
2384 return FALSE; /* don't call it again */
2388 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2390 Glib::RefPtr<Action> act;
2394 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2397 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2400 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2403 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2406 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2411 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2412 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2413 Config->set_native_file_header_format (hf);
2415 session->reset_native_file_format ();
2422 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2424 Glib::RefPtr<Action> act;
2428 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2431 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2436 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2438 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2439 Config->set_native_file_data_format (sf);
2441 session->reset_native_file_format ();
2448 ARDOUR_UI::use_config ()
2450 Glib::RefPtr<Action> act;
2452 switch (Config->get_native_file_data_format ()) {
2454 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2457 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2462 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2463 ract->set_active ();
2466 switch (Config->get_native_file_header_format ()) {
2468 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2471 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2474 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2477 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2480 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2485 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2486 ract->set_active ();