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 = new NewSessionDialog();
154 _session_is_new = false;
155 big_clock_window = 0;
156 session_selector_window = 0;
157 last_key_press_time = 0;
158 connection_editor = 0;
159 add_route_dialog = 0;
164 open_session_selector = 0;
165 have_configure_timeout = false;
166 have_disk_overrun_displayed = false;
167 have_disk_underrun_displayed = false;
168 _will_create_new_session_automatically = false;
169 session_loaded = false;
170 last_speed_displayed = -1.0f;
172 last_configure_time.tv_sec = 0;
173 last_configure_time.tv_usec = 0;
175 shuttle_grabbed = false;
177 shuttle_max_speed = 8.0f;
179 set_shuttle_units (Percentage);
180 set_shuttle_behaviour (Sprung);
182 shuttle_style_menu = 0;
183 shuttle_unit_menu = 0;
185 gettimeofday (&last_peak_grab, 0);
186 gettimeofday (&last_shuttle_request, 0);
188 ARDOUR::DiskStream::CannotRecordNoInput.connect (mem_fun(*this, &ARDOUR_UI::cannot_record_no_input));
189 ARDOUR::DiskStream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
190 ARDOUR::DiskStream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
191 ARDOUR::DiskStream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
193 /* handle pending state with a dialog */
195 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
197 /* have to wait for AudioEngine and Configuration before proceeding */
201 ARDOUR_UI::cannot_record_no_input (DiskStream* ds)
203 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::cannot_record_no_input), ds));
205 string msg = string_compose (_("\
206 You cannot record-enable\n\
208 because it has no input connections.\n\
209 You would be wasting space recording silence."),
212 MessageDialog message (*editor, msg);
217 ARDOUR_UI::set_engine (AudioEngine& e)
221 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
222 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
223 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
224 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
228 keyboard = new Keyboard;
232 meter_path = ARDOUR::find_data_file("v_meter_strip.xpm", "pixmaps");
233 if (meter_path.empty()) {
234 error << _("no vertical meter strip image found") << endmsg;
237 FastMeter::set_vertical_xpm (meter_path);
239 meter_path = ARDOUR::find_data_file("h_meter_strip.xpm", "pixmaps");
240 if (meter_path.empty()) {
241 error << _("no horizontal meter strip image found") << endmsg;
244 FastMeter::set_horizontal_xpm (meter_path);
246 if (setup_windows ()) {
247 throw failed_constructor ();
250 if (GTK_ARDOUR::show_key_actions) {
251 vector<string> names;
252 vector<string> paths;
254 vector<AccelKey> bindings;
256 ActionManager::get_all_actions (names, paths, keys, bindings);
258 vector<string>::iterator n;
259 vector<string>::iterator k;
260 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
261 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
267 /* start with timecode, metering enabled
270 blink_timeout_tag = -1;
272 /* the global configuration object is now valid */
276 /* this being a GUI and all, we want peakfiles */
278 FileSource::set_build_peakfiles (true);
279 FileSource::set_build_missing_peakfiles (true);
281 if (Source::start_peak_thread ()) {
282 throw failed_constructor();
285 /* start the time-of-day-clock */
287 update_wall_clock ();
288 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
290 update_disk_space ();
292 update_sample_rate (engine->frame_rate());
294 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
295 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
298 ARDOUR_UI::~ARDOUR_UI ()
300 save_ardour_state ();
314 if (add_route_dialog) {
315 delete add_route_dialog;
318 Source::stop_peak_thread ();
322 ARDOUR_UI::configure_timeout ()
327 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
328 /* no configure events yet */
332 gettimeofday (&now, 0);
333 timersub (&now, &last_configure_time, &diff);
335 /* force a gap of 0.5 seconds since the last configure event
338 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
341 have_configure_timeout = false;
342 save_ardour_state ();
348 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
350 if (have_configure_timeout) {
351 gettimeofday (&last_configure_time, 0);
353 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
354 have_configure_timeout = true;
361 ARDOUR_UI::save_ardour_state ()
363 if (!keyboard || !mixer || !editor) {
367 /* XXX this is all a bit dubious. add_extra_xml() uses
368 a different lifetime model from add_instant_xml().
371 XMLNode* node = new XMLNode (keyboard->get_state());
372 Config->add_extra_xml (*node);
373 Config->save_state();
375 XMLNode& enode (static_cast<Stateful*>(editor)->get_state());
376 XMLNode& mnode (mixer->get_state());
379 session->add_instant_xml(enode, session->path());
380 session->add_instant_xml(mnode, session->path());
382 Config->add_instant_xml(enode, get_user_ardour_path());
383 Config->add_instant_xml(mnode, get_user_ardour_path());
388 AccelMap::save ("ardour.saved_bindings");
392 ARDOUR_UI::startup ()
394 /* Once the UI is up and running, start the audio engine. Doing
395 this before the UI is up and running can cause problems
396 when not running with SCHED_FIFO, because the amount of
397 CPU and disk work needed to get the UI started can interfere
398 with the scheduling of the audio thread.
401 Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
407 if (session && session->dirty()) {
408 switch (ask_about_saving_session(_("quit"))) {
413 /* use the default name */
414 if (save_state_canfail ("")) {
415 /* failed - don't quit */
416 MessageDialog msg (*editor,
418 Ardour was unable to save your session.\n\n\
419 If you still wish to quit, please use the\n\n\
420 \"Just quit\" option."));
434 ARDOUR_UI::ask_about_saving_session (const string & what)
436 ArdourDialog window (_("ardour: save session?"));
437 Gtk::HBox dhbox; // the hbox for the image and text
438 Gtk::Label prompt_label;
439 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
443 msg = string_compose(_("Don't %1"), what);
444 window.add_button (msg, RESPONSE_REJECT);
445 msg = string_compose(_("Just %1"), what);
446 window.add_button (msg, RESPONSE_APPLY);
447 msg = string_compose(_("Save and %1"), what);
448 window.add_button (msg, RESPONSE_ACCEPT);
450 window.set_default_response (RESPONSE_ACCEPT);
452 Gtk::Button noquit_button (msg);
453 noquit_button.set_name ("EditorGTKButton");
458 if (session->snap_name() == session->name()) {
461 type = _("snapshot");
463 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?"),
464 type, session->snap_name());
466 prompt_label.set_text (prompt);
467 prompt_label.set_name (X_("PrompterLabel"));
468 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
470 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
472 dhbox.set_homogeneous (false);
473 dhbox.pack_start (*dimage, false, false, 5);
474 dhbox.pack_start (prompt_label, true, false, 5);
475 window.get_vbox()->pack_start (dhbox);
477 window.set_name (_("Prompter"));
478 window.set_position (Gtk::WIN_POS_MOUSE);
479 window.set_modal (true);
480 window.set_resizable (false);
483 save_the_session = 0;
485 editor->ensure_float (window);
487 ResponseType r = (ResponseType) window.run();
492 case RESPONSE_ACCEPT: // save and get out of here
494 case RESPONSE_APPLY: // get out of here
504 ARDOUR_UI::every_second ()
507 update_buffer_load ();
508 update_disk_space ();
513 ARDOUR_UI::every_point_one_seconds ()
515 update_speed_display ();
516 RapidScreenUpdate(); /* EMIT_SIGNAL */
521 ARDOUR_UI::every_point_zero_one_seconds ()
523 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
528 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
532 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
534 if (!engine->connected()) {
536 snprintf (buf, sizeof (buf), _("disconnected"));
540 jack_nframes_t rate = engine->frame_rate();
542 if (fmod (rate, 1000.0) != 0.0) {
543 snprintf (buf, sizeof (buf), _("SR: %.1f kHz / %4.1f msecs"),
544 (float) rate/1000.0f,
545 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
547 snprintf (buf, sizeof (buf), _("SR: %u kHz / %4.1f msecs"),
549 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
553 sample_rate_label.set_text (buf);
557 ARDOUR_UI::update_cpu_load ()
560 snprintf (buf, sizeof (buf), _("DSP Load: %.1f%%"), engine->get_cpu_load());
561 cpu_load_label.set_text (buf);
565 ARDOUR_UI::update_buffer_load ()
570 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
571 session->playback_load(), session->capture_load());
572 buffer_load_label.set_text (buf);
574 buffer_load_label.set_text ("");
579 ARDOUR_UI::count_recenabled_diskstreams (DiskStream& ds)
581 if (ds.record_enabled()) {
582 rec_enabled_diskstreams++;
587 ARDOUR_UI::update_disk_space()
593 jack_nframes_t frames = session->available_capture_duration();
596 if (frames == max_frames) {
597 strcpy (buf, _("space: 24hrs+"));
602 jack_nframes_t fr = session->frame_rate();
604 if (session->actively_recording()){
606 rec_enabled_diskstreams = 0;
607 session->foreach_diskstream (this, &ARDOUR_UI::count_recenabled_diskstreams);
609 if (rec_enabled_diskstreams) {
610 frames /= rec_enabled_diskstreams;
615 /* hmmm. shall we divide by the route count? or the diskstream count?
616 or what? for now, do nothing ...
621 hrs = frames / (fr * 3600);
622 frames -= hrs * fr * 3600;
623 mins = frames / (fr * 60);
624 frames -= mins * fr * 60;
627 snprintf (buf, sizeof(buf), _("space: %02dh:%02dm:%02ds"), hrs, mins, secs);
630 disk_space_label.set_text (buf);
634 ARDOUR_UI::update_wall_clock ()
641 tm_now = localtime (&now);
643 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
644 wall_clock_label.set_text (buf);
649 ARDOUR_UI::control_methods_adjusted ()
654 which_method = (int) online_control_button->adjustment.get_value();
655 switch (which_method) {
657 allow_mmc_and_local ();
666 fatal << _("programming error: impossible control method") << endmsg;
672 ARDOUR_UI::mmc_device_id_adjusted ()
677 int dev_id = (int) mmc_id_button->adjustment.get_value();
678 mmc->set_device_id (dev_id);
684 ARDOUR_UI::session_menu (GdkEventButton *ev)
686 session_popup_menu->popup (0, 0);
691 ARDOUR_UI::redisplay_recent_sessions ()
693 vector<string *> *sessions;
694 vector<string *>::iterator i;
695 RecentSessionsSorter cmp;
697 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
698 recent_session_model->clear ();
701 ARDOUR::read_recent_sessions (rs);
704 recent_session_display.set_model (recent_session_model);
708 /* sort them alphabetically */
709 sort (rs.begin(), rs.end(), cmp);
710 sessions = new vector<string*>;
712 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
713 sessions->push_back (new string ((*i).second));
716 for (i = sessions->begin(); i != sessions->end(); ++i) {
718 vector<string*>* states;
719 vector<const gchar*> item;
720 string fullpath = *(*i);
722 /* remove any trailing / */
724 if (fullpath[fullpath.length()-1] == '/') {
725 fullpath = fullpath.substr (0, fullpath.length()-1);
728 /* now get available states for this session */
730 if ((states = Session::possible_states (fullpath)) == 0) {
735 TreeModel::Row row = *(recent_session_model->append());
737 row[recent_session_columns.visible_name] = PBD::basename (fullpath);
738 row[recent_session_columns.fullpath] = fullpath;
740 if (states->size() > 1) {
742 /* add the children */
744 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
746 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
748 child_row[recent_session_columns.visible_name] = **i2;
749 child_row[recent_session_columns.fullpath] = fullpath;
758 recent_session_display.set_model (recent_session_model);
763 ARDOUR_UI::build_session_selector ()
765 session_selector_window = new ArdourDialog ("session selector");
767 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
769 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
770 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
771 session_selector_window->set_default_response (RESPONSE_ACCEPT);
772 recent_session_model = TreeStore::create (recent_session_columns);
773 recent_session_display.set_model (recent_session_model);
774 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
775 recent_session_display.set_headers_visible (false);
776 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
778 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
780 scroller->add (recent_session_display);
781 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
783 session_selector_window->set_name ("SessionSelectorWindow");
784 session_selector_window->set_size_request (200, 400);
785 session_selector_window->get_vbox()->pack_start (*scroller);
786 session_selector_window->show_all_children();
790 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
792 session_selector_window->response (RESPONSE_ACCEPT);
796 ARDOUR_UI::open_recent_session ()
798 /* popup selector window */
800 if (session_selector_window == 0) {
801 build_session_selector ();
804 redisplay_recent_sessions ();
806 ResponseType r = (ResponseType) session_selector_window->run ();
808 session_selector_window->hide();
811 case RESPONSE_ACCEPT:
817 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
819 if (i == recent_session_model->children().end()) {
823 Glib::ustring path = (*i)[recent_session_columns.fullpath];
824 Glib::ustring state = (*i)[recent_session_columns.visible_name];
826 _session_is_new = false;
828 load_session (path, state);
832 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
836 if (stat (info.filename.c_str(), &statbuf) != 0) {
840 if (!S_ISDIR(statbuf.st_mode)) {
844 string session_file = info.filename;
846 session_file += PBD::basename (info.filename);
847 session_file += ".ardour";
849 if (stat (session_file.c_str(), &statbuf) != 0) {
853 return S_ISREG (statbuf.st_mode);
857 ARDOUR_UI::open_session ()
859 /* popup selector window */
861 if (open_session_selector == 0) {
863 /* ardour sessions are folders */
865 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
866 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
867 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
869 FileFilter session_filter;
870 session_filter.add_pattern ("*.ardour");
871 session_filter.set_name (_("Ardour sessions"));
872 open_session_selector->add_filter (session_filter);
873 open_session_selector->set_filter (session_filter);
876 int response = open_session_selector->run();
877 open_session_selector->hide ();
880 case RESPONSE_ACCEPT:
883 open_session_selector->hide();
887 open_session_selector->hide();
888 string session_path = open_session_selector->get_filename();
892 if (session_path.length() > 0) {
893 if (Session::find_session (session_path, path, name, isnew) == 0) {
894 _session_is_new = isnew;
895 load_session (path, name);
902 ARDOUR_UI::session_add_midi_track ()
904 cerr << _("Patience is a virtue.\n");
908 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
913 warning << _("You cannot add a track without a session already loaded.") << endmsg;
919 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
920 error << _("could not create new audio track") << endmsg;
923 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
924 error << _("could not create new audio bus") << endmsg;
929 if (need_control_room_outs) {
935 route->set_stereo_control_outs (control_lr_channels);
936 route->control_outs()->set_stereo_pan (pans, this);
938 #endif /* CONTROLOUTS */
942 MessageDialog msg (*editor,
943 _("There are insufficient JACK ports available\n\
944 to create a new track or bus.\n\
945 You should save Ardour, exit and\n\
946 restart JACK with more ports."));
952 ARDOUR_UI::diskstream_added (DiskStream* ds)
957 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
959 jack_nframes_t _preroll;
962 _preroll = session->convert_to_frames_at (new_position, session->preroll);
964 if (new_position > _preroll) {
965 new_position -= _preroll;
970 session->request_locate (new_position);
975 ARDOUR_UI::transport_goto_start ()
978 session->goto_start();
981 /* force displayed area in editor to start no matter
982 what "follow playhead" setting is.
986 editor->reposition_x_origin (session->current_start_frame());
992 ARDOUR_UI::transport_goto_zero ()
995 session->request_locate (0);
998 /* force displayed area in editor to start no matter
999 what "follow playhead" setting is.
1003 editor->reposition_x_origin (0);
1009 ARDOUR_UI::transport_goto_end ()
1012 jack_nframes_t frame = session->current_end_frame();
1013 session->request_locate (frame);
1015 /* force displayed area in editor to start no matter
1016 what "follow playhead" setting is.
1020 editor->reposition_x_origin (frame);
1026 ARDOUR_UI::transport_stop ()
1032 if (session->is_auditioning()) {
1033 session->cancel_audition ();
1037 if (session->get_auto_loop()) {
1038 session->request_auto_loop (false);
1041 session->request_stop ();
1045 ARDOUR_UI::transport_stop_and_forget_capture ()
1048 session->request_stop (true);
1053 ARDOUR_UI::remove_last_capture()
1056 editor->remove_last_capture();
1061 ARDOUR_UI::transport_record ()
1064 switch (session->record_status()) {
1065 case Session::Disabled:
1066 if (session->ntracks() == 0) {
1067 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1068 MessageDialog msg (*editor, txt);
1072 session->maybe_enable_record ();
1074 case Session::Recording:
1075 case Session::Enabled:
1076 session->disable_record (true);
1082 ARDOUR_UI::transport_roll ()
1090 rolling = session->transport_rolling ();
1092 if (session->get_auto_loop()) {
1093 session->request_auto_loop (false);
1094 auto_loop_button.set_active (false);
1095 roll_button.set_active (true);
1096 } else if (session->get_play_range ()) {
1097 session->request_play_range (false);
1098 play_selection_button.set_active (false);
1099 } else if (rolling) {
1100 session->request_locate (session->last_transport_start(), true);
1103 session->request_transport_speed (1.0f);
1107 ARDOUR_UI::transport_loop()
1110 if (session->get_auto_loop()) {
1111 if (session->transport_rolling()) {
1112 Location * looploc = session->locations()->auto_loop_location();
1114 session->request_locate (looploc->start(), true);
1119 session->request_auto_loop (true);
1125 ARDOUR_UI::transport_play_selection ()
1131 if (!session->get_play_range()) {
1132 session->request_stop ();
1135 editor->play_selection ();
1139 ARDOUR_UI::transport_rewind (int option)
1141 float current_transport_speed;
1144 current_transport_speed = session->transport_speed();
1146 if (current_transport_speed >= 0.0f) {
1149 session->request_transport_speed (-1.0f);
1152 session->request_transport_speed (-4.0f);
1155 session->request_transport_speed (-0.5f);
1160 session->request_transport_speed (current_transport_speed * 1.5f);
1166 ARDOUR_UI::transport_forward (int option)
1168 float current_transport_speed;
1171 current_transport_speed = session->transport_speed();
1173 if (current_transport_speed <= 0.0f) {
1176 session->request_transport_speed (1.0f);
1179 session->request_transport_speed (4.0f);
1182 session->request_transport_speed (0.5f);
1187 session->request_transport_speed (current_transport_speed * 1.5f);
1193 ARDOUR_UI::toggle_monitor_enable (guint32 dstream)
1201 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1202 Port *port = ds->io()->input (0);
1203 port->request_monitor_input (!port->monitoring_input());
1208 ARDOUR_UI::toggle_record_enable (guint32 dstream)
1216 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1217 ds->set_record_enabled (!ds->record_enabled(), this);
1222 ARDOUR_UI::queue_transport_change ()
1224 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1228 ARDOUR_UI::map_transport_state ()
1230 float sp = session->transport_speed();
1233 transport_rolling ();
1234 } else if (sp < 0.0f) {
1235 transport_rewinding ();
1236 } else if (sp > 0.0f) {
1237 transport_forwarding ();
1239 transport_stopped ();
1244 ARDOUR_UI::allow_local_only ()
1250 ARDOUR_UI::allow_mmc_only ()
1256 ARDOUR_UI::allow_mmc_and_local ()
1262 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1264 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1265 (int) adj.get_value()].c_str());
1269 ARDOUR_UI::engine_stopped ()
1271 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1272 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1273 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1278 ARDOUR_UI::engine_running ()
1280 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1281 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1282 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1286 ARDOUR_UI::engine_halted ()
1288 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1290 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1291 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1293 update_sample_rate (0);
1295 MessageDialog msg (*editor,
1297 JACK has either been shutdown or it\n\
1298 disconnected Ardour because Ardour\n\
1299 was not fast enough. You can save the\n\
1300 session and/or try to reconnect to JACK ."));
1305 ARDOUR_UI::do_engine_start ()
1311 catch (AudioEngine::PortRegistrationFailure& err) {
1313 error << _("Unable to create all required ports")
1321 error << _("Unable to start the session running")
1331 ARDOUR_UI::start_engine ()
1333 if (do_engine_start () == 0) {
1334 if (session && _session_is_new) {
1335 /* we need to retain initial visual
1336 settings for a new session
1338 session->save_state ("");
1341 /* there is too much going on, in too many threads, for us to
1342 end up with a clean session. So wait 1 second after loading,
1343 and fix it up. its ugly, but until i come across a better
1344 solution, its what we have.
1347 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1354 ARDOUR_UI::update_clocks ()
1356 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1360 ARDOUR_UI::start_clocking ()
1362 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1366 ARDOUR_UI::stop_clocking ()
1368 clock_signal_connection.disconnect ();
1372 ARDOUR_UI::toggle_clocking ()
1375 if (clock_button.get_active()) {
1384 ARDOUR_UI::_blink (void *arg)
1387 ((ARDOUR_UI *) arg)->blink ();
1394 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1398 ARDOUR_UI::start_blinking ()
1400 /* Start the blink signal. Everybody with a blinking widget
1401 uses Blink to drive the widget's state.
1404 if (blink_timeout_tag < 0) {
1406 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1411 ARDOUR_UI::stop_blinking ()
1413 if (blink_timeout_tag >= 0) {
1414 gtk_timeout_remove (blink_timeout_tag);
1415 blink_timeout_tag = -1;
1421 ARDOUR_UI::add_diskstream_to_menu (DiskStream& dstream)
1423 using namespace Gtk;
1424 using namespace Menu_Helpers;
1426 if (dstream.hidden()) {
1430 MenuList& items = diskstream_menu->items();
1431 items.push_back (MenuElem (dstream.name(), bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), (gint32) dstream.id())));
1435 ARDOUR_UI::diskstream_selected (gint32 id)
1437 selected_dstream = id;
1442 ARDOUR_UI::select_diskstream (GdkEventButton *ev)
1444 using namespace Gtk;
1445 using namespace Menu_Helpers;
1451 diskstream_menu = new Menu();
1452 diskstream_menu->set_name ("ArdourContextMenu");
1453 using namespace Gtk;
1454 using namespace Menu_Helpers;
1456 MenuList& items = diskstream_menu->items();
1457 items.push_back (MenuElem (_("No Stream"), (bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), -1))));
1459 session->foreach_diskstream (this, &ARDOUR_UI::add_diskstream_to_menu);
1462 diskstream_menu->popup (ev->button, ev->time);
1464 diskstream_menu->popup (0, 0);
1467 selected_dstream = -1;
1471 delete diskstream_menu;
1473 return selected_dstream;
1477 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1483 if (io.n_inputs() == 0) {
1488 /* XXX we're not handling multiple ports yet. */
1490 const char **connections = io.input(0)->get_connections();
1492 if (connections == 0 || connections[0] == '\0') {
1495 buf = connections[0];
1502 if (io.n_outputs() == 0) {
1507 /* XXX we're not handling multiple ports yet. */
1509 const char **connections = io.output(0)->get_connections();
1511 if (connections == 0 || connections[0] == '\0') {
1514 buf = connections[0];
1522 ARDOUR_UI::snapshot_session ()
1524 ArdourPrompter prompter (true);
1531 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1533 prompter.set_name ("Prompter");
1534 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1535 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1536 prompter.set_prompt (_("Name of New Snapshot"));
1537 prompter.set_initial_text (now);
1539 switch (prompter.run()) {
1540 case RESPONSE_ACCEPT:
1541 prompter.get_result (snapname);
1542 if (snapname.length()){
1543 save_state (snapname);
1553 ARDOUR_UI::save_state (const string & name)
1555 (void) save_state_canfail (name);
1559 ARDOUR_UI::save_state_canfail (string name)
1564 if (name.length() == 0) {
1565 name = session->snap_name();
1568 if ((ret = session->save_state (name)) != 0) {
1572 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1577 ARDOUR_UI::restore_state (string name)
1580 if (name.length() == 0) {
1581 name = session->name();
1583 session->restore_state (name);
1588 ARDOUR_UI::primary_clock_value_changed ()
1591 session->request_locate (primary_clock.current_time ());
1596 ARDOUR_UI::secondary_clock_value_changed ()
1599 session->request_locate (secondary_clock.current_time ());
1604 ARDOUR_UI::rec_enable_button_blink (bool onoff, DiskStream *dstream, Widget *w)
1606 if (session && dstream && dstream->record_enabled()) {
1608 Session::RecordState rs;
1610 rs = session->record_status ();
1613 case Session::Disabled:
1614 case Session::Enabled:
1615 if (w->get_state() != STATE_SELECTED) {
1616 w->set_state (STATE_SELECTED);
1620 case Session::Recording:
1621 if (w->get_state() != STATE_ACTIVE) {
1622 w->set_state (STATE_ACTIVE);
1628 if (w->get_state() != STATE_NORMAL) {
1629 w->set_state (STATE_NORMAL);
1635 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1641 switch (session->record_status()) {
1642 case Session::Enabled:
1644 rec_button.set_state (1);
1646 rec_button.set_state (0);
1650 case Session::Recording:
1651 rec_button.set_state (2);
1655 rec_button.set_state (0);
1661 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1669 ARDOUR_UI::start_keyboard_prefix ()
1671 keyboard->start_prefix();
1675 ARDOUR_UI::save_template ()
1678 ArdourPrompter prompter (true);
1681 prompter.set_name (X_("Prompter"));
1682 prompter.set_prompt (_("Name for mix template:"));
1683 prompter.set_initial_text(session->name() + _("-template"));
1684 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1685 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1687 switch (prompter.run()) {
1688 case RESPONSE_ACCEPT:
1689 prompter.get_result (name);
1691 if (name.length()) {
1692 session->save_template (name);
1702 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1704 m_new_session_dialog->show();
1705 m_new_session_dialog->set_modal(true);
1706 m_new_session_dialog->set_name(predetermined_path);
1707 m_new_session_dialog->reset_recent();
1709 int response = Gtk::RESPONSE_CANCEL;
1712 response = m_new_session_dialog->run ();
1713 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1717 } else if (response == Gtk::RESPONSE_NONE) {
1718 /* Clear was pressed */
1719 m_new_session_dialog->reset();
1721 } else if (response == Gtk::RESPONSE_YES) {
1722 /* YES == OPEN, but there's no enum for that */
1723 std::string session_name = m_new_session_dialog->session_name();
1724 std::string session_path = m_new_session_dialog->session_folder();
1725 load_session (session_path, session_name);
1728 } else if (response == Gtk::RESPONSE_OK) {
1729 if (m_new_session_dialog->get_current_page() == 1) {
1731 /* XXX this is a bit of a hack..
1732 i really want the new sesion dialog to return RESPONSE_YES
1733 if we're on page 1 (the load page)
1734 Unfortunately i can't see how atm..
1736 std::string session_name = m_new_session_dialog->session_name();
1737 std::string session_path = m_new_session_dialog->session_folder();
1738 load_session (session_path, session_name);
1742 _session_is_new = true;
1744 std::string session_name = m_new_session_dialog->session_name();
1745 std::string session_path = m_new_session_dialog->session_folder();
1748 //XXX This is needed because session constructor wants a
1749 //non-existant path. hopefully this will be fixed at some point.
1751 session_path = Glib::build_filename(session_path, session_name);
1753 std::string template_name = m_new_session_dialog->session_template_name();
1755 if (m_new_session_dialog->use_session_template()) {
1757 load_session (session_path, session_name, &template_name);
1763 Session::AutoConnectOption iconnect;
1764 Session::AutoConnectOption oconnect;
1766 if (m_new_session_dialog->create_control_bus()) {
1767 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1772 if (m_new_session_dialog->create_master_bus()) {
1773 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1778 if (m_new_session_dialog->connect_inputs()) {
1779 iconnect = Session::AutoConnectPhysical;
1781 iconnect = Session::AutoConnectOption (0);
1784 /// @todo some minor tweaks.
1786 if (m_new_session_dialog->connect_outs_to_master()) {
1787 oconnect = Session::AutoConnectMaster;
1788 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1789 oconnect = Session::AutoConnectPhysical;
1791 oconnect = Session::AutoConnectOption (0);
1794 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1795 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1797 build_session (session_path,
1805 engine->frame_rate() * 60 * 5);
1810 } while (response == Gtk::RESPONSE_NONE);
1811 m_new_session_dialog->hide();
1817 ARDOUR_UI::close_session()
1824 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1826 Session *new_session;
1828 session_loaded = false;
1829 x = unload_session ();
1837 /* if it already exists, we must have write access */
1839 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1840 MessageDialog msg (*editor, _("\
1841 You do not have write access to this session.\n\
1842 This prevents the session from being loaded."));
1848 new_session = new Session (*engine, path, snap_name, mix_template);
1853 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1857 connect_to_session (new_session);
1859 //if (engine->running()) {
1860 //mixer->show_window();
1862 session_loaded = true;
1867 ARDOUR_UI::make_session_clean ()
1870 session->set_clean ();
1879 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1880 uint32_t control_channels,
1881 uint32_t master_channels,
1882 Session::AutoConnectOption input_connect,
1883 Session::AutoConnectOption output_connect,
1886 jack_nframes_t initial_length)
1888 Session *new_session;
1891 session_loaded = false;
1892 x = unload_session ();
1899 _session_is_new = true;
1902 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1903 control_channels, master_channels, nphysin, nphysout, initial_length);
1908 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1912 connect_to_session (new_session);
1914 //if (engine->running()) {
1915 //mixer->show_window();
1917 session_loaded = true;
1925 editor->show_window ();
1929 if (session && mixer) {
1930 // mixer->show_window ();
1939 ARDOUR_UI::show_splash ()
1942 about = new About();
1948 ARDOUR_UI::hide_splash ()
1956 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1960 removed = rep.paths.size();
1963 MessageDialog msgd (*editor,
1964 _("No audio files were ready for cleanup"),
1967 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1968 msgd.set_secondary_text (_("If this seems suprising, \n\
1969 check for any existing snapshots.\n\
1970 These may still include regions that\n\
1971 require some unused files to continue to exist."));
1977 ArdourDialog results (_("ardour: cleanup"), true, false);
1979 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1980 CleanupResultsModelColumns() {
1984 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1985 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1989 CleanupResultsModelColumns results_columns;
1990 Glib::RefPtr<Gtk::ListStore> results_model;
1991 Gtk::TreeView results_display;
1993 results_model = ListStore::create (results_columns);
1994 results_display.set_model (results_model);
1995 results_display.append_column (list_title, results_columns.visible_name);
1997 results_display.set_name ("CleanupResultsList");
1998 results_display.set_headers_visible (true);
1999 results_display.set_headers_clickable (false);
2000 results_display.set_reorderable (false);
2002 Gtk::ScrolledWindow list_scroller;
2005 Gtk::HBox dhbox; // the hbox for the image and text
2006 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
2007 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
2009 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
2011 if (rep.space < 1048576.0f) {
2013 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
2015 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
2019 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
2021 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
2025 dhbox.pack_start (*dimage, true, false, 5);
2026 dhbox.pack_start (txt, true, false, 5);
2028 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
2029 TreeModel::Row row = *(results_model->append());
2030 row[results_columns.visible_name] = *i;
2031 row[results_columns.fullpath] = *i;
2034 list_scroller.add (results_display);
2035 list_scroller.set_size_request (-1, 150);
2036 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2038 dvbox.pack_start (dhbox, true, false, 5);
2039 dvbox.pack_start (list_scroller, true, false, 5);
2040 ddhbox.pack_start (dvbox, true, false, 5);
2042 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2043 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2044 results.set_default_response (RESPONSE_CLOSE);
2045 results.set_position (Gtk::WIN_POS_MOUSE);
2046 results.show_all_children ();
2047 results.set_resizable (false);
2054 ARDOUR_UI::cleanup ()
2057 /* shouldn't happen: menu item is insensitive */
2062 MessageDialog checker (_("Are you sure you want to cleanup?"),
2064 Gtk::MESSAGE_QUESTION,
2065 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2067 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2068 ALL undo/redo information will be lost if you cleanup.\n\
2069 After cleanup, unused audio files will be moved to a \
2070 \"dead sounds\" location."));
2072 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2073 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2074 checker.set_default_response (RESPONSE_CANCEL);
2076 checker.set_name (_("CleanupDialog"));
2077 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2078 checker.set_position (Gtk::WIN_POS_MOUSE);
2080 switch (checker.run()) {
2081 case RESPONSE_ACCEPT:
2087 Session::cleanup_report rep;
2089 editor->prepare_for_cleanup ();
2091 if (session->cleanup_sources (rep)) {
2095 display_cleanup_results (rep,
2098 The following %1 %2 not in use and \n\
2099 have been moved to:\n\
2101 Flushing the wastebasket will \n\
2102 release an additional\n\
2103 %4 %5bytes of disk space.\n"
2108 ARDOUR_UI::flush_trash ()
2111 /* shouldn't happen: menu item is insensitive */
2115 Session::cleanup_report rep;
2117 if (session->cleanup_trash_sources (rep)) {
2121 display_cleanup_results (rep,
2123 _("The following %1 %2 deleted from\n\
2125 releasing %4 %5bytes of disk space"));
2129 ARDOUR_UI::add_route ()
2137 if (add_route_dialog == 0) {
2138 add_route_dialog = new AddRouteDialog;
2139 editor->ensure_float (*add_route_dialog);
2142 if (add_route_dialog->is_visible()) {
2143 /* we're already doing this */
2147 ResponseType r = (ResponseType) add_route_dialog->run ();
2149 add_route_dialog->hide();
2152 case RESPONSE_ACCEPT:
2159 if ((count = add_route_dialog->count()) <= 0) {
2163 uint32_t input_chan = add_route_dialog->channels ();
2164 uint32_t output_chan;
2165 string name_template = add_route_dialog->name_template ();
2166 bool track = add_route_dialog->track ();
2168 Session::AutoConnectOption oac = session->get_output_auto_connect();
2170 if (oac & Session::AutoConnectMaster) {
2171 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2173 output_chan = input_chan;
2176 /* XXX do something with name template */
2180 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2182 session_add_audio_bus (input_chan, output_chan);
2186 while (Main::events_pending()) {
2193 ARDOUR_UI::mixer_settings () const
2198 node = session->instant_xml(X_("Mixer"), session->path());
2200 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2204 node = new XMLNode (X_("Mixer"));
2211 ARDOUR_UI::editor_settings () const
2216 node = session->instant_xml(X_("Editor"), session->path());
2218 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2222 node = new XMLNode (X_("Editor"));
2228 ARDOUR_UI::keyboard_settings () const
2232 node = Config->extra_xml(X_("Keyboard"));
2235 node = new XMLNode (X_("Keyboard"));
2241 ARDOUR_UI::halt_on_xrun_message ()
2243 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2245 MessageDialog msg (*editor,
2246 _("Recording was stopped because your system could not keep up."));
2251 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::Source*>* deletion_list)
2253 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2255 for (list<Source*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2259 delete deletion_list;
2263 ARDOUR_UI::disk_overrun_handler ()
2265 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2267 if (!have_disk_overrun_displayed) {
2268 have_disk_overrun_displayed = true;
2269 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2270 The disk system on your computer\n\
2271 was not able to keep up with Ardour.\n\
2273 Specifically, it failed to write data to disk\n\
2274 quickly enough to keep up with recording.\n"));
2276 have_disk_overrun_displayed = false;
2281 ARDOUR_UI::disk_underrun_handler ()
2283 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2285 if (!have_disk_underrun_displayed) {
2286 have_disk_underrun_displayed = true;
2287 MessageDialog msg (*editor,
2288 (_("The disk system on your computer\n\
2289 was not able to keep up with Ardour.\n\
2291 Specifically, it failed to read data from disk\n\
2292 quickly enough to keep up with playback.\n")));
2294 have_disk_underrun_displayed = false;
2299 ARDOUR_UI::disk_underrun_message_gone ()
2301 have_disk_underrun_displayed = false;
2305 ARDOUR_UI::disk_overrun_message_gone ()
2307 have_disk_underrun_displayed = false;
2311 ARDOUR_UI::pending_state_dialog ()
2313 ArdourDialog dialog ("pending state dialog");
2315 This session appears to have been in\n\
2316 middle of recording when ardour or\n\
2317 the computer was shutdown.\n\
2319 Ardour can recover any captured audio for\n\
2320 you, or it can ignore it. Please decide\n\
2321 what you would like to do.\n"));
2323 dialog.get_vbox()->pack_start (message);
2324 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2325 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2327 dialog.set_position (WIN_POS_CENTER);
2330 switch (dialog.run ()) {
2331 case RESPONSE_ACCEPT:
2339 ARDOUR_UI::disconnect_from_jack ()
2342 if( engine->disconnect_from_jack ()) {
2343 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2347 update_sample_rate (0);
2352 ARDOUR_UI::reconnect_to_jack ()
2355 if (engine->reconnect_to_jack ()) {
2356 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2360 update_sample_rate (0);
2365 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2367 engine->request_buffer_size (nframes);
2368 update_sample_rate (0);
2372 ARDOUR_UI::cmdline_new_session (string path)
2374 if (path[0] != '/') {
2375 char buf[PATH_MAX+1];
2378 getcwd (buf, sizeof (buf));
2385 new_session (false, path);
2387 _will_create_new_session_automatically = false; /* done it */
2388 return FALSE; /* don't call it again */
2392 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2394 Glib::RefPtr<Action> act;
2398 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2401 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2404 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2407 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2410 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2415 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2416 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2417 Config->set_native_file_header_format (hf);
2419 session->reset_native_file_format ();
2426 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2428 Glib::RefPtr<Action> act;
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);
2442 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2443 Config->set_native_file_data_format (sf);
2445 session->reset_native_file_format ();
2452 ARDOUR_UI::use_config ()
2454 Glib::RefPtr<Action> act;
2456 switch (Config->get_native_file_data_format ()) {
2458 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2461 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2466 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2467 ract->set_active ();
2470 switch (Config->get_native_file_header_format ()) {
2472 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2475 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2478 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2481 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2484 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2489 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2490 ract->set_active ();