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;
447 window.set_keep_above (true);
450 ResponseType r = (ResponseType) window.run();
455 case RESPONSE_ACCEPT: // save and get out of here
457 case RESPONSE_APPLY: // get out of here
467 ARDOUR_UI::every_second ()
470 update_buffer_load ();
471 update_disk_space ();
476 ARDOUR_UI::every_point_one_seconds ()
478 update_speed_display ();
479 RapidScreenUpdate(); /* EMIT_SIGNAL */
484 ARDOUR_UI::every_point_zero_one_seconds ()
486 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
491 ARDOUR_UI::update_sample_rate (nframes_t ignored)
495 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
497 if (!engine->connected()) {
499 snprintf (buf, sizeof (buf), _("disconnected"));
503 nframes_t rate = engine->frame_rate();
505 if (fmod (rate, 1000.0) != 0.0) {
506 snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"),
507 (float) rate/1000.0f,
508 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
510 snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"),
512 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
516 sample_rate_label.set_text (buf);
520 ARDOUR_UI::update_cpu_load ()
523 snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
524 cpu_load_label.set_text (buf);
528 ARDOUR_UI::update_buffer_load ()
533 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
534 session->playback_load(), session->capture_load());
535 buffer_load_label.set_text (buf);
537 buffer_load_label.set_text ("");
542 ARDOUR_UI::count_recenabled_streams (Route& route)
544 Track* track = dynamic_cast<Track*>(&route);
545 if (track && track->diskstream()->record_enabled()) {
546 rec_enabled_streams += track->n_inputs();
551 ARDOUR_UI::update_disk_space()
557 nframes_t frames = session->available_capture_duration();
560 if (frames == max_frames) {
561 strcpy (buf, _("Disk: 24hrs+"));
566 nframes_t fr = session->frame_rate();
568 rec_enabled_streams = 0;
569 session->foreach_route (this, &ARDOUR_UI::count_recenabled_streams);
571 if (rec_enabled_streams) {
572 frames /= rec_enabled_streams;
575 hrs = frames / (fr * 3600);
576 frames -= hrs * fr * 3600;
577 mins = frames / (fr * 60);
578 frames -= mins * fr * 60;
581 snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
584 disk_space_label.set_text (buf);
588 ARDOUR_UI::update_wall_clock ()
595 tm_now = localtime (&now);
597 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
598 wall_clock_label.set_text (buf);
603 ARDOUR_UI::control_methods_adjusted ()
608 which_method = (int) online_control_button->adjustment.get_value();
609 switch (which_method) {
611 allow_mmc_and_local ();
620 fatal << _("programming error: impossible control method") << endmsg;
626 ARDOUR_UI::mmc_device_id_adjusted ()
631 int dev_id = (int) mmc_id_button->adjustment.get_value();
632 mmc->set_device_id (dev_id);
638 ARDOUR_UI::session_menu (GdkEventButton *ev)
640 session_popup_menu->popup (0, 0);
645 ARDOUR_UI::redisplay_recent_sessions ()
647 vector<string *> *sessions;
648 vector<string *>::iterator i;
649 RecentSessionsSorter cmp;
651 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
652 recent_session_model->clear ();
655 ARDOUR::read_recent_sessions (rs);
658 recent_session_display.set_model (recent_session_model);
662 /* sort them alphabetically */
663 sort (rs.begin(), rs.end(), cmp);
664 sessions = new vector<string*>;
666 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
667 sessions->push_back (new string ((*i).second));
670 for (i = sessions->begin(); i != sessions->end(); ++i) {
672 vector<string*>* states;
673 vector<const gchar*> item;
674 string fullpath = *(*i);
676 /* remove any trailing / */
678 if (fullpath[fullpath.length()-1] == '/') {
679 fullpath = fullpath.substr (0, fullpath.length()-1);
682 /* now get available states for this session */
684 if ((states = Session::possible_states (fullpath)) == 0) {
689 TreeModel::Row row = *(recent_session_model->append());
691 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
692 row[recent_session_columns.fullpath] = fullpath;
694 if (states->size() > 1) {
696 /* add the children */
698 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
700 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
702 child_row[recent_session_columns.visible_name] = **i2;
703 child_row[recent_session_columns.fullpath] = fullpath;
712 recent_session_display.set_model (recent_session_model);
717 ARDOUR_UI::build_session_selector ()
719 session_selector_window = new ArdourDialog ("session selector");
721 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
723 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
724 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
725 session_selector_window->set_default_response (RESPONSE_ACCEPT);
726 recent_session_model = TreeStore::create (recent_session_columns);
727 recent_session_display.set_model (recent_session_model);
728 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
729 recent_session_display.set_headers_visible (false);
730 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
732 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
734 scroller->add (recent_session_display);
735 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
737 session_selector_window->set_name ("SessionSelectorWindow");
738 session_selector_window->set_size_request (200, 400);
739 session_selector_window->get_vbox()->pack_start (*scroller);
740 session_selector_window->show_all_children();
744 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
746 session_selector_window->response (RESPONSE_ACCEPT);
750 ARDOUR_UI::open_recent_session ()
752 /* popup selector window */
754 if (session_selector_window == 0) {
755 build_session_selector ();
758 redisplay_recent_sessions ();
760 ResponseType r = (ResponseType) session_selector_window->run ();
762 session_selector_window->hide();
765 case RESPONSE_ACCEPT:
771 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
773 if (i == recent_session_model->children().end()) {
777 Glib::ustring path = (*i)[recent_session_columns.fullpath];
778 Glib::ustring state = (*i)[recent_session_columns.visible_name];
780 _session_is_new = false;
782 load_session (path, state);
786 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
790 if (stat (info.filename.c_str(), &statbuf) != 0) {
794 if (!S_ISDIR(statbuf.st_mode)) {
800 string session_file = info.filename;
802 session_file += Glib::path_get_basename (info.filename);
803 session_file += ".ardour";
805 if (stat (session_file.c_str(), &statbuf) != 0) {
809 return S_ISREG (statbuf.st_mode);
813 ARDOUR_UI::open_session ()
815 /* popup selector window */
817 if (open_session_selector == 0) {
819 /* ardour sessions are folders */
821 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
822 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
823 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
825 FileFilter session_filter;
826 session_filter.add_pattern ("*.ardour");
827 session_filter.set_name (_("Ardour sessions"));
828 open_session_selector->add_filter (session_filter);
829 open_session_selector->set_filter (session_filter);
832 int response = open_session_selector->run();
833 open_session_selector->hide ();
836 case RESPONSE_ACCEPT:
839 open_session_selector->hide();
843 open_session_selector->hide();
844 string session_path = open_session_selector->get_filename();
848 if (session_path.length() > 0) {
849 if (Session::find_session (session_path, path, name, isnew) == 0) {
850 _session_is_new = isnew;
851 load_session (path, name);
858 ARDOUR_UI::session_add_midi_track ()
860 cerr << _("Patience is a virtue.\n");
864 ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many)
866 list<boost::shared_ptr<AudioTrack> > tracks;
867 Session::RouteList routes;
870 warning << _("You cannot add a track or bus without a session already loaded.") << endmsg;
876 tracks = session->new_audio_track (input_channels, output_channels, mode, how_many);
878 if (tracks.size() != how_many) {
880 error << _("could not create a new audio track") << endmsg;
882 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
888 routes = session->new_audio_route (input_channels, output_channels, how_many);
890 if (routes.size() != how_many) {
892 error << _("could not create a new audio track") << endmsg;
894 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
900 if (need_control_room_outs) {
906 route->set_stereo_control_outs (control_lr_channels);
907 route->control_outs()->set_stereo_pan (pans, this);
909 #endif /* CONTROLOUTS */
913 MessageDialog msg (*editor,
914 _("There are insufficient JACK ports available\n\
915 to create a new track or bus.\n\
916 You should save Ardour, exit and\n\
917 restart JACK with more ports."));
923 ARDOUR_UI::do_transport_locate (nframes_t new_position)
925 nframes_t _preroll = 0;
928 // XXX CONFIG_CHANGE FIX - requires AnyTime handling
929 // _preroll = session->convert_to_frames_at (new_position, Config->get_preroll());
931 if (new_position > _preroll) {
932 new_position -= _preroll;
937 session->request_locate (new_position);
942 ARDOUR_UI::transport_goto_start ()
945 session->goto_start();
948 /* force displayed area in editor to start no matter
949 what "follow playhead" setting is.
953 editor->reposition_x_origin (session->current_start_frame());
959 ARDOUR_UI::transport_goto_zero ()
962 session->request_locate (0);
965 /* force displayed area in editor to start no matter
966 what "follow playhead" setting is.
970 editor->reposition_x_origin (0);
976 ARDOUR_UI::transport_goto_end ()
979 nframes_t frame = session->current_end_frame();
980 session->request_locate (frame);
982 /* force displayed area in editor to start no matter
983 what "follow playhead" setting is.
987 editor->reposition_x_origin (frame);
993 ARDOUR_UI::transport_stop ()
999 if (session->is_auditioning()) {
1000 session->cancel_audition ();
1004 if (session->get_play_loop ()) {
1005 session->request_play_loop (false);
1008 session->request_stop ();
1012 ARDOUR_UI::transport_stop_and_forget_capture ()
1015 session->request_stop (true);
1020 ARDOUR_UI::remove_last_capture()
1023 editor->remove_last_capture();
1028 ARDOUR_UI::transport_record ()
1031 switch (session->record_status()) {
1032 case Session::Disabled:
1033 if (session->ntracks() == 0) {
1034 MessageDialog msg (*editor, _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu."));
1038 session->maybe_enable_record ();
1040 case Session::Recording:
1041 case Session::Enabled:
1042 session->disable_record (true);
1048 ARDOUR_UI::transport_roll ()
1056 rolling = session->transport_rolling ();
1058 if (session->get_play_loop()) {
1059 session->request_play_loop (false);
1060 auto_loop_button.set_active (false);
1061 roll_button.set_active (true);
1062 } else if (session->get_play_range ()) {
1063 session->request_play_range (false);
1064 play_selection_button.set_active (false);
1065 } else if (rolling) {
1066 session->request_locate (session->last_transport_start(), true);
1069 session->request_transport_speed (1.0f);
1073 ARDOUR_UI::transport_loop()
1076 if (session->get_play_loop()) {
1077 if (session->transport_rolling()) {
1078 Location * looploc = session->locations()->auto_loop_location();
1080 session->request_locate (looploc->start(), true);
1085 session->request_play_loop (true);
1091 ARDOUR_UI::transport_play_selection ()
1097 if (!session->get_play_range()) {
1098 session->request_stop ();
1101 editor->play_selection ();
1105 ARDOUR_UI::transport_rewind (int option)
1107 float current_transport_speed;
1110 current_transport_speed = session->transport_speed();
1112 if (current_transport_speed >= 0.0f) {
1115 session->request_transport_speed (-1.0f);
1118 session->request_transport_speed (-4.0f);
1121 session->request_transport_speed (-0.5f);
1126 session->request_transport_speed (current_transport_speed * 1.5f);
1132 ARDOUR_UI::transport_forward (int option)
1134 float current_transport_speed;
1137 current_transport_speed = session->transport_speed();
1139 if (current_transport_speed <= 0.0f) {
1142 session->request_transport_speed (1.0f);
1145 session->request_transport_speed (4.0f);
1148 session->request_transport_speed (0.5f);
1153 session->request_transport_speed (current_transport_speed * 1.5f);
1159 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1165 boost::shared_ptr<Route> r;
1167 if ((r = session->route_by_remote_id (dstream)) != 0) {
1171 if ((t = dynamic_cast<Track*>(r.get())) != 0) {
1172 t->diskstream()->set_record_enabled (!t->diskstream()->record_enabled());
1181 ARDOUR_UI::queue_transport_change ()
1183 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1187 ARDOUR_UI::map_transport_state ()
1189 float sp = session->transport_speed();
1192 transport_rolling ();
1193 } else if (sp < 0.0f) {
1194 transport_rewinding ();
1195 } else if (sp > 0.0f) {
1196 transport_forwarding ();
1198 transport_stopped ();
1203 ARDOUR_UI::allow_local_only ()
1209 ARDOUR_UI::allow_mmc_only ()
1215 ARDOUR_UI::allow_mmc_and_local ()
1221 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1223 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1224 (int) adj.get_value()].c_str());
1228 ARDOUR_UI::engine_stopped ()
1230 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1231 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1232 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1236 ARDOUR_UI::engine_running ()
1238 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1239 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1240 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1244 ARDOUR_UI::engine_halted ()
1246 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1248 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1249 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1251 update_sample_rate (0);
1253 MessageDialog msg (*editor,
1255 JACK has either been shutdown or it\n\
1256 disconnected Ardour because Ardour\n\
1257 was not fast enough. You can save the\n\
1258 session and/or try to reconnect to JACK ."));
1263 ARDOUR_UI::do_engine_start ()
1269 catch (AudioEngine::PortRegistrationFailure& err) {
1271 error << _("Unable to create all required ports")
1279 error << _("Unable to start the session running")
1289 ARDOUR_UI::start_engine ()
1291 if (do_engine_start () == 0) {
1292 if (session && _session_is_new) {
1293 /* we need to retain initial visual
1294 settings for a new session
1296 session->save_state ("");
1299 /* there is too much going on, in too many threads, for us to
1300 end up with a clean session. So wait 1 second after loading,
1301 and fix it up. its ugly, but until i come across a better
1302 solution, its what we have.
1305 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1312 ARDOUR_UI::update_clocks ()
1314 if (!editor || !editor->dragging_playhead()) {
1315 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1320 ARDOUR_UI::start_clocking ()
1322 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1326 ARDOUR_UI::stop_clocking ()
1328 clock_signal_connection.disconnect ();
1332 ARDOUR_UI::toggle_clocking ()
1335 if (clock_button.get_active()) {
1344 ARDOUR_UI::_blink (void *arg)
1347 ((ARDOUR_UI *) arg)->blink ();
1354 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1358 ARDOUR_UI::start_blinking ()
1360 /* Start the blink signal. Everybody with a blinking widget
1361 uses Blink to drive the widget's state.
1364 if (blink_timeout_tag < 0) {
1366 blink_timeout_tag = g_timeout_add (240, _blink, this);
1371 ARDOUR_UI::stop_blinking ()
1373 if (blink_timeout_tag >= 0) {
1374 g_source_remove (blink_timeout_tag);
1375 blink_timeout_tag = -1;
1380 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1386 if (io.n_inputs() == 0) {
1391 /* XXX we're not handling multiple ports yet. */
1393 const char **connections = io.input(0)->get_connections();
1395 if (connections == 0 || connections[0] == '\0') {
1398 buf = connections[0];
1405 if (io.n_outputs() == 0) {
1410 /* XXX we're not handling multiple ports yet. */
1412 const char **connections = io.output(0)->get_connections();
1414 if (connections == 0 || connections[0] == '\0') {
1417 buf = connections[0];
1425 ARDOUR_UI::snapshot_session ()
1427 ArdourPrompter prompter (true);
1434 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1436 prompter.set_name ("Prompter");
1437 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1438 prompter.set_prompt (_("Name of New Snapshot"));
1439 prompter.set_initial_text (now);
1441 switch (prompter.run()) {
1442 case RESPONSE_ACCEPT:
1443 prompter.get_result (snapname);
1444 if (snapname.length()){
1445 save_state (snapname);
1455 ARDOUR_UI::save_state (const string & name)
1457 (void) save_state_canfail (name);
1461 ARDOUR_UI::save_state_canfail (string name)
1466 if (name.length() == 0) {
1467 name = session->snap_name();
1470 if ((ret = session->save_state (name)) != 0) {
1474 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1479 ARDOUR_UI::restore_state (string name)
1482 if (name.length() == 0) {
1483 name = session->name();
1485 session->restore_state (name);
1490 ARDOUR_UI::primary_clock_value_changed ()
1493 session->request_locate (primary_clock.current_time ());
1498 ARDOUR_UI::secondary_clock_value_changed ()
1501 session->request_locate (secondary_clock.current_time ());
1506 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1508 if (session && dstream && dstream->record_enabled()) {
1510 Session::RecordState rs;
1512 rs = session->record_status ();
1515 case Session::Disabled:
1516 case Session::Enabled:
1517 if (w->get_state() != STATE_SELECTED) {
1518 w->set_state (STATE_SELECTED);
1522 case Session::Recording:
1523 if (w->get_state() != STATE_ACTIVE) {
1524 w->set_state (STATE_ACTIVE);
1530 if (w->get_state() != STATE_NORMAL) {
1531 w->set_state (STATE_NORMAL);
1537 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1543 switch (session->record_status()) {
1544 case Session::Enabled:
1546 rec_button.set_state (1);
1548 rec_button.set_state (0);
1552 case Session::Recording:
1553 rec_button.set_state (2);
1557 rec_button.set_state (0);
1563 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1571 ARDOUR_UI::start_keyboard_prefix ()
1573 keyboard->start_prefix();
1577 ARDOUR_UI::save_template ()
1580 ArdourPrompter prompter (true);
1583 prompter.set_name (X_("Prompter"));
1584 prompter.set_prompt (_("Name for mix template:"));
1585 prompter.set_initial_text(session->name() + _("-template"));
1586 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1588 switch (prompter.run()) {
1589 case RESPONSE_ACCEPT:
1590 prompter.get_result (name);
1592 if (name.length()) {
1593 session->save_template (name);
1603 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1605 string session_name;
1606 string session_path;
1608 int response = Gtk::RESPONSE_NONE;
1610 new_session_dialog->set_modal(true);
1611 new_session_dialog->set_name (predetermined_path);
1612 new_session_dialog->reset_recent();
1613 new_session_dialog->show();
1616 response = new_session_dialog->run ();
1618 _session_is_new = false;
1620 if (response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1625 new_session_dialog->hide ();
1628 } else if (response == Gtk::RESPONSE_NONE) {
1630 /* Clear was pressed */
1631 new_session_dialog->reset();
1633 } else if (response == Gtk::RESPONSE_YES) {
1635 /* YES == OPEN, but there's no enum for that */
1637 session_name = new_session_dialog->session_name();
1639 if (session_name.empty()) {
1640 response = Gtk::RESPONSE_NONE;
1644 if (session_name[0] == '/' ||
1645 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1646 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1647 load_session (Glib::path_get_dirname (session_name), session_name);
1649 session_path = new_session_dialog->session_folder();
1650 load_session (session_path, session_name);
1653 } else if (response == Gtk::RESPONSE_OK) {
1655 session_name = new_session_dialog->session_name();
1657 if (new_session_dialog->get_current_page() == 1) {
1659 /* XXX this is a bit of a hack..
1660 i really want the new sesion dialog to return RESPONSE_YES
1661 if we're on page 1 (the load page)
1662 Unfortunately i can't see how atm..
1665 if (session_name.empty()) {
1666 response = Gtk::RESPONSE_NONE;
1670 if (session_name[0] == '/' ||
1671 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1672 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1673 load_session (Glib::path_get_dirname (session_name), session_name);
1675 session_path = new_session_dialog->session_folder();
1676 load_session (session_path, session_name);
1681 if (session_name.empty()) {
1682 response = Gtk::RESPONSE_NONE;
1686 if (session_name[0] == '/' ||
1687 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1688 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1690 session_path = Glib::path_get_dirname (session_name);
1691 session_name = Glib::path_get_basename (session_name);
1695 session_path = new_session_dialog->session_folder();
1699 //XXX This is needed because session constructor wants a
1700 //non-existant path. hopefully this will be fixed at some point.
1702 session_path = Glib::build_filename (session_path, session_name);
1704 if (g_file_test (session_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) {
1706 Glib::ustring str = string_compose (_("This session\n%1\nalready exists. Do you want to open it?"), session_path);
1708 MessageDialog msg (str,
1710 Gtk::MESSAGE_WARNING,
1711 Gtk::BUTTONS_YES_NO,
1715 msg.set_name (X_("CleanupDialog"));
1716 msg.set_wmclass (_("existing_session"), "Ardour");
1717 msg.set_position (Gtk::WIN_POS_MOUSE);
1719 switch (msg.run()) {
1721 load_session (session_path, session_name);
1725 response = RESPONSE_NONE;
1726 new_session_dialog->reset ();
1731 _session_is_new = true;
1733 std::string template_name = new_session_dialog->session_template_name();
1735 if (new_session_dialog->use_session_template()) {
1737 load_session (session_path, session_name, &template_name);
1743 AutoConnectOption iconnect;
1744 AutoConnectOption oconnect;
1746 if (new_session_dialog->create_control_bus()) {
1747 cchns = (uint32_t) new_session_dialog->control_channel_count();
1752 if (new_session_dialog->create_master_bus()) {
1753 mchns = (uint32_t) new_session_dialog->master_channel_count();
1758 if (new_session_dialog->connect_inputs()) {
1759 iconnect = AutoConnectPhysical;
1761 iconnect = AutoConnectOption (0);
1764 /// @todo some minor tweaks.
1766 if (new_session_dialog->connect_outs_to_master()) {
1767 oconnect = AutoConnectMaster;
1768 } else if (new_session_dialog->connect_outs_to_physical()) {
1769 oconnect = AutoConnectPhysical;
1771 oconnect = AutoConnectOption (0);
1774 uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
1775 uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count();
1777 build_session (session_path,
1785 engine->frame_rate() * 60 * 5);
1790 } while (response == Gtk::RESPONSE_NONE);
1794 new_session_dialog->get_window()->set_cursor();
1795 new_session_dialog->hide();
1799 ARDOUR_UI::close_session()
1806 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1808 Session *new_session;
1810 session_loaded = false;
1811 x = unload_session ();
1819 /* if it already exists, we must have write access */
1821 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1822 MessageDialog msg (*editor, _("\
1823 You do not have write access to this session.\n\
1824 This prevents the session from being loaded."));
1830 new_session = new Session (*engine, path, snap_name, mix_template);
1835 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1839 connect_to_session (new_session);
1841 Config->set_current_owner (ConfigVariableBase::Interface);
1843 session_loaded = true;
1845 goto_editor_window ();
1851 ARDOUR_UI::make_session_clean ()
1854 session->set_clean ();
1863 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1864 uint32_t control_channels,
1865 uint32_t master_channels,
1866 AutoConnectOption input_connect,
1867 AutoConnectOption output_connect,
1870 nframes_t initial_length)
1872 Session *new_session;
1875 session_loaded = false;
1876 x = unload_session ();
1883 _session_is_new = true;
1886 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1887 control_channels, master_channels, nphysin, nphysout, initial_length);
1892 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1896 connect_to_session (new_session);
1898 session_loaded = true;
1906 editor->show_window ();
1917 ARDOUR_UI::show_splash ()
1920 about = new About();
1921 about->signal_response().connect(mem_fun (*this, &ARDOUR_UI::about_signal_response) );
1928 ARDOUR_UI::about_signal_response(int response)
1934 ARDOUR_UI::hide_splash ()
1937 about->get_window()->set_cursor ();
1943 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1947 removed = rep.paths.size();
1950 MessageDialog msgd (*editor,
1951 _("No audio files were ready for cleanup"),
1954 (Gtk::ButtonsType)(Gtk::BUTTONS_OK) );
1955 msgd.set_secondary_text (_("If this seems suprising, \n\
1956 check for any existing snapshots.\n\
1957 These may still include regions that\n\
1958 require some unused files to continue to exist."));
1964 ArdourDialog results (_("ardour: cleanup"), true, false);
1966 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1967 CleanupResultsModelColumns() {
1971 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1972 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1976 CleanupResultsModelColumns results_columns;
1977 Glib::RefPtr<Gtk::ListStore> results_model;
1978 Gtk::TreeView results_display;
1980 results_model = ListStore::create (results_columns);
1981 results_display.set_model (results_model);
1982 results_display.append_column (list_title, results_columns.visible_name);
1984 results_display.set_name ("CleanupResultsList");
1985 results_display.set_headers_visible (true);
1986 results_display.set_headers_clickable (false);
1987 results_display.set_reorderable (false);
1989 Gtk::ScrolledWindow list_scroller;
1992 Gtk::HBox dhbox; // the hbox for the image and text
1993 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1994 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1996 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1998 if (rep.space < 1048576.0f) {
2000 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
2002 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
2006 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
2008 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
2012 dhbox.pack_start (*dimage, true, false, 5);
2013 dhbox.pack_start (txt, true, false, 5);
2015 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
2016 TreeModel::Row row = *(results_model->append());
2017 row[results_columns.visible_name] = *i;
2018 row[results_columns.fullpath] = *i;
2021 list_scroller.add (results_display);
2022 list_scroller.set_size_request (-1, 150);
2023 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2025 dvbox.pack_start (dhbox, true, false, 5);
2026 dvbox.pack_start (list_scroller, true, false, 5);
2027 ddhbox.pack_start (dvbox, true, false, 5);
2029 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2030 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2031 results.set_default_response (RESPONSE_CLOSE);
2032 results.set_position (Gtk::WIN_POS_MOUSE);
2033 results.show_all_children ();
2034 results.set_resizable (false);
2041 ARDOUR_UI::cleanup ()
2044 /* shouldn't happen: menu item is insensitive */
2049 MessageDialog checker (_("Are you sure you want to cleanup?"),
2051 Gtk::MESSAGE_QUESTION,
2052 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2054 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2055 ALL undo/redo information will be lost if you cleanup.\n\
2056 After cleanup, unused audio files will be moved to a \
2057 \"dead sounds\" location."));
2059 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2060 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2061 checker.set_default_response (RESPONSE_CANCEL);
2063 checker.set_name (_("CleanupDialog"));
2064 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2065 checker.set_position (Gtk::WIN_POS_MOUSE);
2067 switch (checker.run()) {
2068 case RESPONSE_ACCEPT:
2074 Session::cleanup_report rep;
2076 editor->prepare_for_cleanup ();
2078 if (session->cleanup_sources (rep)) {
2082 display_cleanup_results (rep,
2085 The following %1 %2 not in use and \n\
2086 have been moved to:\n\
2088 Flushing the wastebasket will \n\
2089 release an additional\n\
2090 %4 %5bytes of disk space.\n"
2095 ARDOUR_UI::flush_trash ()
2098 /* shouldn't happen: menu item is insensitive */
2102 Session::cleanup_report rep;
2104 if (session->cleanup_trash_sources (rep)) {
2108 display_cleanup_results (rep,
2110 _("The following %1 %2 deleted from\n\
2112 releasing %4 %5bytes of disk space"));
2116 ARDOUR_UI::add_route ()
2124 if (add_route_dialog == 0) {
2125 add_route_dialog = new AddRouteDialog;
2126 editor->ensure_float (*add_route_dialog);
2129 if (add_route_dialog->is_visible()) {
2130 /* we're already doing this */
2134 ResponseType r = (ResponseType) add_route_dialog->run ();
2136 add_route_dialog->hide();
2139 case RESPONSE_ACCEPT:
2146 if ((count = add_route_dialog->count()) <= 0) {
2150 uint32_t input_chan = add_route_dialog->channels ();
2151 uint32_t output_chan;
2152 string name_template = add_route_dialog->name_template ();
2153 bool track = add_route_dialog->track ();
2155 AutoConnectOption oac = Config->get_output_auto_connect();
2157 if (oac & AutoConnectMaster) {
2158 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2160 output_chan = input_chan;
2163 /* XXX do something with name template */
2166 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
2168 session_add_audio_bus (input_chan, output_chan, count);
2173 ARDOUR_UI::mixer_settings () const
2178 node = session->instant_xml(X_("Mixer"), session->path());
2180 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2184 node = new XMLNode (X_("Mixer"));
2191 ARDOUR_UI::editor_settings () const
2196 node = session->instant_xml(X_("Editor"), session->path());
2198 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2202 node = new XMLNode (X_("Editor"));
2208 ARDOUR_UI::keyboard_settings () const
2212 node = Config->extra_xml(X_("Keyboard"));
2215 node = new XMLNode (X_("Keyboard"));
2221 ARDOUR_UI::halt_on_xrun_message ()
2223 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2225 MessageDialog msg (*editor,
2226 _("Recording was stopped because your system could not keep up."));
2231 ARDOUR_UI::disk_overrun_handler ()
2233 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2235 if (!have_disk_overrun_displayed) {
2236 have_disk_overrun_displayed = true;
2237 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2238 The disk system on your computer\n\
2239 was not able to keep up with Ardour.\n\
2241 Specifically, it failed to write data to disk\n\
2242 quickly enough to keep up with recording.\n"));
2244 have_disk_overrun_displayed = false;
2249 ARDOUR_UI::disk_underrun_handler ()
2251 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2253 if (!have_disk_underrun_displayed) {
2254 have_disk_underrun_displayed = true;
2255 MessageDialog msg (*editor,
2256 (_("The disk system on your computer\n\
2257 was not able to keep up with Ardour.\n\
2259 Specifically, it failed to read data from disk\n\
2260 quickly enough to keep up with playback.\n")));
2262 have_disk_underrun_displayed = false;
2267 ARDOUR_UI::disk_underrun_message_gone ()
2269 have_disk_underrun_displayed = false;
2273 ARDOUR_UI::disk_overrun_message_gone ()
2275 have_disk_underrun_displayed = false;
2279 ARDOUR_UI::pending_state_dialog ()
2281 ArdourDialog dialog ("pending state dialog");
2283 This session appears to have been in\n\
2284 middle of recording when ardour or\n\
2285 the computer was shutdown.\n\
2287 Ardour can recover any captured audio for\n\
2288 you, or it can ignore it. Please decide\n\
2289 what you would like to do.\n"));
2291 dialog.get_vbox()->pack_start (message);
2292 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2293 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2295 dialog.set_position (WIN_POS_CENTER);
2298 switch (dialog.run ()) {
2299 case RESPONSE_ACCEPT:
2307 ARDOUR_UI::disconnect_from_jack ()
2310 if( engine->disconnect_from_jack ()) {
2311 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2315 update_sample_rate (0);
2320 ARDOUR_UI::reconnect_to_jack ()
2323 if (engine->reconnect_to_jack ()) {
2324 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2328 update_sample_rate (0);
2333 ARDOUR_UI::set_jack_buffer_size (nframes_t nframes)
2335 engine->request_buffer_size (nframes);
2336 update_sample_rate (0);
2340 ARDOUR_UI::cmdline_new_session (string path)
2342 if (path[0] != '/') {
2343 char buf[PATH_MAX+1];
2346 getcwd (buf, sizeof (buf));
2353 new_session (false, path);
2355 _will_create_new_session_automatically = false; /* done it */
2356 return FALSE; /* don't call it again */
2360 ARDOUR_UI::use_config ()
2362 Glib::RefPtr<Action> act;
2364 switch (Config->get_native_file_data_format ()) {
2366 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2369 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2374 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2375 ract->set_active ();
2378 switch (Config->get_native_file_header_format ()) {
2380 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2383 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2386 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2389 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2392 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2395 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2398 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2403 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2404 ract->set_active ();
2409 ARDOUR_UI::update_transport_clocks (nframes_t pos)
2411 primary_clock.set (pos);
2412 secondary_clock.set (pos);
2414 if (big_clock_window) {
2415 big_clock.set (pos);
2420 ARDOUR_UI::record_state_changed ()
2422 if (!session || !big_clock_window) {
2423 /* why bother - the clock isn't visible */
2427 switch (session->record_status()) {
2428 case Session::Recording:
2429 big_clock.set_name ("BigClockRecording");
2432 big_clock.set_name ("BigClockNonRecording");