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 ("BigClockNonRecording", true, false, 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::Diskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
182 ARDOUR::Diskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
184 /* handle pending state with a dialog */
186 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
188 /* have to wait for AudioEngine and Configuration before proceeding */
192 ARDOUR_UI::set_engine (AudioEngine& e)
196 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
197 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
198 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
199 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
201 ActionManager::init ();
202 new_session_dialog = new NewSessionDialog();
206 keyboard = new Keyboard;
208 if (setup_windows ()) {
209 throw failed_constructor ();
212 if (GTK_ARDOUR::show_key_actions) {
213 vector<string> names;
214 vector<string> paths;
216 vector<AccelKey> bindings;
218 ActionManager::get_all_actions (names, paths, keys, bindings);
220 vector<string>::iterator n;
221 vector<string>::iterator k;
222 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
223 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
229 /* start with timecode, metering enabled
232 blink_timeout_tag = -1;
234 /* the global configuration object is now valid */
238 /* this being a GUI and all, we want peakfiles */
240 AudioFileSource::set_build_peakfiles (true);
241 AudioFileSource::set_build_missing_peakfiles (true);
243 if (AudioSource::start_peak_thread ()) {
244 throw failed_constructor();
247 /* start the time-of-day-clock */
249 update_wall_clock ();
250 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
252 update_disk_space ();
254 update_sample_rate (engine->frame_rate());
256 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
257 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
260 ARDOUR_UI::~ARDOUR_UI ()
262 save_ardour_state ();
276 if (add_route_dialog) {
277 delete add_route_dialog;
280 AudioSource::stop_peak_thread ();
284 ARDOUR_UI::configure_timeout ()
289 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
290 /* no configure events yet */
294 gettimeofday (&now, 0);
295 timersub (&now, &last_configure_time, &diff);
297 /* force a gap of 0.5 seconds since the last configure event
300 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
303 have_configure_timeout = false;
304 save_ardour_state ();
310 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
312 if (have_configure_timeout) {
313 gettimeofday (&last_configure_time, 0);
315 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
316 have_configure_timeout = true;
323 ARDOUR_UI::save_ardour_state ()
325 if (!keyboard || !mixer || !editor) {
329 /* XXX this is all a bit dubious. add_extra_xml() uses
330 a different lifetime model from add_instant_xml().
333 XMLNode* node = new XMLNode (keyboard->get_state());
334 Config->add_extra_xml (*node);
335 Config->save_state();
337 XMLNode enode(static_cast<Stateful*>(editor)->get_state());
338 XMLNode mnode(mixer->get_state());
341 session->add_instant_xml (enode, session->path());
342 session->add_instant_xml (mnode, session->path());
344 Config->add_instant_xml (enode, get_user_ardour_path());
345 Config->add_instant_xml (mnode, get_user_ardour_path());
350 AccelMap::save ("ardour.saved_bindings");
354 ARDOUR_UI::startup ()
362 if (session && session->dirty()) {
363 switch (ask_about_saving_session(_("quit"))) {
368 /* use the default name */
369 if (save_state_canfail ("")) {
370 /* failed - don't quit */
371 MessageDialog msg (*editor,
373 Ardour was unable to save your session.\n\n\
374 If you still wish to quit, please use the\n\n\
375 \"Just quit\" option."));
386 Config->save_state();
391 ARDOUR_UI::ask_about_saving_session (const string & what)
393 ArdourDialog window (_("ardour: save session?"));
394 Gtk::HBox dhbox; // the hbox for the image and text
395 Gtk::Label prompt_label;
396 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
400 msg = string_compose(_("Don't %1"), what);
401 window.add_button (msg, RESPONSE_REJECT);
402 msg = string_compose(_("Just %1"), what);
403 window.add_button (msg, RESPONSE_APPLY);
404 msg = string_compose(_("Save and %1"), what);
405 window.add_button (msg, RESPONSE_ACCEPT);
407 window.set_default_response (RESPONSE_ACCEPT);
409 Gtk::Button noquit_button (msg);
410 noquit_button.set_name ("EditorGTKButton");
415 if (session->snap_name() == session->name()) {
418 type = _("snapshot");
420 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?"),
421 type, session->snap_name());
423 prompt_label.set_text (prompt);
424 prompt_label.set_name (X_("PrompterLabel"));
425 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
427 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
429 dhbox.set_homogeneous (false);
430 dhbox.pack_start (*dimage, false, false, 5);
431 dhbox.pack_start (prompt_label, true, false, 5);
432 window.get_vbox()->pack_start (dhbox);
434 window.set_name (_("Prompter"));
435 window.set_position (Gtk::WIN_POS_MOUSE);
436 window.set_modal (true);
437 window.set_resizable (false);
440 save_the_session = 0;
442 window.set_keep_above (true);
445 ResponseType r = (ResponseType) window.run();
450 case RESPONSE_ACCEPT: // save and get out of here
452 case RESPONSE_APPLY: // get out of here
462 ARDOUR_UI::every_second ()
465 update_buffer_load ();
466 update_disk_space ();
471 ARDOUR_UI::every_point_one_seconds ()
473 update_speed_display ();
474 RapidScreenUpdate(); /* EMIT_SIGNAL */
479 ARDOUR_UI::every_point_zero_one_seconds ()
481 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
486 ARDOUR_UI::update_sample_rate (nframes_t ignored)
490 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
492 if (!engine->connected()) {
494 snprintf (buf, sizeof (buf), _("disconnected"));
498 nframes_t rate = engine->frame_rate();
500 if (fmod (rate, 1000.0) != 0.0) {
501 snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"),
502 (float) rate/1000.0f,
503 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
505 snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"),
507 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
511 sample_rate_label.set_text (buf);
515 ARDOUR_UI::update_cpu_load ()
518 snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
519 cpu_load_label.set_text (buf);
523 ARDOUR_UI::update_buffer_load ()
528 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
529 session->playback_load(), session->capture_load());
530 buffer_load_label.set_text (buf);
532 buffer_load_label.set_text ("");
537 ARDOUR_UI::count_recenabled_streams (Route& route)
539 Track* track = dynamic_cast<Track*>(&route);
540 if (track && track->diskstream()->record_enabled()) {
541 rec_enabled_streams += track->n_inputs();
546 ARDOUR_UI::update_disk_space()
552 nframes_t frames = session->available_capture_duration();
555 if (frames == max_frames) {
556 strcpy (buf, _("Disk: 24hrs+"));
561 nframes_t fr = session->frame_rate();
563 rec_enabled_streams = 0;
564 session->foreach_route (this, &ARDOUR_UI::count_recenabled_streams);
566 if (rec_enabled_streams) {
567 frames /= rec_enabled_streams;
570 hrs = frames / (fr * 3600);
571 frames -= hrs * fr * 3600;
572 mins = frames / (fr * 60);
573 frames -= mins * fr * 60;
576 snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
579 disk_space_label.set_text (buf);
583 ARDOUR_UI::update_wall_clock ()
590 tm_now = localtime (&now);
592 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
593 wall_clock_label.set_text (buf);
598 ARDOUR_UI::control_methods_adjusted ()
603 which_method = (int) online_control_button->adjustment.get_value();
604 switch (which_method) {
606 allow_mmc_and_local ();
615 fatal << _("programming error: impossible control method") << endmsg;
621 ARDOUR_UI::mmc_device_id_adjusted ()
626 int dev_id = (int) mmc_id_button->adjustment.get_value();
627 mmc->set_device_id (dev_id);
633 ARDOUR_UI::session_menu (GdkEventButton *ev)
635 session_popup_menu->popup (0, 0);
640 ARDOUR_UI::redisplay_recent_sessions ()
642 vector<string *> *sessions;
643 vector<string *>::iterator i;
644 RecentSessionsSorter cmp;
646 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
647 recent_session_model->clear ();
650 ARDOUR::read_recent_sessions (rs);
653 recent_session_display.set_model (recent_session_model);
657 /* sort them alphabetically */
658 sort (rs.begin(), rs.end(), cmp);
659 sessions = new vector<string*>;
661 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
662 sessions->push_back (new string ((*i).second));
665 for (i = sessions->begin(); i != sessions->end(); ++i) {
667 vector<string*>* states;
668 vector<const gchar*> item;
669 string fullpath = *(*i);
671 /* remove any trailing / */
673 if (fullpath[fullpath.length()-1] == '/') {
674 fullpath = fullpath.substr (0, fullpath.length()-1);
677 /* now get available states for this session */
679 if ((states = Session::possible_states (fullpath)) == 0) {
684 TreeModel::Row row = *(recent_session_model->append());
686 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
687 row[recent_session_columns.fullpath] = fullpath;
689 if (states->size() > 1) {
691 /* add the children */
693 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
695 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
697 child_row[recent_session_columns.visible_name] = **i2;
698 child_row[recent_session_columns.fullpath] = fullpath;
707 recent_session_display.set_model (recent_session_model);
712 ARDOUR_UI::build_session_selector ()
714 session_selector_window = new ArdourDialog ("session selector");
716 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
718 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
719 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
720 session_selector_window->set_default_response (RESPONSE_ACCEPT);
721 recent_session_model = TreeStore::create (recent_session_columns);
722 recent_session_display.set_model (recent_session_model);
723 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
724 recent_session_display.set_headers_visible (false);
725 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
727 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
729 scroller->add (recent_session_display);
730 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
732 session_selector_window->set_name ("SessionSelectorWindow");
733 session_selector_window->set_size_request (200, 400);
734 session_selector_window->get_vbox()->pack_start (*scroller);
735 session_selector_window->show_all_children();
739 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
741 session_selector_window->response (RESPONSE_ACCEPT);
745 ARDOUR_UI::open_recent_session ()
747 /* popup selector window */
749 if (session_selector_window == 0) {
750 build_session_selector ();
753 redisplay_recent_sessions ();
755 ResponseType r = (ResponseType) session_selector_window->run ();
757 session_selector_window->hide();
760 case RESPONSE_ACCEPT:
766 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
768 if (i == recent_session_model->children().end()) {
772 Glib::ustring path = (*i)[recent_session_columns.fullpath];
773 Glib::ustring state = (*i)[recent_session_columns.visible_name];
775 _session_is_new = false;
777 load_session (path, state);
781 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
785 if (stat (info.filename.c_str(), &statbuf) != 0) {
789 if (!S_ISDIR(statbuf.st_mode)) {
795 string session_file = info.filename;
797 session_file += Glib::path_get_basename (info.filename);
798 session_file += ".ardour";
800 if (stat (session_file.c_str(), &statbuf) != 0) {
804 return S_ISREG (statbuf.st_mode);
808 ARDOUR_UI::open_session ()
810 /* popup selector window */
812 if (open_session_selector == 0) {
814 /* ardour sessions are folders */
816 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
817 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
818 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
820 FileFilter session_filter;
821 session_filter.add_pattern ("*.ardour");
822 session_filter.set_name (_("Ardour sessions"));
823 open_session_selector->add_filter (session_filter);
824 open_session_selector->set_filter (session_filter);
827 int response = open_session_selector->run();
828 open_session_selector->hide ();
831 case RESPONSE_ACCEPT:
834 open_session_selector->hide();
838 open_session_selector->hide();
839 string session_path = open_session_selector->get_filename();
843 if (session_path.length() > 0) {
844 if (Session::find_session (session_path, path, name, isnew) == 0) {
845 _session_is_new = isnew;
846 load_session (path, name);
853 ARDOUR_UI::session_add_midi_track ()
855 cerr << _("Patience is a virtue.\n");
859 ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many)
861 list<boost::shared_ptr<AudioTrack> > tracks;
862 Session::RouteList routes;
865 warning << _("You cannot add a track or bus without a session already loaded.") << endmsg;
871 tracks = session->new_audio_track (input_channels, output_channels, mode, how_many);
873 if (tracks.size() != how_many) {
875 error << _("could not create a new audio track") << endmsg;
877 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
883 routes = session->new_audio_route (input_channels, output_channels, how_many);
885 if (routes.size() != how_many) {
887 error << _("could not create a new audio track") << endmsg;
889 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
895 if (need_control_room_outs) {
901 route->set_stereo_control_outs (control_lr_channels);
902 route->control_outs()->set_stereo_pan (pans, this);
904 #endif /* CONTROLOUTS */
908 MessageDialog msg (*editor,
909 _("There are insufficient JACK ports available\n\
910 to create a new track or bus.\n\
911 You should save Ardour, exit and\n\
912 restart JACK with more ports."));
918 ARDOUR_UI::do_transport_locate (nframes_t new_position)
920 nframes_t _preroll = 0;
923 // XXX CONFIG_CHANGE FIX - requires AnyTime handling
924 // _preroll = session->convert_to_frames_at (new_position, Config->get_preroll());
926 if (new_position > _preroll) {
927 new_position -= _preroll;
932 session->request_locate (new_position);
937 ARDOUR_UI::transport_goto_start ()
940 session->goto_start();
943 /* force displayed area in editor to start no matter
944 what "follow playhead" setting is.
948 editor->reposition_x_origin (session->current_start_frame());
954 ARDOUR_UI::transport_goto_zero ()
957 session->request_locate (0);
960 /* force displayed area in editor to start no matter
961 what "follow playhead" setting is.
965 editor->reposition_x_origin (0);
971 ARDOUR_UI::transport_goto_end ()
974 nframes_t frame = session->current_end_frame();
975 session->request_locate (frame);
977 /* force displayed area in editor to start no matter
978 what "follow playhead" setting is.
982 editor->reposition_x_origin (frame);
988 ARDOUR_UI::transport_stop ()
994 if (session->is_auditioning()) {
995 session->cancel_audition ();
999 if (session->get_play_loop ()) {
1000 session->request_play_loop (false);
1003 session->request_stop ();
1007 ARDOUR_UI::transport_stop_and_forget_capture ()
1010 session->request_stop (true);
1015 ARDOUR_UI::remove_last_capture()
1018 editor->remove_last_capture();
1023 ARDOUR_UI::transport_record ()
1026 switch (session->record_status()) {
1027 case Session::Disabled:
1028 if (session->ntracks() == 0) {
1029 MessageDialog msg (*editor, _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu."));
1033 session->maybe_enable_record ();
1035 case Session::Recording:
1036 case Session::Enabled:
1037 session->disable_record (true);
1043 ARDOUR_UI::transport_roll ()
1051 rolling = session->transport_rolling ();
1053 if (session->get_play_loop()) {
1054 session->request_play_loop (false);
1055 auto_loop_button.set_active (false);
1056 roll_button.set_active (true);
1057 } else if (session->get_play_range ()) {
1058 session->request_play_range (false);
1059 play_selection_button.set_active (false);
1060 } else if (rolling) {
1061 session->request_locate (session->last_transport_start(), true);
1064 session->request_transport_speed (1.0f);
1068 ARDOUR_UI::transport_loop()
1071 if (session->get_play_loop()) {
1072 if (session->transport_rolling()) {
1073 Location * looploc = session->locations()->auto_loop_location();
1075 session->request_locate (looploc->start(), true);
1080 session->request_play_loop (true);
1086 ARDOUR_UI::transport_play_selection ()
1092 if (!session->get_play_range()) {
1093 session->request_stop ();
1096 editor->play_selection ();
1100 ARDOUR_UI::transport_rewind (int option)
1102 float current_transport_speed;
1105 current_transport_speed = session->transport_speed();
1107 if (current_transport_speed >= 0.0f) {
1110 session->request_transport_speed (-1.0f);
1113 session->request_transport_speed (-4.0f);
1116 session->request_transport_speed (-0.5f);
1121 session->request_transport_speed (current_transport_speed * 1.5f);
1127 ARDOUR_UI::transport_forward (int option)
1129 float current_transport_speed;
1132 current_transport_speed = session->transport_speed();
1134 if (current_transport_speed <= 0.0f) {
1137 session->request_transport_speed (1.0f);
1140 session->request_transport_speed (4.0f);
1143 session->request_transport_speed (0.5f);
1148 session->request_transport_speed (current_transport_speed * 1.5f);
1154 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1160 boost::shared_ptr<Route> r;
1162 if ((r = session->route_by_remote_id (dstream)) != 0) {
1166 if ((t = dynamic_cast<Track*>(r.get())) != 0) {
1167 t->diskstream()->set_record_enabled (!t->diskstream()->record_enabled());
1176 ARDOUR_UI::queue_transport_change ()
1178 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1182 ARDOUR_UI::map_transport_state ()
1184 float sp = session->transport_speed();
1187 transport_rolling ();
1188 } else if (sp < 0.0f) {
1189 transport_rewinding ();
1190 } else if (sp > 0.0f) {
1191 transport_forwarding ();
1193 transport_stopped ();
1198 ARDOUR_UI::allow_local_only ()
1204 ARDOUR_UI::allow_mmc_only ()
1210 ARDOUR_UI::allow_mmc_and_local ()
1216 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1218 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1219 (int) adj.get_value()].c_str());
1223 ARDOUR_UI::engine_stopped ()
1225 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1226 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1227 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1231 ARDOUR_UI::engine_running ()
1233 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1234 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1235 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1239 ARDOUR_UI::engine_halted ()
1241 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1243 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1244 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1246 update_sample_rate (0);
1248 MessageDialog msg (*editor,
1250 JACK has either been shutdown or it\n\
1251 disconnected Ardour because Ardour\n\
1252 was not fast enough. You can save the\n\
1253 session and/or try to reconnect to JACK ."));
1258 ARDOUR_UI::do_engine_start ()
1264 catch (AudioEngine::PortRegistrationFailure& err) {
1266 error << _("Unable to create all required ports")
1274 error << _("Unable to start the session running")
1284 ARDOUR_UI::start_engine ()
1286 if (do_engine_start () == 0) {
1287 if (session && _session_is_new) {
1288 /* we need to retain initial visual
1289 settings for a new session
1291 session->save_state ("");
1294 /* there is too much going on, in too many threads, for us to
1295 end up with a clean session. So wait 1 second after loading,
1296 and fix it up. its ugly, but until i come across a better
1297 solution, its what we have.
1300 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1307 ARDOUR_UI::update_clocks ()
1309 if (!editor || !editor->dragging_playhead()) {
1310 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1315 ARDOUR_UI::start_clocking ()
1317 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1321 ARDOUR_UI::stop_clocking ()
1323 clock_signal_connection.disconnect ();
1327 ARDOUR_UI::toggle_clocking ()
1330 if (clock_button.get_active()) {
1339 ARDOUR_UI::_blink (void *arg)
1342 ((ARDOUR_UI *) arg)->blink ();
1349 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1353 ARDOUR_UI::start_blinking ()
1355 /* Start the blink signal. Everybody with a blinking widget
1356 uses Blink to drive the widget's state.
1359 if (blink_timeout_tag < 0) {
1361 blink_timeout_tag = g_timeout_add (240, _blink, this);
1366 ARDOUR_UI::stop_blinking ()
1368 if (blink_timeout_tag >= 0) {
1369 g_source_remove (blink_timeout_tag);
1370 blink_timeout_tag = -1;
1375 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1381 if (io.n_inputs() == 0) {
1386 /* XXX we're not handling multiple ports yet. */
1388 const char **connections = io.input(0)->get_connections();
1390 if (connections == 0 || connections[0] == '\0') {
1393 buf = connections[0];
1400 if (io.n_outputs() == 0) {
1405 /* XXX we're not handling multiple ports yet. */
1407 const char **connections = io.output(0)->get_connections();
1409 if (connections == 0 || connections[0] == '\0') {
1412 buf = connections[0];
1420 ARDOUR_UI::snapshot_session ()
1422 ArdourPrompter prompter (true);
1429 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1431 prompter.set_name ("Prompter");
1432 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1433 prompter.set_prompt (_("Name of New Snapshot"));
1434 prompter.set_initial_text (now);
1436 switch (prompter.run()) {
1437 case RESPONSE_ACCEPT:
1438 prompter.get_result (snapname);
1439 if (snapname.length()){
1440 save_state (snapname);
1450 ARDOUR_UI::save_state (const string & name)
1452 (void) save_state_canfail (name);
1456 ARDOUR_UI::save_state_canfail (string name)
1461 if (name.length() == 0) {
1462 name = session->snap_name();
1465 if ((ret = session->save_state (name)) != 0) {
1469 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1474 ARDOUR_UI::restore_state (string name)
1477 if (name.length() == 0) {
1478 name = session->name();
1480 session->restore_state (name);
1485 ARDOUR_UI::primary_clock_value_changed ()
1488 session->request_locate (primary_clock.current_time ());
1493 ARDOUR_UI::secondary_clock_value_changed ()
1496 session->request_locate (secondary_clock.current_time ());
1501 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1503 if (session && dstream && dstream->record_enabled()) {
1505 Session::RecordState rs;
1507 rs = session->record_status ();
1510 case Session::Disabled:
1511 case Session::Enabled:
1512 if (w->get_state() != STATE_SELECTED) {
1513 w->set_state (STATE_SELECTED);
1517 case Session::Recording:
1518 if (w->get_state() != STATE_ACTIVE) {
1519 w->set_state (STATE_ACTIVE);
1525 if (w->get_state() != STATE_NORMAL) {
1526 w->set_state (STATE_NORMAL);
1532 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1538 switch (session->record_status()) {
1539 case Session::Enabled:
1541 rec_button.set_state (1);
1543 rec_button.set_state (0);
1547 case Session::Recording:
1548 rec_button.set_state (2);
1552 rec_button.set_state (0);
1558 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1566 ARDOUR_UI::start_keyboard_prefix ()
1568 keyboard->start_prefix();
1572 ARDOUR_UI::save_template ()
1575 ArdourPrompter prompter (true);
1578 prompter.set_name (X_("Prompter"));
1579 prompter.set_prompt (_("Name for mix template:"));
1580 prompter.set_initial_text(session->name() + _("-template"));
1581 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1583 switch (prompter.run()) {
1584 case RESPONSE_ACCEPT:
1585 prompter.get_result (name);
1587 if (name.length()) {
1588 session->save_template (name);
1598 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1600 string session_name;
1601 string session_path;
1603 int response = Gtk::RESPONSE_NONE;
1605 new_session_dialog->set_modal(true);
1606 new_session_dialog->set_name (predetermined_path);
1607 new_session_dialog->reset_recent();
1608 new_session_dialog->show();
1611 response = new_session_dialog->run ();
1613 _session_is_new = false;
1615 if (response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1620 new_session_dialog->hide ();
1623 } else if (response == Gtk::RESPONSE_NONE) {
1625 /* Clear was pressed */
1626 new_session_dialog->reset();
1628 } else if (response == Gtk::RESPONSE_YES) {
1630 /* YES == OPEN, but there's no enum for that */
1632 session_name = new_session_dialog->session_name();
1634 if (session_name.empty()) {
1635 response = Gtk::RESPONSE_NONE;
1639 if (session_name[0] == '/' ||
1640 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1641 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1642 load_session (Glib::path_get_dirname (session_name), session_name);
1644 session_path = new_session_dialog->session_folder();
1645 load_session (session_path, session_name);
1648 } else if (response == Gtk::RESPONSE_OK) {
1650 session_name = new_session_dialog->session_name();
1652 if (new_session_dialog->get_current_page() == 1) {
1654 /* XXX this is a bit of a hack..
1655 i really want the new sesion dialog to return RESPONSE_YES
1656 if we're on page 1 (the load page)
1657 Unfortunately i can't see how atm..
1660 if (session_name.empty()) {
1661 response = Gtk::RESPONSE_NONE;
1665 if (session_name[0] == '/' ||
1666 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1667 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1668 load_session (Glib::path_get_dirname (session_name), session_name);
1670 session_path = new_session_dialog->session_folder();
1671 load_session (session_path, session_name);
1676 if (session_name.empty()) {
1677 response = Gtk::RESPONSE_NONE;
1681 if (session_name[0] == '/' ||
1682 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1683 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1685 session_path = Glib::path_get_dirname (session_name);
1686 session_name = Glib::path_get_basename (session_name);
1690 session_path = new_session_dialog->session_folder();
1694 //XXX This is needed because session constructor wants a
1695 //non-existant path. hopefully this will be fixed at some point.
1697 session_path = Glib::build_filename (session_path, session_name);
1699 if (g_file_test (session_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) {
1701 Glib::ustring str = string_compose (_("This session\n%1\nalready exists. Do you want to open it?"), session_path);
1703 MessageDialog msg (str,
1705 Gtk::MESSAGE_WARNING,
1706 Gtk::BUTTONS_YES_NO,
1710 msg.set_name (X_("CleanupDialog"));
1711 msg.set_wmclass (_("existing_session"), "Ardour");
1712 msg.set_position (Gtk::WIN_POS_MOUSE);
1714 switch (msg.run()) {
1716 load_session (session_path, session_name);
1720 response = RESPONSE_NONE;
1721 new_session_dialog->reset ();
1726 _session_is_new = true;
1728 std::string template_name = new_session_dialog->session_template_name();
1730 if (new_session_dialog->use_session_template()) {
1732 load_session (session_path, session_name, &template_name);
1738 AutoConnectOption iconnect;
1739 AutoConnectOption oconnect;
1741 if (new_session_dialog->create_control_bus()) {
1742 cchns = (uint32_t) new_session_dialog->control_channel_count();
1747 if (new_session_dialog->create_master_bus()) {
1748 mchns = (uint32_t) new_session_dialog->master_channel_count();
1753 if (new_session_dialog->connect_inputs()) {
1754 iconnect = AutoConnectPhysical;
1756 iconnect = AutoConnectOption (0);
1759 /// @todo some minor tweaks.
1761 if (new_session_dialog->connect_outs_to_master()) {
1762 oconnect = AutoConnectMaster;
1763 } else if (new_session_dialog->connect_outs_to_physical()) {
1764 oconnect = AutoConnectPhysical;
1766 oconnect = AutoConnectOption (0);
1769 uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
1770 uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count();
1772 build_session (session_path,
1780 engine->frame_rate() * 60 * 5);
1785 } while (response == Gtk::RESPONSE_NONE);
1789 new_session_dialog->get_window()->set_cursor();
1790 new_session_dialog->hide();
1794 ARDOUR_UI::close_session()
1801 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1803 Session *new_session;
1805 session_loaded = false;
1806 x = unload_session ();
1814 /* if it already exists, we must have write access */
1816 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1817 MessageDialog msg (*editor, _("\
1818 You do not have write access to this session.\n\
1819 This prevents the session from being loaded."));
1825 new_session = new Session (*engine, path, snap_name, mix_template);
1830 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1834 connect_to_session (new_session);
1836 Config->set_current_owner (ConfigVariableBase::Interface);
1838 session_loaded = true;
1840 goto_editor_window ();
1846 ARDOUR_UI::make_session_clean ()
1849 session->set_clean ();
1858 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1859 uint32_t control_channels,
1860 uint32_t master_channels,
1861 AutoConnectOption input_connect,
1862 AutoConnectOption output_connect,
1865 nframes_t initial_length)
1867 Session *new_session;
1870 session_loaded = false;
1871 x = unload_session ();
1878 _session_is_new = true;
1881 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1882 control_channels, master_channels, nphysin, nphysout, initial_length);
1887 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1891 connect_to_session (new_session);
1893 session_loaded = true;
1901 editor->show_window ();
1912 ARDOUR_UI::show_splash ()
1915 about = new About();
1916 about->signal_response().connect(mem_fun (*this, &ARDOUR_UI::about_signal_response) );
1923 ARDOUR_UI::about_signal_response(int response)
1929 ARDOUR_UI::hide_splash ()
1932 about->get_window()->set_cursor ();
1938 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1942 removed = rep.paths.size();
1945 MessageDialog msgd (*editor,
1946 _("No audio files were ready for cleanup"),
1949 (Gtk::ButtonsType)(Gtk::BUTTONS_OK) );
1950 msgd.set_secondary_text (_("If this seems suprising, \n\
1951 check for any existing snapshots.\n\
1952 These may still include regions that\n\
1953 require some unused files to continue to exist."));
1959 ArdourDialog results (_("ardour: cleanup"), true, false);
1961 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1962 CleanupResultsModelColumns() {
1966 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1967 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1971 CleanupResultsModelColumns results_columns;
1972 Glib::RefPtr<Gtk::ListStore> results_model;
1973 Gtk::TreeView results_display;
1975 results_model = ListStore::create (results_columns);
1976 results_display.set_model (results_model);
1977 results_display.append_column (list_title, results_columns.visible_name);
1979 results_display.set_name ("CleanupResultsList");
1980 results_display.set_headers_visible (true);
1981 results_display.set_headers_clickable (false);
1982 results_display.set_reorderable (false);
1984 Gtk::ScrolledWindow list_scroller;
1987 Gtk::HBox dhbox; // the hbox for the image and text
1988 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1989 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1991 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1993 if (rep.space < 1048576.0f) {
1995 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1997 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
2001 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
2003 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
2007 dhbox.pack_start (*dimage, true, false, 5);
2008 dhbox.pack_start (txt, true, false, 5);
2010 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
2011 TreeModel::Row row = *(results_model->append());
2012 row[results_columns.visible_name] = *i;
2013 row[results_columns.fullpath] = *i;
2016 list_scroller.add (results_display);
2017 list_scroller.set_size_request (-1, 150);
2018 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2020 dvbox.pack_start (dhbox, true, false, 5);
2021 dvbox.pack_start (list_scroller, true, false, 5);
2022 ddhbox.pack_start (dvbox, true, false, 5);
2024 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2025 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2026 results.set_default_response (RESPONSE_CLOSE);
2027 results.set_position (Gtk::WIN_POS_MOUSE);
2028 results.show_all_children ();
2029 results.set_resizable (false);
2036 ARDOUR_UI::cleanup ()
2039 /* shouldn't happen: menu item is insensitive */
2044 MessageDialog checker (_("Are you sure you want to cleanup?"),
2046 Gtk::MESSAGE_QUESTION,
2047 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2049 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2050 ALL undo/redo information will be lost if you cleanup.\n\
2051 After cleanup, unused audio files will be moved to a \
2052 \"dead sounds\" location."));
2054 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2055 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2056 checker.set_default_response (RESPONSE_CANCEL);
2058 checker.set_name (_("CleanupDialog"));
2059 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2060 checker.set_position (Gtk::WIN_POS_MOUSE);
2062 switch (checker.run()) {
2063 case RESPONSE_ACCEPT:
2069 Session::cleanup_report rep;
2071 editor->prepare_for_cleanup ();
2073 if (session->cleanup_sources (rep)) {
2077 display_cleanup_results (rep,
2080 The following %1 %2 not in use and \n\
2081 have been moved to:\n\
2083 Flushing the wastebasket will \n\
2084 release an additional\n\
2085 %4 %5bytes of disk space.\n"
2090 ARDOUR_UI::flush_trash ()
2093 /* shouldn't happen: menu item is insensitive */
2097 Session::cleanup_report rep;
2099 if (session->cleanup_trash_sources (rep)) {
2103 display_cleanup_results (rep,
2105 _("The following %1 %2 deleted from\n\
2107 releasing %4 %5bytes of disk space"));
2111 ARDOUR_UI::add_route ()
2119 if (add_route_dialog == 0) {
2120 add_route_dialog = new AddRouteDialog;
2121 editor->ensure_float (*add_route_dialog);
2124 if (add_route_dialog->is_visible()) {
2125 /* we're already doing this */
2129 ResponseType r = (ResponseType) add_route_dialog->run ();
2131 add_route_dialog->hide();
2134 case RESPONSE_ACCEPT:
2141 if ((count = add_route_dialog->count()) <= 0) {
2145 uint32_t input_chan = add_route_dialog->channels ();
2146 uint32_t output_chan;
2147 string name_template = add_route_dialog->name_template ();
2148 bool track = add_route_dialog->track ();
2150 AutoConnectOption oac = Config->get_output_auto_connect();
2152 if (oac & AutoConnectMaster) {
2153 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2155 output_chan = input_chan;
2158 /* XXX do something with name template */
2161 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
2163 session_add_audio_bus (input_chan, output_chan, count);
2168 ARDOUR_UI::mixer_settings () const
2173 node = session->instant_xml(X_("Mixer"), session->path());
2175 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2179 node = new XMLNode (X_("Mixer"));
2186 ARDOUR_UI::editor_settings () const
2191 node = session->instant_xml(X_("Editor"), session->path());
2193 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2197 node = new XMLNode (X_("Editor"));
2203 ARDOUR_UI::keyboard_settings () const
2207 node = Config->extra_xml(X_("Keyboard"));
2210 node = new XMLNode (X_("Keyboard"));
2216 ARDOUR_UI::halt_on_xrun_message ()
2218 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2220 MessageDialog msg (*editor,
2221 _("Recording was stopped because your system could not keep up."));
2226 ARDOUR_UI::disk_overrun_handler ()
2228 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2230 if (!have_disk_overrun_displayed) {
2231 have_disk_overrun_displayed = true;
2232 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2233 The disk system on your computer\n\
2234 was not able to keep up with Ardour.\n\
2236 Specifically, it failed to write data to disk\n\
2237 quickly enough to keep up with recording.\n"));
2239 have_disk_overrun_displayed = false;
2244 ARDOUR_UI::disk_underrun_handler ()
2246 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2248 if (!have_disk_underrun_displayed) {
2249 have_disk_underrun_displayed = true;
2250 MessageDialog msg (*editor,
2251 (_("The disk system on your computer\n\
2252 was not able to keep up with Ardour.\n\
2254 Specifically, it failed to read data from disk\n\
2255 quickly enough to keep up with playback.\n")));
2257 have_disk_underrun_displayed = false;
2262 ARDOUR_UI::disk_underrun_message_gone ()
2264 have_disk_underrun_displayed = false;
2268 ARDOUR_UI::disk_overrun_message_gone ()
2270 have_disk_underrun_displayed = false;
2274 ARDOUR_UI::pending_state_dialog ()
2276 ArdourDialog dialog ("pending state dialog");
2278 This session appears to have been in\n\
2279 middle of recording when ardour or\n\
2280 the computer was shutdown.\n\
2282 Ardour can recover any captured audio for\n\
2283 you, or it can ignore it. Please decide\n\
2284 what you would like to do.\n"));
2286 dialog.get_vbox()->pack_start (message);
2287 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2288 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2290 dialog.set_position (WIN_POS_CENTER);
2293 switch (dialog.run ()) {
2294 case RESPONSE_ACCEPT:
2302 ARDOUR_UI::disconnect_from_jack ()
2305 if( engine->disconnect_from_jack ()) {
2306 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2310 update_sample_rate (0);
2315 ARDOUR_UI::reconnect_to_jack ()
2318 if (engine->reconnect_to_jack ()) {
2319 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2323 update_sample_rate (0);
2328 ARDOUR_UI::set_jack_buffer_size (nframes_t nframes)
2330 engine->request_buffer_size (nframes);
2331 update_sample_rate (0);
2335 ARDOUR_UI::cmdline_new_session (string path)
2337 if (path[0] != '/') {
2338 char buf[PATH_MAX+1];
2341 getcwd (buf, sizeof (buf));
2348 new_session (false, path);
2350 _will_create_new_session_automatically = false; /* done it */
2351 return FALSE; /* don't call it again */
2355 ARDOUR_UI::use_config ()
2357 Glib::RefPtr<Action> act;
2359 switch (Config->get_native_file_data_format ()) {
2361 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2364 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2369 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2370 ract->set_active ();
2373 switch (Config->get_native_file_header_format ()) {
2375 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2378 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2381 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2384 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2387 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2390 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2393 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2398 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2399 ract->set_active ();
2404 ARDOUR_UI::update_transport_clocks (nframes_t pos)
2406 primary_clock.set (pos);
2407 secondary_clock.set (pos);
2409 if (big_clock_window) {
2410 big_clock.set (pos);
2415 ARDOUR_UI::record_state_changed ()
2417 if (!session || !big_clock_window) {
2418 /* why bother - the clock isn't visible */
2422 switch (session->record_status()) {
2423 case Session::Recording:
2424 big_clock.set_name ("BigClockRecording");
2427 big_clock.set_name ("BigClockNonRecording");