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 ()
356 /* Once the UI is up and running, start the audio engine. Doing
357 this before the UI is up and running can cause problems
358 when not running with SCHED_FIFO, because the amount of
359 CPU and disk work needed to get the UI started can interfere
360 with the scheduling of the audio thread.
363 Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
369 if (session && session->dirty()) {
370 switch (ask_about_saving_session(_("quit"))) {
375 /* use the default name */
376 if (save_state_canfail ("")) {
377 /* failed - don't quit */
378 MessageDialog msg (*editor,
380 Ardour was unable to save your session.\n\n\
381 If you still wish to quit, please use the\n\n\
382 \"Just quit\" option."));
391 Config->save_state();
396 ARDOUR_UI::ask_about_saving_session (const string & what)
398 ArdourDialog window (_("ardour: save session?"));
399 Gtk::HBox dhbox; // the hbox for the image and text
400 Gtk::Label prompt_label;
401 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
405 msg = string_compose(_("Don't %1"), what);
406 window.add_button (msg, RESPONSE_REJECT);
407 msg = string_compose(_("Just %1"), what);
408 window.add_button (msg, RESPONSE_APPLY);
409 msg = string_compose(_("Save and %1"), what);
410 window.add_button (msg, RESPONSE_ACCEPT);
412 window.set_default_response (RESPONSE_ACCEPT);
414 Gtk::Button noquit_button (msg);
415 noquit_button.set_name ("EditorGTKButton");
420 if (session->snap_name() == session->name()) {
423 type = _("snapshot");
425 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?"),
426 type, session->snap_name());
428 prompt_label.set_text (prompt);
429 prompt_label.set_name (X_("PrompterLabel"));
430 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
432 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
434 dhbox.set_homogeneous (false);
435 dhbox.pack_start (*dimage, false, false, 5);
436 dhbox.pack_start (prompt_label, true, false, 5);
437 window.get_vbox()->pack_start (dhbox);
439 window.set_name (_("Prompter"));
440 window.set_position (Gtk::WIN_POS_MOUSE);
441 window.set_modal (true);
442 window.set_resizable (false);
445 save_the_session = 0;
449 ResponseType r = (ResponseType) window.run();
454 case RESPONSE_ACCEPT: // save and get out of here
456 case RESPONSE_APPLY: // get out of here
466 ARDOUR_UI::every_second ()
469 update_buffer_load ();
470 update_disk_space ();
475 ARDOUR_UI::every_point_one_seconds ()
477 update_speed_display ();
478 RapidScreenUpdate(); /* EMIT_SIGNAL */
483 ARDOUR_UI::every_point_zero_one_seconds ()
485 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
490 ARDOUR_UI::update_sample_rate (nframes_t ignored)
494 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
496 if (!engine->connected()) {
498 snprintf (buf, sizeof (buf), _("disconnected"));
502 nframes_t rate = engine->frame_rate();
504 if (fmod (rate, 1000.0) != 0.0) {
505 snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"),
506 (float) rate/1000.0f,
507 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
509 snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"),
511 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
515 sample_rate_label.set_text (buf);
519 ARDOUR_UI::update_cpu_load ()
522 snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
523 cpu_load_label.set_text (buf);
527 ARDOUR_UI::update_buffer_load ()
532 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
533 session->playback_load(), session->capture_load());
534 buffer_load_label.set_text (buf);
536 buffer_load_label.set_text ("");
541 ARDOUR_UI::count_recenabled_streams (Route& route)
543 Track* track = dynamic_cast<Track*>(&route);
544 if (track && track->diskstream()->record_enabled()) {
545 rec_enabled_streams += track->n_inputs();
550 ARDOUR_UI::update_disk_space()
556 nframes_t frames = session->available_capture_duration();
559 if (frames == max_frames) {
560 strcpy (buf, _("Disk: 24hrs+"));
565 nframes_t fr = session->frame_rate();
567 rec_enabled_streams = 0;
568 session->foreach_route (this, &ARDOUR_UI::count_recenabled_streams);
570 if (rec_enabled_streams) {
571 frames /= rec_enabled_streams;
574 hrs = frames / (fr * 3600);
575 frames -= hrs * fr * 3600;
576 mins = frames / (fr * 60);
577 frames -= mins * fr * 60;
580 snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
583 disk_space_label.set_text (buf);
587 ARDOUR_UI::update_wall_clock ()
594 tm_now = localtime (&now);
596 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
597 wall_clock_label.set_text (buf);
602 ARDOUR_UI::control_methods_adjusted ()
607 which_method = (int) online_control_button->adjustment.get_value();
608 switch (which_method) {
610 allow_mmc_and_local ();
619 fatal << _("programming error: impossible control method") << endmsg;
625 ARDOUR_UI::mmc_device_id_adjusted ()
630 int dev_id = (int) mmc_id_button->adjustment.get_value();
631 mmc->set_device_id (dev_id);
637 ARDOUR_UI::session_menu (GdkEventButton *ev)
639 session_popup_menu->popup (0, 0);
644 ARDOUR_UI::redisplay_recent_sessions ()
646 vector<string *> *sessions;
647 vector<string *>::iterator i;
648 RecentSessionsSorter cmp;
650 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
651 recent_session_model->clear ();
654 ARDOUR::read_recent_sessions (rs);
657 recent_session_display.set_model (recent_session_model);
661 /* sort them alphabetically */
662 sort (rs.begin(), rs.end(), cmp);
663 sessions = new vector<string*>;
665 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
666 sessions->push_back (new string ((*i).second));
669 for (i = sessions->begin(); i != sessions->end(); ++i) {
671 vector<string*>* states;
672 vector<const gchar*> item;
673 string fullpath = *(*i);
675 /* remove any trailing / */
677 if (fullpath[fullpath.length()-1] == '/') {
678 fullpath = fullpath.substr (0, fullpath.length()-1);
681 /* now get available states for this session */
683 if ((states = Session::possible_states (fullpath)) == 0) {
688 TreeModel::Row row = *(recent_session_model->append());
690 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
691 row[recent_session_columns.fullpath] = fullpath;
693 if (states->size() > 1) {
695 /* add the children */
697 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
699 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
701 child_row[recent_session_columns.visible_name] = **i2;
702 child_row[recent_session_columns.fullpath] = fullpath;
711 recent_session_display.set_model (recent_session_model);
716 ARDOUR_UI::build_session_selector ()
718 session_selector_window = new ArdourDialog ("session selector");
720 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
722 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
723 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
724 session_selector_window->set_default_response (RESPONSE_ACCEPT);
725 recent_session_model = TreeStore::create (recent_session_columns);
726 recent_session_display.set_model (recent_session_model);
727 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
728 recent_session_display.set_headers_visible (false);
729 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
731 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
733 scroller->add (recent_session_display);
734 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
736 session_selector_window->set_name ("SessionSelectorWindow");
737 session_selector_window->set_size_request (200, 400);
738 session_selector_window->get_vbox()->pack_start (*scroller);
739 session_selector_window->show_all_children();
743 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
745 session_selector_window->response (RESPONSE_ACCEPT);
749 ARDOUR_UI::open_recent_session ()
751 /* popup selector window */
753 if (session_selector_window == 0) {
754 build_session_selector ();
757 redisplay_recent_sessions ();
759 ResponseType r = (ResponseType) session_selector_window->run ();
761 session_selector_window->hide();
764 case RESPONSE_ACCEPT:
770 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
772 if (i == recent_session_model->children().end()) {
776 Glib::ustring path = (*i)[recent_session_columns.fullpath];
777 Glib::ustring state = (*i)[recent_session_columns.visible_name];
779 _session_is_new = false;
781 load_session (path, state);
785 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
789 if (stat (info.filename.c_str(), &statbuf) != 0) {
793 if (!S_ISDIR(statbuf.st_mode)) {
799 string session_file = info.filename;
801 session_file += Glib::path_get_basename (info.filename);
802 session_file += ".ardour";
804 if (stat (session_file.c_str(), &statbuf) != 0) {
808 return S_ISREG (statbuf.st_mode);
812 ARDOUR_UI::open_session ()
814 /* popup selector window */
816 if (open_session_selector == 0) {
818 /* ardour sessions are folders */
820 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
821 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
822 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
824 FileFilter session_filter;
825 session_filter.add_pattern ("*.ardour");
826 session_filter.set_name (_("Ardour sessions"));
827 open_session_selector->add_filter (session_filter);
828 open_session_selector->set_filter (session_filter);
831 int response = open_session_selector->run();
832 open_session_selector->hide ();
835 case RESPONSE_ACCEPT:
838 open_session_selector->hide();
842 open_session_selector->hide();
843 string session_path = open_session_selector->get_filename();
847 if (session_path.length() > 0) {
848 if (Session::find_session (session_path, path, name, isnew) == 0) {
849 _session_is_new = isnew;
850 load_session (path, name);
857 ARDOUR_UI::session_add_midi_track ()
859 cerr << _("Patience is a virtue.\n");
863 ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many)
865 list<boost::shared_ptr<AudioTrack> > tracks;
866 Session::RouteList routes;
869 warning << _("You cannot add a track or bus without a session already loaded.") << endmsg;
875 tracks = session->new_audio_track (input_channels, output_channels, mode, how_many);
877 if (tracks.size() != how_many) {
879 error << _("could not create a new audio track") << endmsg;
881 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
887 routes = session->new_audio_route (input_channels, output_channels, how_many);
889 if (routes.size() != how_many) {
891 error << _("could not create a new audio track") << endmsg;
893 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
899 if (need_control_room_outs) {
905 route->set_stereo_control_outs (control_lr_channels);
906 route->control_outs()->set_stereo_pan (pans, this);
908 #endif /* CONTROLOUTS */
912 MessageDialog msg (*editor,
913 _("There are insufficient JACK ports available\n\
914 to create a new track or bus.\n\
915 You should save Ardour, exit and\n\
916 restart JACK with more ports."));
922 ARDOUR_UI::do_transport_locate (nframes_t new_position)
924 nframes_t _preroll = 0;
927 // XXX CONFIG_CHANGE FIX - requires AnyTime handling
928 // _preroll = session->convert_to_frames_at (new_position, Config->get_preroll());
930 if (new_position > _preroll) {
931 new_position -= _preroll;
936 session->request_locate (new_position);
941 ARDOUR_UI::transport_goto_start ()
944 session->goto_start();
947 /* force displayed area in editor to start no matter
948 what "follow playhead" setting is.
952 editor->reposition_x_origin (session->current_start_frame());
958 ARDOUR_UI::transport_goto_zero ()
961 session->request_locate (0);
964 /* force displayed area in editor to start no matter
965 what "follow playhead" setting is.
969 editor->reposition_x_origin (0);
975 ARDOUR_UI::transport_goto_end ()
978 nframes_t frame = session->current_end_frame();
979 session->request_locate (frame);
981 /* force displayed area in editor to start no matter
982 what "follow playhead" setting is.
986 editor->reposition_x_origin (frame);
992 ARDOUR_UI::transport_stop ()
998 if (session->is_auditioning()) {
999 session->cancel_audition ();
1003 if (session->get_play_loop ()) {
1004 session->request_play_loop (false);
1007 session->request_stop ();
1011 ARDOUR_UI::transport_stop_and_forget_capture ()
1014 session->request_stop (true);
1019 ARDOUR_UI::remove_last_capture()
1022 editor->remove_last_capture();
1027 ARDOUR_UI::transport_record ()
1030 switch (session->record_status()) {
1031 case Session::Disabled:
1032 if (session->ntracks() == 0) {
1033 MessageDialog msg (*editor, _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu."));
1037 session->maybe_enable_record ();
1039 case Session::Recording:
1040 case Session::Enabled:
1041 session->disable_record (true);
1047 ARDOUR_UI::transport_roll ()
1055 rolling = session->transport_rolling ();
1057 if (session->get_play_loop()) {
1058 session->request_play_loop (false);
1059 auto_loop_button.set_active (false);
1060 roll_button.set_active (true);
1061 } else if (session->get_play_range ()) {
1062 session->request_play_range (false);
1063 play_selection_button.set_active (false);
1064 } else if (rolling) {
1065 session->request_locate (session->last_transport_start(), true);
1068 session->request_transport_speed (1.0f);
1072 ARDOUR_UI::transport_loop()
1075 if (session->get_play_loop()) {
1076 if (session->transport_rolling()) {
1077 Location * looploc = session->locations()->auto_loop_location();
1079 session->request_locate (looploc->start(), true);
1084 session->request_play_loop (true);
1090 ARDOUR_UI::transport_play_selection ()
1096 if (!session->get_play_range()) {
1097 session->request_stop ();
1100 editor->play_selection ();
1104 ARDOUR_UI::transport_rewind (int option)
1106 float current_transport_speed;
1109 current_transport_speed = session->transport_speed();
1111 if (current_transport_speed >= 0.0f) {
1114 session->request_transport_speed (-1.0f);
1117 session->request_transport_speed (-4.0f);
1120 session->request_transport_speed (-0.5f);
1125 session->request_transport_speed (current_transport_speed * 1.5f);
1131 ARDOUR_UI::transport_forward (int option)
1133 float current_transport_speed;
1136 current_transport_speed = session->transport_speed();
1138 if (current_transport_speed <= 0.0f) {
1141 session->request_transport_speed (1.0f);
1144 session->request_transport_speed (4.0f);
1147 session->request_transport_speed (0.5f);
1152 session->request_transport_speed (current_transport_speed * 1.5f);
1158 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1164 boost::shared_ptr<Route> r;
1166 if ((r = session->route_by_remote_id (dstream)) != 0) {
1170 if ((t = dynamic_cast<Track*>(r.get())) != 0) {
1171 t->diskstream()->set_record_enabled (!t->diskstream()->record_enabled());
1180 ARDOUR_UI::queue_transport_change ()
1182 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1186 ARDOUR_UI::map_transport_state ()
1188 float sp = session->transport_speed();
1191 transport_rolling ();
1192 } else if (sp < 0.0f) {
1193 transport_rewinding ();
1194 } else if (sp > 0.0f) {
1195 transport_forwarding ();
1197 transport_stopped ();
1202 ARDOUR_UI::allow_local_only ()
1208 ARDOUR_UI::allow_mmc_only ()
1214 ARDOUR_UI::allow_mmc_and_local ()
1220 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1222 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1223 (int) adj.get_value()].c_str());
1227 ARDOUR_UI::engine_stopped ()
1229 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1230 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1231 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1235 ARDOUR_UI::engine_running ()
1237 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1238 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1239 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1243 ARDOUR_UI::engine_halted ()
1245 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1247 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1248 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1250 update_sample_rate (0);
1252 MessageDialog msg (*editor,
1254 JACK has either been shutdown or it\n\
1255 disconnected Ardour because Ardour\n\
1256 was not fast enough. You can save the\n\
1257 session and/or try to reconnect to JACK ."));
1262 ARDOUR_UI::do_engine_start ()
1268 catch (AudioEngine::PortRegistrationFailure& err) {
1270 error << _("Unable to create all required ports")
1278 error << _("Unable to start the session running")
1288 ARDOUR_UI::start_engine ()
1290 if (do_engine_start () == 0) {
1291 if (session && _session_is_new) {
1292 /* we need to retain initial visual
1293 settings for a new session
1295 session->save_state ("");
1298 /* there is too much going on, in too many threads, for us to
1299 end up with a clean session. So wait 1 second after loading,
1300 and fix it up. its ugly, but until i come across a better
1301 solution, its what we have.
1304 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1311 ARDOUR_UI::update_clocks ()
1313 if (!editor || !editor->dragging_playhead()) {
1314 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1319 ARDOUR_UI::start_clocking ()
1321 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1325 ARDOUR_UI::stop_clocking ()
1327 clock_signal_connection.disconnect ();
1331 ARDOUR_UI::toggle_clocking ()
1334 if (clock_button.get_active()) {
1343 ARDOUR_UI::_blink (void *arg)
1346 ((ARDOUR_UI *) arg)->blink ();
1353 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1357 ARDOUR_UI::start_blinking ()
1359 /* Start the blink signal. Everybody with a blinking widget
1360 uses Blink to drive the widget's state.
1363 if (blink_timeout_tag < 0) {
1365 blink_timeout_tag = g_timeout_add (240, _blink, this);
1370 ARDOUR_UI::stop_blinking ()
1372 if (blink_timeout_tag >= 0) {
1373 g_source_remove (blink_timeout_tag);
1374 blink_timeout_tag = -1;
1379 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1385 if (io.n_inputs() == 0) {
1390 /* XXX we're not handling multiple ports yet. */
1392 const char **connections = io.input(0)->get_connections();
1394 if (connections == 0 || connections[0] == '\0') {
1397 buf = connections[0];
1404 if (io.n_outputs() == 0) {
1409 /* XXX we're not handling multiple ports yet. */
1411 const char **connections = io.output(0)->get_connections();
1413 if (connections == 0 || connections[0] == '\0') {
1416 buf = connections[0];
1424 ARDOUR_UI::snapshot_session ()
1426 ArdourPrompter prompter (true);
1433 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1435 prompter.set_name ("Prompter");
1436 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1437 prompter.set_prompt (_("Name of New Snapshot"));
1438 prompter.set_initial_text (now);
1440 switch (prompter.run()) {
1441 case RESPONSE_ACCEPT:
1442 prompter.get_result (snapname);
1443 if (snapname.length()){
1444 save_state (snapname);
1454 ARDOUR_UI::save_state (const string & name)
1456 (void) save_state_canfail (name);
1460 ARDOUR_UI::save_state_canfail (string name)
1465 if (name.length() == 0) {
1466 name = session->snap_name();
1469 if ((ret = session->save_state (name)) != 0) {
1473 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1478 ARDOUR_UI::restore_state (string name)
1481 if (name.length() == 0) {
1482 name = session->name();
1484 session->restore_state (name);
1489 ARDOUR_UI::primary_clock_value_changed ()
1492 session->request_locate (primary_clock.current_time ());
1497 ARDOUR_UI::secondary_clock_value_changed ()
1500 session->request_locate (secondary_clock.current_time ());
1505 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1507 if (session && dstream && dstream->record_enabled()) {
1509 Session::RecordState rs;
1511 rs = session->record_status ();
1514 case Session::Disabled:
1515 case Session::Enabled:
1516 if (w->get_state() != STATE_SELECTED) {
1517 w->set_state (STATE_SELECTED);
1521 case Session::Recording:
1522 if (w->get_state() != STATE_ACTIVE) {
1523 w->set_state (STATE_ACTIVE);
1529 if (w->get_state() != STATE_NORMAL) {
1530 w->set_state (STATE_NORMAL);
1536 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1542 switch (session->record_status()) {
1543 case Session::Enabled:
1545 rec_button.set_state (1);
1547 rec_button.set_state (0);
1551 case Session::Recording:
1552 rec_button.set_state (2);
1556 rec_button.set_state (0);
1562 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1570 ARDOUR_UI::start_keyboard_prefix ()
1572 keyboard->start_prefix();
1576 ARDOUR_UI::save_template ()
1579 ArdourPrompter prompter (true);
1582 prompter.set_name (X_("Prompter"));
1583 prompter.set_prompt (_("Name for mix template:"));
1584 prompter.set_initial_text(session->name() + _("-template"));
1585 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1587 switch (prompter.run()) {
1588 case RESPONSE_ACCEPT:
1589 prompter.get_result (name);
1591 if (name.length()) {
1592 session->save_template (name);
1602 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1604 string session_name;
1605 string session_path;
1607 int response = Gtk::RESPONSE_NONE;
1609 new_session_dialog->set_modal(true);
1610 new_session_dialog->set_name (predetermined_path);
1611 new_session_dialog->reset_recent();
1612 new_session_dialog->show();
1615 response = new_session_dialog->run ();
1617 _session_is_new = false;
1619 if (response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1624 new_session_dialog->hide ();
1627 } else if (response == Gtk::RESPONSE_NONE) {
1629 /* Clear was pressed */
1630 new_session_dialog->reset();
1632 } else if (response == Gtk::RESPONSE_YES) {
1634 /* YES == OPEN, but there's no enum for that */
1636 session_name = new_session_dialog->session_name();
1638 if (session_name.empty()) {
1639 response = Gtk::RESPONSE_NONE;
1643 if (session_name[0] == '/' ||
1644 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1645 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1646 load_session (Glib::path_get_dirname (session_name), session_name);
1648 session_path = new_session_dialog->session_folder();
1649 load_session (session_path, session_name);
1652 } else if (response == Gtk::RESPONSE_OK) {
1654 session_name = new_session_dialog->session_name();
1656 if (new_session_dialog->get_current_page() == 1) {
1658 /* XXX this is a bit of a hack..
1659 i really want the new sesion dialog to return RESPONSE_YES
1660 if we're on page 1 (the load page)
1661 Unfortunately i can't see how atm..
1664 if (session_name.empty()) {
1665 response = Gtk::RESPONSE_NONE;
1669 if (session_name[0] == '/' ||
1670 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1671 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1672 load_session (Glib::path_get_dirname (session_name), session_name);
1674 session_path = new_session_dialog->session_folder();
1675 load_session (session_path, session_name);
1680 if (session_name.empty()) {
1681 response = Gtk::RESPONSE_NONE;
1685 if (session_name[0] == '/' ||
1686 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1687 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1689 session_path = Glib::path_get_dirname (session_name);
1690 session_name = Glib::path_get_basename (session_name);
1694 session_path = new_session_dialog->session_folder();
1698 //XXX This is needed because session constructor wants a
1699 //non-existant path. hopefully this will be fixed at some point.
1701 session_path = Glib::build_filename (session_path, session_name);
1703 if (g_file_test (session_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) {
1705 Glib::ustring str = string_compose (_("This session\n%1\nalready exists. Do you want to open it?"), session_path);
1707 MessageDialog msg (str,
1709 Gtk::MESSAGE_WARNING,
1710 Gtk::BUTTONS_YES_NO,
1714 msg.set_name (X_("CleanupDialog"));
1715 msg.set_wmclass (_("existing_session"), "Ardour");
1716 msg.set_position (Gtk::WIN_POS_MOUSE);
1718 switch (msg.run()) {
1720 load_session (session_path, session_name);
1724 response = RESPONSE_NONE;
1725 new_session_dialog->reset ();
1730 _session_is_new = true;
1732 std::string template_name = new_session_dialog->session_template_name();
1734 if (new_session_dialog->use_session_template()) {
1736 load_session (session_path, session_name, &template_name);
1742 AutoConnectOption iconnect;
1743 AutoConnectOption oconnect;
1745 if (new_session_dialog->create_control_bus()) {
1746 cchns = (uint32_t) new_session_dialog->control_channel_count();
1751 if (new_session_dialog->create_master_bus()) {
1752 mchns = (uint32_t) new_session_dialog->master_channel_count();
1757 if (new_session_dialog->connect_inputs()) {
1758 iconnect = AutoConnectPhysical;
1760 iconnect = AutoConnectOption (0);
1763 /// @todo some minor tweaks.
1765 if (new_session_dialog->connect_outs_to_master()) {
1766 oconnect = AutoConnectMaster;
1767 } else if (new_session_dialog->connect_outs_to_physical()) {
1768 oconnect = AutoConnectPhysical;
1770 oconnect = AutoConnectOption (0);
1773 uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
1774 uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count();
1776 build_session (session_path,
1784 engine->frame_rate() * 60 * 5);
1789 } while (response == Gtk::RESPONSE_NONE);
1793 new_session_dialog->get_window()->set_cursor();
1794 new_session_dialog->hide();
1798 ARDOUR_UI::close_session()
1805 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1807 Session *new_session;
1809 session_loaded = false;
1810 x = unload_session ();
1818 /* if it already exists, we must have write access */
1820 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1821 MessageDialog msg (*editor, _("\
1822 You do not have write access to this session.\n\
1823 This prevents the session from being loaded."));
1829 new_session = new Session (*engine, path, snap_name, mix_template);
1834 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1838 connect_to_session (new_session);
1840 Config->set_current_owner (ConfigVariableBase::Interface);
1842 session_loaded = true;
1844 goto_editor_window ();
1850 ARDOUR_UI::make_session_clean ()
1853 session->set_clean ();
1862 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1863 uint32_t control_channels,
1864 uint32_t master_channels,
1865 AutoConnectOption input_connect,
1866 AutoConnectOption output_connect,
1869 nframes_t initial_length)
1871 Session *new_session;
1874 session_loaded = false;
1875 x = unload_session ();
1882 _session_is_new = true;
1885 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1886 control_channels, master_channels, nphysin, nphysout, initial_length);
1891 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1895 connect_to_session (new_session);
1897 session_loaded = true;
1905 editor->show_window ();
1916 ARDOUR_UI::show_splash ()
1919 about = new About();
1920 about->signal_response().connect(mem_fun (*this, &ARDOUR_UI::about_signal_response) );
1927 ARDOUR_UI::about_signal_response(int response)
1933 ARDOUR_UI::hide_splash ()
1936 about->get_window()->set_cursor ();
1942 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1946 removed = rep.paths.size();
1949 MessageDialog msgd (*editor,
1950 _("No audio files were ready for cleanup"),
1953 (Gtk::ButtonsType)(Gtk::BUTTONS_OK) );
1954 msgd.set_secondary_text (_("If this seems suprising, \n\
1955 check for any existing snapshots.\n\
1956 These may still include regions that\n\
1957 require some unused files to continue to exist."));
1963 ArdourDialog results (_("ardour: cleanup"), true, false);
1965 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1966 CleanupResultsModelColumns() {
1970 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1971 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1975 CleanupResultsModelColumns results_columns;
1976 Glib::RefPtr<Gtk::ListStore> results_model;
1977 Gtk::TreeView results_display;
1979 results_model = ListStore::create (results_columns);
1980 results_display.set_model (results_model);
1981 results_display.append_column (list_title, results_columns.visible_name);
1983 results_display.set_name ("CleanupResultsList");
1984 results_display.set_headers_visible (true);
1985 results_display.set_headers_clickable (false);
1986 results_display.set_reorderable (false);
1988 Gtk::ScrolledWindow list_scroller;
1991 Gtk::HBox dhbox; // the hbox for the image and text
1992 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1993 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1995 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1997 if (rep.space < 1048576.0f) {
1999 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
2001 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
2005 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
2007 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
2011 dhbox.pack_start (*dimage, true, false, 5);
2012 dhbox.pack_start (txt, true, false, 5);
2014 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
2015 TreeModel::Row row = *(results_model->append());
2016 row[results_columns.visible_name] = *i;
2017 row[results_columns.fullpath] = *i;
2020 list_scroller.add (results_display);
2021 list_scroller.set_size_request (-1, 150);
2022 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2024 dvbox.pack_start (dhbox, true, false, 5);
2025 dvbox.pack_start (list_scroller, true, false, 5);
2026 ddhbox.pack_start (dvbox, true, false, 5);
2028 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2029 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2030 results.set_default_response (RESPONSE_CLOSE);
2031 results.set_position (Gtk::WIN_POS_MOUSE);
2032 results.show_all_children ();
2033 results.set_resizable (false);
2040 ARDOUR_UI::cleanup ()
2043 /* shouldn't happen: menu item is insensitive */
2048 MessageDialog checker (_("Are you sure you want to cleanup?"),
2050 Gtk::MESSAGE_QUESTION,
2051 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2053 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2054 ALL undo/redo information will be lost if you cleanup.\n\
2055 After cleanup, unused audio files will be moved to a \
2056 \"dead sounds\" location."));
2058 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2059 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2060 checker.set_default_response (RESPONSE_CANCEL);
2062 checker.set_name (_("CleanupDialog"));
2063 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2064 checker.set_position (Gtk::WIN_POS_MOUSE);
2066 switch (checker.run()) {
2067 case RESPONSE_ACCEPT:
2073 Session::cleanup_report rep;
2075 editor->prepare_for_cleanup ();
2077 if (session->cleanup_sources (rep)) {
2081 display_cleanup_results (rep,
2084 The following %1 %2 not in use and \n\
2085 have been moved to:\n\
2087 Flushing the wastebasket will \n\
2088 release an additional\n\
2089 %4 %5bytes of disk space.\n"
2094 ARDOUR_UI::flush_trash ()
2097 /* shouldn't happen: menu item is insensitive */
2101 Session::cleanup_report rep;
2103 if (session->cleanup_trash_sources (rep)) {
2107 display_cleanup_results (rep,
2109 _("The following %1 %2 deleted from\n\
2111 releasing %4 %5bytes of disk space"));
2115 ARDOUR_UI::add_route ()
2123 if (add_route_dialog == 0) {
2124 add_route_dialog = new AddRouteDialog;
2125 editor->ensure_float (*add_route_dialog);
2128 if (add_route_dialog->is_visible()) {
2129 /* we're already doing this */
2133 ResponseType r = (ResponseType) add_route_dialog->run ();
2135 add_route_dialog->hide();
2138 case RESPONSE_ACCEPT:
2145 if ((count = add_route_dialog->count()) <= 0) {
2149 uint32_t input_chan = add_route_dialog->channels ();
2150 uint32_t output_chan;
2151 string name_template = add_route_dialog->name_template ();
2152 bool track = add_route_dialog->track ();
2154 AutoConnectOption oac = Config->get_output_auto_connect();
2156 if (oac & AutoConnectMaster) {
2157 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2159 output_chan = input_chan;
2162 /* XXX do something with name template */
2165 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
2167 session_add_audio_bus (input_chan, output_chan, count);
2172 ARDOUR_UI::mixer_settings () const
2177 node = session->instant_xml(X_("Mixer"), session->path());
2179 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2183 node = new XMLNode (X_("Mixer"));
2190 ARDOUR_UI::editor_settings () const
2195 node = session->instant_xml(X_("Editor"), session->path());
2197 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2201 node = new XMLNode (X_("Editor"));
2207 ARDOUR_UI::keyboard_settings () const
2211 node = Config->extra_xml(X_("Keyboard"));
2214 node = new XMLNode (X_("Keyboard"));
2220 ARDOUR_UI::halt_on_xrun_message ()
2222 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2224 MessageDialog msg (*editor,
2225 _("Recording was stopped because your system could not keep up."));
2230 ARDOUR_UI::disk_overrun_handler ()
2232 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2234 if (!have_disk_overrun_displayed) {
2235 have_disk_overrun_displayed = true;
2236 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2237 The disk system on your computer\n\
2238 was not able to keep up with Ardour.\n\
2240 Specifically, it failed to write data to disk\n\
2241 quickly enough to keep up with recording.\n"));
2243 have_disk_overrun_displayed = false;
2248 ARDOUR_UI::disk_underrun_handler ()
2250 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2252 if (!have_disk_underrun_displayed) {
2253 have_disk_underrun_displayed = true;
2254 MessageDialog msg (*editor,
2255 (_("The disk system on your computer\n\
2256 was not able to keep up with Ardour.\n\
2258 Specifically, it failed to read data from disk\n\
2259 quickly enough to keep up with playback.\n")));
2261 have_disk_underrun_displayed = false;
2266 ARDOUR_UI::disk_underrun_message_gone ()
2268 have_disk_underrun_displayed = false;
2272 ARDOUR_UI::disk_overrun_message_gone ()
2274 have_disk_underrun_displayed = false;
2278 ARDOUR_UI::pending_state_dialog ()
2280 ArdourDialog dialog ("pending state dialog");
2282 This session appears to have been in\n\
2283 middle of recording when ardour or\n\
2284 the computer was shutdown.\n\
2286 Ardour can recover any captured audio for\n\
2287 you, or it can ignore it. Please decide\n\
2288 what you would like to do.\n"));
2290 dialog.get_vbox()->pack_start (message);
2291 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2292 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2294 dialog.set_position (WIN_POS_CENTER);
2297 switch (dialog.run ()) {
2298 case RESPONSE_ACCEPT:
2306 ARDOUR_UI::disconnect_from_jack ()
2309 if( engine->disconnect_from_jack ()) {
2310 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2314 update_sample_rate (0);
2319 ARDOUR_UI::reconnect_to_jack ()
2322 if (engine->reconnect_to_jack ()) {
2323 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2327 update_sample_rate (0);
2332 ARDOUR_UI::set_jack_buffer_size (nframes_t nframes)
2334 engine->request_buffer_size (nframes);
2335 update_sample_rate (0);
2339 ARDOUR_UI::cmdline_new_session (string path)
2341 if (path[0] != '/') {
2342 char buf[PATH_MAX+1];
2345 getcwd (buf, sizeof (buf));
2352 new_session (false, path);
2354 _will_create_new_session_automatically = false; /* done it */
2355 return FALSE; /* don't call it again */
2359 ARDOUR_UI::use_config ()
2361 Glib::RefPtr<Action> act;
2363 switch (Config->get_native_file_data_format ()) {
2365 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2368 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2373 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2374 ract->set_active ();
2377 switch (Config->get_native_file_header_format ()) {
2379 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2382 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2385 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2388 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2391 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2394 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2397 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2402 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2403 ract->set_active ();
2408 ARDOUR_UI::update_transport_clocks (nframes_t pos)
2410 primary_clock.set (pos);
2411 secondary_clock.set (pos);
2413 if (big_clock_window) {
2414 big_clock.set (pos);
2419 ARDOUR_UI::record_state_changed ()
2421 if (!session || !big_clock_window) {
2422 /* why bother - the clock isn't visible */
2426 switch (session->record_status()) {
2427 case Session::Recording:
2428 big_clock.set_name ("BigClockRecording");
2431 big_clock.set_name ("BigClockNonRecording");