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,jack_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) {
139 ActionManager::init ();
143 color_manager = new ColorManager();
145 std::string color_file = ARDOUR::find_config_file("ardour.colors");
147 color_manager->load (color_file);
149 m_new_session_dialog = new NewSessionDialog();
153 _session_is_new = false;
154 big_clock_window = 0;
155 session_selector_window = 0;
156 last_key_press_time = 0;
157 connection_editor = 0;
158 add_route_dialog = 0;
163 open_session_selector = 0;
164 have_configure_timeout = false;
165 have_disk_overrun_displayed = false;
166 have_disk_underrun_displayed = false;
167 _will_create_new_session_automatically = false;
168 session_loaded = false;
169 last_speed_displayed = -1.0f;
171 last_configure_time.tv_sec = 0;
172 last_configure_time.tv_usec = 0;
174 shuttle_grabbed = false;
176 shuttle_max_speed = 8.0f;
178 set_shuttle_units (Percentage);
179 set_shuttle_behaviour (Sprung);
181 shuttle_style_menu = 0;
182 shuttle_unit_menu = 0;
184 gettimeofday (&last_peak_grab, 0);
185 gettimeofday (&last_shuttle_request, 0);
187 ARDOUR::AudioDiskstream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
188 ARDOUR::Diskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
189 ARDOUR::Diskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
191 /* handle pending state with a dialog */
193 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
195 /* have to wait for AudioEngine and Configuration before proceeding */
199 ARDOUR_UI::set_engine (AudioEngine& e)
203 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
204 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
205 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
206 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
210 keyboard = new Keyboard;
212 if (setup_windows ()) {
213 throw failed_constructor ();
216 if (GTK_ARDOUR::show_key_actions) {
217 vector<string> names;
218 vector<string> paths;
220 vector<AccelKey> bindings;
222 ActionManager::get_all_actions (names, paths, keys, bindings);
224 vector<string>::iterator n;
225 vector<string>::iterator k;
226 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
227 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
233 /* start with timecode, metering enabled
236 blink_timeout_tag = -1;
238 /* the global configuration object is now valid */
242 /* this being a GUI and all, we want peakfiles */
244 AudioFileSource::set_build_peakfiles (true);
245 AudioFileSource::set_build_missing_peakfiles (true);
247 if (AudioSource::start_peak_thread ()) {
248 throw failed_constructor();
251 /* start the time-of-day-clock */
253 update_wall_clock ();
254 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
256 update_disk_space ();
258 update_sample_rate (engine->frame_rate());
260 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
261 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
264 ARDOUR_UI::~ARDOUR_UI ()
266 save_ardour_state ();
280 if (add_route_dialog) {
281 delete add_route_dialog;
284 AudioSource::stop_peak_thread ();
288 ARDOUR_UI::configure_timeout ()
293 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
294 /* no configure events yet */
298 gettimeofday (&now, 0);
299 timersub (&now, &last_configure_time, &diff);
301 /* force a gap of 0.5 seconds since the last configure event
304 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
307 have_configure_timeout = false;
308 save_ardour_state ();
314 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
316 if (have_configure_timeout) {
317 gettimeofday (&last_configure_time, 0);
319 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
320 have_configure_timeout = true;
327 ARDOUR_UI::save_ardour_state ()
329 if (!keyboard || !mixer || !editor) {
333 /* XXX this is all a bit dubious. add_extra_xml() uses
334 a different lifetime model from add_instant_xml().
337 XMLNode* node = new XMLNode (keyboard->get_state());
338 Config->add_extra_xml (*node);
339 Config->save_state();
341 XMLNode enode(static_cast<Stateful*>(editor)->get_state());
342 XMLNode mnode(mixer->get_state());
345 session->add_instant_xml (enode, session->path());
346 session->add_instant_xml (mnode, session->path());
348 Config->add_instant_xml (enode, get_user_ardour_path());
349 Config->add_instant_xml (mnode, get_user_ardour_path());
354 AccelMap::save ("ardour.saved_bindings");
358 ARDOUR_UI::startup ()
360 /* Once the UI is up and running, start the audio engine. Doing
361 this before the UI is up and running can cause problems
362 when not running with SCHED_FIFO, because the amount of
363 CPU and disk work needed to get the UI started can interfere
364 with the scheduling of the audio thread.
367 Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
373 if (session && session->dirty()) {
374 switch (ask_about_saving_session(_("quit"))) {
379 /* use the default name */
380 if (save_state_canfail ("")) {
381 /* failed - don't quit */
382 MessageDialog msg (*editor,
384 Ardour was unable to save your session.\n\n\
385 If you still wish to quit, please use the\n\n\
386 \"Just quit\" option."));
395 Config->save_state();
400 ARDOUR_UI::ask_about_saving_session (const string & what)
402 ArdourDialog window (_("ardour: save session?"));
403 Gtk::HBox dhbox; // the hbox for the image and text
404 Gtk::Label prompt_label;
405 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
409 msg = string_compose(_("Don't %1"), what);
410 window.add_button (msg, RESPONSE_REJECT);
411 msg = string_compose(_("Just %1"), what);
412 window.add_button (msg, RESPONSE_APPLY);
413 msg = string_compose(_("Save and %1"), what);
414 window.add_button (msg, RESPONSE_ACCEPT);
416 window.set_default_response (RESPONSE_ACCEPT);
418 Gtk::Button noquit_button (msg);
419 noquit_button.set_name ("EditorGTKButton");
424 if (session->snap_name() == session->name()) {
427 type = _("snapshot");
429 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?"),
430 type, session->snap_name());
432 prompt_label.set_text (prompt);
433 prompt_label.set_name (X_("PrompterLabel"));
434 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
436 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
438 dhbox.set_homogeneous (false);
439 dhbox.pack_start (*dimage, false, false, 5);
440 dhbox.pack_start (prompt_label, true, false, 5);
441 window.get_vbox()->pack_start (dhbox);
443 window.set_name (_("Prompter"));
444 window.set_position (Gtk::WIN_POS_MOUSE);
445 window.set_modal (true);
446 window.set_resizable (false);
449 save_the_session = 0;
451 editor->ensure_float (window);
453 ResponseType r = (ResponseType) window.run();
458 case RESPONSE_ACCEPT: // save and get out of here
460 case RESPONSE_APPLY: // get out of here
470 ARDOUR_UI::every_second ()
473 update_buffer_load ();
474 update_disk_space ();
479 ARDOUR_UI::every_point_one_seconds ()
481 update_speed_display ();
482 RapidScreenUpdate(); /* EMIT_SIGNAL */
487 ARDOUR_UI::every_point_zero_one_seconds ()
489 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
494 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
498 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
500 if (!engine->connected()) {
502 snprintf (buf, sizeof (buf), _("disconnected"));
506 jack_nframes_t rate = engine->frame_rate();
508 if (fmod (rate, 1000.0) != 0.0) {
509 snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"),
510 (float) rate/1000.0f,
511 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
513 snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"),
515 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
519 sample_rate_label.set_text (buf);
523 ARDOUR_UI::update_cpu_load ()
526 snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
527 cpu_load_label.set_text (buf);
531 ARDOUR_UI::update_buffer_load ()
536 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
537 session->playback_load(), session->capture_load());
538 buffer_load_label.set_text (buf);
540 buffer_load_label.set_text ("");
545 ARDOUR_UI::count_recenabled_diskstreams (Route& route)
547 Track* track = dynamic_cast<Track*>(&route);
548 if (track && track->diskstream().record_enabled()) {
549 rec_enabled_diskstreams++;
554 ARDOUR_UI::update_disk_space()
560 jack_nframes_t frames = session->available_capture_duration();
563 if (frames == max_frames) {
564 strcpy (buf, _("Disk: 24hrs+"));
569 jack_nframes_t fr = session->frame_rate();
571 if (session->actively_recording()){
573 rec_enabled_diskstreams = 0;
574 session->foreach_route (this, &ARDOUR_UI::count_recenabled_diskstreams);
576 if (rec_enabled_diskstreams) {
577 frames /= rec_enabled_diskstreams;
582 /* hmmm. shall we divide by the route count? or the diskstream count?
583 or what? for now, do nothing ...
588 hrs = frames / (fr * 3600);
589 frames -= hrs * fr * 3600;
590 mins = frames / (fr * 60);
591 frames -= mins * fr * 60;
594 snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
597 disk_space_label.set_text (buf);
601 ARDOUR_UI::update_wall_clock ()
608 tm_now = localtime (&now);
610 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
611 wall_clock_label.set_text (buf);
616 ARDOUR_UI::control_methods_adjusted ()
621 which_method = (int) online_control_button->adjustment.get_value();
622 switch (which_method) {
624 allow_mmc_and_local ();
633 fatal << _("programming error: impossible control method") << endmsg;
639 ARDOUR_UI::mmc_device_id_adjusted ()
644 int dev_id = (int) mmc_id_button->adjustment.get_value();
645 mmc->set_device_id (dev_id);
651 ARDOUR_UI::session_menu (GdkEventButton *ev)
653 session_popup_menu->popup (0, 0);
658 ARDOUR_UI::redisplay_recent_sessions ()
660 vector<string *> *sessions;
661 vector<string *>::iterator i;
662 RecentSessionsSorter cmp;
664 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
665 recent_session_model->clear ();
668 ARDOUR::read_recent_sessions (rs);
671 recent_session_display.set_model (recent_session_model);
675 /* sort them alphabetically */
676 sort (rs.begin(), rs.end(), cmp);
677 sessions = new vector<string*>;
679 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
680 sessions->push_back (new string ((*i).second));
683 for (i = sessions->begin(); i != sessions->end(); ++i) {
685 vector<string*>* states;
686 vector<const gchar*> item;
687 string fullpath = *(*i);
689 /* remove any trailing / */
691 if (fullpath[fullpath.length()-1] == '/') {
692 fullpath = fullpath.substr (0, fullpath.length()-1);
695 /* now get available states for this session */
697 if ((states = Session::possible_states (fullpath)) == 0) {
702 TreeModel::Row row = *(recent_session_model->append());
704 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
705 row[recent_session_columns.fullpath] = fullpath;
707 if (states->size() > 1) {
709 /* add the children */
711 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
713 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
715 child_row[recent_session_columns.visible_name] = **i2;
716 child_row[recent_session_columns.fullpath] = fullpath;
725 recent_session_display.set_model (recent_session_model);
730 ARDOUR_UI::build_session_selector ()
732 session_selector_window = new ArdourDialog ("session selector");
734 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
736 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
737 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
738 session_selector_window->set_default_response (RESPONSE_ACCEPT);
739 recent_session_model = TreeStore::create (recent_session_columns);
740 recent_session_display.set_model (recent_session_model);
741 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
742 recent_session_display.set_headers_visible (false);
743 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
745 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
747 scroller->add (recent_session_display);
748 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
750 session_selector_window->set_name ("SessionSelectorWindow");
751 session_selector_window->set_size_request (200, 400);
752 session_selector_window->get_vbox()->pack_start (*scroller);
753 session_selector_window->show_all_children();
757 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
759 session_selector_window->response (RESPONSE_ACCEPT);
763 ARDOUR_UI::open_recent_session ()
765 /* popup selector window */
767 if (session_selector_window == 0) {
768 build_session_selector ();
771 redisplay_recent_sessions ();
773 ResponseType r = (ResponseType) session_selector_window->run ();
775 session_selector_window->hide();
778 case RESPONSE_ACCEPT:
784 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
786 if (i == recent_session_model->children().end()) {
790 Glib::ustring path = (*i)[recent_session_columns.fullpath];
791 Glib::ustring state = (*i)[recent_session_columns.visible_name];
793 _session_is_new = false;
795 load_session (path, state);
799 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
803 if (stat (info.filename.c_str(), &statbuf) != 0) {
807 if (!S_ISDIR(statbuf.st_mode)) {
813 string session_file = info.filename;
815 session_file += Glib::path_get_basename (info.filename);
816 session_file += ".ardour";
818 if (stat (session_file.c_str(), &statbuf) != 0) {
822 return S_ISREG (statbuf.st_mode);
826 ARDOUR_UI::open_session ()
828 /* popup selector window */
830 if (open_session_selector == 0) {
832 /* ardour sessions are folders */
834 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
835 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
836 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
838 FileFilter session_filter;
839 session_filter.add_pattern ("*.ardour");
840 session_filter.set_name (_("Ardour sessions"));
841 open_session_selector->add_filter (session_filter);
842 open_session_selector->set_filter (session_filter);
845 int response = open_session_selector->run();
846 open_session_selector->hide ();
849 case RESPONSE_ACCEPT:
852 open_session_selector->hide();
856 open_session_selector->hide();
857 string session_path = open_session_selector->get_filename();
861 if (session_path.length() > 0) {
862 if (Session::find_session (session_path, path, name, isnew) == 0) {
863 _session_is_new = isnew;
864 load_session (path, name);
871 ARDOUR_UI::session_add_midi_track ()
873 cerr << _("Patience is a virtue.\n");
877 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
879 boost::shared_ptr<Route> route;
882 warning << _("You cannot add a track without a session already loaded.") << endmsg;
888 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
889 error << _("could not create new audio track") << endmsg;
892 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
893 error << _("could not create new audio bus") << endmsg;
898 if (need_control_room_outs) {
904 route->set_stereo_control_outs (control_lr_channels);
905 route->control_outs()->set_stereo_pan (pans, this);
907 #endif /* CONTROLOUTS */
911 MessageDialog msg (*editor,
912 _("There are insufficient JACK ports available\n\
913 to create a new track or bus.\n\
914 You should save Ardour, exit and\n\
915 restart JACK with more ports."));
921 ARDOUR_UI::diskstream_added (Diskstream* ds)
926 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
928 jack_nframes_t _preroll;
931 _preroll = session->convert_to_frames_at (new_position, session->preroll);
933 if (new_position > _preroll) {
934 new_position -= _preroll;
939 session->request_locate (new_position);
944 ARDOUR_UI::transport_goto_start ()
947 session->goto_start();
950 /* force displayed area in editor to start no matter
951 what "follow playhead" setting is.
955 editor->reposition_x_origin (session->current_start_frame());
961 ARDOUR_UI::transport_goto_zero ()
964 session->request_locate (0);
967 /* force displayed area in editor to start no matter
968 what "follow playhead" setting is.
972 editor->reposition_x_origin (0);
978 ARDOUR_UI::transport_goto_end ()
981 jack_nframes_t frame = session->current_end_frame();
982 session->request_locate (frame);
984 /* force displayed area in editor to start no matter
985 what "follow playhead" setting is.
989 editor->reposition_x_origin (frame);
995 ARDOUR_UI::transport_stop ()
1001 if (session->is_auditioning()) {
1002 session->cancel_audition ();
1006 if (session->get_auto_loop()) {
1007 session->request_auto_loop (false);
1010 session->request_stop ();
1014 ARDOUR_UI::transport_stop_and_forget_capture ()
1017 session->request_stop (true);
1022 ARDOUR_UI::remove_last_capture()
1025 editor->remove_last_capture();
1030 ARDOUR_UI::transport_record ()
1033 switch (session->record_status()) {
1034 case Session::Disabled:
1035 if (session->ntracks() == 0) {
1036 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1037 MessageDialog msg (*editor, txt);
1041 session->maybe_enable_record ();
1043 case Session::Recording:
1044 case Session::Enabled:
1045 session->disable_record (true);
1051 ARDOUR_UI::transport_roll ()
1059 rolling = session->transport_rolling ();
1061 if (session->get_auto_loop()) {
1062 session->request_auto_loop (false);
1063 auto_loop_button.set_active (false);
1064 roll_button.set_active (true);
1065 } else if (session->get_play_range ()) {
1066 session->request_play_range (false);
1067 play_selection_button.set_active (false);
1068 } else if (rolling) {
1069 session->request_locate (session->last_transport_start(), true);
1072 session->request_transport_speed (1.0f);
1076 ARDOUR_UI::transport_loop()
1079 if (session->get_auto_loop()) {
1080 if (session->transport_rolling()) {
1081 Location * looploc = session->locations()->auto_loop_location();
1083 session->request_locate (looploc->start(), true);
1088 session->request_auto_loop (true);
1094 ARDOUR_UI::transport_play_selection ()
1100 if (!session->get_play_range()) {
1101 session->request_stop ();
1104 editor->play_selection ();
1108 ARDOUR_UI::transport_rewind (int option)
1110 float current_transport_speed;
1113 current_transport_speed = session->transport_speed();
1115 if (current_transport_speed >= 0.0f) {
1118 session->request_transport_speed (-1.0f);
1121 session->request_transport_speed (-4.0f);
1124 session->request_transport_speed (-0.5f);
1129 session->request_transport_speed (current_transport_speed * 1.5f);
1135 ARDOUR_UI::transport_forward (int option)
1137 float current_transport_speed;
1140 current_transport_speed = session->transport_speed();
1142 if (current_transport_speed <= 0.0f) {
1145 session->request_transport_speed (1.0f);
1148 session->request_transport_speed (4.0f);
1151 session->request_transport_speed (0.5f);
1156 session->request_transport_speed (current_transport_speed * 1.5f);
1162 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1168 boost::shared_ptr<Route> r;
1170 if ((r = session->route_by_remote_id (dstream)) != 0) {
1174 if ((t = dynamic_cast<Track*>(r.get())) != 0) {
1175 t->diskstream().set_record_enabled (!t->diskstream().record_enabled());
1184 ARDOUR_UI::queue_transport_change ()
1186 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1190 ARDOUR_UI::map_transport_state ()
1192 float sp = session->transport_speed();
1195 transport_rolling ();
1196 } else if (sp < 0.0f) {
1197 transport_rewinding ();
1198 } else if (sp > 0.0f) {
1199 transport_forwarding ();
1201 transport_stopped ();
1206 ARDOUR_UI::allow_local_only ()
1212 ARDOUR_UI::allow_mmc_only ()
1218 ARDOUR_UI::allow_mmc_and_local ()
1224 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1226 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1227 (int) adj.get_value()].c_str());
1231 ARDOUR_UI::engine_stopped ()
1233 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1234 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1235 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1240 ARDOUR_UI::engine_running ()
1242 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1243 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1244 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1248 ARDOUR_UI::engine_halted ()
1250 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1252 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1253 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1255 update_sample_rate (0);
1257 MessageDialog msg (*editor,
1259 JACK has either been shutdown or it\n\
1260 disconnected Ardour because Ardour\n\
1261 was not fast enough. You can save the\n\
1262 session and/or try to reconnect to JACK ."));
1267 ARDOUR_UI::do_engine_start ()
1273 catch (AudioEngine::PortRegistrationFailure& err) {
1275 error << _("Unable to create all required ports")
1283 error << _("Unable to start the session running")
1293 ARDOUR_UI::start_engine ()
1295 if (do_engine_start () == 0) {
1296 if (session && _session_is_new) {
1297 /* we need to retain initial visual
1298 settings for a new session
1300 session->save_state ("");
1301 session->save_history ("");
1304 /* there is too much going on, in too many threads, for us to
1305 end up with a clean session. So wait 1 second after loading,
1306 and fix it up. its ugly, but until i come across a better
1307 solution, its what we have.
1310 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1317 ARDOUR_UI::update_clocks ()
1319 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1323 ARDOUR_UI::start_clocking ()
1325 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1329 ARDOUR_UI::stop_clocking ()
1331 clock_signal_connection.disconnect ();
1335 ARDOUR_UI::toggle_clocking ()
1338 if (clock_button.get_active()) {
1347 ARDOUR_UI::_blink (void *arg)
1350 ((ARDOUR_UI *) arg)->blink ();
1357 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1361 ARDOUR_UI::start_blinking ()
1363 /* Start the blink signal. Everybody with a blinking widget
1364 uses Blink to drive the widget's state.
1367 if (blink_timeout_tag < 0) {
1369 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1374 ARDOUR_UI::stop_blinking ()
1376 if (blink_timeout_tag >= 0) {
1377 gtk_timeout_remove (blink_timeout_tag);
1378 blink_timeout_tag = -1;
1383 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1389 if (io.n_inputs() == 0) {
1394 /* XXX we're not handling multiple ports yet. */
1396 const char **connections = io.input(0)->get_connections();
1398 if (connections == 0 || connections[0] == '\0') {
1401 buf = connections[0];
1408 if (io.n_outputs() == 0) {
1413 /* XXX we're not handling multiple ports yet. */
1415 const char **connections = io.output(0)->get_connections();
1417 if (connections == 0 || connections[0] == '\0') {
1420 buf = connections[0];
1428 ARDOUR_UI::snapshot_session ()
1430 ArdourPrompter prompter (true);
1437 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1439 prompter.set_name ("Prompter");
1440 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1441 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1442 prompter.set_prompt (_("Name of New Snapshot"));
1443 prompter.set_initial_text (now);
1445 switch (prompter.run()) {
1446 case RESPONSE_ACCEPT:
1447 prompter.get_result (snapname);
1448 if (snapname.length()){
1449 save_state (snapname);
1459 ARDOUR_UI::save_state (const string & name)
1461 (void) save_state_canfail (name);
1465 ARDOUR_UI::save_state_canfail (string name)
1470 if (name.length() == 0) {
1471 name = session->snap_name();
1474 if ((ret = session->save_state (name)) != 0) {
1475 session->save_history (name);
1479 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1484 ARDOUR_UI::restore_state (string name)
1487 if (name.length() == 0) {
1488 name = session->name();
1490 session->restore_state (name);
1491 session->restore_history (name);
1496 ARDOUR_UI::primary_clock_value_changed ()
1499 session->request_locate (primary_clock.current_time ());
1504 ARDOUR_UI::secondary_clock_value_changed ()
1507 session->request_locate (secondary_clock.current_time ());
1512 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1514 if (session && dstream && dstream->record_enabled()) {
1516 Session::RecordState rs;
1518 rs = session->record_status ();
1521 case Session::Disabled:
1522 case Session::Enabled:
1523 if (w->get_state() != STATE_SELECTED) {
1524 w->set_state (STATE_SELECTED);
1528 case Session::Recording:
1529 if (w->get_state() != STATE_ACTIVE) {
1530 w->set_state (STATE_ACTIVE);
1536 if (w->get_state() != STATE_NORMAL) {
1537 w->set_state (STATE_NORMAL);
1543 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1549 switch (session->record_status()) {
1550 case Session::Enabled:
1552 rec_button.set_state (1);
1554 rec_button.set_state (0);
1558 case Session::Recording:
1559 rec_button.set_state (2);
1563 rec_button.set_state (0);
1569 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1577 ARDOUR_UI::start_keyboard_prefix ()
1579 keyboard->start_prefix();
1583 ARDOUR_UI::save_template ()
1586 ArdourPrompter prompter (true);
1589 prompter.set_name (X_("Prompter"));
1590 prompter.set_prompt (_("Name for mix template:"));
1591 prompter.set_initial_text(session->name() + _("-template"));
1592 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1593 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1595 switch (prompter.run()) {
1596 case RESPONSE_ACCEPT:
1597 prompter.get_result (name);
1599 if (name.length()) {
1600 session->save_template (name);
1610 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1612 m_new_session_dialog->show();
1613 m_new_session_dialog->set_modal(true);
1614 m_new_session_dialog->set_name(predetermined_path);
1615 m_new_session_dialog->reset_recent();
1617 int response = Gtk::RESPONSE_CANCEL;
1620 response = m_new_session_dialog->run ();
1621 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1625 } else if (response == Gtk::RESPONSE_NONE) {
1626 /* Clear was pressed */
1627 m_new_session_dialog->reset();
1629 } else if (response == Gtk::RESPONSE_YES) {
1630 /* YES == OPEN, but there's no enum for that */
1631 std::string session_name = m_new_session_dialog->session_name();
1632 std::string session_path = m_new_session_dialog->session_folder();
1633 load_session (session_path, session_name);
1636 } else if (response == Gtk::RESPONSE_OK) {
1637 if (m_new_session_dialog->get_current_page() == 1) {
1639 /* XXX this is a bit of a hack..
1640 i really want the new sesion dialog to return RESPONSE_YES
1641 if we're on page 1 (the load page)
1642 Unfortunately i can't see how atm..
1644 std::string session_name = m_new_session_dialog->session_name();
1645 std::string session_path = m_new_session_dialog->session_folder();
1646 load_session (session_path, session_name);
1650 _session_is_new = true;
1652 std::string session_name = m_new_session_dialog->session_name();
1653 std::string session_path = m_new_session_dialog->session_folder();
1656 //XXX This is needed because session constructor wants a
1657 //non-existant path. hopefully this will be fixed at some point.
1659 session_path = Glib::build_filename(session_path, session_name);
1661 std::string template_name = m_new_session_dialog->session_template_name();
1663 if (m_new_session_dialog->use_session_template()) {
1665 load_session (session_path, session_name, &template_name);
1671 Session::AutoConnectOption iconnect;
1672 Session::AutoConnectOption oconnect;
1674 if (m_new_session_dialog->create_control_bus()) {
1675 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1680 if (m_new_session_dialog->create_master_bus()) {
1681 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1686 if (m_new_session_dialog->connect_inputs()) {
1687 iconnect = Session::AutoConnectPhysical;
1689 iconnect = Session::AutoConnectOption (0);
1692 /// @todo some minor tweaks.
1694 if (m_new_session_dialog->connect_outs_to_master()) {
1695 oconnect = Session::AutoConnectMaster;
1696 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1697 oconnect = Session::AutoConnectPhysical;
1699 oconnect = Session::AutoConnectOption (0);
1702 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1703 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1705 build_session (session_path,
1713 engine->frame_rate() * 60 * 5);
1718 } while (response == Gtk::RESPONSE_NONE);
1719 m_new_session_dialog->hide();
1725 ARDOUR_UI::close_session()
1732 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1734 Session *new_session;
1736 session_loaded = false;
1737 x = unload_session ();
1745 /* if it already exists, we must have write access */
1747 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1748 MessageDialog msg (*editor, _("\
1749 You do not have write access to this session.\n\
1750 This prevents the session from being loaded."));
1756 new_session = new Session (*engine, path, snap_name, mix_template);
1761 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1765 connect_to_session (new_session);
1767 //if (engine->running()) {
1768 //mixer->show_window();
1770 session_loaded = true;
1775 ARDOUR_UI::make_session_clean ()
1778 session->set_clean ();
1787 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1788 uint32_t control_channels,
1789 uint32_t master_channels,
1790 Session::AutoConnectOption input_connect,
1791 Session::AutoConnectOption output_connect,
1794 jack_nframes_t initial_length)
1796 Session *new_session;
1799 session_loaded = false;
1800 x = unload_session ();
1807 _session_is_new = true;
1810 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1811 control_channels, master_channels, nphysin, nphysout, initial_length);
1816 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1820 connect_to_session (new_session);
1822 //if (engine->running()) {
1823 //mixer->show_window();
1825 session_loaded = true;
1833 editor->show_window ();
1837 if (session && mixer) {
1838 // mixer->show_window ();
1847 ARDOUR_UI::show_splash ()
1850 about = new About();
1856 ARDOUR_UI::hide_splash ()
1864 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1868 removed = rep.paths.size();
1871 MessageDialog msgd (*editor,
1872 _("No audio files were ready for cleanup"),
1875 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1876 msgd.set_secondary_text (_("If this seems suprising, \n\
1877 check for any existing snapshots.\n\
1878 These may still include regions that\n\
1879 require some unused files to continue to exist."));
1885 ArdourDialog results (_("ardour: cleanup"), true, false);
1887 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1888 CleanupResultsModelColumns() {
1892 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1893 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1897 CleanupResultsModelColumns results_columns;
1898 Glib::RefPtr<Gtk::ListStore> results_model;
1899 Gtk::TreeView results_display;
1901 results_model = ListStore::create (results_columns);
1902 results_display.set_model (results_model);
1903 results_display.append_column (list_title, results_columns.visible_name);
1905 results_display.set_name ("CleanupResultsList");
1906 results_display.set_headers_visible (true);
1907 results_display.set_headers_clickable (false);
1908 results_display.set_reorderable (false);
1910 Gtk::ScrolledWindow list_scroller;
1913 Gtk::HBox dhbox; // the hbox for the image and text
1914 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1915 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1917 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1919 if (rep.space < 1048576.0f) {
1921 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1923 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1927 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1929 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1933 dhbox.pack_start (*dimage, true, false, 5);
1934 dhbox.pack_start (txt, true, false, 5);
1936 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1937 TreeModel::Row row = *(results_model->append());
1938 row[results_columns.visible_name] = *i;
1939 row[results_columns.fullpath] = *i;
1942 list_scroller.add (results_display);
1943 list_scroller.set_size_request (-1, 150);
1944 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
1946 dvbox.pack_start (dhbox, true, false, 5);
1947 dvbox.pack_start (list_scroller, true, false, 5);
1948 ddhbox.pack_start (dvbox, true, false, 5);
1950 results.get_vbox()->pack_start (ddhbox, true, false, 5);
1951 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
1952 results.set_default_response (RESPONSE_CLOSE);
1953 results.set_position (Gtk::WIN_POS_MOUSE);
1954 results.show_all_children ();
1955 results.set_resizable (false);
1962 ARDOUR_UI::cleanup ()
1965 /* shouldn't happen: menu item is insensitive */
1970 MessageDialog checker (_("Are you sure you want to cleanup?"),
1972 Gtk::MESSAGE_QUESTION,
1973 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
1975 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
1976 ALL undo/redo information will be lost if you cleanup.\n\
1977 After cleanup, unused audio files will be moved to a \
1978 \"dead sounds\" location."));
1980 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
1981 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
1982 checker.set_default_response (RESPONSE_CANCEL);
1984 checker.set_name (_("CleanupDialog"));
1985 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
1986 checker.set_position (Gtk::WIN_POS_MOUSE);
1988 switch (checker.run()) {
1989 case RESPONSE_ACCEPT:
1995 Session::cleanup_report rep;
1997 editor->prepare_for_cleanup ();
1999 if (session->cleanup_sources (rep)) {
2003 display_cleanup_results (rep,
2006 The following %1 %2 not in use and \n\
2007 have been moved to:\n\
2009 Flushing the wastebasket will \n\
2010 release an additional\n\
2011 %4 %5bytes of disk space.\n"
2016 ARDOUR_UI::flush_trash ()
2019 /* shouldn't happen: menu item is insensitive */
2023 Session::cleanup_report rep;
2025 if (session->cleanup_trash_sources (rep)) {
2029 display_cleanup_results (rep,
2031 _("The following %1 %2 deleted from\n\
2033 releasing %4 %5bytes of disk space"));
2037 ARDOUR_UI::add_route ()
2045 if (add_route_dialog == 0) {
2046 add_route_dialog = new AddRouteDialog;
2047 editor->ensure_float (*add_route_dialog);
2050 if (add_route_dialog->is_visible()) {
2051 /* we're already doing this */
2055 ResponseType r = (ResponseType) add_route_dialog->run ();
2057 add_route_dialog->hide();
2060 case RESPONSE_ACCEPT:
2067 if ((count = add_route_dialog->count()) <= 0) {
2071 uint32_t input_chan = add_route_dialog->channels ();
2072 uint32_t output_chan;
2073 string name_template = add_route_dialog->name_template ();
2074 bool track = add_route_dialog->track ();
2076 Session::AutoConnectOption oac = session->get_output_auto_connect();
2078 if (oac & Session::AutoConnectMaster) {
2079 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2081 output_chan = input_chan;
2084 /* XXX do something with name template */
2088 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2090 session_add_audio_bus (input_chan, output_chan);
2094 while (Main::events_pending()) {
2101 ARDOUR_UI::mixer_settings () const
2106 node = session->instant_xml(X_("Mixer"), session->path());
2108 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2112 node = new XMLNode (X_("Mixer"));
2119 ARDOUR_UI::editor_settings () const
2124 node = session->instant_xml(X_("Editor"), session->path());
2126 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2130 node = new XMLNode (X_("Editor"));
2136 ARDOUR_UI::keyboard_settings () const
2140 node = Config->extra_xml(X_("Keyboard"));
2143 node = new XMLNode (X_("Keyboard"));
2149 ARDOUR_UI::halt_on_xrun_message ()
2151 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2153 MessageDialog msg (*editor,
2154 _("Recording was stopped because your system could not keep up."));
2159 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::Source*>* deletion_list)
2161 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2163 for (list<Source*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2167 delete deletion_list;
2171 ARDOUR_UI::disk_overrun_handler ()
2173 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2175 if (!have_disk_overrun_displayed) {
2176 have_disk_overrun_displayed = true;
2177 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2178 The disk system on your computer\n\
2179 was not able to keep up with Ardour.\n\
2181 Specifically, it failed to write data to disk\n\
2182 quickly enough to keep up with recording.\n"));
2184 have_disk_overrun_displayed = false;
2189 ARDOUR_UI::disk_underrun_handler ()
2191 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2193 if (!have_disk_underrun_displayed) {
2194 have_disk_underrun_displayed = true;
2195 MessageDialog msg (*editor,
2196 (_("The disk system on your computer\n\
2197 was not able to keep up with Ardour.\n\
2199 Specifically, it failed to read data from disk\n\
2200 quickly enough to keep up with playback.\n")));
2202 have_disk_underrun_displayed = false;
2207 ARDOUR_UI::disk_underrun_message_gone ()
2209 have_disk_underrun_displayed = false;
2213 ARDOUR_UI::disk_overrun_message_gone ()
2215 have_disk_underrun_displayed = false;
2219 ARDOUR_UI::pending_state_dialog ()
2221 ArdourDialog dialog ("pending state dialog");
2223 This session appears to have been in\n\
2224 middle of recording when ardour or\n\
2225 the computer was shutdown.\n\
2227 Ardour can recover any captured audio for\n\
2228 you, or it can ignore it. Please decide\n\
2229 what you would like to do.\n"));
2231 dialog.get_vbox()->pack_start (message);
2232 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2233 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2235 dialog.set_position (WIN_POS_CENTER);
2238 switch (dialog.run ()) {
2239 case RESPONSE_ACCEPT:
2247 ARDOUR_UI::disconnect_from_jack ()
2250 if( engine->disconnect_from_jack ()) {
2251 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2255 update_sample_rate (0);
2260 ARDOUR_UI::reconnect_to_jack ()
2263 if (engine->reconnect_to_jack ()) {
2264 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2268 update_sample_rate (0);
2273 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2275 engine->request_buffer_size (nframes);
2276 update_sample_rate (0);
2280 ARDOUR_UI::cmdline_new_session (string path)
2282 if (path[0] != '/') {
2283 char buf[PATH_MAX+1];
2286 getcwd (buf, sizeof (buf));
2293 new_session (false, path);
2295 _will_create_new_session_automatically = false; /* done it */
2296 return FALSE; /* don't call it again */
2300 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2302 Glib::RefPtr<Action> act;
2306 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2309 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2312 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2315 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2318 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2321 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2324 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2329 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2330 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2331 Config->set_native_file_header_format (hf);
2333 session->reset_native_file_format ();
2340 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2342 Glib::RefPtr<Action> act;
2346 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2349 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2354 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2356 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2357 Config->set_native_file_data_format (sf);
2359 session->reset_native_file_format ();
2366 ARDOUR_UI::use_config ()
2368 Glib::RefPtr<Action> act;
2370 switch (Config->get_native_file_data_format ()) {
2372 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2375 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2380 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2381 ract->set_active ();
2384 switch (Config->get_native_file_header_format ()) {
2386 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2389 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2392 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2395 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2398 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2401 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2404 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2409 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2410 ract->set_active ();