2 Copyright (C) 1999-2002 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
31 #include <gtkmm/messagedialog.h>
32 #include <gtkmm/accelmap.h>
34 #include <pbd/error.h>
35 #include <pbd/compose.h>
36 #include <pbd/pathscanner.h>
37 #include <pbd/failed_constructor.h>
38 #include <gtkmm2ext/gtk_ui.h>
39 #include <gtkmm2ext/utils.h>
40 #include <gtkmm2ext/click_box.h>
41 #include <gtkmm2ext/fastmeter.h>
42 #include <gtkmm2ext/stop_signal.h>
43 #include <gtkmm2ext/popup.h>
45 #include <midi++/port.h>
46 #include <midi++/mmc.h>
48 #include <ardour/ardour.h>
49 #include <ardour/session_route.h>
50 #include <ardour/port.h>
51 #include <ardour/audioengine.h>
52 #include <ardour/playlist.h>
53 #include <ardour/utils.h>
54 #include <ardour/audio_diskstream.h>
55 #include <ardour/audiofilesource.h>
56 #include <ardour/recent_sessions.h>
57 #include <ardour/port.h>
58 #include <ardour/audio_track.h>
61 #include "ardour_ui.h"
62 #include "public_editor.h"
63 #include "audio_clock.h"
68 #include "keyboard_target.h"
69 #include "add_route_dialog.h"
70 #include "new_session_dialog.h"
73 #include "gui_thread.h"
74 #include "color_manager.h"
78 using namespace ARDOUR;
80 using namespace Gtkmm2ext;
84 ARDOUR_UI *ARDOUR_UI::theArdourUI = 0;
86 sigc::signal<void,bool> ARDOUR_UI::Blink;
87 sigc::signal<void> ARDOUR_UI::RapidScreenUpdate;
88 sigc::signal<void> ARDOUR_UI::SuperRapidScreenUpdate;
89 sigc::signal<void,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 In")),
120 punch_out_button (_("Punch Out")),
121 auto_return_button (_("Auto Return")),
122 auto_play_button (_("Autuo Play")),
123 auto_input_button (_("Auto Input")),
124 click_button (_("Click")),
125 auditioning_alert_button (_("AUDITION")),
126 solo_alert_button (_("SOLO")),
129 using namespace Gtk::Menu_Helpers;
135 if (theArdourUI == 0) {
141 color_manager = new ColorManager();
143 std::string color_file = ARDOUR::find_config_file("ardour.colors");
145 color_manager->load (color_file);
150 _session_is_new = false;
151 big_clock_window = 0;
152 session_selector_window = 0;
153 last_key_press_time = 0;
154 connection_editor = 0;
155 add_route_dialog = 0;
160 open_session_selector = 0;
161 have_configure_timeout = false;
162 have_disk_overrun_displayed = false;
163 have_disk_underrun_displayed = false;
164 _will_create_new_session_automatically = false;
165 session_loaded = false;
166 last_speed_displayed = -1.0f;
168 last_configure_time.tv_sec = 0;
169 last_configure_time.tv_usec = 0;
171 shuttle_grabbed = false;
173 shuttle_max_speed = 8.0f;
175 shuttle_style_menu = 0;
176 shuttle_unit_menu = 0;
178 gettimeofday (&last_peak_grab, 0);
179 gettimeofday (&last_shuttle_request, 0);
181 ARDOUR::AudioDiskstream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
182 ARDOUR::Diskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
183 ARDOUR::Diskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
185 /* handle pending state with a dialog */
187 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
189 /* have to wait for AudioEngine and Configuration before proceeding */
193 ARDOUR_UI::set_engine (AudioEngine& e)
197 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
198 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
199 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
200 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
202 ActionManager::init ();
203 new_session_dialog = new NewSessionDialog();
207 keyboard = new Keyboard;
209 if (setup_windows ()) {
210 throw failed_constructor ();
213 if (GTK_ARDOUR::show_key_actions) {
214 vector<string> names;
215 vector<string> paths;
217 vector<AccelKey> bindings;
219 ActionManager::get_all_actions (names, paths, keys, bindings);
221 vector<string>::iterator n;
222 vector<string>::iterator k;
223 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
224 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
230 /* start with timecode, metering enabled
233 blink_timeout_tag = -1;
235 /* the global configuration object is now valid */
239 /* this being a GUI and all, we want peakfiles */
241 AudioFileSource::set_build_peakfiles (true);
242 AudioFileSource::set_build_missing_peakfiles (true);
244 if (AudioSource::start_peak_thread ()) {
245 throw failed_constructor();
248 /* start the time-of-day-clock */
250 update_wall_clock ();
251 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
253 update_disk_space ();
255 update_sample_rate (engine->frame_rate());
257 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
258 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
261 ARDOUR_UI::~ARDOUR_UI ()
263 save_ardour_state ();
277 if (add_route_dialog) {
278 delete add_route_dialog;
281 AudioSource::stop_peak_thread ();
285 ARDOUR_UI::configure_timeout ()
290 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
291 /* no configure events yet */
295 gettimeofday (&now, 0);
296 timersub (&now, &last_configure_time, &diff);
298 /* force a gap of 0.5 seconds since the last configure event
301 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
304 have_configure_timeout = false;
305 save_ardour_state ();
311 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
313 if (have_configure_timeout) {
314 gettimeofday (&last_configure_time, 0);
316 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
317 have_configure_timeout = true;
324 ARDOUR_UI::save_ardour_state ()
326 if (!keyboard || !mixer || !editor) {
330 /* XXX this is all a bit dubious. add_extra_xml() uses
331 a different lifetime model from add_instant_xml().
334 XMLNode* node = new XMLNode (keyboard->get_state());
335 Config->add_extra_xml (*node);
336 Config->save_state();
338 XMLNode enode(static_cast<Stateful*>(editor)->get_state());
339 XMLNode mnode(mixer->get_state());
342 session->add_instant_xml (enode, session->path());
343 session->add_instant_xml (mnode, session->path());
345 Config->add_instant_xml (enode, get_user_ardour_path());
346 Config->add_instant_xml (mnode, get_user_ardour_path());
351 AccelMap::save ("ardour.saved_bindings");
355 ARDOUR_UI::startup ()
357 /* Once the UI is up and running, start the audio engine. Doing
358 this before the UI is up and running can cause problems
359 when not running with SCHED_FIFO, because the amount of
360 CPU and disk work needed to get the UI started can interfere
361 with the scheduling of the audio thread.
364 Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
370 if (session && session->dirty()) {
371 switch (ask_about_saving_session(_("quit"))) {
376 /* use the default name */
377 if (save_state_canfail ("")) {
378 /* failed - don't quit */
379 MessageDialog msg (*editor,
381 Ardour was unable to save your session.\n\n\
382 If you still wish to quit, please use the\n\n\
383 \"Just quit\" option."));
392 Config->save_state();
397 ARDOUR_UI::ask_about_saving_session (const string & what)
399 ArdourDialog window (_("ardour: save session?"));
400 Gtk::HBox dhbox; // the hbox for the image and text
401 Gtk::Label prompt_label;
402 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
406 msg = string_compose(_("Don't %1"), what);
407 window.add_button (msg, RESPONSE_REJECT);
408 msg = string_compose(_("Just %1"), what);
409 window.add_button (msg, RESPONSE_APPLY);
410 msg = string_compose(_("Save and %1"), what);
411 window.add_button (msg, RESPONSE_ACCEPT);
413 window.set_default_response (RESPONSE_ACCEPT);
415 Gtk::Button noquit_button (msg);
416 noquit_button.set_name ("EditorGTKButton");
421 if (session->snap_name() == session->name()) {
424 type = _("snapshot");
426 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?"),
427 type, session->snap_name());
429 prompt_label.set_text (prompt);
430 prompt_label.set_name (X_("PrompterLabel"));
431 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
433 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
435 dhbox.set_homogeneous (false);
436 dhbox.pack_start (*dimage, false, false, 5);
437 dhbox.pack_start (prompt_label, true, false, 5);
438 window.get_vbox()->pack_start (dhbox);
440 window.set_name (_("Prompter"));
441 window.set_position (Gtk::WIN_POS_MOUSE);
442 window.set_modal (true);
443 window.set_resizable (false);
446 save_the_session = 0;
448 editor->ensure_float (window);
450 ResponseType r = (ResponseType) window.run();
455 case RESPONSE_ACCEPT: // save and get out of here
457 case RESPONSE_APPLY: // get out of here
467 ARDOUR_UI::every_second ()
470 update_buffer_load ();
471 update_disk_space ();
476 ARDOUR_UI::every_point_one_seconds ()
478 update_speed_display ();
479 RapidScreenUpdate(); /* EMIT_SIGNAL */
484 ARDOUR_UI::every_point_zero_one_seconds ()
486 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
491 ARDOUR_UI::update_sample_rate (nframes_t ignored)
495 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
497 if (!engine->connected()) {
499 snprintf (buf, sizeof (buf), _("disconnected"));
503 nframes_t rate = engine->frame_rate();
505 if (fmod (rate, 1000.0) != 0.0) {
506 snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"),
507 (float) rate/1000.0f,
508 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
510 snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"),
512 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
516 sample_rate_label.set_text (buf);
520 ARDOUR_UI::update_cpu_load ()
523 snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
524 cpu_load_label.set_text (buf);
528 ARDOUR_UI::update_buffer_load ()
533 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
534 session->playback_load(), session->capture_load());
535 buffer_load_label.set_text (buf);
537 buffer_load_label.set_text ("");
542 ARDOUR_UI::count_recenabled_diskstreams (Route& route)
544 Track* track = dynamic_cast<Track*>(&route);
545 if (track && track->diskstream()->record_enabled()) {
546 rec_enabled_diskstreams++;
551 ARDOUR_UI::update_disk_space()
557 nframes_t frames = session->available_capture_duration();
560 if (frames == max_frames) {
561 strcpy (buf, _("Disk: 24hrs+"));
566 nframes_t fr = session->frame_rate();
568 if (session->actively_recording()){
570 rec_enabled_diskstreams = 0;
571 session->foreach_route (this, &ARDOUR_UI::count_recenabled_diskstreams);
573 if (rec_enabled_diskstreams) {
574 frames /= rec_enabled_diskstreams;
579 /* hmmm. shall we divide by the route count? or the diskstream count?
580 or what? for now, do nothing ...
585 hrs = frames / (fr * 3600);
586 frames -= hrs * fr * 3600;
587 mins = frames / (fr * 60);
588 frames -= mins * fr * 60;
591 snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
594 disk_space_label.set_text (buf);
598 ARDOUR_UI::update_wall_clock ()
605 tm_now = localtime (&now);
607 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
608 wall_clock_label.set_text (buf);
613 ARDOUR_UI::control_methods_adjusted ()
618 which_method = (int) online_control_button->adjustment.get_value();
619 switch (which_method) {
621 allow_mmc_and_local ();
630 fatal << _("programming error: impossible control method") << endmsg;
636 ARDOUR_UI::mmc_device_id_adjusted ()
641 int dev_id = (int) mmc_id_button->adjustment.get_value();
642 mmc->set_device_id (dev_id);
648 ARDOUR_UI::session_menu (GdkEventButton *ev)
650 session_popup_menu->popup (0, 0);
655 ARDOUR_UI::redisplay_recent_sessions ()
657 vector<string *> *sessions;
658 vector<string *>::iterator i;
659 RecentSessionsSorter cmp;
661 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
662 recent_session_model->clear ();
665 ARDOUR::read_recent_sessions (rs);
668 recent_session_display.set_model (recent_session_model);
672 /* sort them alphabetically */
673 sort (rs.begin(), rs.end(), cmp);
674 sessions = new vector<string*>;
676 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
677 sessions->push_back (new string ((*i).second));
680 for (i = sessions->begin(); i != sessions->end(); ++i) {
682 vector<string*>* states;
683 vector<const gchar*> item;
684 string fullpath = *(*i);
686 /* remove any trailing / */
688 if (fullpath[fullpath.length()-1] == '/') {
689 fullpath = fullpath.substr (0, fullpath.length()-1);
692 /* now get available states for this session */
694 if ((states = Session::possible_states (fullpath)) == 0) {
699 TreeModel::Row row = *(recent_session_model->append());
701 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
702 row[recent_session_columns.fullpath] = fullpath;
704 if (states->size() > 1) {
706 /* add the children */
708 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
710 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
712 child_row[recent_session_columns.visible_name] = **i2;
713 child_row[recent_session_columns.fullpath] = fullpath;
722 recent_session_display.set_model (recent_session_model);
727 ARDOUR_UI::build_session_selector ()
729 session_selector_window = new ArdourDialog ("session selector");
731 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
733 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
734 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
735 session_selector_window->set_default_response (RESPONSE_ACCEPT);
736 recent_session_model = TreeStore::create (recent_session_columns);
737 recent_session_display.set_model (recent_session_model);
738 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
739 recent_session_display.set_headers_visible (false);
740 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
742 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
744 scroller->add (recent_session_display);
745 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
747 session_selector_window->set_name ("SessionSelectorWindow");
748 session_selector_window->set_size_request (200, 400);
749 session_selector_window->get_vbox()->pack_start (*scroller);
750 session_selector_window->show_all_children();
754 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
756 session_selector_window->response (RESPONSE_ACCEPT);
760 ARDOUR_UI::open_recent_session ()
762 /* popup selector window */
764 if (session_selector_window == 0) {
765 build_session_selector ();
768 redisplay_recent_sessions ();
770 ResponseType r = (ResponseType) session_selector_window->run ();
772 session_selector_window->hide();
775 case RESPONSE_ACCEPT:
781 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
783 if (i == recent_session_model->children().end()) {
787 Glib::ustring path = (*i)[recent_session_columns.fullpath];
788 Glib::ustring state = (*i)[recent_session_columns.visible_name];
790 _session_is_new = false;
792 load_session (path, state);
796 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
800 if (stat (info.filename.c_str(), &statbuf) != 0) {
804 if (!S_ISDIR(statbuf.st_mode)) {
810 string session_file = info.filename;
812 session_file += Glib::path_get_basename (info.filename);
813 session_file += ".ardour";
815 if (stat (session_file.c_str(), &statbuf) != 0) {
819 return S_ISREG (statbuf.st_mode);
823 ARDOUR_UI::open_session ()
825 /* popup selector window */
827 if (open_session_selector == 0) {
829 /* ardour sessions are folders */
831 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
832 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
833 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
835 FileFilter session_filter;
836 session_filter.add_pattern ("*.ardour");
837 session_filter.set_name (_("Ardour sessions"));
838 open_session_selector->add_filter (session_filter);
839 open_session_selector->set_filter (session_filter);
842 int response = open_session_selector->run();
843 open_session_selector->hide ();
846 case RESPONSE_ACCEPT:
849 open_session_selector->hide();
853 open_session_selector->hide();
854 string session_path = open_session_selector->get_filename();
858 if (session_path.length() > 0) {
859 if (Session::find_session (session_path, path, name, isnew) == 0) {
860 _session_is_new = isnew;
861 load_session (path, name);
868 ARDOUR_UI::session_add_midi_track ()
870 cerr << _("Patience is a virtue.\n");
874 ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many)
876 list<boost::shared_ptr<AudioTrack> > tracks;
877 Session::RouteList routes;
880 warning << _("You cannot add a track or bus without a session already loaded.") << endmsg;
886 tracks = session->new_audio_track (input_channels, output_channels, mode, how_many);
888 if (tracks.size() != how_many) {
890 error << _("could not create a new audio track") << endmsg;
892 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
898 routes = session->new_audio_route (input_channels, output_channels, how_many);
900 if (routes.size() != how_many) {
902 error << _("could not create a new audio track") << endmsg;
904 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
910 if (need_control_room_outs) {
916 route->set_stereo_control_outs (control_lr_channels);
917 route->control_outs()->set_stereo_pan (pans, this);
919 #endif /* CONTROLOUTS */
923 MessageDialog msg (*editor,
924 _("There are insufficient JACK ports available\n\
925 to create a new track or bus.\n\
926 You should save Ardour, exit and\n\
927 restart JACK with more ports."));
933 ARDOUR_UI::do_transport_locate (nframes_t new_position)
935 nframes_t _preroll = 0;
938 // XXX CONFIG_CHANGE FIX - requires AnyTime handling
939 // _preroll = session->convert_to_frames_at (new_position, Config->get_preroll());
941 if (new_position > _preroll) {
942 new_position -= _preroll;
947 session->request_locate (new_position);
952 ARDOUR_UI::transport_goto_start ()
955 session->goto_start();
958 /* force displayed area in editor to start no matter
959 what "follow playhead" setting is.
963 editor->reposition_x_origin (session->current_start_frame());
969 ARDOUR_UI::transport_goto_zero ()
972 session->request_locate (0);
975 /* force displayed area in editor to start no matter
976 what "follow playhead" setting is.
980 editor->reposition_x_origin (0);
986 ARDOUR_UI::transport_goto_end ()
989 nframes_t frame = session->current_end_frame();
990 session->request_locate (frame);
992 /* force displayed area in editor to start no matter
993 what "follow playhead" setting is.
997 editor->reposition_x_origin (frame);
1003 ARDOUR_UI::transport_stop ()
1009 if (session->is_auditioning()) {
1010 session->cancel_audition ();
1014 if (Config->get_auto_loop()) {
1015 session->request_play_loop (false);
1018 session->request_stop ();
1022 ARDOUR_UI::transport_stop_and_forget_capture ()
1025 session->request_stop (true);
1030 ARDOUR_UI::remove_last_capture()
1033 editor->remove_last_capture();
1038 ARDOUR_UI::transport_record ()
1041 switch (session->record_status()) {
1042 case Session::Disabled:
1043 if (session->ntracks() == 0) {
1044 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1045 MessageDialog msg (*editor, txt);
1049 session->maybe_enable_record ();
1051 case Session::Recording:
1052 case Session::Enabled:
1053 session->disable_record (true);
1059 ARDOUR_UI::transport_roll ()
1067 rolling = session->transport_rolling ();
1069 if (Config->get_auto_loop()) {
1070 session->request_play_loop (false);
1071 auto_loop_button.set_active (false);
1072 roll_button.set_active (true);
1073 } else if (session->get_play_range ()) {
1074 session->request_play_range (false);
1075 play_selection_button.set_active (false);
1076 } else if (rolling) {
1077 session->request_locate (session->last_transport_start(), true);
1080 session->request_transport_speed (1.0f);
1084 ARDOUR_UI::transport_loop()
1087 if (Config->get_auto_loop()) {
1088 if (session->transport_rolling()) {
1089 Location * looploc = session->locations()->auto_loop_location();
1091 session->request_locate (looploc->start(), true);
1096 session->request_play_loop (true);
1102 ARDOUR_UI::transport_play_selection ()
1108 if (!session->get_play_range()) {
1109 session->request_stop ();
1112 editor->play_selection ();
1116 ARDOUR_UI::transport_rewind (int option)
1118 float current_transport_speed;
1121 current_transport_speed = session->transport_speed();
1123 if (current_transport_speed >= 0.0f) {
1126 session->request_transport_speed (-1.0f);
1129 session->request_transport_speed (-4.0f);
1132 session->request_transport_speed (-0.5f);
1137 session->request_transport_speed (current_transport_speed * 1.5f);
1143 ARDOUR_UI::transport_forward (int option)
1145 float current_transport_speed;
1148 current_transport_speed = session->transport_speed();
1150 if (current_transport_speed <= 0.0f) {
1153 session->request_transport_speed (1.0f);
1156 session->request_transport_speed (4.0f);
1159 session->request_transport_speed (0.5f);
1164 session->request_transport_speed (current_transport_speed * 1.5f);
1170 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1176 boost::shared_ptr<Route> r;
1178 if ((r = session->route_by_remote_id (dstream)) != 0) {
1182 if ((t = dynamic_cast<Track*>(r.get())) != 0) {
1183 t->diskstream()->set_record_enabled (!t->diskstream()->record_enabled());
1192 ARDOUR_UI::queue_transport_change ()
1194 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1198 ARDOUR_UI::map_transport_state ()
1200 float sp = session->transport_speed();
1203 transport_rolling ();
1204 } else if (sp < 0.0f) {
1205 transport_rewinding ();
1206 } else if (sp > 0.0f) {
1207 transport_forwarding ();
1209 transport_stopped ();
1214 ARDOUR_UI::allow_local_only ()
1220 ARDOUR_UI::allow_mmc_only ()
1226 ARDOUR_UI::allow_mmc_and_local ()
1232 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1234 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1235 (int) adj.get_value()].c_str());
1239 ARDOUR_UI::engine_stopped ()
1241 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1242 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1243 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1248 ARDOUR_UI::engine_running ()
1250 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1251 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1252 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1256 ARDOUR_UI::engine_halted ()
1258 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1260 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1261 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1263 update_sample_rate (0);
1265 MessageDialog msg (*editor,
1267 JACK has either been shutdown or it\n\
1268 disconnected Ardour because Ardour\n\
1269 was not fast enough. You can save the\n\
1270 session and/or try to reconnect to JACK ."));
1275 ARDOUR_UI::do_engine_start ()
1281 catch (AudioEngine::PortRegistrationFailure& err) {
1283 error << _("Unable to create all required ports")
1291 error << _("Unable to start the session running")
1301 ARDOUR_UI::start_engine ()
1303 if (do_engine_start () == 0) {
1304 if (session && _session_is_new) {
1305 /* we need to retain initial visual
1306 settings for a new session
1308 session->save_state ("");
1311 /* there is too much going on, in too many threads, for us to
1312 end up with a clean session. So wait 1 second after loading,
1313 and fix it up. its ugly, but until i come across a better
1314 solution, its what we have.
1317 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1324 ARDOUR_UI::update_clocks ()
1326 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1330 ARDOUR_UI::start_clocking ()
1332 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1336 ARDOUR_UI::stop_clocking ()
1338 clock_signal_connection.disconnect ();
1342 ARDOUR_UI::toggle_clocking ()
1345 if (clock_button.get_active()) {
1354 ARDOUR_UI::_blink (void *arg)
1357 ((ARDOUR_UI *) arg)->blink ();
1364 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1368 ARDOUR_UI::start_blinking ()
1370 /* Start the blink signal. Everybody with a blinking widget
1371 uses Blink to drive the widget's state.
1374 if (blink_timeout_tag < 0) {
1376 blink_timeout_tag = g_timeout_add (240, _blink, this);
1381 ARDOUR_UI::stop_blinking ()
1383 if (blink_timeout_tag >= 0) {
1384 g_source_remove (blink_timeout_tag);
1385 blink_timeout_tag = -1;
1390 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1396 if (io.n_inputs() == 0) {
1401 /* XXX we're not handling multiple ports yet. */
1403 const char **connections = io.input(0)->get_connections();
1405 if (connections == 0 || connections[0] == '\0') {
1408 buf = connections[0];
1415 if (io.n_outputs() == 0) {
1420 /* XXX we're not handling multiple ports yet. */
1422 const char **connections = io.output(0)->get_connections();
1424 if (connections == 0 || connections[0] == '\0') {
1427 buf = connections[0];
1435 ARDOUR_UI::snapshot_session ()
1437 ArdourPrompter prompter (true);
1444 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1446 prompter.set_name ("Prompter");
1447 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1448 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1449 prompter.set_prompt (_("Name of New Snapshot"));
1450 prompter.set_initial_text (now);
1452 switch (prompter.run()) {
1453 case RESPONSE_ACCEPT:
1454 prompter.get_result (snapname);
1455 if (snapname.length()){
1456 save_state (snapname);
1466 ARDOUR_UI::save_state (const string & name)
1468 (void) save_state_canfail (name);
1472 ARDOUR_UI::save_state_canfail (string name)
1477 if (name.length() == 0) {
1478 name = session->snap_name();
1481 if ((ret = session->save_state (name)) != 0) {
1485 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1490 ARDOUR_UI::restore_state (string name)
1493 if (name.length() == 0) {
1494 name = session->name();
1496 session->restore_state (name);
1501 ARDOUR_UI::primary_clock_value_changed ()
1504 session->request_locate (primary_clock.current_time ());
1509 ARDOUR_UI::secondary_clock_value_changed ()
1512 session->request_locate (secondary_clock.current_time ());
1517 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1519 if (session && dstream && dstream->record_enabled()) {
1521 Session::RecordState rs;
1523 rs = session->record_status ();
1526 case Session::Disabled:
1527 case Session::Enabled:
1528 if (w->get_state() != STATE_SELECTED) {
1529 w->set_state (STATE_SELECTED);
1533 case Session::Recording:
1534 if (w->get_state() != STATE_ACTIVE) {
1535 w->set_state (STATE_ACTIVE);
1541 if (w->get_state() != STATE_NORMAL) {
1542 w->set_state (STATE_NORMAL);
1548 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1554 switch (session->record_status()) {
1555 case Session::Enabled:
1557 rec_button.set_state (1);
1559 rec_button.set_state (0);
1563 case Session::Recording:
1564 rec_button.set_state (2);
1568 rec_button.set_state (0);
1574 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1582 ARDOUR_UI::start_keyboard_prefix ()
1584 keyboard->start_prefix();
1588 ARDOUR_UI::save_template ()
1591 ArdourPrompter prompter (true);
1594 prompter.set_name (X_("Prompter"));
1595 prompter.set_prompt (_("Name for mix template:"));
1596 prompter.set_initial_text(session->name() + _("-template"));
1597 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1598 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1600 switch (prompter.run()) {
1601 case RESPONSE_ACCEPT:
1602 prompter.get_result (name);
1604 if (name.length()) {
1605 session->save_template (name);
1615 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1617 string session_name;
1618 string session_path;
1620 int response = Gtk::RESPONSE_NONE;
1622 new_session_dialog->set_modal(true);
1623 new_session_dialog->set_name(predetermined_path);
1624 new_session_dialog->reset_recent();
1625 new_session_dialog->show();
1627 //Glib::RefPtr<Gdk::Window> nsd_window = new_session_dialog->get_window();
1630 response = new_session_dialog->run ();
1631 //nsd_window ->set_cursor(Gdk::Cursor(Gdk::WATCH));
1633 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1637 } else if (response == Gtk::RESPONSE_NONE) {
1638 /* Clear was pressed */
1639 new_session_dialog->reset();
1641 } else if (response == Gtk::RESPONSE_YES) {
1643 /* YES == OPEN, but there's no enum for that */
1645 session_name = new_session_dialog->session_name();
1647 if (session_name.empty()) {
1648 response = Gtk::RESPONSE_NONE;
1652 if (session_name[0] == '/' ||
1653 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1654 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1655 load_session (Glib::path_get_dirname (session_name), session_name);
1657 session_path = new_session_dialog->session_folder();
1658 load_session (session_path, session_name);
1661 } else if (response == Gtk::RESPONSE_OK) {
1663 session_name = new_session_dialog->session_name();
1665 if (new_session_dialog->get_current_page() == 1) {
1667 /* XXX this is a bit of a hack..
1668 i really want the new sesion dialog to return RESPONSE_YES
1669 if we're on page 1 (the load page)
1670 Unfortunately i can't see how atm..
1673 if (session_name.empty()) {
1674 response = Gtk::RESPONSE_NONE;
1678 if (session_name[0] == '/' ||
1679 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1680 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1681 load_session (Glib::path_get_dirname (session_name), session_name);
1683 session_path = new_session_dialog->session_folder();
1684 load_session (session_path, session_name);
1689 _session_is_new = true;
1691 if (session_name.empty()) {
1692 response = Gtk::RESPONSE_NONE;
1696 if (session_name[0] == '/' ||
1697 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1698 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1700 session_path = Glib::path_get_dirname (session_name);
1701 session_name = Glib::path_get_basename (session_name);
1705 std::string session_path = new_session_dialog->session_folder();
1709 //XXX This is needed because session constructor wants a
1710 //non-existant path. hopefully this will be fixed at some point.
1712 session_path = Glib::build_filename (session_path, session_name);
1714 std::string template_name = new_session_dialog->session_template_name();
1716 if (new_session_dialog->use_session_template()) {
1718 load_session (session_path, session_name, &template_name);
1724 AutoConnectOption iconnect;
1725 AutoConnectOption oconnect;
1727 if (new_session_dialog->create_control_bus()) {
1728 cchns = (uint32_t) new_session_dialog->control_channel_count();
1733 if (new_session_dialog->create_master_bus()) {
1734 mchns = (uint32_t) new_session_dialog->master_channel_count();
1739 if (new_session_dialog->connect_inputs()) {
1740 iconnect = AutoConnectPhysical;
1742 iconnect = AutoConnectOption (0);
1745 /// @todo some minor tweaks.
1747 if (new_session_dialog->connect_outs_to_master()) {
1748 oconnect = AutoConnectMaster;
1749 } else if (new_session_dialog->connect_outs_to_physical()) {
1750 oconnect = AutoConnectPhysical;
1752 oconnect = AutoConnectOption (0);
1755 uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
1756 uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count();
1758 build_session (session_path,
1766 engine->frame_rate() * 60 * 5);
1771 } while (response == Gtk::RESPONSE_NONE);
1774 new_session_dialog->get_window()->set_cursor();
1775 new_session_dialog->hide();
1779 ARDOUR_UI::close_session()
1786 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1788 Session *new_session;
1790 session_loaded = false;
1791 x = unload_session ();
1799 /* if it already exists, we must have write access */
1801 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1802 MessageDialog msg (*editor, _("\
1803 You do not have write access to this session.\n\
1804 This prevents the session from being loaded."));
1810 new_session = new Session (*engine, path, snap_name, mix_template);
1815 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1819 connect_to_session (new_session);
1821 Config->set_current_owner (ConfigVariableBase::Interface);
1823 session_loaded = true;
1828 ARDOUR_UI::make_session_clean ()
1831 session->set_clean ();
1840 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1841 uint32_t control_channels,
1842 uint32_t master_channels,
1843 AutoConnectOption input_connect,
1844 AutoConnectOption output_connect,
1847 nframes_t initial_length)
1849 Session *new_session;
1852 session_loaded = false;
1853 x = unload_session ();
1860 _session_is_new = true;
1863 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1864 control_channels, master_channels, nphysin, nphysout, initial_length);
1869 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1873 connect_to_session (new_session);
1875 session_loaded = true;
1883 editor->show_window ();
1898 ARDOUR_UI::show_splash ()
1901 about = new About();
1907 ARDOUR_UI::hide_splash ()
1910 about->get_window()->set_cursor ();
1916 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1920 removed = rep.paths.size();
1923 MessageDialog msgd (*editor,
1924 _("No audio files were ready for cleanup"),
1927 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1928 msgd.set_secondary_text (_("If this seems suprising, \n\
1929 check for any existing snapshots.\n\
1930 These may still include regions that\n\
1931 require some unused files to continue to exist."));
1937 ArdourDialog results (_("ardour: cleanup"), true, false);
1939 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1940 CleanupResultsModelColumns() {
1944 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1945 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1949 CleanupResultsModelColumns results_columns;
1950 Glib::RefPtr<Gtk::ListStore> results_model;
1951 Gtk::TreeView results_display;
1953 results_model = ListStore::create (results_columns);
1954 results_display.set_model (results_model);
1955 results_display.append_column (list_title, results_columns.visible_name);
1957 results_display.set_name ("CleanupResultsList");
1958 results_display.set_headers_visible (true);
1959 results_display.set_headers_clickable (false);
1960 results_display.set_reorderable (false);
1962 Gtk::ScrolledWindow list_scroller;
1965 Gtk::HBox dhbox; // the hbox for the image and text
1966 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1967 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1969 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1971 if (rep.space < 1048576.0f) {
1973 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1975 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1979 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1981 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1985 dhbox.pack_start (*dimage, true, false, 5);
1986 dhbox.pack_start (txt, true, false, 5);
1988 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1989 TreeModel::Row row = *(results_model->append());
1990 row[results_columns.visible_name] = *i;
1991 row[results_columns.fullpath] = *i;
1994 list_scroller.add (results_display);
1995 list_scroller.set_size_request (-1, 150);
1996 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
1998 dvbox.pack_start (dhbox, true, false, 5);
1999 dvbox.pack_start (list_scroller, true, false, 5);
2000 ddhbox.pack_start (dvbox, true, false, 5);
2002 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2003 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2004 results.set_default_response (RESPONSE_CLOSE);
2005 results.set_position (Gtk::WIN_POS_MOUSE);
2006 results.show_all_children ();
2007 results.set_resizable (false);
2014 ARDOUR_UI::cleanup ()
2017 /* shouldn't happen: menu item is insensitive */
2022 MessageDialog checker (_("Are you sure you want to cleanup?"),
2024 Gtk::MESSAGE_QUESTION,
2025 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2027 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2028 ALL undo/redo information will be lost if you cleanup.\n\
2029 After cleanup, unused audio files will be moved to a \
2030 \"dead sounds\" location."));
2032 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2033 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2034 checker.set_default_response (RESPONSE_CANCEL);
2036 checker.set_name (_("CleanupDialog"));
2037 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2038 checker.set_position (Gtk::WIN_POS_MOUSE);
2040 switch (checker.run()) {
2041 case RESPONSE_ACCEPT:
2047 Session::cleanup_report rep;
2049 editor->prepare_for_cleanup ();
2051 if (session->cleanup_sources (rep)) {
2055 display_cleanup_results (rep,
2058 The following %1 %2 not in use and \n\
2059 have been moved to:\n\
2061 Flushing the wastebasket will \n\
2062 release an additional\n\
2063 %4 %5bytes of disk space.\n"
2068 ARDOUR_UI::flush_trash ()
2071 /* shouldn't happen: menu item is insensitive */
2075 Session::cleanup_report rep;
2077 if (session->cleanup_trash_sources (rep)) {
2081 display_cleanup_results (rep,
2083 _("The following %1 %2 deleted from\n\
2085 releasing %4 %5bytes of disk space"));
2089 ARDOUR_UI::add_route ()
2097 if (add_route_dialog == 0) {
2098 add_route_dialog = new AddRouteDialog;
2099 editor->ensure_float (*add_route_dialog);
2102 if (add_route_dialog->is_visible()) {
2103 /* we're already doing this */
2107 ResponseType r = (ResponseType) add_route_dialog->run ();
2109 add_route_dialog->hide();
2112 case RESPONSE_ACCEPT:
2119 if ((count = add_route_dialog->count()) <= 0) {
2123 uint32_t input_chan = add_route_dialog->channels ();
2124 uint32_t output_chan;
2125 string name_template = add_route_dialog->name_template ();
2126 bool track = add_route_dialog->track ();
2128 AutoConnectOption oac = Config->get_output_auto_connect();
2130 if (oac & AutoConnectMaster) {
2131 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2133 output_chan = input_chan;
2136 /* XXX do something with name template */
2139 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
2141 session_add_audio_bus (input_chan, output_chan, count);
2146 ARDOUR_UI::mixer_settings () const
2151 node = session->instant_xml(X_("Mixer"), session->path());
2153 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2157 node = new XMLNode (X_("Mixer"));
2164 ARDOUR_UI::editor_settings () const
2169 node = session->instant_xml(X_("Editor"), session->path());
2171 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2175 node = new XMLNode (X_("Editor"));
2181 ARDOUR_UI::keyboard_settings () const
2185 node = Config->extra_xml(X_("Keyboard"));
2188 node = new XMLNode (X_("Keyboard"));
2194 ARDOUR_UI::halt_on_xrun_message ()
2196 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2198 MessageDialog msg (*editor,
2199 _("Recording was stopped because your system could not keep up."));
2204 ARDOUR_UI::delete_sources_in_the_right_thread (list<boost::shared_ptr<ARDOUR::Source> >* deletion_list)
2206 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2208 for (list<boost::shared_ptr<Source> >::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2209 (*i)->drop_references ();
2212 delete deletion_list;
2216 ARDOUR_UI::disk_overrun_handler ()
2218 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2220 if (!have_disk_overrun_displayed) {
2221 have_disk_overrun_displayed = true;
2222 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2223 The disk system on your computer\n\
2224 was not able to keep up with Ardour.\n\
2226 Specifically, it failed to write data to disk\n\
2227 quickly enough to keep up with recording.\n"));
2229 have_disk_overrun_displayed = false;
2234 ARDOUR_UI::disk_underrun_handler ()
2236 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2238 if (!have_disk_underrun_displayed) {
2239 have_disk_underrun_displayed = true;
2240 MessageDialog msg (*editor,
2241 (_("The disk system on your computer\n\
2242 was not able to keep up with Ardour.\n\
2244 Specifically, it failed to read data from disk\n\
2245 quickly enough to keep up with playback.\n")));
2247 have_disk_underrun_displayed = false;
2252 ARDOUR_UI::disk_underrun_message_gone ()
2254 have_disk_underrun_displayed = false;
2258 ARDOUR_UI::disk_overrun_message_gone ()
2260 have_disk_underrun_displayed = false;
2264 ARDOUR_UI::pending_state_dialog ()
2266 ArdourDialog dialog ("pending state dialog");
2268 This session appears to have been in\n\
2269 middle of recording when ardour or\n\
2270 the computer was shutdown.\n\
2272 Ardour can recover any captured audio for\n\
2273 you, or it can ignore it. Please decide\n\
2274 what you would like to do.\n"));
2276 dialog.get_vbox()->pack_start (message);
2277 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2278 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2280 dialog.set_position (WIN_POS_CENTER);
2283 switch (dialog.run ()) {
2284 case RESPONSE_ACCEPT:
2292 ARDOUR_UI::disconnect_from_jack ()
2295 if( engine->disconnect_from_jack ()) {
2296 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2300 update_sample_rate (0);
2305 ARDOUR_UI::reconnect_to_jack ()
2308 if (engine->reconnect_to_jack ()) {
2309 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2313 update_sample_rate (0);
2318 ARDOUR_UI::set_jack_buffer_size (nframes_t nframes)
2320 engine->request_buffer_size (nframes);
2321 update_sample_rate (0);
2325 ARDOUR_UI::cmdline_new_session (string path)
2327 if (path[0] != '/') {
2328 char buf[PATH_MAX+1];
2331 getcwd (buf, sizeof (buf));
2338 new_session (false, path);
2340 _will_create_new_session_automatically = false; /* done it */
2341 return FALSE; /* don't call it again */
2345 ARDOUR_UI::use_config ()
2347 Glib::RefPtr<Action> act;
2349 switch (Config->get_native_file_data_format ()) {
2351 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2354 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2359 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2360 ract->set_active ();
2363 switch (Config->get_native_file_header_format ()) {
2365 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2368 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2371 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2374 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2377 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2380 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2383 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2388 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2389 ract->set_active ();