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\nin")),
120 punch_out_button (_("punch\nout")),
121 auto_return_button (_("auto\nreturn")),
122 auto_play_button (_("auto\nplay")),
123 auto_input_button (_("auto\ninput")),
124 click_button (_("click")),
125 auditioning_alert_button (_("AUDITIONING")),
126 solo_alert_button (_("SOLO")),
130 using namespace Gtk::Menu_Helpers;
136 if (theArdourUI == 0) {
140 ActionManager::init ();
144 color_manager = new ColorManager();
146 std::string color_file = ARDOUR::find_config_file("ardour.colors");
148 color_manager->load (color_file);
150 m_new_session_dialog = new NewSessionDialog();
154 _session_is_new = false;
155 big_clock_window = 0;
156 session_selector_window = 0;
157 last_key_press_time = 0;
158 connection_editor = 0;
159 add_route_dialog = 0;
164 open_session_selector = 0;
165 have_configure_timeout = false;
166 have_disk_overrun_displayed = false;
167 have_disk_underrun_displayed = false;
168 _will_create_new_session_automatically = false;
169 session_loaded = false;
170 last_speed_displayed = -1.0f;
172 last_configure_time.tv_sec = 0;
173 last_configure_time.tv_usec = 0;
175 shuttle_grabbed = false;
177 shuttle_max_speed = 8.0f;
179 set_shuttle_units (Percentage);
180 set_shuttle_behaviour (Sprung);
182 shuttle_style_menu = 0;
183 shuttle_unit_menu = 0;
185 gettimeofday (&last_peak_grab, 0);
186 gettimeofday (&last_shuttle_request, 0);
188 ARDOUR::AudioDiskstream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
189 ARDOUR::Diskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
190 ARDOUR::Diskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
192 /* handle pending state with a dialog */
194 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
196 /* have to wait for AudioEngine and Configuration before proceeding */
200 ARDOUR_UI::set_engine (AudioEngine& e)
204 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
205 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
206 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
207 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
211 keyboard = new Keyboard;
213 if (setup_windows ()) {
214 throw failed_constructor ();
217 if (GTK_ARDOUR::show_key_actions) {
218 vector<string> names;
219 vector<string> paths;
221 vector<AccelKey> bindings;
223 ActionManager::get_all_actions (names, paths, keys, bindings);
225 vector<string>::iterator n;
226 vector<string>::iterator k;
227 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
228 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
234 /* start with timecode, metering enabled
237 blink_timeout_tag = -1;
239 /* the global configuration object is now valid */
243 /* this being a GUI and all, we want peakfiles */
245 AudioFileSource::set_build_peakfiles (true);
246 AudioFileSource::set_build_missing_peakfiles (true);
248 if (AudioSource::start_peak_thread ()) {
249 throw failed_constructor();
252 /* start the time-of-day-clock */
254 update_wall_clock ();
255 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
257 update_disk_space ();
259 update_sample_rate (engine->frame_rate());
261 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
262 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
265 ARDOUR_UI::~ARDOUR_UI ()
267 save_ardour_state ();
281 if (add_route_dialog) {
282 delete add_route_dialog;
285 AudioSource::stop_peak_thread ();
289 ARDOUR_UI::configure_timeout ()
294 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
295 /* no configure events yet */
299 gettimeofday (&now, 0);
300 timersub (&now, &last_configure_time, &diff);
302 /* force a gap of 0.5 seconds since the last configure event
305 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
308 have_configure_timeout = false;
309 save_ardour_state ();
315 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
317 if (have_configure_timeout) {
318 gettimeofday (&last_configure_time, 0);
320 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
321 have_configure_timeout = true;
328 ARDOUR_UI::save_ardour_state ()
330 if (!keyboard || !mixer || !editor) {
334 /* XXX this is all a bit dubious. add_extra_xml() uses
335 a different lifetime model from add_instant_xml().
338 XMLNode* node = new XMLNode (keyboard->get_state());
339 Config->add_extra_xml (*node);
340 Config->save_state();
342 XMLNode enode(static_cast<Stateful*>(editor)->get_state());
343 XMLNode mnode(mixer->get_state());
346 session->add_instant_xml (enode, session->path());
347 session->add_instant_xml (mnode, session->path());
349 Config->add_instant_xml (enode, get_user_ardour_path());
350 Config->add_instant_xml (mnode, get_user_ardour_path());
355 AccelMap::save ("ardour.saved_bindings");
359 ARDOUR_UI::startup ()
361 /* Once the UI is up and running, start the audio engine. Doing
362 this before the UI is up and running can cause problems
363 when not running with SCHED_FIFO, because the amount of
364 CPU and disk work needed to get the UI started can interfere
365 with the scheduling of the audio thread.
368 Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
374 if (session && session->dirty()) {
375 switch (ask_about_saving_session(_("quit"))) {
380 /* use the default name */
381 if (save_state_canfail ("")) {
382 /* failed - don't quit */
383 MessageDialog msg (*editor,
385 Ardour was unable to save your session.\n\n\
386 If you still wish to quit, please use the\n\n\
387 \"Just quit\" option."));
396 Config->save_state();
401 ARDOUR_UI::ask_about_saving_session (const string & what)
403 ArdourDialog window (_("ardour: save session?"));
404 Gtk::HBox dhbox; // the hbox for the image and text
405 Gtk::Label prompt_label;
406 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
410 msg = string_compose(_("Don't %1"), what);
411 window.add_button (msg, RESPONSE_REJECT);
412 msg = string_compose(_("Just %1"), what);
413 window.add_button (msg, RESPONSE_APPLY);
414 msg = string_compose(_("Save and %1"), what);
415 window.add_button (msg, RESPONSE_ACCEPT);
417 window.set_default_response (RESPONSE_ACCEPT);
419 Gtk::Button noquit_button (msg);
420 noquit_button.set_name ("EditorGTKButton");
425 if (session->snap_name() == session->name()) {
428 type = _("snapshot");
430 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?"),
431 type, session->snap_name());
433 prompt_label.set_text (prompt);
434 prompt_label.set_name (X_("PrompterLabel"));
435 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
437 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
439 dhbox.set_homogeneous (false);
440 dhbox.pack_start (*dimage, false, false, 5);
441 dhbox.pack_start (prompt_label, true, false, 5);
442 window.get_vbox()->pack_start (dhbox);
444 window.set_name (_("Prompter"));
445 window.set_position (Gtk::WIN_POS_MOUSE);
446 window.set_modal (true);
447 window.set_resizable (false);
450 save_the_session = 0;
452 editor->ensure_float (window);
454 ResponseType r = (ResponseType) window.run();
459 case RESPONSE_ACCEPT: // save and get out of here
461 case RESPONSE_APPLY: // get out of here
471 ARDOUR_UI::every_second ()
474 update_buffer_load ();
475 update_disk_space ();
480 ARDOUR_UI::every_point_one_seconds ()
482 update_speed_display ();
483 RapidScreenUpdate(); /* EMIT_SIGNAL */
488 ARDOUR_UI::every_point_zero_one_seconds ()
490 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
495 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
499 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
501 if (!engine->connected()) {
503 snprintf (buf, sizeof (buf), _("disconnected"));
507 jack_nframes_t rate = engine->frame_rate();
509 if (fmod (rate, 1000.0) != 0.0) {
510 snprintf (buf, sizeof (buf), _("SR: %.1f kHz / %4.1f msecs"),
511 (float) rate/1000.0f,
512 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
514 snprintf (buf, sizeof (buf), _("SR: %u kHz / %4.1f msecs"),
516 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
520 sample_rate_label.set_text (buf);
524 ARDOUR_UI::update_cpu_load ()
527 snprintf (buf, sizeof (buf), _("DSP Load: %.1f%%"), engine->get_cpu_load());
528 cpu_load_label.set_text (buf);
532 ARDOUR_UI::update_buffer_load ()
537 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
538 session->playback_load(), session->capture_load());
539 buffer_load_label.set_text (buf);
541 buffer_load_label.set_text ("");
546 ARDOUR_UI::count_recenabled_diskstreams (Route& route)
548 Track* track = dynamic_cast<Track*>(&route);
549 if (track && track->diskstream().record_enabled()) {
550 rec_enabled_diskstreams++;
555 ARDOUR_UI::update_disk_space()
561 jack_nframes_t frames = session->available_capture_duration();
564 if (frames == max_frames) {
565 strcpy (buf, _("space: 24hrs+"));
570 jack_nframes_t fr = session->frame_rate();
572 if (session->actively_recording()){
574 rec_enabled_diskstreams = 0;
575 session->foreach_route (this, &ARDOUR_UI::count_recenabled_diskstreams);
577 if (rec_enabled_diskstreams) {
578 frames /= rec_enabled_diskstreams;
583 /* hmmm. shall we divide by the route count? or the diskstream count?
584 or what? for now, do nothing ...
589 hrs = frames / (fr * 3600);
590 frames -= hrs * fr * 3600;
591 mins = frames / (fr * 60);
592 frames -= mins * fr * 60;
595 snprintf (buf, sizeof(buf), _("space: %02dh:%02dm:%02ds"), hrs, mins, secs);
598 disk_space_label.set_text (buf);
602 ARDOUR_UI::update_wall_clock ()
609 tm_now = localtime (&now);
611 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
612 wall_clock_label.set_text (buf);
617 ARDOUR_UI::control_methods_adjusted ()
622 which_method = (int) online_control_button->adjustment.get_value();
623 switch (which_method) {
625 allow_mmc_and_local ();
634 fatal << _("programming error: impossible control method") << endmsg;
640 ARDOUR_UI::mmc_device_id_adjusted ()
645 int dev_id = (int) mmc_id_button->adjustment.get_value();
646 mmc->set_device_id (dev_id);
652 ARDOUR_UI::session_menu (GdkEventButton *ev)
654 session_popup_menu->popup (0, 0);
659 ARDOUR_UI::redisplay_recent_sessions ()
661 vector<string *> *sessions;
662 vector<string *>::iterator i;
663 RecentSessionsSorter cmp;
665 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
666 recent_session_model->clear ();
669 ARDOUR::read_recent_sessions (rs);
672 recent_session_display.set_model (recent_session_model);
676 /* sort them alphabetically */
677 sort (rs.begin(), rs.end(), cmp);
678 sessions = new vector<string*>;
680 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
681 sessions->push_back (new string ((*i).second));
684 for (i = sessions->begin(); i != sessions->end(); ++i) {
686 vector<string*>* states;
687 vector<const gchar*> item;
688 string fullpath = *(*i);
690 /* remove any trailing / */
692 if (fullpath[fullpath.length()-1] == '/') {
693 fullpath = fullpath.substr (0, fullpath.length()-1);
696 /* now get available states for this session */
698 if ((states = Session::possible_states (fullpath)) == 0) {
703 TreeModel::Row row = *(recent_session_model->append());
705 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
706 row[recent_session_columns.fullpath] = fullpath;
708 if (states->size() > 1) {
710 /* add the children */
712 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
714 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
716 child_row[recent_session_columns.visible_name] = **i2;
717 child_row[recent_session_columns.fullpath] = fullpath;
726 recent_session_display.set_model (recent_session_model);
731 ARDOUR_UI::build_session_selector ()
733 session_selector_window = new ArdourDialog ("session selector");
735 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
737 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
738 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
739 session_selector_window->set_default_response (RESPONSE_ACCEPT);
740 recent_session_model = TreeStore::create (recent_session_columns);
741 recent_session_display.set_model (recent_session_model);
742 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
743 recent_session_display.set_headers_visible (false);
744 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
746 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
748 scroller->add (recent_session_display);
749 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
751 session_selector_window->set_name ("SessionSelectorWindow");
752 session_selector_window->set_size_request (200, 400);
753 session_selector_window->get_vbox()->pack_start (*scroller);
754 session_selector_window->show_all_children();
758 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
760 session_selector_window->response (RESPONSE_ACCEPT);
764 ARDOUR_UI::open_recent_session ()
766 /* popup selector window */
768 if (session_selector_window == 0) {
769 build_session_selector ();
772 redisplay_recent_sessions ();
774 ResponseType r = (ResponseType) session_selector_window->run ();
776 session_selector_window->hide();
779 case RESPONSE_ACCEPT:
785 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
787 if (i == recent_session_model->children().end()) {
791 Glib::ustring path = (*i)[recent_session_columns.fullpath];
792 Glib::ustring state = (*i)[recent_session_columns.visible_name];
794 _session_is_new = false;
796 load_session (path, state);
800 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
804 if (stat (info.filename.c_str(), &statbuf) != 0) {
808 if (!S_ISDIR(statbuf.st_mode)) {
814 string session_file = info.filename;
816 session_file += Glib::path_get_basename (info.filename);
817 session_file += ".ardour";
819 if (stat (session_file.c_str(), &statbuf) != 0) {
823 return S_ISREG (statbuf.st_mode);
827 ARDOUR_UI::open_session ()
829 /* popup selector window */
831 if (open_session_selector == 0) {
833 /* ardour sessions are folders */
835 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
836 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
837 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
839 FileFilter session_filter;
840 session_filter.add_pattern ("*.ardour");
841 session_filter.set_name (_("Ardour sessions"));
842 open_session_selector->add_filter (session_filter);
843 open_session_selector->set_filter (session_filter);
846 int response = open_session_selector->run();
847 open_session_selector->hide ();
850 case RESPONSE_ACCEPT:
853 open_session_selector->hide();
857 open_session_selector->hide();
858 string session_path = open_session_selector->get_filename();
862 if (session_path.length() > 0) {
863 if (Session::find_session (session_path, path, name, isnew) == 0) {
864 _session_is_new = isnew;
865 load_session (path, name);
872 ARDOUR_UI::session_add_midi_track ()
874 cerr << _("Patience is a virtue.\n");
878 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
880 boost::shared_ptr<Route> route;
883 warning << _("You cannot add a track without a session already loaded.") << endmsg;
889 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
890 error << _("could not create new audio track") << endmsg;
893 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
894 error << _("could not create new audio bus") << endmsg;
899 if (need_control_room_outs) {
905 route->set_stereo_control_outs (control_lr_channels);
906 route->control_outs()->set_stereo_pan (pans, this);
908 #endif /* CONTROLOUTS */
912 MessageDialog msg (*editor,
913 _("There are insufficient JACK ports available\n\
914 to create a new track or bus.\n\
915 You should save Ardour, exit and\n\
916 restart JACK with more ports."));
922 ARDOUR_UI::diskstream_added (Diskstream* ds)
927 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
929 jack_nframes_t _preroll;
932 _preroll = session->convert_to_frames_at (new_position, session->preroll);
934 if (new_position > _preroll) {
935 new_position -= _preroll;
940 session->request_locate (new_position);
945 ARDOUR_UI::transport_goto_start ()
948 session->goto_start();
951 /* force displayed area in editor to start no matter
952 what "follow playhead" setting is.
956 editor->reposition_x_origin (session->current_start_frame());
962 ARDOUR_UI::transport_goto_zero ()
965 session->request_locate (0);
968 /* force displayed area in editor to start no matter
969 what "follow playhead" setting is.
973 editor->reposition_x_origin (0);
979 ARDOUR_UI::transport_goto_end ()
982 jack_nframes_t frame = session->current_end_frame();
983 session->request_locate (frame);
985 /* force displayed area in editor to start no matter
986 what "follow playhead" setting is.
990 editor->reposition_x_origin (frame);
996 ARDOUR_UI::transport_stop ()
1002 if (session->is_auditioning()) {
1003 session->cancel_audition ();
1007 if (session->get_auto_loop()) {
1008 session->request_auto_loop (false);
1011 session->request_stop ();
1015 ARDOUR_UI::transport_stop_and_forget_capture ()
1018 session->request_stop (true);
1023 ARDOUR_UI::remove_last_capture()
1026 editor->remove_last_capture();
1031 ARDOUR_UI::transport_record ()
1034 switch (session->record_status()) {
1035 case Session::Disabled:
1036 if (session->ntracks() == 0) {
1037 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1038 MessageDialog msg (*editor, txt);
1042 session->maybe_enable_record ();
1044 case Session::Recording:
1045 case Session::Enabled:
1046 session->disable_record (true);
1052 ARDOUR_UI::transport_roll ()
1060 rolling = session->transport_rolling ();
1062 if (session->get_auto_loop()) {
1063 session->request_auto_loop (false);
1064 auto_loop_button.set_active (false);
1065 roll_button.set_active (true);
1066 } else if (session->get_play_range ()) {
1067 session->request_play_range (false);
1068 play_selection_button.set_active (false);
1069 } else if (rolling) {
1070 session->request_locate (session->last_transport_start(), true);
1073 session->request_transport_speed (1.0f);
1077 ARDOUR_UI::transport_loop()
1080 if (session->get_auto_loop()) {
1081 if (session->transport_rolling()) {
1082 Location * looploc = session->locations()->auto_loop_location();
1084 session->request_locate (looploc->start(), true);
1089 session->request_auto_loop (true);
1095 ARDOUR_UI::transport_play_selection ()
1101 if (!session->get_play_range()) {
1102 session->request_stop ();
1105 editor->play_selection ();
1109 ARDOUR_UI::transport_rewind (int option)
1111 float current_transport_speed;
1114 current_transport_speed = session->transport_speed();
1116 if (current_transport_speed >= 0.0f) {
1119 session->request_transport_speed (-1.0f);
1122 session->request_transport_speed (-4.0f);
1125 session->request_transport_speed (-0.5f);
1130 session->request_transport_speed (current_transport_speed * 1.5f);
1136 ARDOUR_UI::transport_forward (int option)
1138 float current_transport_speed;
1141 current_transport_speed = session->transport_speed();
1143 if (current_transport_speed <= 0.0f) {
1146 session->request_transport_speed (1.0f);
1149 session->request_transport_speed (4.0f);
1152 session->request_transport_speed (0.5f);
1157 session->request_transport_speed (current_transport_speed * 1.5f);
1163 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1169 boost::shared_ptr<Route> r;
1171 if ((r = session->route_by_remote_id (dstream)) != 0) {
1175 if ((t = dynamic_cast<Track*>(r.get())) != 0) {
1176 t->diskstream().set_record_enabled (!t->diskstream().record_enabled());
1185 ARDOUR_UI::queue_transport_change ()
1187 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1191 ARDOUR_UI::map_transport_state ()
1193 float sp = session->transport_speed();
1196 transport_rolling ();
1197 } else if (sp < 0.0f) {
1198 transport_rewinding ();
1199 } else if (sp > 0.0f) {
1200 transport_forwarding ();
1202 transport_stopped ();
1207 ARDOUR_UI::allow_local_only ()
1213 ARDOUR_UI::allow_mmc_only ()
1219 ARDOUR_UI::allow_mmc_and_local ()
1225 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1227 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1228 (int) adj.get_value()].c_str());
1232 ARDOUR_UI::engine_stopped ()
1234 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1235 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1236 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1241 ARDOUR_UI::engine_running ()
1243 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1244 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1245 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1249 ARDOUR_UI::engine_halted ()
1251 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1253 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1254 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1256 update_sample_rate (0);
1258 MessageDialog msg (*editor,
1260 JACK has either been shutdown or it\n\
1261 disconnected Ardour because Ardour\n\
1262 was not fast enough. You can save the\n\
1263 session and/or try to reconnect to JACK ."));
1268 ARDOUR_UI::do_engine_start ()
1274 catch (AudioEngine::PortRegistrationFailure& err) {
1276 error << _("Unable to create all required ports")
1284 error << _("Unable to start the session running")
1294 ARDOUR_UI::start_engine ()
1296 if (do_engine_start () == 0) {
1297 if (session && _session_is_new) {
1298 /* we need to retain initial visual
1299 settings for a new session
1301 session->save_state ("");
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) {
1478 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1483 ARDOUR_UI::restore_state (string name)
1486 if (name.length() == 0) {
1487 name = session->name();
1489 session->restore_state (name);
1494 ARDOUR_UI::primary_clock_value_changed ()
1497 session->request_locate (primary_clock.current_time ());
1502 ARDOUR_UI::secondary_clock_value_changed ()
1505 session->request_locate (secondary_clock.current_time ());
1510 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1512 if (session && dstream && dstream->record_enabled()) {
1514 Session::RecordState rs;
1516 rs = session->record_status ();
1519 case Session::Disabled:
1520 case Session::Enabled:
1521 if (w->get_state() != STATE_SELECTED) {
1522 w->set_state (STATE_SELECTED);
1526 case Session::Recording:
1527 if (w->get_state() != STATE_ACTIVE) {
1528 w->set_state (STATE_ACTIVE);
1534 if (w->get_state() != STATE_NORMAL) {
1535 w->set_state (STATE_NORMAL);
1541 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1547 switch (session->record_status()) {
1548 case Session::Enabled:
1550 rec_button.set_state (1);
1552 rec_button.set_state (0);
1556 case Session::Recording:
1557 rec_button.set_state (2);
1561 rec_button.set_state (0);
1567 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1575 ARDOUR_UI::start_keyboard_prefix ()
1577 keyboard->start_prefix();
1581 ARDOUR_UI::save_template ()
1584 ArdourPrompter prompter (true);
1587 prompter.set_name (X_("Prompter"));
1588 prompter.set_prompt (_("Name for mix template:"));
1589 prompter.set_initial_text(session->name() + _("-template"));
1590 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1591 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1593 switch (prompter.run()) {
1594 case RESPONSE_ACCEPT:
1595 prompter.get_result (name);
1597 if (name.length()) {
1598 session->save_template (name);
1608 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1610 m_new_session_dialog->show();
1611 m_new_session_dialog->set_modal(true);
1612 m_new_session_dialog->set_name(predetermined_path);
1613 m_new_session_dialog->reset_recent();
1615 int response = Gtk::RESPONSE_CANCEL;
1618 response = m_new_session_dialog->run ();
1619 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1623 } else if (response == Gtk::RESPONSE_NONE) {
1624 /* Clear was pressed */
1625 m_new_session_dialog->reset();
1627 } else if (response == Gtk::RESPONSE_YES) {
1628 /* YES == OPEN, but there's no enum for that */
1629 std::string session_name = m_new_session_dialog->session_name();
1630 std::string session_path = m_new_session_dialog->session_folder();
1631 load_session (session_path, session_name);
1634 } else if (response == Gtk::RESPONSE_OK) {
1635 if (m_new_session_dialog->get_current_page() == 1) {
1637 /* XXX this is a bit of a hack..
1638 i really want the new sesion dialog to return RESPONSE_YES
1639 if we're on page 1 (the load page)
1640 Unfortunately i can't see how atm..
1642 std::string session_name = m_new_session_dialog->session_name();
1643 std::string session_path = m_new_session_dialog->session_folder();
1644 load_session (session_path, session_name);
1648 _session_is_new = true;
1650 std::string session_name = m_new_session_dialog->session_name();
1651 std::string session_path = m_new_session_dialog->session_folder();
1654 //XXX This is needed because session constructor wants a
1655 //non-existant path. hopefully this will be fixed at some point.
1657 session_path = Glib::build_filename(session_path, session_name);
1659 std::string template_name = m_new_session_dialog->session_template_name();
1661 if (m_new_session_dialog->use_session_template()) {
1663 load_session (session_path, session_name, &template_name);
1669 Session::AutoConnectOption iconnect;
1670 Session::AutoConnectOption oconnect;
1672 if (m_new_session_dialog->create_control_bus()) {
1673 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1678 if (m_new_session_dialog->create_master_bus()) {
1679 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1684 if (m_new_session_dialog->connect_inputs()) {
1685 iconnect = Session::AutoConnectPhysical;
1687 iconnect = Session::AutoConnectOption (0);
1690 /// @todo some minor tweaks.
1692 if (m_new_session_dialog->connect_outs_to_master()) {
1693 oconnect = Session::AutoConnectMaster;
1694 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1695 oconnect = Session::AutoConnectPhysical;
1697 oconnect = Session::AutoConnectOption (0);
1700 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1701 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1703 build_session (session_path,
1711 engine->frame_rate() * 60 * 5);
1716 } while (response == Gtk::RESPONSE_NONE);
1717 m_new_session_dialog->hide();
1723 ARDOUR_UI::close_session()
1730 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1732 Session *new_session;
1734 session_loaded = false;
1735 x = unload_session ();
1743 /* if it already exists, we must have write access */
1745 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1746 MessageDialog msg (*editor, _("\
1747 You do not have write access to this session.\n\
1748 This prevents the session from being loaded."));
1754 new_session = new Session (*engine, path, snap_name, mix_template);
1759 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1763 connect_to_session (new_session);
1765 //if (engine->running()) {
1766 //mixer->show_window();
1768 session_loaded = true;
1773 ARDOUR_UI::make_session_clean ()
1776 session->set_clean ();
1785 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1786 uint32_t control_channels,
1787 uint32_t master_channels,
1788 Session::AutoConnectOption input_connect,
1789 Session::AutoConnectOption output_connect,
1792 jack_nframes_t initial_length)
1794 Session *new_session;
1797 session_loaded = false;
1798 x = unload_session ();
1805 _session_is_new = true;
1808 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1809 control_channels, master_channels, nphysin, nphysout, initial_length);
1814 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1818 connect_to_session (new_session);
1820 //if (engine->running()) {
1821 //mixer->show_window();
1823 session_loaded = true;
1831 editor->show_window ();
1835 if (session && mixer) {
1836 // mixer->show_window ();
1845 ARDOUR_UI::show_splash ()
1848 about = new About();
1854 ARDOUR_UI::hide_splash ()
1862 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1866 removed = rep.paths.size();
1869 MessageDialog msgd (*editor,
1870 _("No audio files were ready for cleanup"),
1873 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1874 msgd.set_secondary_text (_("If this seems suprising, \n\
1875 check for any existing snapshots.\n\
1876 These may still include regions that\n\
1877 require some unused files to continue to exist."));
1883 ArdourDialog results (_("ardour: cleanup"), true, false);
1885 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1886 CleanupResultsModelColumns() {
1890 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1891 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1895 CleanupResultsModelColumns results_columns;
1896 Glib::RefPtr<Gtk::ListStore> results_model;
1897 Gtk::TreeView results_display;
1899 results_model = ListStore::create (results_columns);
1900 results_display.set_model (results_model);
1901 results_display.append_column (list_title, results_columns.visible_name);
1903 results_display.set_name ("CleanupResultsList");
1904 results_display.set_headers_visible (true);
1905 results_display.set_headers_clickable (false);
1906 results_display.set_reorderable (false);
1908 Gtk::ScrolledWindow list_scroller;
1911 Gtk::HBox dhbox; // the hbox for the image and text
1912 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1913 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1915 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1917 if (rep.space < 1048576.0f) {
1919 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1921 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1925 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1927 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1931 dhbox.pack_start (*dimage, true, false, 5);
1932 dhbox.pack_start (txt, true, false, 5);
1934 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1935 TreeModel::Row row = *(results_model->append());
1936 row[results_columns.visible_name] = *i;
1937 row[results_columns.fullpath] = *i;
1940 list_scroller.add (results_display);
1941 list_scroller.set_size_request (-1, 150);
1942 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
1944 dvbox.pack_start (dhbox, true, false, 5);
1945 dvbox.pack_start (list_scroller, true, false, 5);
1946 ddhbox.pack_start (dvbox, true, false, 5);
1948 results.get_vbox()->pack_start (ddhbox, true, false, 5);
1949 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
1950 results.set_default_response (RESPONSE_CLOSE);
1951 results.set_position (Gtk::WIN_POS_MOUSE);
1952 results.show_all_children ();
1953 results.set_resizable (false);
1960 ARDOUR_UI::cleanup ()
1963 /* shouldn't happen: menu item is insensitive */
1968 MessageDialog checker (_("Are you sure you want to cleanup?"),
1970 Gtk::MESSAGE_QUESTION,
1971 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
1973 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
1974 ALL undo/redo information will be lost if you cleanup.\n\
1975 After cleanup, unused audio files will be moved to a \
1976 \"dead sounds\" location."));
1978 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
1979 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
1980 checker.set_default_response (RESPONSE_CANCEL);
1982 checker.set_name (_("CleanupDialog"));
1983 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
1984 checker.set_position (Gtk::WIN_POS_MOUSE);
1986 switch (checker.run()) {
1987 case RESPONSE_ACCEPT:
1993 Session::cleanup_report rep;
1995 editor->prepare_for_cleanup ();
1997 if (session->cleanup_sources (rep)) {
2001 display_cleanup_results (rep,
2004 The following %1 %2 not in use and \n\
2005 have been moved to:\n\
2007 Flushing the wastebasket will \n\
2008 release an additional\n\
2009 %4 %5bytes of disk space.\n"
2014 ARDOUR_UI::flush_trash ()
2017 /* shouldn't happen: menu item is insensitive */
2021 Session::cleanup_report rep;
2023 if (session->cleanup_trash_sources (rep)) {
2027 display_cleanup_results (rep,
2029 _("The following %1 %2 deleted from\n\
2031 releasing %4 %5bytes of disk space"));
2035 ARDOUR_UI::add_route ()
2043 if (add_route_dialog == 0) {
2044 add_route_dialog = new AddRouteDialog;
2045 editor->ensure_float (*add_route_dialog);
2048 if (add_route_dialog->is_visible()) {
2049 /* we're already doing this */
2053 ResponseType r = (ResponseType) add_route_dialog->run ();
2055 add_route_dialog->hide();
2058 case RESPONSE_ACCEPT:
2065 if ((count = add_route_dialog->count()) <= 0) {
2069 uint32_t input_chan = add_route_dialog->channels ();
2070 uint32_t output_chan;
2071 string name_template = add_route_dialog->name_template ();
2072 bool track = add_route_dialog->track ();
2074 Session::AutoConnectOption oac = session->get_output_auto_connect();
2076 if (oac & Session::AutoConnectMaster) {
2077 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2079 output_chan = input_chan;
2082 /* XXX do something with name template */
2086 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2088 session_add_audio_bus (input_chan, output_chan);
2092 while (Main::events_pending()) {
2099 ARDOUR_UI::mixer_settings () const
2104 node = session->instant_xml(X_("Mixer"), session->path());
2106 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2110 node = new XMLNode (X_("Mixer"));
2117 ARDOUR_UI::editor_settings () const
2122 node = session->instant_xml(X_("Editor"), session->path());
2124 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2128 node = new XMLNode (X_("Editor"));
2134 ARDOUR_UI::keyboard_settings () const
2138 node = Config->extra_xml(X_("Keyboard"));
2141 node = new XMLNode (X_("Keyboard"));
2147 ARDOUR_UI::halt_on_xrun_message ()
2149 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2151 MessageDialog msg (*editor,
2152 _("Recording was stopped because your system could not keep up."));
2157 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::Source*>* deletion_list)
2159 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2161 for (list<Source*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2165 delete deletion_list;
2169 ARDOUR_UI::disk_overrun_handler ()
2171 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2173 if (!have_disk_overrun_displayed) {
2174 have_disk_overrun_displayed = true;
2175 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2176 The disk system on your computer\n\
2177 was not able to keep up with Ardour.\n\
2179 Specifically, it failed to write data to disk\n\
2180 quickly enough to keep up with recording.\n"));
2182 have_disk_overrun_displayed = false;
2187 ARDOUR_UI::disk_underrun_handler ()
2189 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2191 if (!have_disk_underrun_displayed) {
2192 have_disk_underrun_displayed = true;
2193 MessageDialog msg (*editor,
2194 (_("The disk system on your computer\n\
2195 was not able to keep up with Ardour.\n\
2197 Specifically, it failed to read data from disk\n\
2198 quickly enough to keep up with playback.\n")));
2200 have_disk_underrun_displayed = false;
2205 ARDOUR_UI::disk_underrun_message_gone ()
2207 have_disk_underrun_displayed = false;
2211 ARDOUR_UI::disk_overrun_message_gone ()
2213 have_disk_underrun_displayed = false;
2217 ARDOUR_UI::pending_state_dialog ()
2219 ArdourDialog dialog ("pending state dialog");
2221 This session appears to have been in\n\
2222 middle of recording when ardour or\n\
2223 the computer was shutdown.\n\
2225 Ardour can recover any captured audio for\n\
2226 you, or it can ignore it. Please decide\n\
2227 what you would like to do.\n"));
2229 dialog.get_vbox()->pack_start (message);
2230 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2231 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2233 dialog.set_position (WIN_POS_CENTER);
2236 switch (dialog.run ()) {
2237 case RESPONSE_ACCEPT:
2245 ARDOUR_UI::disconnect_from_jack ()
2248 if( engine->disconnect_from_jack ()) {
2249 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2253 update_sample_rate (0);
2258 ARDOUR_UI::reconnect_to_jack ()
2261 if (engine->reconnect_to_jack ()) {
2262 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2266 update_sample_rate (0);
2271 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2273 engine->request_buffer_size (nframes);
2274 update_sample_rate (0);
2278 ARDOUR_UI::cmdline_new_session (string path)
2280 if (path[0] != '/') {
2281 char buf[PATH_MAX+1];
2284 getcwd (buf, sizeof (buf));
2291 new_session (false, path);
2293 _will_create_new_session_automatically = false; /* done it */
2294 return FALSE; /* don't call it again */
2298 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2300 Glib::RefPtr<Action> act;
2304 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2307 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2310 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2313 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2316 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2319 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2322 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2327 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2328 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2329 Config->set_native_file_header_format (hf);
2331 session->reset_native_file_format ();
2338 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2340 Glib::RefPtr<Action> act;
2344 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2347 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2352 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2354 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2355 Config->set_native_file_data_format (sf);
2357 session->reset_native_file_format ();
2364 ARDOUR_UI::use_config ()
2366 Glib::RefPtr<Action> act;
2368 switch (Config->get_native_file_data_format ()) {
2370 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2373 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2378 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2379 ract->set_active ();
2382 switch (Config->get_native_file_header_format ()) {
2384 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2387 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2390 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2393 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2396 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2399 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2402 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2407 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2408 ract->set_active ();