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::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 editor->ensure_float (window);
449 ResponseType r = (ResponseType) window.run();
454 case RESPONSE_ACCEPT: // save and get out of here
456 case RESPONSE_APPLY: // get out of here
466 ARDOUR_UI::every_second ()
469 update_buffer_load ();
470 update_disk_space ();
475 ARDOUR_UI::every_point_one_seconds ()
477 update_speed_display ();
478 RapidScreenUpdate(); /* EMIT_SIGNAL */
483 ARDOUR_UI::every_point_zero_one_seconds ()
485 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
490 ARDOUR_UI::update_sample_rate (nframes_t ignored)
494 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
496 if (!engine->connected()) {
498 snprintf (buf, sizeof (buf), _("disconnected"));
502 nframes_t rate = engine->frame_rate();
504 if (fmod (rate, 1000.0) != 0.0) {
505 snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"),
506 (float) rate/1000.0f,
507 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
509 snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"),
511 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
515 sample_rate_label.set_text (buf);
519 ARDOUR_UI::update_cpu_load ()
522 snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
523 cpu_load_label.set_text (buf);
527 ARDOUR_UI::update_buffer_load ()
532 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
533 session->playback_load(), session->capture_load());
534 buffer_load_label.set_text (buf);
536 buffer_load_label.set_text ("");
541 ARDOUR_UI::count_recenabled_diskstreams (Route& route)
543 Track* track = dynamic_cast<Track*>(&route);
544 if (track && track->diskstream()->record_enabled()) {
545 rec_enabled_diskstreams++;
550 ARDOUR_UI::update_disk_space()
556 nframes_t frames = session->available_capture_duration();
559 if (frames == max_frames) {
560 strcpy (buf, _("Disk: 24hrs+"));
565 nframes_t fr = session->frame_rate();
567 if (session->actively_recording()){
569 rec_enabled_diskstreams = 0;
570 session->foreach_route (this, &ARDOUR_UI::count_recenabled_diskstreams);
572 if (rec_enabled_diskstreams) {
573 frames /= rec_enabled_diskstreams;
578 /* hmmm. shall we divide by the route count? or the diskstream count?
579 or what? for now, do nothing ...
584 hrs = frames / (fr * 3600);
585 frames -= hrs * fr * 3600;
586 mins = frames / (fr * 60);
587 frames -= mins * fr * 60;
590 snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
593 disk_space_label.set_text (buf);
597 ARDOUR_UI::update_wall_clock ()
604 tm_now = localtime (&now);
606 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
607 wall_clock_label.set_text (buf);
612 ARDOUR_UI::control_methods_adjusted ()
617 which_method = (int) online_control_button->adjustment.get_value();
618 switch (which_method) {
620 allow_mmc_and_local ();
629 fatal << _("programming error: impossible control method") << endmsg;
635 ARDOUR_UI::mmc_device_id_adjusted ()
640 int dev_id = (int) mmc_id_button->adjustment.get_value();
641 mmc->set_device_id (dev_id);
647 ARDOUR_UI::session_menu (GdkEventButton *ev)
649 session_popup_menu->popup (0, 0);
654 ARDOUR_UI::redisplay_recent_sessions ()
656 vector<string *> *sessions;
657 vector<string *>::iterator i;
658 RecentSessionsSorter cmp;
660 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
661 recent_session_model->clear ();
664 ARDOUR::read_recent_sessions (rs);
667 recent_session_display.set_model (recent_session_model);
671 /* sort them alphabetically */
672 sort (rs.begin(), rs.end(), cmp);
673 sessions = new vector<string*>;
675 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
676 sessions->push_back (new string ((*i).second));
679 for (i = sessions->begin(); i != sessions->end(); ++i) {
681 vector<string*>* states;
682 vector<const gchar*> item;
683 string fullpath = *(*i);
685 /* remove any trailing / */
687 if (fullpath[fullpath.length()-1] == '/') {
688 fullpath = fullpath.substr (0, fullpath.length()-1);
691 /* now get available states for this session */
693 if ((states = Session::possible_states (fullpath)) == 0) {
698 TreeModel::Row row = *(recent_session_model->append());
700 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
701 row[recent_session_columns.fullpath] = fullpath;
703 if (states->size() > 1) {
705 /* add the children */
707 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
709 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
711 child_row[recent_session_columns.visible_name] = **i2;
712 child_row[recent_session_columns.fullpath] = fullpath;
721 recent_session_display.set_model (recent_session_model);
726 ARDOUR_UI::build_session_selector ()
728 session_selector_window = new ArdourDialog ("session selector");
730 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
732 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
733 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
734 session_selector_window->set_default_response (RESPONSE_ACCEPT);
735 recent_session_model = TreeStore::create (recent_session_columns);
736 recent_session_display.set_model (recent_session_model);
737 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
738 recent_session_display.set_headers_visible (false);
739 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
741 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
743 scroller->add (recent_session_display);
744 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
746 session_selector_window->set_name ("SessionSelectorWindow");
747 session_selector_window->set_size_request (200, 400);
748 session_selector_window->get_vbox()->pack_start (*scroller);
749 session_selector_window->show_all_children();
753 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
755 session_selector_window->response (RESPONSE_ACCEPT);
759 ARDOUR_UI::open_recent_session ()
761 /* popup selector window */
763 if (session_selector_window == 0) {
764 build_session_selector ();
767 redisplay_recent_sessions ();
769 ResponseType r = (ResponseType) session_selector_window->run ();
771 session_selector_window->hide();
774 case RESPONSE_ACCEPT:
780 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
782 if (i == recent_session_model->children().end()) {
786 Glib::ustring path = (*i)[recent_session_columns.fullpath];
787 Glib::ustring state = (*i)[recent_session_columns.visible_name];
789 _session_is_new = false;
791 load_session (path, state);
795 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
799 if (stat (info.filename.c_str(), &statbuf) != 0) {
803 if (!S_ISDIR(statbuf.st_mode)) {
809 string session_file = info.filename;
811 session_file += Glib::path_get_basename (info.filename);
812 session_file += ".ardour";
814 if (stat (session_file.c_str(), &statbuf) != 0) {
818 return S_ISREG (statbuf.st_mode);
822 ARDOUR_UI::open_session ()
824 /* popup selector window */
826 if (open_session_selector == 0) {
828 /* ardour sessions are folders */
830 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
831 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
832 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
834 FileFilter session_filter;
835 session_filter.add_pattern ("*.ardour");
836 session_filter.set_name (_("Ardour sessions"));
837 open_session_selector->add_filter (session_filter);
838 open_session_selector->set_filter (session_filter);
841 int response = open_session_selector->run();
842 open_session_selector->hide ();
845 case RESPONSE_ACCEPT:
848 open_session_selector->hide();
852 open_session_selector->hide();
853 string session_path = open_session_selector->get_filename();
857 if (session_path.length() > 0) {
858 if (Session::find_session (session_path, path, name, isnew) == 0) {
859 _session_is_new = isnew;
860 load_session (path, name);
867 ARDOUR_UI::session_add_midi_track ()
869 cerr << _("Patience is a virtue.\n");
873 ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many)
875 list<boost::shared_ptr<AudioTrack> > tracks;
876 Session::RouteList routes;
879 warning << _("You cannot add a track or bus without a session already loaded.") << endmsg;
885 tracks = session->new_audio_track (input_channels, output_channels, mode, how_many);
887 if (tracks.size() != how_many) {
889 error << _("could not create a new audio track") << endmsg;
891 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
897 routes = session->new_audio_route (input_channels, output_channels, how_many);
899 if (routes.size() != how_many) {
901 error << _("could not create a new audio track") << endmsg;
903 error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg;
909 if (need_control_room_outs) {
915 route->set_stereo_control_outs (control_lr_channels);
916 route->control_outs()->set_stereo_pan (pans, this);
918 #endif /* CONTROLOUTS */
922 MessageDialog msg (*editor,
923 _("There are insufficient JACK ports available\n\
924 to create a new track or bus.\n\
925 You should save Ardour, exit and\n\
926 restart JACK with more ports."));
932 ARDOUR_UI::do_transport_locate (nframes_t new_position)
934 nframes_t _preroll = 0;
937 // XXX CONFIG_CHANGE FIX - requires AnyTime handling
938 // _preroll = session->convert_to_frames_at (new_position, Config->get_preroll());
940 if (new_position > _preroll) {
941 new_position -= _preroll;
946 session->request_locate (new_position);
951 ARDOUR_UI::transport_goto_start ()
954 session->goto_start();
957 /* force displayed area in editor to start no matter
958 what "follow playhead" setting is.
962 editor->reposition_x_origin (session->current_start_frame());
968 ARDOUR_UI::transport_goto_zero ()
971 session->request_locate (0);
974 /* force displayed area in editor to start no matter
975 what "follow playhead" setting is.
979 editor->reposition_x_origin (0);
985 ARDOUR_UI::transport_goto_end ()
988 nframes_t frame = session->current_end_frame();
989 session->request_locate (frame);
991 /* force displayed area in editor to start no matter
992 what "follow playhead" setting is.
996 editor->reposition_x_origin (frame);
1002 ARDOUR_UI::transport_stop ()
1008 if (session->is_auditioning()) {
1009 session->cancel_audition ();
1013 if (Config->get_auto_loop()) {
1014 session->request_play_loop (false);
1017 session->request_stop ();
1021 ARDOUR_UI::transport_stop_and_forget_capture ()
1024 session->request_stop (true);
1029 ARDOUR_UI::remove_last_capture()
1032 editor->remove_last_capture();
1037 ARDOUR_UI::transport_record ()
1040 switch (session->record_status()) {
1041 case Session::Disabled:
1042 if (session->ntracks() == 0) {
1043 MessageDialog msg (*editor, _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu."));
1047 session->maybe_enable_record ();
1049 case Session::Recording:
1050 case Session::Enabled:
1051 session->disable_record (true);
1057 ARDOUR_UI::transport_roll ()
1065 rolling = session->transport_rolling ();
1067 if (Config->get_auto_loop()) {
1068 session->request_play_loop (false);
1069 auto_loop_button.set_active (false);
1070 roll_button.set_active (true);
1071 } else if (session->get_play_range ()) {
1072 session->request_play_range (false);
1073 play_selection_button.set_active (false);
1074 } else if (rolling) {
1075 session->request_locate (session->last_transport_start(), true);
1078 session->request_transport_speed (1.0f);
1082 ARDOUR_UI::transport_loop()
1085 if (Config->get_auto_loop()) {
1086 if (session->transport_rolling()) {
1087 Location * looploc = session->locations()->auto_loop_location();
1089 session->request_locate (looploc->start(), true);
1094 session->request_play_loop (true);
1100 ARDOUR_UI::transport_play_selection ()
1106 if (!session->get_play_range()) {
1107 session->request_stop ();
1110 editor->play_selection ();
1114 ARDOUR_UI::transport_rewind (int option)
1116 float current_transport_speed;
1119 current_transport_speed = session->transport_speed();
1121 if (current_transport_speed >= 0.0f) {
1124 session->request_transport_speed (-1.0f);
1127 session->request_transport_speed (-4.0f);
1130 session->request_transport_speed (-0.5f);
1135 session->request_transport_speed (current_transport_speed * 1.5f);
1141 ARDOUR_UI::transport_forward (int option)
1143 float current_transport_speed;
1146 current_transport_speed = session->transport_speed();
1148 if (current_transport_speed <= 0.0f) {
1151 session->request_transport_speed (1.0f);
1154 session->request_transport_speed (4.0f);
1157 session->request_transport_speed (0.5f);
1162 session->request_transport_speed (current_transport_speed * 1.5f);
1168 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1174 boost::shared_ptr<Route> r;
1176 if ((r = session->route_by_remote_id (dstream)) != 0) {
1180 if ((t = dynamic_cast<Track*>(r.get())) != 0) {
1181 t->diskstream()->set_record_enabled (!t->diskstream()->record_enabled());
1190 ARDOUR_UI::queue_transport_change ()
1192 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1196 ARDOUR_UI::map_transport_state ()
1198 float sp = session->transport_speed();
1201 transport_rolling ();
1202 } else if (sp < 0.0f) {
1203 transport_rewinding ();
1204 } else if (sp > 0.0f) {
1205 transport_forwarding ();
1207 transport_stopped ();
1212 ARDOUR_UI::allow_local_only ()
1218 ARDOUR_UI::allow_mmc_only ()
1224 ARDOUR_UI::allow_mmc_and_local ()
1230 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1232 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1233 (int) adj.get_value()].c_str());
1237 ARDOUR_UI::engine_stopped ()
1239 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1240 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1241 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1246 ARDOUR_UI::engine_running ()
1248 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1249 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1250 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1254 ARDOUR_UI::engine_halted ()
1256 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1258 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1259 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1261 update_sample_rate (0);
1263 MessageDialog msg (*editor,
1265 JACK has either been shutdown or it\n\
1266 disconnected Ardour because Ardour\n\
1267 was not fast enough. You can save the\n\
1268 session and/or try to reconnect to JACK ."));
1273 ARDOUR_UI::do_engine_start ()
1279 catch (AudioEngine::PortRegistrationFailure& err) {
1281 error << _("Unable to create all required ports")
1289 error << _("Unable to start the session running")
1299 ARDOUR_UI::start_engine ()
1301 if (do_engine_start () == 0) {
1302 if (session && _session_is_new) {
1303 /* we need to retain initial visual
1304 settings for a new session
1306 session->save_state ("");
1309 /* there is too much going on, in too many threads, for us to
1310 end up with a clean session. So wait 1 second after loading,
1311 and fix it up. its ugly, but until i come across a better
1312 solution, its what we have.
1315 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1322 ARDOUR_UI::update_clocks ()
1324 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1328 ARDOUR_UI::start_clocking ()
1330 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1334 ARDOUR_UI::stop_clocking ()
1336 clock_signal_connection.disconnect ();
1340 ARDOUR_UI::toggle_clocking ()
1343 if (clock_button.get_active()) {
1352 ARDOUR_UI::_blink (void *arg)
1355 ((ARDOUR_UI *) arg)->blink ();
1362 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1366 ARDOUR_UI::start_blinking ()
1368 /* Start the blink signal. Everybody with a blinking widget
1369 uses Blink to drive the widget's state.
1372 if (blink_timeout_tag < 0) {
1374 blink_timeout_tag = g_timeout_add (240, _blink, this);
1379 ARDOUR_UI::stop_blinking ()
1381 if (blink_timeout_tag >= 0) {
1382 g_source_remove (blink_timeout_tag);
1383 blink_timeout_tag = -1;
1388 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1394 if (io.n_inputs() == 0) {
1399 /* XXX we're not handling multiple ports yet. */
1401 const char **connections = io.input(0)->get_connections();
1403 if (connections == 0 || connections[0] == '\0') {
1406 buf = connections[0];
1413 if (io.n_outputs() == 0) {
1418 /* XXX we're not handling multiple ports yet. */
1420 const char **connections = io.output(0)->get_connections();
1422 if (connections == 0 || connections[0] == '\0') {
1425 buf = connections[0];
1433 ARDOUR_UI::snapshot_session ()
1435 ArdourPrompter prompter (true);
1442 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1444 prompter.set_name ("Prompter");
1445 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1446 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1447 prompter.set_prompt (_("Name of New Snapshot"));
1448 prompter.set_initial_text (now);
1450 switch (prompter.run()) {
1451 case RESPONSE_ACCEPT:
1452 prompter.get_result (snapname);
1453 if (snapname.length()){
1454 save_state (snapname);
1464 ARDOUR_UI::save_state (const string & name)
1466 (void) save_state_canfail (name);
1470 ARDOUR_UI::save_state_canfail (string name)
1475 if (name.length() == 0) {
1476 name = session->snap_name();
1479 if ((ret = session->save_state (name)) != 0) {
1483 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1488 ARDOUR_UI::restore_state (string name)
1491 if (name.length() == 0) {
1492 name = session->name();
1494 session->restore_state (name);
1499 ARDOUR_UI::primary_clock_value_changed ()
1502 session->request_locate (primary_clock.current_time ());
1507 ARDOUR_UI::secondary_clock_value_changed ()
1510 session->request_locate (secondary_clock.current_time ());
1515 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1517 if (session && dstream && dstream->record_enabled()) {
1519 Session::RecordState rs;
1521 rs = session->record_status ();
1524 case Session::Disabled:
1525 case Session::Enabled:
1526 if (w->get_state() != STATE_SELECTED) {
1527 w->set_state (STATE_SELECTED);
1531 case Session::Recording:
1532 if (w->get_state() != STATE_ACTIVE) {
1533 w->set_state (STATE_ACTIVE);
1539 if (w->get_state() != STATE_NORMAL) {
1540 w->set_state (STATE_NORMAL);
1546 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1552 switch (session->record_status()) {
1553 case Session::Enabled:
1555 rec_button.set_state (1);
1557 rec_button.set_state (0);
1561 case Session::Recording:
1562 rec_button.set_state (2);
1566 rec_button.set_state (0);
1572 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1580 ARDOUR_UI::start_keyboard_prefix ()
1582 keyboard->start_prefix();
1586 ARDOUR_UI::save_template ()
1589 ArdourPrompter prompter (true);
1592 prompter.set_name (X_("Prompter"));
1593 prompter.set_prompt (_("Name for mix template:"));
1594 prompter.set_initial_text(session->name() + _("-template"));
1595 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1596 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1598 switch (prompter.run()) {
1599 case RESPONSE_ACCEPT:
1600 prompter.get_result (name);
1602 if (name.length()) {
1603 session->save_template (name);
1613 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1615 string session_name;
1616 string session_path;
1618 int response = Gtk::RESPONSE_NONE;
1620 new_session_dialog->set_modal(true);
1621 new_session_dialog->set_name(predetermined_path);
1622 new_session_dialog->reset_recent();
1623 new_session_dialog->show();
1626 response = new_session_dialog->run ();
1628 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1632 } else if (response == Gtk::RESPONSE_NONE) {
1633 /* Clear was pressed */
1634 new_session_dialog->reset();
1636 } else if (response == Gtk::RESPONSE_YES) {
1638 /* YES == OPEN, but there's no enum for that */
1640 session_name = new_session_dialog->session_name();
1642 if (session_name.empty()) {
1643 response = Gtk::RESPONSE_NONE;
1647 if (session_name[0] == '/' ||
1648 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1649 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1650 load_session (Glib::path_get_dirname (session_name), session_name);
1652 session_path = new_session_dialog->session_folder();
1653 load_session (session_path, session_name);
1656 } else if (response == Gtk::RESPONSE_OK) {
1658 session_name = new_session_dialog->session_name();
1660 if (new_session_dialog->get_current_page() == 1) {
1662 /* XXX this is a bit of a hack..
1663 i really want the new sesion dialog to return RESPONSE_YES
1664 if we're on page 1 (the load page)
1665 Unfortunately i can't see how atm..
1668 if (session_name.empty()) {
1669 response = Gtk::RESPONSE_NONE;
1673 if (session_name[0] == '/' ||
1674 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1675 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1676 load_session (Glib::path_get_dirname (session_name), session_name);
1678 session_path = new_session_dialog->session_folder();
1679 load_session (session_path, session_name);
1684 _session_is_new = true;
1686 if (session_name.empty()) {
1687 response = Gtk::RESPONSE_NONE;
1691 if (session_name[0] == '/' ||
1692 (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') ||
1693 (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) {
1695 session_path = Glib::path_get_dirname (session_name);
1696 session_name = Glib::path_get_basename (session_name);
1700 std::string session_path = new_session_dialog->session_folder();
1704 //XXX This is needed because session constructor wants a
1705 //non-existant path. hopefully this will be fixed at some point.
1707 session_path = Glib::build_filename (session_path, session_name);
1709 std::string template_name = new_session_dialog->session_template_name();
1711 if (new_session_dialog->use_session_template()) {
1713 load_session (session_path, session_name, &template_name);
1719 AutoConnectOption iconnect;
1720 AutoConnectOption oconnect;
1722 if (new_session_dialog->create_control_bus()) {
1723 cchns = (uint32_t) new_session_dialog->control_channel_count();
1728 if (new_session_dialog->create_master_bus()) {
1729 mchns = (uint32_t) new_session_dialog->master_channel_count();
1734 if (new_session_dialog->connect_inputs()) {
1735 iconnect = AutoConnectPhysical;
1737 iconnect = AutoConnectOption (0);
1740 /// @todo some minor tweaks.
1742 if (new_session_dialog->connect_outs_to_master()) {
1743 oconnect = AutoConnectMaster;
1744 } else if (new_session_dialog->connect_outs_to_physical()) {
1745 oconnect = AutoConnectPhysical;
1747 oconnect = AutoConnectOption (0);
1750 uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count();
1751 uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count();
1753 build_session (session_path,
1761 engine->frame_rate() * 60 * 5);
1766 } while (response == Gtk::RESPONSE_NONE);
1769 new_session_dialog->get_window()->set_cursor();
1770 new_session_dialog->hide();
1774 ARDOUR_UI::close_session()
1781 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1783 Session *new_session;
1785 session_loaded = false;
1786 x = unload_session ();
1794 /* if it already exists, we must have write access */
1796 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1797 MessageDialog msg (*editor, _("\
1798 You do not have write access to this session.\n\
1799 This prevents the session from being loaded."));
1805 new_session = new Session (*engine, path, snap_name, mix_template);
1810 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1814 connect_to_session (new_session);
1816 Config->set_current_owner (ConfigVariableBase::Interface);
1818 session_loaded = true;
1823 ARDOUR_UI::make_session_clean ()
1826 session->set_clean ();
1835 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1836 uint32_t control_channels,
1837 uint32_t master_channels,
1838 AutoConnectOption input_connect,
1839 AutoConnectOption output_connect,
1842 nframes_t initial_length)
1844 Session *new_session;
1847 session_loaded = false;
1848 x = unload_session ();
1855 _session_is_new = true;
1858 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1859 control_channels, master_channels, nphysin, nphysout, initial_length);
1864 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1868 connect_to_session (new_session);
1870 session_loaded = true;
1878 editor->show_window ();
1893 ARDOUR_UI::show_splash ()
1896 about = new About();
1902 ARDOUR_UI::hide_splash ()
1905 about->get_window()->set_cursor ();
1911 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1915 removed = rep.paths.size();
1918 MessageDialog msgd (*editor,
1919 _("No audio files were ready for cleanup"),
1922 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1923 msgd.set_secondary_text (_("If this seems suprising, \n\
1924 check for any existing snapshots.\n\
1925 These may still include regions that\n\
1926 require some unused files to continue to exist."));
1932 ArdourDialog results (_("ardour: cleanup"), true, false);
1934 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1935 CleanupResultsModelColumns() {
1939 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1940 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1944 CleanupResultsModelColumns results_columns;
1945 Glib::RefPtr<Gtk::ListStore> results_model;
1946 Gtk::TreeView results_display;
1948 results_model = ListStore::create (results_columns);
1949 results_display.set_model (results_model);
1950 results_display.append_column (list_title, results_columns.visible_name);
1952 results_display.set_name ("CleanupResultsList");
1953 results_display.set_headers_visible (true);
1954 results_display.set_headers_clickable (false);
1955 results_display.set_reorderable (false);
1957 Gtk::ScrolledWindow list_scroller;
1960 Gtk::HBox dhbox; // the hbox for the image and text
1961 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1962 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1964 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1966 if (rep.space < 1048576.0f) {
1968 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1970 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1974 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1976 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1980 dhbox.pack_start (*dimage, true, false, 5);
1981 dhbox.pack_start (txt, true, false, 5);
1983 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1984 TreeModel::Row row = *(results_model->append());
1985 row[results_columns.visible_name] = *i;
1986 row[results_columns.fullpath] = *i;
1989 list_scroller.add (results_display);
1990 list_scroller.set_size_request (-1, 150);
1991 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
1993 dvbox.pack_start (dhbox, true, false, 5);
1994 dvbox.pack_start (list_scroller, true, false, 5);
1995 ddhbox.pack_start (dvbox, true, false, 5);
1997 results.get_vbox()->pack_start (ddhbox, true, false, 5);
1998 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
1999 results.set_default_response (RESPONSE_CLOSE);
2000 results.set_position (Gtk::WIN_POS_MOUSE);
2001 results.show_all_children ();
2002 results.set_resizable (false);
2009 ARDOUR_UI::cleanup ()
2012 /* shouldn't happen: menu item is insensitive */
2017 MessageDialog checker (_("Are you sure you want to cleanup?"),
2019 Gtk::MESSAGE_QUESTION,
2020 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2022 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2023 ALL undo/redo information will be lost if you cleanup.\n\
2024 After cleanup, unused audio files will be moved to a \
2025 \"dead sounds\" location."));
2027 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2028 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2029 checker.set_default_response (RESPONSE_CANCEL);
2031 checker.set_name (_("CleanupDialog"));
2032 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2033 checker.set_position (Gtk::WIN_POS_MOUSE);
2035 switch (checker.run()) {
2036 case RESPONSE_ACCEPT:
2042 Session::cleanup_report rep;
2044 editor->prepare_for_cleanup ();
2046 if (session->cleanup_sources (rep)) {
2050 display_cleanup_results (rep,
2053 The following %1 %2 not in use and \n\
2054 have been moved to:\n\
2056 Flushing the wastebasket will \n\
2057 release an additional\n\
2058 %4 %5bytes of disk space.\n"
2063 ARDOUR_UI::flush_trash ()
2066 /* shouldn't happen: menu item is insensitive */
2070 Session::cleanup_report rep;
2072 if (session->cleanup_trash_sources (rep)) {
2076 display_cleanup_results (rep,
2078 _("The following %1 %2 deleted from\n\
2080 releasing %4 %5bytes of disk space"));
2084 ARDOUR_UI::add_route ()
2092 if (add_route_dialog == 0) {
2093 add_route_dialog = new AddRouteDialog;
2094 editor->ensure_float (*add_route_dialog);
2097 if (add_route_dialog->is_visible()) {
2098 /* we're already doing this */
2102 ResponseType r = (ResponseType) add_route_dialog->run ();
2104 add_route_dialog->hide();
2107 case RESPONSE_ACCEPT:
2114 if ((count = add_route_dialog->count()) <= 0) {
2118 uint32_t input_chan = add_route_dialog->channels ();
2119 uint32_t output_chan;
2120 string name_template = add_route_dialog->name_template ();
2121 bool track = add_route_dialog->track ();
2123 AutoConnectOption oac = Config->get_output_auto_connect();
2125 if (oac & AutoConnectMaster) {
2126 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2128 output_chan = input_chan;
2131 /* XXX do something with name template */
2134 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
2136 session_add_audio_bus (input_chan, output_chan, count);
2141 ARDOUR_UI::mixer_settings () const
2146 node = session->instant_xml(X_("Mixer"), session->path());
2148 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2152 node = new XMLNode (X_("Mixer"));
2159 ARDOUR_UI::editor_settings () const
2164 node = session->instant_xml(X_("Editor"), session->path());
2166 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2170 node = new XMLNode (X_("Editor"));
2176 ARDOUR_UI::keyboard_settings () const
2180 node = Config->extra_xml(X_("Keyboard"));
2183 node = new XMLNode (X_("Keyboard"));
2189 ARDOUR_UI::halt_on_xrun_message ()
2191 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2193 MessageDialog msg (*editor,
2194 _("Recording was stopped because your system could not keep up."));
2199 ARDOUR_UI::disk_overrun_handler ()
2201 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2203 if (!have_disk_overrun_displayed) {
2204 have_disk_overrun_displayed = true;
2205 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2206 The disk system on your computer\n\
2207 was not able to keep up with Ardour.\n\
2209 Specifically, it failed to write data to disk\n\
2210 quickly enough to keep up with recording.\n"));
2212 have_disk_overrun_displayed = false;
2217 ARDOUR_UI::disk_underrun_handler ()
2219 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2221 if (!have_disk_underrun_displayed) {
2222 have_disk_underrun_displayed = true;
2223 MessageDialog msg (*editor,
2224 (_("The disk system on your computer\n\
2225 was not able to keep up with Ardour.\n\
2227 Specifically, it failed to read data from disk\n\
2228 quickly enough to keep up with playback.\n")));
2230 have_disk_underrun_displayed = false;
2235 ARDOUR_UI::disk_underrun_message_gone ()
2237 have_disk_underrun_displayed = false;
2241 ARDOUR_UI::disk_overrun_message_gone ()
2243 have_disk_underrun_displayed = false;
2247 ARDOUR_UI::pending_state_dialog ()
2249 ArdourDialog dialog ("pending state dialog");
2251 This session appears to have been in\n\
2252 middle of recording when ardour or\n\
2253 the computer was shutdown.\n\
2255 Ardour can recover any captured audio for\n\
2256 you, or it can ignore it. Please decide\n\
2257 what you would like to do.\n"));
2259 dialog.get_vbox()->pack_start (message);
2260 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2261 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2263 dialog.set_position (WIN_POS_CENTER);
2266 switch (dialog.run ()) {
2267 case RESPONSE_ACCEPT:
2275 ARDOUR_UI::disconnect_from_jack ()
2278 if( engine->disconnect_from_jack ()) {
2279 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2283 update_sample_rate (0);
2288 ARDOUR_UI::reconnect_to_jack ()
2291 if (engine->reconnect_to_jack ()) {
2292 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2296 update_sample_rate (0);
2301 ARDOUR_UI::set_jack_buffer_size (nframes_t nframes)
2303 engine->request_buffer_size (nframes);
2304 update_sample_rate (0);
2308 ARDOUR_UI::cmdline_new_session (string path)
2310 if (path[0] != '/') {
2311 char buf[PATH_MAX+1];
2314 getcwd (buf, sizeof (buf));
2321 new_session (false, path);
2323 _will_create_new_session_automatically = false; /* done it */
2324 return FALSE; /* don't call it again */
2328 ARDOUR_UI::use_config ()
2330 Glib::RefPtr<Action> act;
2332 switch (Config->get_native_file_data_format ()) {
2334 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2337 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2342 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2343 ract->set_active ();
2346 switch (Config->get_native_file_header_format ()) {
2348 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2351 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2354 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2357 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2360 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2363 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2366 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2371 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2372 ract->set_active ();