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