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/port.h>
50 #include <ardour/audioengine.h>
51 #include <ardour/playlist.h>
52 #include <ardour/utils.h>
53 #include <ardour/audio_diskstream.h>
54 #include <ardour/audiofilesource.h>
55 #include <ardour/recent_sessions.h>
56 #include <ardour/session_diskstream.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::AudioDiskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
190 ARDOUR::AudioDiskstream::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"))) {
377 cerr << "dialog return -1\n";
381 cerr << "dialog return +1\n";
382 /* use the default name */
383 if (save_state_canfail ("")) {
384 /* failed - don't quit */
385 MessageDialog msg (*editor,
387 Ardour was unable to save your session.\n\n\
388 If you still wish to quit, please use the\n\n\
389 \"Just quit\" option."));
395 cerr << "dialog return 0\n";
398 cerr << "dialog return other\n";
401 Config->save_state();
406 ARDOUR_UI::ask_about_saving_session (const string & what)
408 ArdourDialog window (_("ardour: save session?"));
409 Gtk::HBox dhbox; // the hbox for the image and text
410 Gtk::Label prompt_label;
411 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
415 msg = string_compose(_("Don't %1"), what);
416 window.add_button (msg, RESPONSE_REJECT);
417 msg = string_compose(_("Just %1"), what);
418 window.add_button (msg, RESPONSE_APPLY);
419 msg = string_compose(_("Save and %1"), what);
420 window.add_button (msg, RESPONSE_ACCEPT);
422 window.set_default_response (RESPONSE_ACCEPT);
424 Gtk::Button noquit_button (msg);
425 noquit_button.set_name ("EditorGTKButton");
430 if (session->snap_name() == session->name()) {
433 type = _("snapshot");
435 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?"),
436 type, session->snap_name());
438 prompt_label.set_text (prompt);
439 prompt_label.set_name (X_("PrompterLabel"));
440 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
442 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
444 dhbox.set_homogeneous (false);
445 dhbox.pack_start (*dimage, false, false, 5);
446 dhbox.pack_start (prompt_label, true, false, 5);
447 window.get_vbox()->pack_start (dhbox);
449 window.set_name (_("Prompter"));
450 window.set_position (Gtk::WIN_POS_MOUSE);
451 window.set_modal (true);
452 window.set_resizable (false);
455 save_the_session = 0;
457 editor->ensure_float (window);
459 ResponseType r = (ResponseType) window.run();
464 case RESPONSE_ACCEPT: // save and get out of here
466 case RESPONSE_APPLY: // get out of here
476 ARDOUR_UI::every_second ()
479 update_buffer_load ();
480 update_disk_space ();
485 ARDOUR_UI::every_point_one_seconds ()
487 update_speed_display ();
488 RapidScreenUpdate(); /* EMIT_SIGNAL */
493 ARDOUR_UI::every_point_zero_one_seconds ()
495 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
500 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
504 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
506 if (!engine->connected()) {
508 snprintf (buf, sizeof (buf), _("disconnected"));
512 jack_nframes_t rate = engine->frame_rate();
514 if (fmod (rate, 1000.0) != 0.0) {
515 snprintf (buf, sizeof (buf), _("SR: %.1f kHz / %4.1f msecs"),
516 (float) rate/1000.0f,
517 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
519 snprintf (buf, sizeof (buf), _("SR: %u kHz / %4.1f msecs"),
521 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
525 sample_rate_label.set_text (buf);
529 ARDOUR_UI::update_cpu_load ()
532 snprintf (buf, sizeof (buf), _("DSP Load: %.1f%%"), engine->get_cpu_load());
533 cpu_load_label.set_text (buf);
537 ARDOUR_UI::update_buffer_load ()
542 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
543 session->playback_load(), session->capture_load());
544 buffer_load_label.set_text (buf);
546 buffer_load_label.set_text ("");
551 ARDOUR_UI::count_recenabled_diskstreams (AudioDiskstream& ds)
553 if (ds.record_enabled()) {
554 rec_enabled_diskstreams++;
559 ARDOUR_UI::update_disk_space()
565 jack_nframes_t frames = session->available_capture_duration();
568 if (frames == max_frames) {
569 strcpy (buf, _("space: 24hrs+"));
574 jack_nframes_t fr = session->frame_rate();
576 if (session->actively_recording()){
578 rec_enabled_diskstreams = 0;
579 session->foreach_audio_diskstream (this, &ARDOUR_UI::count_recenabled_diskstreams);
581 if (rec_enabled_diskstreams) {
582 frames /= rec_enabled_diskstreams;
587 /* hmmm. shall we divide by the route count? or the diskstream count?
588 or what? for now, do nothing ...
593 hrs = frames / (fr * 3600);
594 frames -= hrs * fr * 3600;
595 mins = frames / (fr * 60);
596 frames -= mins * fr * 60;
599 snprintf (buf, sizeof(buf), _("space: %02dh:%02dm:%02ds"), hrs, mins, secs);
602 disk_space_label.set_text (buf);
606 ARDOUR_UI::update_wall_clock ()
613 tm_now = localtime (&now);
615 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
616 wall_clock_label.set_text (buf);
621 ARDOUR_UI::control_methods_adjusted ()
626 which_method = (int) online_control_button->adjustment.get_value();
627 switch (which_method) {
629 allow_mmc_and_local ();
638 fatal << _("programming error: impossible control method") << endmsg;
644 ARDOUR_UI::mmc_device_id_adjusted ()
649 int dev_id = (int) mmc_id_button->adjustment.get_value();
650 mmc->set_device_id (dev_id);
656 ARDOUR_UI::session_menu (GdkEventButton *ev)
658 session_popup_menu->popup (0, 0);
663 ARDOUR_UI::redisplay_recent_sessions ()
665 vector<string *> *sessions;
666 vector<string *>::iterator i;
667 RecentSessionsSorter cmp;
669 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
670 recent_session_model->clear ();
673 ARDOUR::read_recent_sessions (rs);
676 recent_session_display.set_model (recent_session_model);
680 /* sort them alphabetically */
681 sort (rs.begin(), rs.end(), cmp);
682 sessions = new vector<string*>;
684 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
685 sessions->push_back (new string ((*i).second));
688 for (i = sessions->begin(); i != sessions->end(); ++i) {
690 vector<string*>* states;
691 vector<const gchar*> item;
692 string fullpath = *(*i);
694 /* remove any trailing / */
696 if (fullpath[fullpath.length()-1] == '/') {
697 fullpath = fullpath.substr (0, fullpath.length()-1);
700 /* now get available states for this session */
702 if ((states = Session::possible_states (fullpath)) == 0) {
707 TreeModel::Row row = *(recent_session_model->append());
709 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
710 row[recent_session_columns.fullpath] = fullpath;
712 if (states->size() > 1) {
714 /* add the children */
716 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
718 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
720 child_row[recent_session_columns.visible_name] = **i2;
721 child_row[recent_session_columns.fullpath] = fullpath;
730 recent_session_display.set_model (recent_session_model);
735 ARDOUR_UI::build_session_selector ()
737 session_selector_window = new ArdourDialog ("session selector");
739 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
741 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
742 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
743 session_selector_window->set_default_response (RESPONSE_ACCEPT);
744 recent_session_model = TreeStore::create (recent_session_columns);
745 recent_session_display.set_model (recent_session_model);
746 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
747 recent_session_display.set_headers_visible (false);
748 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
750 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
752 scroller->add (recent_session_display);
753 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
755 session_selector_window->set_name ("SessionSelectorWindow");
756 session_selector_window->set_size_request (200, 400);
757 session_selector_window->get_vbox()->pack_start (*scroller);
758 session_selector_window->show_all_children();
762 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
764 session_selector_window->response (RESPONSE_ACCEPT);
768 ARDOUR_UI::open_recent_session ()
770 /* popup selector window */
772 if (session_selector_window == 0) {
773 build_session_selector ();
776 redisplay_recent_sessions ();
778 ResponseType r = (ResponseType) session_selector_window->run ();
780 session_selector_window->hide();
783 case RESPONSE_ACCEPT:
789 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
791 if (i == recent_session_model->children().end()) {
795 Glib::ustring path = (*i)[recent_session_columns.fullpath];
796 Glib::ustring state = (*i)[recent_session_columns.visible_name];
798 _session_is_new = false;
800 load_session (path, state);
804 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
808 if (stat (info.filename.c_str(), &statbuf) != 0) {
812 if (!S_ISDIR(statbuf.st_mode)) {
818 string session_file = info.filename;
820 session_file += Glib::path_get_basename (info.filename);
821 session_file += ".ardour";
823 if (stat (session_file.c_str(), &statbuf) != 0) {
827 return S_ISREG (statbuf.st_mode);
831 ARDOUR_UI::open_session ()
833 /* popup selector window */
835 if (open_session_selector == 0) {
837 /* ardour sessions are folders */
839 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
840 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
841 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
843 FileFilter session_filter;
844 session_filter.add_pattern ("*.ardour");
845 session_filter.set_name (_("Ardour sessions"));
846 open_session_selector->add_filter (session_filter);
847 open_session_selector->set_filter (session_filter);
850 int response = open_session_selector->run();
851 open_session_selector->hide ();
854 case RESPONSE_ACCEPT:
857 open_session_selector->hide();
861 open_session_selector->hide();
862 string session_path = open_session_selector->get_filename();
866 if (session_path.length() > 0) {
867 if (Session::find_session (session_path, path, name, isnew) == 0) {
868 _session_is_new = isnew;
869 load_session (path, name);
876 ARDOUR_UI::session_add_midi_track ()
878 cerr << _("Patience is a virtue.\n");
882 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
887 warning << _("You cannot add a track without a session already loaded.") << endmsg;
893 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
894 error << _("could not create new audio track") << endmsg;
897 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
898 error << _("could not create new audio bus") << endmsg;
903 if (need_control_room_outs) {
909 route->set_stereo_control_outs (control_lr_channels);
910 route->control_outs()->set_stereo_pan (pans, this);
912 #endif /* CONTROLOUTS */
916 MessageDialog msg (*editor,
917 _("There are insufficient JACK ports available\n\
918 to create a new track or bus.\n\
919 You should save Ardour, exit and\n\
920 restart JACK with more ports."));
926 ARDOUR_UI::diskstream_added (AudioDiskstream* ds)
931 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
933 jack_nframes_t _preroll;
936 _preroll = session->convert_to_frames_at (new_position, session->preroll);
938 if (new_position > _preroll) {
939 new_position -= _preroll;
944 session->request_locate (new_position);
949 ARDOUR_UI::transport_goto_start ()
952 session->goto_start();
955 /* force displayed area in editor to start no matter
956 what "follow playhead" setting is.
960 editor->reposition_x_origin (session->current_start_frame());
966 ARDOUR_UI::transport_goto_zero ()
969 session->request_locate (0);
972 /* force displayed area in editor to start no matter
973 what "follow playhead" setting is.
977 editor->reposition_x_origin (0);
983 ARDOUR_UI::transport_goto_end ()
986 jack_nframes_t frame = session->current_end_frame();
987 session->request_locate (frame);
989 /* force displayed area in editor to start no matter
990 what "follow playhead" setting is.
994 editor->reposition_x_origin (frame);
1000 ARDOUR_UI::transport_stop ()
1006 if (session->is_auditioning()) {
1007 session->cancel_audition ();
1011 if (session->get_auto_loop()) {
1012 session->request_auto_loop (false);
1015 session->request_stop ();
1019 ARDOUR_UI::transport_stop_and_forget_capture ()
1022 session->request_stop (true);
1027 ARDOUR_UI::remove_last_capture()
1030 editor->remove_last_capture();
1035 ARDOUR_UI::transport_record ()
1038 switch (session->record_status()) {
1039 case Session::Disabled:
1040 if (session->ntracks() == 0) {
1041 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1042 MessageDialog msg (*editor, txt);
1046 session->maybe_enable_record ();
1048 case Session::Recording:
1049 case Session::Enabled:
1050 session->disable_record (true);
1056 ARDOUR_UI::transport_roll ()
1064 rolling = session->transport_rolling ();
1066 if (session->get_auto_loop()) {
1067 session->request_auto_loop (false);
1068 auto_loop_button.set_active (false);
1069 roll_button.set_active (true);
1070 } else if (session->get_play_range ()) {
1071 session->request_play_range (false);
1072 play_selection_button.set_active (false);
1073 } else if (rolling) {
1074 session->request_locate (session->last_transport_start(), true);
1077 session->request_transport_speed (1.0f);
1081 ARDOUR_UI::transport_loop()
1084 if (session->get_auto_loop()) {
1085 if (session->transport_rolling()) {
1086 Location * looploc = session->locations()->auto_loop_location();
1088 session->request_locate (looploc->start(), true);
1093 session->request_auto_loop (true);
1099 ARDOUR_UI::transport_play_selection ()
1105 if (!session->get_play_range()) {
1106 session->request_stop ();
1109 editor->play_selection ();
1113 ARDOUR_UI::transport_rewind (int option)
1115 float current_transport_speed;
1118 current_transport_speed = session->transport_speed();
1120 if (current_transport_speed >= 0.0f) {
1123 session->request_transport_speed (-1.0f);
1126 session->request_transport_speed (-4.0f);
1129 session->request_transport_speed (-0.5f);
1134 session->request_transport_speed (current_transport_speed * 1.5f);
1140 ARDOUR_UI::transport_forward (int option)
1142 float current_transport_speed;
1145 current_transport_speed = session->transport_speed();
1147 if (current_transport_speed <= 0.0f) {
1150 session->request_transport_speed (1.0f);
1153 session->request_transport_speed (4.0f);
1156 session->request_transport_speed (0.5f);
1161 session->request_transport_speed (current_transport_speed * 1.5f);
1167 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1175 if ((r = session->route_by_remote_id (dstream)) != 0) {
1179 if ((at = dynamic_cast<AudioTrack*>(r)) != 0) {
1180 at->disk_stream().set_record_enabled (!at->disk_stream().record_enabled(), this);
1186 ARDOUR_UI::queue_transport_change ()
1188 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1192 ARDOUR_UI::map_transport_state ()
1194 float sp = session->transport_speed();
1197 transport_rolling ();
1198 } else if (sp < 0.0f) {
1199 transport_rewinding ();
1200 } else if (sp > 0.0f) {
1201 transport_forwarding ();
1203 transport_stopped ();
1208 ARDOUR_UI::allow_local_only ()
1214 ARDOUR_UI::allow_mmc_only ()
1220 ARDOUR_UI::allow_mmc_and_local ()
1226 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1228 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1229 (int) adj.get_value()].c_str());
1233 ARDOUR_UI::engine_stopped ()
1235 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1236 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1237 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1242 ARDOUR_UI::engine_running ()
1244 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1245 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1246 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1250 ARDOUR_UI::engine_halted ()
1252 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1254 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1255 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1257 update_sample_rate (0);
1259 MessageDialog msg (*editor,
1261 JACK has either been shutdown or it\n\
1262 disconnected Ardour because Ardour\n\
1263 was not fast enough. You can save the\n\
1264 session and/or try to reconnect to JACK ."));
1269 ARDOUR_UI::do_engine_start ()
1275 catch (AudioEngine::PortRegistrationFailure& err) {
1277 error << _("Unable to create all required ports")
1285 error << _("Unable to start the session running")
1295 ARDOUR_UI::start_engine ()
1297 if (do_engine_start () == 0) {
1298 if (session && _session_is_new) {
1299 /* we need to retain initial visual
1300 settings for a new session
1302 session->save_state ("");
1305 /* there is too much going on, in too many threads, for us to
1306 end up with a clean session. So wait 1 second after loading,
1307 and fix it up. its ugly, but until i come across a better
1308 solution, its what we have.
1311 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1318 ARDOUR_UI::update_clocks ()
1320 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1324 ARDOUR_UI::start_clocking ()
1326 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1330 ARDOUR_UI::stop_clocking ()
1332 clock_signal_connection.disconnect ();
1336 ARDOUR_UI::toggle_clocking ()
1339 if (clock_button.get_active()) {
1348 ARDOUR_UI::_blink (void *arg)
1351 ((ARDOUR_UI *) arg)->blink ();
1358 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1362 ARDOUR_UI::start_blinking ()
1364 /* Start the blink signal. Everybody with a blinking widget
1365 uses Blink to drive the widget's state.
1368 if (blink_timeout_tag < 0) {
1370 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1375 ARDOUR_UI::stop_blinking ()
1377 if (blink_timeout_tag >= 0) {
1378 gtk_timeout_remove (blink_timeout_tag);
1379 blink_timeout_tag = -1;
1384 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1390 if (io.n_inputs() == 0) {
1395 /* XXX we're not handling multiple ports yet. */
1397 const char **connections = io.input(0)->get_connections();
1399 if (connections == 0 || connections[0] == '\0') {
1402 buf = connections[0];
1409 if (io.n_outputs() == 0) {
1414 /* XXX we're not handling multiple ports yet. */
1416 const char **connections = io.output(0)->get_connections();
1418 if (connections == 0 || connections[0] == '\0') {
1421 buf = connections[0];
1429 ARDOUR_UI::snapshot_session ()
1431 ArdourPrompter prompter (true);
1438 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1440 prompter.set_name ("Prompter");
1441 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1442 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1443 prompter.set_prompt (_("Name of New Snapshot"));
1444 prompter.set_initial_text (now);
1446 switch (prompter.run()) {
1447 case RESPONSE_ACCEPT:
1448 prompter.get_result (snapname);
1449 if (snapname.length()){
1450 save_state (snapname);
1460 ARDOUR_UI::save_state (const string & name)
1462 (void) save_state_canfail (name);
1466 ARDOUR_UI::save_state_canfail (string name)
1471 if (name.length() == 0) {
1472 name = session->snap_name();
1475 if ((ret = session->save_state (name)) != 0) {
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);
1495 ARDOUR_UI::primary_clock_value_changed ()
1498 session->request_locate (primary_clock.current_time ());
1503 ARDOUR_UI::secondary_clock_value_changed ()
1506 session->request_locate (secondary_clock.current_time ());
1511 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1513 if (session && dstream && dstream->record_enabled()) {
1515 Session::RecordState rs;
1517 rs = session->record_status ();
1520 case Session::Disabled:
1521 case Session::Enabled:
1522 if (w->get_state() != STATE_SELECTED) {
1523 w->set_state (STATE_SELECTED);
1527 case Session::Recording:
1528 if (w->get_state() != STATE_ACTIVE) {
1529 w->set_state (STATE_ACTIVE);
1535 if (w->get_state() != STATE_NORMAL) {
1536 w->set_state (STATE_NORMAL);
1542 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1548 switch (session->record_status()) {
1549 case Session::Enabled:
1551 rec_button.set_state (1);
1553 rec_button.set_state (0);
1557 case Session::Recording:
1558 rec_button.set_state (2);
1562 rec_button.set_state (0);
1568 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1576 ARDOUR_UI::start_keyboard_prefix ()
1578 keyboard->start_prefix();
1582 ARDOUR_UI::save_template ()
1585 ArdourPrompter prompter (true);
1588 prompter.set_name (X_("Prompter"));
1589 prompter.set_prompt (_("Name for mix template:"));
1590 prompter.set_initial_text(session->name() + _("-template"));
1591 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1592 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1594 switch (prompter.run()) {
1595 case RESPONSE_ACCEPT:
1596 prompter.get_result (name);
1598 if (name.length()) {
1599 session->save_template (name);
1609 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1611 m_new_session_dialog->show();
1612 m_new_session_dialog->set_modal(true);
1613 m_new_session_dialog->set_name(predetermined_path);
1614 m_new_session_dialog->reset_recent();
1616 int response = Gtk::RESPONSE_CANCEL;
1619 response = m_new_session_dialog->run ();
1620 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1624 } else if (response == Gtk::RESPONSE_NONE) {
1625 /* Clear was pressed */
1626 m_new_session_dialog->reset();
1628 } else if (response == Gtk::RESPONSE_YES) {
1629 /* YES == OPEN, but there's no enum for that */
1630 std::string session_name = m_new_session_dialog->session_name();
1631 std::string session_path = m_new_session_dialog->session_folder();
1632 load_session (session_path, session_name);
1635 } else if (response == Gtk::RESPONSE_OK) {
1636 if (m_new_session_dialog->get_current_page() == 1) {
1638 /* XXX this is a bit of a hack..
1639 i really want the new sesion dialog to return RESPONSE_YES
1640 if we're on page 1 (the load page)
1641 Unfortunately i can't see how atm..
1643 std::string session_name = m_new_session_dialog->session_name();
1644 std::string session_path = m_new_session_dialog->session_folder();
1645 load_session (session_path, session_name);
1649 _session_is_new = true;
1651 std::string session_name = m_new_session_dialog->session_name();
1652 std::string session_path = m_new_session_dialog->session_folder();
1655 //XXX This is needed because session constructor wants a
1656 //non-existant path. hopefully this will be fixed at some point.
1658 session_path = Glib::build_filename(session_path, session_name);
1660 std::string template_name = m_new_session_dialog->session_template_name();
1662 if (m_new_session_dialog->use_session_template()) {
1664 load_session (session_path, session_name, &template_name);
1670 Session::AutoConnectOption iconnect;
1671 Session::AutoConnectOption oconnect;
1673 if (m_new_session_dialog->create_control_bus()) {
1674 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1679 if (m_new_session_dialog->create_master_bus()) {
1680 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1685 if (m_new_session_dialog->connect_inputs()) {
1686 iconnect = Session::AutoConnectPhysical;
1688 iconnect = Session::AutoConnectOption (0);
1691 /// @todo some minor tweaks.
1693 if (m_new_session_dialog->connect_outs_to_master()) {
1694 oconnect = Session::AutoConnectMaster;
1695 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1696 oconnect = Session::AutoConnectPhysical;
1698 oconnect = Session::AutoConnectOption (0);
1701 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1702 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1704 build_session (session_path,
1712 engine->frame_rate() * 60 * 5);
1717 } while (response == Gtk::RESPONSE_NONE);
1718 m_new_session_dialog->hide();
1724 ARDOUR_UI::close_session()
1731 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1733 Session *new_session;
1735 session_loaded = false;
1736 x = unload_session ();
1744 /* if it already exists, we must have write access */
1746 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1747 MessageDialog msg (*editor, _("\
1748 You do not have write access to this session.\n\
1749 This prevents the session from being loaded."));
1755 new_session = new Session (*engine, path, snap_name, mix_template);
1760 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1764 connect_to_session (new_session);
1766 //if (engine->running()) {
1767 //mixer->show_window();
1769 session_loaded = true;
1774 ARDOUR_UI::make_session_clean ()
1777 session->set_clean ();
1786 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1787 uint32_t control_channels,
1788 uint32_t master_channels,
1789 Session::AutoConnectOption input_connect,
1790 Session::AutoConnectOption output_connect,
1793 jack_nframes_t initial_length)
1795 Session *new_session;
1798 session_loaded = false;
1799 x = unload_session ();
1806 _session_is_new = true;
1809 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1810 control_channels, master_channels, nphysin, nphysout, initial_length);
1815 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1819 connect_to_session (new_session);
1821 //if (engine->running()) {
1822 //mixer->show_window();
1824 session_loaded = true;
1832 editor->show_window ();
1836 if (session && mixer) {
1837 // mixer->show_window ();
1846 ARDOUR_UI::show_splash ()
1849 about = new About();
1855 ARDOUR_UI::hide_splash ()
1863 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1867 removed = rep.paths.size();
1870 MessageDialog msgd (*editor,
1871 _("No audio files were ready for cleanup"),
1874 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1875 msgd.set_secondary_text (_("If this seems suprising, \n\
1876 check for any existing snapshots.\n\
1877 These may still include regions that\n\
1878 require some unused files to continue to exist."));
1884 ArdourDialog results (_("ardour: cleanup"), true, false);
1886 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1887 CleanupResultsModelColumns() {
1891 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1892 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1896 CleanupResultsModelColumns results_columns;
1897 Glib::RefPtr<Gtk::ListStore> results_model;
1898 Gtk::TreeView results_display;
1900 results_model = ListStore::create (results_columns);
1901 results_display.set_model (results_model);
1902 results_display.append_column (list_title, results_columns.visible_name);
1904 results_display.set_name ("CleanupResultsList");
1905 results_display.set_headers_visible (true);
1906 results_display.set_headers_clickable (false);
1907 results_display.set_reorderable (false);
1909 Gtk::ScrolledWindow list_scroller;
1912 Gtk::HBox dhbox; // the hbox for the image and text
1913 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1914 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1916 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1918 if (rep.space < 1048576.0f) {
1920 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1922 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1926 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1928 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1932 dhbox.pack_start (*dimage, true, false, 5);
1933 dhbox.pack_start (txt, true, false, 5);
1935 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1936 TreeModel::Row row = *(results_model->append());
1937 row[results_columns.visible_name] = *i;
1938 row[results_columns.fullpath] = *i;
1941 list_scroller.add (results_display);
1942 list_scroller.set_size_request (-1, 150);
1943 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
1945 dvbox.pack_start (dhbox, true, false, 5);
1946 dvbox.pack_start (list_scroller, true, false, 5);
1947 ddhbox.pack_start (dvbox, true, false, 5);
1949 results.get_vbox()->pack_start (ddhbox, true, false, 5);
1950 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
1951 results.set_default_response (RESPONSE_CLOSE);
1952 results.set_position (Gtk::WIN_POS_MOUSE);
1953 results.show_all_children ();
1954 results.set_resizable (false);
1961 ARDOUR_UI::cleanup ()
1964 /* shouldn't happen: menu item is insensitive */
1969 MessageDialog checker (_("Are you sure you want to cleanup?"),
1971 Gtk::MESSAGE_QUESTION,
1972 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
1974 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
1975 ALL undo/redo information will be lost if you cleanup.\n\
1976 After cleanup, unused audio files will be moved to a \
1977 \"dead sounds\" location."));
1979 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
1980 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
1981 checker.set_default_response (RESPONSE_CANCEL);
1983 checker.set_name (_("CleanupDialog"));
1984 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
1985 checker.set_position (Gtk::WIN_POS_MOUSE);
1987 switch (checker.run()) {
1988 case RESPONSE_ACCEPT:
1994 Session::cleanup_report rep;
1996 editor->prepare_for_cleanup ();
1998 if (session->cleanup_sources (rep)) {
2002 display_cleanup_results (rep,
2005 The following %1 %2 not in use and \n\
2006 have been moved to:\n\
2008 Flushing the wastebasket will \n\
2009 release an additional\n\
2010 %4 %5bytes of disk space.\n"
2015 ARDOUR_UI::flush_trash ()
2018 /* shouldn't happen: menu item is insensitive */
2022 Session::cleanup_report rep;
2024 if (session->cleanup_trash_sources (rep)) {
2028 display_cleanup_results (rep,
2030 _("The following %1 %2 deleted from\n\
2032 releasing %4 %5bytes of disk space"));
2036 ARDOUR_UI::add_route ()
2044 if (add_route_dialog == 0) {
2045 add_route_dialog = new AddRouteDialog;
2046 editor->ensure_float (*add_route_dialog);
2049 if (add_route_dialog->is_visible()) {
2050 /* we're already doing this */
2054 ResponseType r = (ResponseType) add_route_dialog->run ();
2056 add_route_dialog->hide();
2059 case RESPONSE_ACCEPT:
2066 if ((count = add_route_dialog->count()) <= 0) {
2070 uint32_t input_chan = add_route_dialog->channels ();
2071 uint32_t output_chan;
2072 string name_template = add_route_dialog->name_template ();
2073 bool track = add_route_dialog->track ();
2075 Session::AutoConnectOption oac = session->get_output_auto_connect();
2077 if (oac & Session::AutoConnectMaster) {
2078 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2080 output_chan = input_chan;
2083 /* XXX do something with name template */
2087 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2089 session_add_audio_bus (input_chan, output_chan);
2093 while (Main::events_pending()) {
2100 ARDOUR_UI::mixer_settings () const
2105 node = session->instant_xml(X_("Mixer"), session->path());
2107 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2111 node = new XMLNode (X_("Mixer"));
2118 ARDOUR_UI::editor_settings () const
2123 node = session->instant_xml(X_("Editor"), session->path());
2125 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2129 node = new XMLNode (X_("Editor"));
2135 ARDOUR_UI::keyboard_settings () const
2139 node = Config->extra_xml(X_("Keyboard"));
2142 node = new XMLNode (X_("Keyboard"));
2148 ARDOUR_UI::halt_on_xrun_message ()
2150 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2152 MessageDialog msg (*editor,
2153 _("Recording was stopped because your system could not keep up."));
2158 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::AudioFileSource*>* deletion_list)
2160 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2162 for (list<AudioFileSource*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2166 delete deletion_list;
2170 ARDOUR_UI::disk_overrun_handler ()
2172 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2174 if (!have_disk_overrun_displayed) {
2175 have_disk_overrun_displayed = true;
2176 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2177 The disk system on your computer\n\
2178 was not able to keep up with Ardour.\n\
2180 Specifically, it failed to write data to disk\n\
2181 quickly enough to keep up with recording.\n"));
2183 have_disk_overrun_displayed = false;
2188 ARDOUR_UI::disk_underrun_handler ()
2190 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2192 if (!have_disk_underrun_displayed) {
2193 have_disk_underrun_displayed = true;
2194 MessageDialog msg (*editor,
2195 (_("The disk system on your computer\n\
2196 was not able to keep up with Ardour.\n\
2198 Specifically, it failed to read data from disk\n\
2199 quickly enough to keep up with playback.\n")));
2201 have_disk_underrun_displayed = false;
2206 ARDOUR_UI::disk_underrun_message_gone ()
2208 have_disk_underrun_displayed = false;
2212 ARDOUR_UI::disk_overrun_message_gone ()
2214 have_disk_underrun_displayed = false;
2218 ARDOUR_UI::pending_state_dialog ()
2220 ArdourDialog dialog ("pending state dialog");
2222 This session appears to have been in\n\
2223 middle of recording when ardour or\n\
2224 the computer was shutdown.\n\
2226 Ardour can recover any captured audio for\n\
2227 you, or it can ignore it. Please decide\n\
2228 what you would like to do.\n"));
2230 dialog.get_vbox()->pack_start (message);
2231 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2232 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2234 dialog.set_position (WIN_POS_CENTER);
2237 switch (dialog.run ()) {
2238 case RESPONSE_ACCEPT:
2246 ARDOUR_UI::disconnect_from_jack ()
2249 if( engine->disconnect_from_jack ()) {
2250 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2254 update_sample_rate (0);
2259 ARDOUR_UI::reconnect_to_jack ()
2262 if (engine->reconnect_to_jack ()) {
2263 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2267 update_sample_rate (0);
2272 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2274 engine->request_buffer_size (nframes);
2275 update_sample_rate (0);
2279 ARDOUR_UI::cmdline_new_session (string path)
2281 if (path[0] != '/') {
2282 char buf[PATH_MAX+1];
2285 getcwd (buf, sizeof (buf));
2292 new_session (false, path);
2294 _will_create_new_session_automatically = false; /* done it */
2295 return FALSE; /* don't call it again */
2299 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2301 Glib::RefPtr<Action> act;
2305 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2308 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2311 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2314 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2317 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2320 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2323 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2328 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2329 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2330 Config->set_native_file_header_format (hf);
2332 session->reset_native_file_format ();
2339 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2341 Glib::RefPtr<Action> act;
2345 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2348 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2353 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2355 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2356 Config->set_native_file_data_format (sf);
2358 session->reset_native_file_format ();
2365 ARDOUR_UI::use_config ()
2367 Glib::RefPtr<Action> act;
2369 switch (Config->get_native_file_data_format ()) {
2371 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2374 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2379 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2380 ract->set_active ();
2383 switch (Config->get_native_file_header_format ()) {
2385 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2388 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2391 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2394 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2397 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2400 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2403 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2408 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2409 ract->set_active ();