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));
443 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
447 msg = string_compose(_("Don't %1"), what);
448 window.add_button (msg, RESPONSE_REJECT);
449 msg = string_compose(_("Just %1"), what);
450 window.add_button (msg, RESPONSE_APPLY);
451 msg = string_compose(_("Save and %1"), what);
452 window.add_button (msg, RESPONSE_ACCEPT);
454 window.set_default_response (RESPONSE_ACCEPT);
456 Gtk::Button noquit_button (msg);
457 noquit_button.set_name ("EditorGTKButton");
462 if (session->snap_name() == session->name()) {
465 type = _("snapshot");
467 prompt = string_compose(_("The %1\n\"%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?"),
468 type, session->snap_name());
470 prompt_label.set_text (prompt);
471 prompt_label.set_name (X_("PrompterLabel"));
472 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
473 dhbox.set_homogeneous (false);
474 dhbox.pack_start (*dimage, true, false, 5);
475 dhbox.pack_start (prompt_label, true, false, 5);
476 window.get_vbox()->pack_start (dhbox);
478 window.set_name (_("Prompter"));
479 window.set_position (Gtk::WIN_POS_MOUSE);
480 window.set_modal (true);
481 window.set_resizable (false);
484 save_the_session = 0;
486 editor->ensure_float (window);
488 ResponseType r = (ResponseType) window.run();
493 case RESPONSE_ACCEPT: // save and get out of here
495 case RESPONSE_APPLY: // get out of here
505 ARDOUR_UI::every_second ()
508 update_buffer_load ();
509 update_disk_space ();
514 ARDOUR_UI::every_point_one_seconds ()
516 update_speed_display ();
517 RapidScreenUpdate(); /* EMIT_SIGNAL */
522 ARDOUR_UI::every_point_zero_one_seconds ()
524 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
529 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
533 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
535 if (!engine->connected()) {
537 snprintf (buf, sizeof (buf), _("disconnected"));
541 jack_nframes_t rate = engine->frame_rate();
543 if (fmod (rate, 1000.0) != 0.0) {
544 snprintf (buf, sizeof (buf), _("SR: %.1f kHz / %4.1f msecs"),
545 (float) rate/1000.0f,
546 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
548 snprintf (buf, sizeof (buf), _("SR: %u kHz / %4.1f msecs"),
550 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
554 sample_rate_label.set_text (buf);
558 ARDOUR_UI::update_cpu_load ()
561 snprintf (buf, sizeof (buf), _("DSP Load: %.1f%%"), engine->get_cpu_load());
562 cpu_load_label.set_text (buf);
566 ARDOUR_UI::update_buffer_load ()
571 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
572 session->playback_load(), session->capture_load());
573 buffer_load_label.set_text (buf);
575 buffer_load_label.set_text ("");
580 ARDOUR_UI::count_recenabled_diskstreams (DiskStream& ds)
582 if (ds.record_enabled()) {
583 rec_enabled_diskstreams++;
588 ARDOUR_UI::update_disk_space()
594 jack_nframes_t frames = session->available_capture_duration();
597 if (frames == max_frames) {
598 strcpy (buf, _("space: 24hrs+"));
603 jack_nframes_t fr = session->frame_rate();
605 if (session->actively_recording()){
607 rec_enabled_diskstreams = 0;
608 session->foreach_diskstream (this, &ARDOUR_UI::count_recenabled_diskstreams);
610 if (rec_enabled_diskstreams) {
611 frames /= rec_enabled_diskstreams;
616 /* hmmm. shall we divide by the route count? or the diskstream count?
617 or what? for now, do nothing ...
622 hrs = frames / (fr * 3600);
623 frames -= hrs * fr * 3600;
624 mins = frames / (fr * 60);
625 frames -= mins * fr * 60;
628 snprintf (buf, sizeof(buf), _("space: %02dh:%02dm:%02ds"), hrs, mins, secs);
631 disk_space_label.set_text (buf);
635 ARDOUR_UI::update_wall_clock ()
642 tm_now = localtime (&now);
644 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
645 wall_clock_label.set_text (buf);
650 ARDOUR_UI::control_methods_adjusted ()
655 which_method = (int) online_control_button->adjustment.get_value();
656 switch (which_method) {
658 allow_mmc_and_local ();
667 fatal << _("programming error: impossible control method") << endmsg;
673 ARDOUR_UI::mmc_device_id_adjusted ()
678 int dev_id = (int) mmc_id_button->adjustment.get_value();
679 mmc->set_device_id (dev_id);
685 ARDOUR_UI::session_menu (GdkEventButton *ev)
687 session_popup_menu->popup (0, 0);
692 ARDOUR_UI::redisplay_recent_sessions ()
694 vector<string *> *sessions;
695 vector<string *>::iterator i;
696 RecentSessionsSorter cmp;
698 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
699 recent_session_model->clear ();
702 ARDOUR::read_recent_sessions (rs);
705 recent_session_display.set_model (recent_session_model);
709 /* sort them alphabetically */
710 sort (rs.begin(), rs.end(), cmp);
711 sessions = new vector<string*>;
713 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
714 sessions->push_back (new string ((*i).second));
717 for (i = sessions->begin(); i != sessions->end(); ++i) {
719 vector<string*>* states;
720 vector<const gchar*> item;
721 string fullpath = *(*i);
723 /* remove any trailing / */
725 if (fullpath[fullpath.length()-1] == '/') {
726 fullpath = fullpath.substr (0, fullpath.length()-1);
729 /* now get available states for this session */
731 if ((states = Session::possible_states (fullpath)) == 0) {
736 TreeModel::Row row = *(recent_session_model->append());
738 row[recent_session_columns.visible_name] = PBD::basename (fullpath);
739 row[recent_session_columns.fullpath] = fullpath;
741 if (states->size() > 1) {
743 /* add the children */
745 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
747 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
749 child_row[recent_session_columns.visible_name] = **i2;
750 child_row[recent_session_columns.fullpath] = fullpath;
759 recent_session_display.set_model (recent_session_model);
764 ARDOUR_UI::build_session_selector ()
766 session_selector_window = new ArdourDialog ("session selector");
768 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
770 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
771 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
772 session_selector_window->set_default_response (RESPONSE_ACCEPT);
773 recent_session_model = TreeStore::create (recent_session_columns);
774 recent_session_display.set_model (recent_session_model);
775 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
776 recent_session_display.set_headers_visible (false);
777 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
779 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
781 scroller->add (recent_session_display);
782 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
784 session_selector_window->set_name ("SessionSelectorWindow");
785 session_selector_window->set_size_request (200, 400);
786 session_selector_window->get_vbox()->pack_start (*scroller);
787 session_selector_window->show_all_children();
791 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
793 session_selector_window->response (RESPONSE_ACCEPT);
797 ARDOUR_UI::open_recent_session ()
799 /* popup selector window */
801 if (session_selector_window == 0) {
802 build_session_selector ();
805 redisplay_recent_sessions ();
807 ResponseType r = (ResponseType) session_selector_window->run ();
809 session_selector_window->hide();
812 case RESPONSE_ACCEPT:
818 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
820 if (i == recent_session_model->children().end()) {
824 Glib::ustring path = (*i)[recent_session_columns.fullpath];
825 Glib::ustring state = (*i)[recent_session_columns.visible_name];
827 _session_is_new = false;
829 load_session (path, state);
833 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
837 if (stat (info.filename.c_str(), &statbuf) != 0) {
841 if (!S_ISDIR(statbuf.st_mode)) {
845 string session_file = info.filename;
847 session_file += PBD::basename (info.filename);
848 session_file += ".ardour";
850 if (stat (session_file.c_str(), &statbuf) != 0) {
854 return S_ISREG (statbuf.st_mode);
858 ARDOUR_UI::open_session ()
860 /* popup selector window */
862 if (open_session_selector == 0) {
864 /* ardour sessions are folders */
866 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
867 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
868 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
870 FileFilter session_filter;
871 session_filter.add_pattern ("*.ardour");
872 session_filter.set_name (_("Ardour sessions"));
873 open_session_selector->add_filter (session_filter);
874 open_session_selector->set_filter (session_filter);
877 int response = open_session_selector->run();
878 open_session_selector->hide ();
881 case RESPONSE_ACCEPT:
884 open_session_selector->hide();
888 open_session_selector->hide();
889 string session_path = open_session_selector->get_filename();
893 if (session_path.length() > 0) {
894 if (Session::find_session (session_path, path, name, isnew) == 0) {
895 _session_is_new = isnew;
896 load_session (path, name);
903 ARDOUR_UI::session_add_midi_track ()
905 cerr << _("Patience is a virtue.\n");
909 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
914 warning << _("You cannot add a track without a session already loaded.") << endmsg;
920 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
921 error << _("could not create new audio track") << endmsg;
924 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
925 error << _("could not create new audio bus") << endmsg;
930 if (need_control_room_outs) {
936 route->set_stereo_control_outs (control_lr_channels);
937 route->control_outs()->set_stereo_pan (pans, this);
939 #endif /* CONTROLOUTS */
943 MessageDialog msg (*editor,
944 _("There are insufficient JACK ports available\n\
945 to create a new track or bus.\n\
946 You should save Ardour, exit and\n\
947 restart JACK with more ports."));
953 ARDOUR_UI::diskstream_added (DiskStream* ds)
958 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
960 jack_nframes_t _preroll;
963 _preroll = session->convert_to_frames_at (new_position, session->preroll);
965 if (new_position > _preroll) {
966 new_position -= _preroll;
971 session->request_locate (new_position);
976 ARDOUR_UI::transport_goto_start ()
979 session->goto_start();
982 /* force displayed area in editor to start no matter
983 what "follow playhead" setting is.
987 editor->reposition_x_origin (session->current_start_frame());
993 ARDOUR_UI::transport_goto_zero ()
996 session->request_locate (0);
999 /* force displayed area in editor to start no matter
1000 what "follow playhead" setting is.
1004 editor->reposition_x_origin (0);
1010 ARDOUR_UI::transport_goto_end ()
1013 jack_nframes_t frame = session->current_end_frame();
1014 session->request_locate (frame);
1016 /* force displayed area in editor to start no matter
1017 what "follow playhead" setting is.
1021 editor->reposition_x_origin (frame);
1027 ARDOUR_UI::transport_stop ()
1033 if (session->is_auditioning()) {
1034 session->cancel_audition ();
1038 if (session->get_auto_loop()) {
1039 session->request_auto_loop (false);
1042 session->request_stop ();
1046 ARDOUR_UI::transport_stop_and_forget_capture ()
1049 session->request_stop (true);
1054 ARDOUR_UI::remove_last_capture()
1057 editor->remove_last_capture();
1062 ARDOUR_UI::transport_record ()
1065 switch (session->record_status()) {
1066 case Session::Disabled:
1067 if (session->ntracks() == 0) {
1068 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1069 MessageDialog msg (*editor, txt);
1073 session->maybe_enable_record ();
1075 case Session::Recording:
1076 case Session::Enabled:
1077 session->disable_record (true);
1083 ARDOUR_UI::transport_roll ()
1091 rolling = session->transport_rolling ();
1093 if (session->get_auto_loop()) {
1094 session->request_auto_loop (false);
1095 auto_loop_button.set_active (false);
1096 roll_button.set_active (true);
1097 } else if (session->get_play_range ()) {
1098 session->request_play_range (false);
1099 play_selection_button.set_active (false);
1100 } else if (rolling) {
1101 session->request_locate (session->last_transport_start(), true);
1104 session->request_transport_speed (1.0f);
1108 ARDOUR_UI::transport_loop()
1111 if (session->get_auto_loop()) {
1112 if (session->transport_rolling()) {
1113 Location * looploc = session->locations()->auto_loop_location();
1115 session->request_locate (looploc->start(), true);
1120 session->request_auto_loop (true);
1126 ARDOUR_UI::transport_play_selection ()
1132 if (!session->get_play_range()) {
1133 session->request_stop ();
1136 editor->play_selection ();
1140 ARDOUR_UI::transport_rewind (int option)
1142 float current_transport_speed;
1145 current_transport_speed = session->transport_speed();
1147 if (current_transport_speed >= 0.0f) {
1150 session->request_transport_speed (-1.0f);
1153 session->request_transport_speed (-4.0f);
1156 session->request_transport_speed (-0.5f);
1161 session->request_transport_speed (current_transport_speed * 1.5f);
1167 ARDOUR_UI::transport_forward (int option)
1169 float current_transport_speed;
1172 current_transport_speed = session->transport_speed();
1174 if (current_transport_speed <= 0.0f) {
1177 session->request_transport_speed (1.0f);
1180 session->request_transport_speed (4.0f);
1183 session->request_transport_speed (0.5f);
1188 session->request_transport_speed (current_transport_speed * 1.5f);
1194 ARDOUR_UI::toggle_monitor_enable (guint32 dstream)
1202 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1203 Port *port = ds->io()->input (0);
1204 port->request_monitor_input (!port->monitoring_input());
1209 ARDOUR_UI::toggle_record_enable (guint32 dstream)
1217 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1218 ds->set_record_enabled (!ds->record_enabled(), this);
1223 ARDOUR_UI::queue_transport_change ()
1225 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1229 ARDOUR_UI::map_transport_state ()
1231 float sp = session->transport_speed();
1234 transport_rolling ();
1235 } else if (sp < 0.0f) {
1236 transport_rewinding ();
1237 } else if (sp > 0.0f) {
1238 transport_forwarding ();
1240 transport_stopped ();
1245 ARDOUR_UI::allow_local_only ()
1251 ARDOUR_UI::allow_mmc_only ()
1257 ARDOUR_UI::allow_mmc_and_local ()
1263 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1265 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1266 (int) adj.get_value()].c_str());
1270 ARDOUR_UI::engine_stopped ()
1272 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1273 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1274 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1279 ARDOUR_UI::engine_running ()
1281 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1282 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1283 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1287 ARDOUR_UI::engine_halted ()
1289 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1291 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1292 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1294 update_sample_rate (0);
1296 MessageDialog msg (*editor,
1298 JACK has either been shutdown or it\n\
1299 disconnected Ardour because Ardour\n\
1300 was not fast enough. You can save the\n\
1301 session and/or try to reconnect to JACK ."));
1306 ARDOUR_UI::do_engine_start ()
1312 catch (AudioEngine::PortRegistrationFailure& err) {
1314 error << _("Unable to create all required ports")
1322 error << _("Unable to start the session running")
1332 ARDOUR_UI::start_engine ()
1334 if (do_engine_start () == 0) {
1335 if (session && _session_is_new) {
1336 /* we need to retain initial visual
1337 settings for a new session
1339 session->save_state ("");
1342 /* there is too much going on, in too many threads, for us to
1343 end up with a clean session. So wait 1 second after loading,
1344 and fix it up. its ugly, but until i come across a better
1345 solution, its what we have.
1348 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1355 ARDOUR_UI::update_clocks ()
1357 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1361 ARDOUR_UI::start_clocking ()
1363 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1367 ARDOUR_UI::stop_clocking ()
1369 clock_signal_connection.disconnect ();
1373 ARDOUR_UI::toggle_clocking ()
1376 if (clock_button.get_active()) {
1385 ARDOUR_UI::_blink (void *arg)
1388 ((ARDOUR_UI *) arg)->blink ();
1395 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1399 ARDOUR_UI::start_blinking ()
1401 /* Start the blink signal. Everybody with a blinking widget
1402 uses Blink to drive the widget's state.
1405 if (blink_timeout_tag < 0) {
1407 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1412 ARDOUR_UI::stop_blinking ()
1414 if (blink_timeout_tag >= 0) {
1415 gtk_timeout_remove (blink_timeout_tag);
1416 blink_timeout_tag = -1;
1422 ARDOUR_UI::add_diskstream_to_menu (DiskStream& dstream)
1424 using namespace Gtk;
1425 using namespace Menu_Helpers;
1427 if (dstream.hidden()) {
1431 MenuList& items = diskstream_menu->items();
1432 items.push_back (MenuElem (dstream.name(), bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), (gint32) dstream.id())));
1436 ARDOUR_UI::diskstream_selected (gint32 id)
1438 selected_dstream = id;
1443 ARDOUR_UI::select_diskstream (GdkEventButton *ev)
1445 using namespace Gtk;
1446 using namespace Menu_Helpers;
1452 diskstream_menu = new Menu();
1453 diskstream_menu->set_name ("ArdourContextMenu");
1454 using namespace Gtk;
1455 using namespace Menu_Helpers;
1457 MenuList& items = diskstream_menu->items();
1458 items.push_back (MenuElem (_("No Stream"), (bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), -1))));
1460 session->foreach_diskstream (this, &ARDOUR_UI::add_diskstream_to_menu);
1463 diskstream_menu->popup (ev->button, ev->time);
1465 diskstream_menu->popup (0, 0);
1468 selected_dstream = -1;
1472 delete diskstream_menu;
1474 return selected_dstream;
1478 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1484 if (io.n_inputs() == 0) {
1489 /* XXX we're not handling multiple ports yet. */
1491 const char **connections = io.input(0)->get_connections();
1493 if (connections == 0 || connections[0] == '\0') {
1496 buf = connections[0];
1503 if (io.n_outputs() == 0) {
1508 /* XXX we're not handling multiple ports yet. */
1510 const char **connections = io.output(0)->get_connections();
1512 if (connections == 0 || connections[0] == '\0') {
1515 buf = connections[0];
1523 ARDOUR_UI::snapshot_session ()
1525 ArdourPrompter prompter (true);
1532 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1534 prompter.set_name ("Prompter");
1535 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1536 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1537 prompter.set_prompt (_("Name of New Snapshot"));
1538 prompter.set_initial_text (now);
1540 switch (prompter.run()) {
1541 case RESPONSE_ACCEPT:
1542 prompter.get_result (snapname);
1543 if (snapname.length()){
1544 save_state (snapname);
1554 ARDOUR_UI::save_state (const string & name)
1556 (void) save_state_canfail (name);
1560 ARDOUR_UI::save_state_canfail (string name)
1565 if (name.length() == 0) {
1566 name = session->snap_name();
1569 if ((ret = session->save_state (name)) != 0) {
1573 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1578 ARDOUR_UI::restore_state (string name)
1581 if (name.length() == 0) {
1582 name = session->name();
1584 session->restore_state (name);
1589 ARDOUR_UI::primary_clock_value_changed ()
1592 session->request_locate (primary_clock.current_time ());
1597 ARDOUR_UI::secondary_clock_value_changed ()
1600 session->request_locate (secondary_clock.current_time ());
1605 ARDOUR_UI::rec_enable_button_blink (bool onoff, DiskStream *dstream, Widget *w)
1607 if (session && dstream && dstream->record_enabled()) {
1609 Session::RecordState rs;
1611 rs = session->record_status ();
1614 case Session::Disabled:
1615 case Session::Enabled:
1616 if (w->get_state() != STATE_SELECTED) {
1617 w->set_state (STATE_SELECTED);
1621 case Session::Recording:
1622 if (w->get_state() != STATE_ACTIVE) {
1623 w->set_state (STATE_ACTIVE);
1629 if (w->get_state() != STATE_NORMAL) {
1630 w->set_state (STATE_NORMAL);
1636 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1642 switch (session->record_status()) {
1643 case Session::Enabled:
1645 rec_button.set_state (1);
1647 rec_button.set_state (0);
1651 case Session::Recording:
1652 rec_button.set_state (2);
1656 rec_button.set_state (0);
1662 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1670 ARDOUR_UI::start_keyboard_prefix ()
1672 keyboard->start_prefix();
1676 ARDOUR_UI::save_template ()
1679 ArdourPrompter prompter (true);
1682 prompter.set_name (X_("Prompter"));
1683 prompter.set_prompt (_("Name for mix template:"));
1684 prompter.set_initial_text(session->name() + _("-template"));
1685 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1686 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1688 switch (prompter.run()) {
1689 case RESPONSE_ACCEPT:
1690 prompter.get_result (name);
1692 if (name.length()) {
1693 session->save_template (name);
1703 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1705 m_new_session_dialog->show_all();
1706 m_new_session_dialog->set_transient_for(*editor);
1707 m_new_session_dialog->set_name(predetermined_path);
1709 int response = Gtk::RESPONSE_CANCEL;
1712 response = m_new_session_dialog->run ();
1714 if(response == Gtk::RESPONSE_OK) {
1716 _session_is_new = true;
1718 std::string session_name = m_new_session_dialog->session_name();
1719 std::string session_path = m_new_session_dialog->session_folder();
1722 XXX This is needed because session constructor wants a
1723 non-existant path. hopefully this will be fixed at some point.
1725 session_path = Glib::build_filename(session_path, session_name);
1727 std::string template_name = m_new_session_dialog->session_template_name();
1729 if (m_new_session_dialog->use_session_template()) {
1731 load_session (session_path, session_name, &template_name);
1737 Session::AutoConnectOption iconnect;
1738 Session::AutoConnectOption oconnect;
1740 if (m_new_session_dialog->create_control_bus()) {
1741 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1746 if (m_new_session_dialog->create_master_bus()) {
1747 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1752 if (m_new_session_dialog->connect_inputs()) {
1753 iconnect = Session::AutoConnectPhysical;
1755 iconnect = Session::AutoConnectOption (0);
1758 /// @todo some minor tweaks.
1760 if (m_new_session_dialog->connect_outs_to_master()) {
1761 oconnect = Session::AutoConnectMaster;
1762 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1763 oconnect = Session::AutoConnectPhysical;
1765 oconnect = Session::AutoConnectOption (0);
1768 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1769 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1771 build_session (session_path,
1779 engine->frame_rate() * 60 * 5);
1783 } while(response == Gtk::RESPONSE_HELP);
1784 m_new_session_dialog->hide_all();
1788 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1790 Session *new_session;
1792 session_loaded = false;
1793 x = unload_session ();
1801 /* if it already exists, we must have write access */
1803 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1804 MessageDialog msg (*editor, _("\
1805 You do not have write access to this session.\n\
1806 This prevents the session from being loaded."));
1812 new_session = new Session (*engine, path, snap_name, mix_template);
1817 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1821 connect_to_session (new_session);
1823 //if (engine->running()) {
1824 //mixer->show_window();
1826 session_loaded = true;
1831 ARDOUR_UI::make_session_clean ()
1834 session->set_clean ();
1841 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1842 uint32_t control_channels,
1843 uint32_t master_channels,
1844 Session::AutoConnectOption input_connect,
1845 Session::AutoConnectOption output_connect,
1848 jack_nframes_t initial_length)
1850 Session *new_session;
1853 session_loaded = false;
1854 x = unload_session ();
1861 _session_is_new = true;
1864 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1865 control_channels, master_channels, nphysin, nphysout, initial_length);
1870 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1874 connect_to_session (new_session);
1876 //if (engine->running()) {
1877 //mixer->show_window();
1879 session_loaded = true;
1887 editor->show_window ();
1891 if (session && mixer) {
1892 // mixer->show_window ();
1901 ARDOUR_UI::show_splash ()
1904 about = new About();
1910 ARDOUR_UI::hide_splash ()
1918 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1922 removed = rep.paths.size();
1925 MessageDialog msgd (*editor,
1926 _("No audio files were ready for cleanup"),
1929 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1930 msgd.set_secondary_text (_("If this seems suprising, \n\
1931 check for any existing snapshots.\n\
1932 These may still include regions that\n\
1933 require some unused files to continue to exist."));
1939 ArdourDialog results (_("ardour: cleanup"), true, false);
1941 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1942 CleanupResultsModelColumns() {
1946 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1947 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1951 CleanupResultsModelColumns results_columns;
1952 Glib::RefPtr<Gtk::ListStore> results_model;
1953 Gtk::TreeView results_display;
1955 results_model = ListStore::create (results_columns);
1956 results_display.set_model (results_model);
1957 results_display.append_column (list_title, results_columns.visible_name);
1959 results_display.set_name ("CleanupResultsList");
1960 results_display.set_headers_visible (true);
1961 results_display.set_headers_clickable (false);
1962 results_display.set_reorderable (false);
1964 Gtk::ScrolledWindow list_scroller;
1967 Gtk::HBox dhbox; // the hbox for the image and text
1968 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1969 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1971 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1973 if (rep.space < 1048576.0f) {
1975 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1977 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1981 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1983 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1987 dhbox.pack_start (*dimage, true, false, 5);
1988 dhbox.pack_start (txt, true, false, 5);
1990 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1991 TreeModel::Row row = *(results_model->append());
1992 row[results_columns.visible_name] = *i;
1993 row[results_columns.fullpath] = *i;
1996 list_scroller.add (results_display);
1997 list_scroller.set_size_request (-1, 150);
1998 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2000 dvbox.pack_start (dhbox, true, false, 5);
2001 dvbox.pack_start (list_scroller, true, false, 5);
2002 ddhbox.pack_start (dvbox, true, false, 5);
2004 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2005 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2006 results.set_default_response (RESPONSE_CLOSE);
2007 results.set_position (Gtk::WIN_POS_MOUSE);
2008 results.show_all_children ();
2009 results.set_resizable (false);
2016 ARDOUR_UI::cleanup ()
2019 /* shouldn't happen: menu item is insensitive */
2024 MessageDialog checker (_("Are you sure you want to cleanup?"),
2026 Gtk::MESSAGE_QUESTION,
2027 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2029 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2030 ALL undo/redo information will be lost if you cleanup.\n\
2031 After cleanup, unused audio files will be moved to a \
2032 \"dead sounds\" location."));
2034 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2035 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2036 checker.set_default_response (RESPONSE_CANCEL);
2038 checker.set_name (_("CleanupDialog"));
2039 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2040 checker.set_position (Gtk::WIN_POS_MOUSE);
2042 switch (checker.run()) {
2043 case RESPONSE_ACCEPT:
2049 Session::cleanup_report rep;
2051 editor->prepare_for_cleanup ();
2053 if (session->cleanup_sources (rep)) {
2057 display_cleanup_results (rep,
2060 The following %1 %2 not in use and \n\
2061 have been moved to:\n\
2063 Flushing the wastebasket will \n\
2064 release an additional\n\
2065 %4 %5bytes of disk space.\n"
2070 ARDOUR_UI::flush_trash ()
2073 /* shouldn't happen: menu item is insensitive */
2077 Session::cleanup_report rep;
2079 if (session->cleanup_trash_sources (rep)) {
2083 display_cleanup_results (rep,
2085 _("The following %1 %2 deleted from\n\
2087 releasing %4 %5bytes of disk space"));
2091 ARDOUR_UI::add_route ()
2099 if (add_route_dialog == 0) {
2100 add_route_dialog = new AddRouteDialog;
2101 editor->ensure_float (*add_route_dialog);
2104 if (add_route_dialog->is_visible()) {
2105 /* we're already doing this */
2109 ResponseType r = (ResponseType) add_route_dialog->run ();
2111 add_route_dialog->hide();
2114 case RESPONSE_ACCEPT:
2121 if ((count = add_route_dialog->count()) <= 0) {
2125 uint32_t input_chan = add_route_dialog->channels ();
2126 uint32_t output_chan;
2127 string name_template = add_route_dialog->name_template ();
2128 bool track = add_route_dialog->track ();
2130 Session::AutoConnectOption oac = session->get_output_auto_connect();
2132 if (oac & Session::AutoConnectMaster) {
2133 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2135 output_chan = input_chan;
2138 /* XXX do something with name template */
2142 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2144 session_add_audio_bus (input_chan, output_chan);
2148 while (Main::events_pending()) {
2155 ARDOUR_UI::mixer_settings () const
2160 node = session->instant_xml(X_("Mixer"), session->path());
2162 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2166 node = new XMLNode (X_("Mixer"));
2173 ARDOUR_UI::editor_settings () const
2178 node = session->instant_xml(X_("Editor"), session->path());
2180 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2184 node = new XMLNode (X_("Editor"));
2190 ARDOUR_UI::keyboard_settings () const
2194 node = Config->extra_xml(X_("Keyboard"));
2197 node = new XMLNode (X_("Keyboard"));
2203 ARDOUR_UI::halt_on_xrun_message ()
2205 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2207 MessageDialog msg (*editor,
2208 _("Recording was stopped because your system could not keep up."));
2213 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::Source*>* deletion_list)
2215 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2217 for (list<Source*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2221 delete deletion_list;
2225 ARDOUR_UI::disk_overrun_handler ()
2227 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2229 if (!have_disk_overrun_displayed) {
2230 have_disk_overrun_displayed = true;
2231 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2232 The disk system on your computer\n\
2233 was not able to keep up with Ardour.\n\
2235 Specifically, it failed to write data to disk\n\
2236 quickly enough to keep up with recording.\n"));
2238 have_disk_overrun_displayed = false;
2243 ARDOUR_UI::disk_underrun_handler ()
2245 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2247 if (!have_disk_underrun_displayed) {
2248 have_disk_underrun_displayed = true;
2249 MessageDialog msg (*editor,
2250 (_("The disk system on your computer\n\
2251 was not able to keep up with Ardour.\n\
2253 Specifically, it failed to read data from disk\n\
2254 quickly enough to keep up with playback.\n")));
2256 have_disk_underrun_displayed = false;
2261 ARDOUR_UI::disk_underrun_message_gone ()
2263 have_disk_underrun_displayed = false;
2267 ARDOUR_UI::disk_overrun_message_gone ()
2269 have_disk_underrun_displayed = false;
2273 ARDOUR_UI::pending_state_dialog ()
2275 ArdourDialog dialog ("pending state dialog");
2277 This session appears to have been in\n\
2278 middle of recording when ardour or\n\
2279 the computer was shutdown.\n\
2281 Ardour can recover any captured audio for\n\
2282 you, or it can ignore it. Please decide\n\
2283 what you would like to do.\n"));
2285 dialog.get_vbox()->pack_start (message);
2286 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2287 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2289 dialog.set_position (WIN_POS_CENTER);
2292 switch (dialog.run ()) {
2293 case RESPONSE_ACCEPT:
2301 ARDOUR_UI::disconnect_from_jack ()
2304 if( engine->disconnect_from_jack ()) {
2305 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2309 update_sample_rate (0);
2314 ARDOUR_UI::reconnect_to_jack ()
2317 if (engine->reconnect_to_jack ()) {
2318 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2322 update_sample_rate (0);
2327 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2329 engine->request_buffer_size (nframes);
2330 update_sample_rate (0);
2334 ARDOUR_UI::cmdline_new_session (string path)
2336 if (path[0] != '/') {
2337 char buf[PATH_MAX+1];
2340 getcwd (buf, sizeof (buf));
2347 new_session (false, path);
2349 _will_create_new_session_automatically = false; /* done it */
2350 return FALSE; /* don't call it again */
2354 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2356 Glib::RefPtr<Action> act;
2360 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2363 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2366 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2369 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2372 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2377 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2378 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2379 Config->set_native_file_header_format (hf);
2381 session->reset_native_file_format ();
2388 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2390 Glib::RefPtr<Action> act;
2394 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2397 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2402 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2404 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2405 Config->set_native_file_data_format (sf);
2407 session->reset_native_file_format ();
2414 ARDOUR_UI::use_config ()
2416 Glib::RefPtr<Action> act;
2418 switch (Config->get_native_file_data_format ()) {
2420 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2423 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2428 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2429 ract->set_active ();
2432 switch (Config->get_native_file_header_format ()) {
2434 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2437 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2440 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2443 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2446 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2451 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2452 ract->set_active ();