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/basename.h>
37 #include <pbd/pathscanner.h>
38 #include <pbd/failed_constructor.h>
39 #include <gtkmm2ext/gtk_ui.h>
40 #include <gtkmm2ext/utils.h>
41 #include <gtkmm2ext/click_box.h>
42 #include <gtkmm2ext/fastmeter.h>
43 #include <gtkmm2ext/stop_signal.h>
44 #include <gtkmm2ext/popup.h>
46 #include <midi++/port.h>
47 #include <midi++/mmc.h>
49 #include <ardour/ardour.h>
50 #include <ardour/port.h>
51 #include <ardour/audioengine.h>
52 #include <ardour/playlist.h>
53 #include <ardour/utils.h>
54 #include <ardour/diskstream.h>
55 #include <ardour/filesource.h>
56 #include <ardour/recent_sessions.h>
57 #include <ardour/session_diskstream.h>
58 #include <ardour/port.h>
59 #include <ardour/audio_track.h>
62 #include "ardour_ui.h"
63 #include "public_editor.h"
64 #include "audio_clock.h"
69 #include "keyboard_target.h"
70 #include "add_route_dialog.h"
71 #include "new_session_dialog.h"
74 #include "gui_thread.h"
75 #include "color_manager.h"
79 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 = 0;
151 m_new_session_dialog_ref = NewSessionDialogFactory::create();
152 m_new_session_dialog_ref->get_widget_derived (NewSessionDialogFactory::top_level_widget_name(), m_new_session_dialog);
156 _session_is_new = false;
157 big_clock_window = 0;
158 session_selector_window = 0;
159 last_key_press_time = 0;
160 connection_editor = 0;
161 add_route_dialog = 0;
166 open_session_selector = 0;
167 have_configure_timeout = false;
168 have_disk_overrun_displayed = false;
169 have_disk_underrun_displayed = false;
170 _will_create_new_session_automatically = false;
171 session_loaded = false;
172 last_speed_displayed = -1.0f;
174 last_configure_time.tv_sec = 0;
175 last_configure_time.tv_usec = 0;
177 shuttle_grabbed = false;
179 shuttle_max_speed = 8.0f;
181 set_shuttle_units (Percentage);
182 set_shuttle_behaviour (Sprung);
184 shuttle_style_menu = 0;
185 shuttle_unit_menu = 0;
187 gettimeofday (&last_peak_grab, 0);
188 gettimeofday (&last_shuttle_request, 0);
190 ARDOUR::DiskStream::CannotRecordNoInput.connect (mem_fun(*this, &ARDOUR_UI::cannot_record_no_input));
191 ARDOUR::DiskStream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
192 ARDOUR::DiskStream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
193 ARDOUR::DiskStream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
195 /* handle pending state with a dialog */
197 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
199 /* have to wait for AudioEngine and Configuration before proceeding */
203 ARDOUR_UI::cannot_record_no_input (DiskStream* ds)
205 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::cannot_record_no_input), ds));
207 string msg = string_compose (_("\
208 You cannot record-enable\n\
210 because it has no input connections.\n\
211 You would be wasting space recording silence."),
214 MessageDialog message (*editor, msg);
219 ARDOUR_UI::set_engine (AudioEngine& e)
223 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
224 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
225 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
226 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
230 keyboard = new Keyboard;
231 install_keybindings ();
235 meter_path = ARDOUR::find_data_file("v_meter_strip.xpm", "pixmaps");
236 if (meter_path.empty()) {
237 error << _("no vertical meter strip image found") << endmsg;
240 FastMeter::set_vertical_xpm (meter_path);
242 meter_path = ARDOUR::find_data_file("h_meter_strip.xpm", "pixmaps");
243 if (meter_path.empty()) {
244 error << _("no horizontal meter strip image found") << endmsg;
247 FastMeter::set_horizontal_xpm (meter_path);
249 if (setup_windows ()) {
250 throw failed_constructor ();
253 if (GTK_ARDOUR::show_key_actions) {
254 vector<string> names;
255 vector<string> paths;
257 vector<AccelKey> bindings;
259 ActionManager::get_all_actions (names, paths, keys, bindings);
261 vector<string>::iterator n;
262 vector<string>::iterator k;
263 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
264 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
270 /* start with timecode, metering enabled
273 blink_timeout_tag = -1;
275 /* the global configuration object is now valid */
279 /* this being a GUI and all, we want peakfiles */
281 FileSource::set_build_peakfiles (true);
282 FileSource::set_build_missing_peakfiles (true);
284 if (Source::start_peak_thread ()) {
285 throw failed_constructor();
288 /* start the time-of-day-clock */
290 update_wall_clock ();
291 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
293 update_disk_space ();
295 update_sample_rate (engine->frame_rate());
297 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
298 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
301 ARDOUR_UI::~ARDOUR_UI ()
303 save_ardour_state ();
317 if (add_route_dialog) {
318 delete add_route_dialog;
321 Source::stop_peak_thread ();
325 ARDOUR_UI::configure_timeout ()
330 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
331 /* no configure events yet */
335 gettimeofday (&now, 0);
336 timersub (&now, &last_configure_time, &diff);
338 /* force a gap of 0.5 seconds since the last configure event
341 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
344 have_configure_timeout = false;
345 save_ardour_state ();
351 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
353 if (have_configure_timeout) {
354 gettimeofday (&last_configure_time, 0);
356 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
357 have_configure_timeout = true;
364 ARDOUR_UI::save_ardour_state ()
366 if (!keyboard || !mixer || !editor) {
370 /* XXX this is all a bit dubious. add_extra_xml() uses
371 a different lifetime model from add_instant_xml().
374 XMLNode* node = new XMLNode (keyboard->get_state());
375 Config->add_extra_xml (*node);
376 Config->save_state();
378 XMLNode& enode (static_cast<Stateful*>(editor)->get_state());
379 XMLNode& mnode (mixer->get_state());
382 session->add_instant_xml(enode, session->path());
383 session->add_instant_xml(mnode, session->path());
385 Config->add_instant_xml(enode, get_user_ardour_path());
386 Config->add_instant_xml(mnode, get_user_ardour_path());
391 AccelMap::save ("ardour.saved_bindings");
395 ARDOUR_UI::startup ()
397 /* Once the UI is up and running, start the audio engine. Doing
398 this before the UI is up and running can cause problems
399 when not running with SCHED_FIFO, because the amount of
400 CPU and disk work needed to get the UI started can interfere
401 with the scheduling of the audio thread.
404 Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
410 if (session && session->dirty()) {
411 switch (ask_about_saving_session(_("quit"))) {
416 /* use the default name */
417 if (save_state_canfail ("")) {
418 /* failed - don't quit */
419 MessageDialog msg (*editor,
421 Ardour was unable to save your session.\n\n\
422 If you still wish to quit, please use the\n\n\
423 \"Just quit\" option."));
437 ARDOUR_UI::ask_about_saving_session (const string & what)
439 ArdourDialog window (_("ardour: save session?"));
440 Gtk::Label prompt_label;
443 msg = string_compose(_("Save and %1"), what);
444 window.add_button (msg, RESPONSE_ACCEPT);
445 msg = string_compose(_("Just %1"), what);
446 window.add_button (msg, RESPONSE_APPLY);
447 msg = string_compose(_("Don't %1"), what);
448 window.add_button (msg, RESPONSE_REJECT);
450 Gtk::Button noquit_button (msg);
451 noquit_button.set_name ("EditorGTKButton");
456 if (session->snap_name() == session->name()) {
459 type = _("snapshot");
461 prompt = string_compose(_("The %1\n\"%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?"),
462 type, session->snap_name());
464 prompt_label.set_text (prompt);
465 prompt_label.set_alignment (0.5, 0.5);
466 prompt_label.set_name (X_("PrompterLabel"));
468 window.get_vbox()->pack_start (prompt_label);
470 window.set_name (_("Prompter"));
471 window.set_position (Gtk::WIN_POS_MOUSE);
472 window.set_modal (true);
475 save_the_session = 0;
477 editor->ensure_float (window);
479 ResponseType r = (ResponseType) window.run();
484 case RESPONSE_ACCEPT: // save and get out of here
486 case RESPONSE_APPLY: // get out of here
496 ARDOUR_UI::every_second ()
499 update_buffer_load ();
500 update_disk_space ();
501 // update_disk_rate ();
506 ARDOUR_UI::every_point_one_seconds ()
511 /* do not attempt to grab peak power more than once per cycle.
514 gettimeofday (&now, 0);
515 timersub (&now, &last_peak_grab, &diff);
517 if ((diff.tv_usec + (diff.tv_sec * 1000000)) >= engine->usecs_per_cycle()) {
518 IO::GrabPeakPower(); /* EMIT_SIGNAL */
519 last_peak_grab = now;
522 update_speed_display ();
523 RapidScreenUpdate(); /* EMIT_SIGNAL */
528 ARDOUR_UI::every_point_zero_one_seconds ()
530 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
535 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
539 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
541 if (!engine->connected()) {
543 snprintf (buf, sizeof (buf), _("disconnected"));
547 jack_nframes_t rate = engine->frame_rate();
549 if (fmod (rate, 1000.0) != 0.0) {
550 snprintf (buf, sizeof (buf), _("SR: %.1f kHz / %4.1f msecs"),
551 (float) rate/1000.0f,
552 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
554 snprintf (buf, sizeof (buf), _("SR: %u kHz / %4.1f msecs"),
556 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
560 sample_rate_label.set_text (buf);
564 ARDOUR_UI::update_cpu_load ()
567 snprintf (buf, sizeof (buf), _("DSP Load: %.1f%%"), engine->get_cpu_load());
568 cpu_load_label.set_text (buf);
572 ARDOUR_UI::update_disk_rate ()
577 snprintf (buf, sizeof (buf), _("Disk r:%5.1f w:%5.1f MB/s"),
578 session->read_data_rate()/1048576.0f, session->write_data_rate()/1048576.0f);
579 disk_rate_label.set_text (buf);
581 disk_rate_label.set_text ("");
586 ARDOUR_UI::update_buffer_load ()
591 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
592 session->playback_load(), session->capture_load());
593 buffer_load_label.set_text (buf);
595 buffer_load_label.set_text ("");
600 ARDOUR_UI::count_recenabled_diskstreams (DiskStream& ds)
602 if (ds.record_enabled()) {
603 rec_enabled_diskstreams++;
608 ARDOUR_UI::update_disk_space()
614 jack_nframes_t frames = session->available_capture_duration();
617 if (frames == max_frames) {
618 strcpy (buf, _("space: 24hrs+"));
623 jack_nframes_t fr = session->frame_rate();
625 if (session->actively_recording()){
627 rec_enabled_diskstreams = 0;
628 session->foreach_diskstream (this, &ARDOUR_UI::count_recenabled_diskstreams);
630 if (rec_enabled_diskstreams) {
631 frames /= rec_enabled_diskstreams;
636 /* hmmm. shall we divide by the route count? or the diskstream count?
637 or what? for now, do nothing ...
642 hrs = frames / (fr * 3600);
643 frames -= hrs * fr * 3600;
644 mins = frames / (fr * 60);
645 frames -= mins * fr * 60;
648 snprintf (buf, sizeof(buf), _("space: %02dh:%02dm:%02ds"), hrs, mins, secs);
651 disk_space_label.set_text (buf);
655 ARDOUR_UI::update_wall_clock ()
662 tm_now = localtime (&now);
664 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
665 wall_clock_label.set_text (buf);
670 ARDOUR_UI::control_methods_adjusted ()
675 which_method = (int) online_control_button->adjustment.get_value();
676 switch (which_method) {
678 allow_mmc_and_local ();
687 fatal << _("programming error: impossible control method") << endmsg;
693 ARDOUR_UI::mmc_device_id_adjusted ()
698 int dev_id = (int) mmc_id_button->adjustment.get_value();
699 mmc->set_device_id (dev_id);
705 ARDOUR_UI::session_menu (GdkEventButton *ev)
707 session_popup_menu->popup (0, 0);
712 ARDOUR_UI::redisplay_recent_sessions ()
714 vector<string *> *sessions;
715 vector<string *>::iterator i;
716 RecentSessionsSorter cmp;
718 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
719 recent_session_model->clear ();
722 ARDOUR::read_recent_sessions (rs);
725 recent_session_display.set_model (recent_session_model);
729 /* sort them alphabetically */
730 sort (rs.begin(), rs.end(), cmp);
731 sessions = new vector<string*>;
733 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
734 sessions->push_back (new string ((*i).second));
737 for (i = sessions->begin(); i != sessions->end(); ++i) {
739 vector<string*>* states;
740 vector<const gchar*> item;
741 string fullpath = *(*i);
743 /* remove any trailing / */
745 if (fullpath[fullpath.length()-1] == '/') {
746 fullpath = fullpath.substr (0, fullpath.length()-1);
749 /* now get available states for this session */
751 if ((states = Session::possible_states (fullpath)) == 0) {
756 TreeModel::Row row = *(recent_session_model->append());
758 row[recent_session_columns.visible_name] = PBD::basename (fullpath);
759 row[recent_session_columns.fullpath] = fullpath;
761 if (states->size() > 1) {
763 /* add the children */
765 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
767 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
769 child_row[recent_session_columns.visible_name] = **i2;
770 child_row[recent_session_columns.fullpath] = fullpath;
779 recent_session_display.set_model (recent_session_model);
784 ARDOUR_UI::build_session_selector ()
786 session_selector_window = new ArdourDialog ("session selector");
788 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
790 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
791 session_selector_window->add_button (Stock::OK, RESPONSE_ACCEPT);
793 recent_session_model = TreeStore::create (recent_session_columns);
794 recent_session_display.set_model (recent_session_model);
795 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
796 recent_session_display.set_headers_visible (false);
797 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
799 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
801 scroller->add (recent_session_display);
802 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
804 session_selector_window->set_name ("SessionSelectorWindow");
805 session_selector_window->set_size_request (200, 400);
806 session_selector_window->get_vbox()->pack_start (*scroller);
807 session_selector_window->show_all_children();
811 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
813 session_selector_window->response (RESPONSE_ACCEPT);
817 ARDOUR_UI::open_recent_session ()
819 /* popup selector window */
821 if (session_selector_window == 0) {
822 build_session_selector ();
825 redisplay_recent_sessions ();
827 ResponseType r = (ResponseType) session_selector_window->run ();
829 session_selector_window->hide();
832 case RESPONSE_ACCEPT:
838 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
840 if (i == recent_session_model->children().end()) {
844 Glib::ustring path = (*i)[recent_session_columns.fullpath];
845 Glib::ustring state = (*i)[recent_session_columns.visible_name];
847 _session_is_new = false;
849 load_session (path, state);
853 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
857 if (stat (info.filename.c_str(), &statbuf) != 0) {
861 if (!S_ISDIR(statbuf.st_mode)) {
865 string session_file = info.filename;
867 session_file += PBD::basename (info.filename);
868 session_file += ".ardour";
870 if (stat (session_file.c_str(), &statbuf) != 0) {
874 return S_ISREG (statbuf.st_mode);
878 ARDOUR_UI::open_session ()
880 /* popup selector window */
882 if (open_session_selector == 0) {
884 /* ardour sessions are folders */
886 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
887 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
888 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
890 FileFilter session_filter;
891 session_filter.add_pattern ("*.ardour");
892 session_filter.set_name (_("Ardour sessions"));
893 open_session_selector->add_filter (session_filter);
894 open_session_selector->set_filter (session_filter);
897 int response = open_session_selector->run();
898 open_session_selector->hide ();
901 case RESPONSE_ACCEPT:
904 open_session_selector->hide();
908 open_session_selector->hide();
909 string session_path = open_session_selector->get_filename();
913 if (session_path.length() > 0) {
914 if (Session::find_session (session_path, path, name, isnew) == 0) {
915 _session_is_new = isnew;
916 load_session (path, name);
923 ARDOUR_UI::session_add_midi_track ()
925 cerr << _("Patience is a virtue.\n");
929 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
934 warning << _("You cannot add a track without a session already loaded.") << endmsg;
940 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
941 error << _("could not create new audio track") << endmsg;
944 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
945 error << _("could not create new audio bus") << endmsg;
950 if (need_control_room_outs) {
956 route->set_stereo_control_outs (control_lr_channels);
957 route->control_outs()->set_stereo_pan (pans, this);
959 #endif /* CONTROLOUTS */
963 MessageDialog msg (*editor,
964 _("There are insufficient JACK ports available\n\
965 to create a new track or bus.\n\
966 You should save Ardour, exit and\n\
967 restart JACK with more ports."));
973 ARDOUR_UI::diskstream_added (DiskStream* ds)
978 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
980 jack_nframes_t _preroll;
983 _preroll = session->convert_to_frames_at (new_position, session->preroll);
985 if (new_position > _preroll) {
986 new_position -= _preroll;
991 session->request_locate (new_position);
996 ARDOUR_UI::transport_goto_start ()
999 session->goto_start();
1002 /* force displayed area in editor to start no matter
1003 what "follow playhead" setting is.
1007 editor->reposition_x_origin (session->current_start_frame());
1013 ARDOUR_UI::transport_goto_zero ()
1016 session->request_locate (0);
1019 /* force displayed area in editor to start no matter
1020 what "follow playhead" setting is.
1024 editor->reposition_x_origin (0);
1030 ARDOUR_UI::transport_goto_end ()
1033 jack_nframes_t frame = session->current_end_frame();
1034 session->request_locate (frame);
1036 /* force displayed area in editor to start no matter
1037 what "follow playhead" setting is.
1041 editor->reposition_x_origin (frame);
1047 ARDOUR_UI::transport_stop ()
1053 if (session->is_auditioning()) {
1054 session->cancel_audition ();
1058 if (session->get_auto_loop()) {
1059 session->request_auto_loop (false);
1062 session->request_stop ();
1066 ARDOUR_UI::transport_stop_and_forget_capture ()
1069 session->request_stop (true);
1074 ARDOUR_UI::remove_last_capture()
1077 editor->remove_last_capture();
1082 ARDOUR_UI::transport_record ()
1085 switch (session->record_status()) {
1086 case Session::Disabled:
1087 if (session->ntracks() == 0) {
1088 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1089 MessageDialog msg (*editor, txt);
1093 session->maybe_enable_record ();
1095 case Session::Recording:
1096 case Session::Enabled:
1097 session->disable_record (true);
1103 ARDOUR_UI::transport_roll ()
1111 rolling = session->transport_rolling ();
1113 if (session->get_auto_loop()) {
1114 session->request_auto_loop (false);
1115 auto_loop_button.set_active (false);
1116 roll_button.set_active (true);
1117 } else if (session->get_play_range ()) {
1118 session->request_play_range (false);
1119 play_selection_button.set_active (false);
1120 } else if (rolling) {
1121 session->request_locate (session->last_transport_start(), true);
1124 session->request_transport_speed (1.0f);
1128 ARDOUR_UI::transport_loop()
1131 if (session->get_auto_loop()) {
1132 if (session->transport_rolling()) {
1133 Location * looploc = session->locations()->auto_loop_location();
1135 session->request_locate (looploc->start(), true);
1140 session->request_auto_loop (true);
1146 ARDOUR_UI::transport_play_selection ()
1152 if (!session->get_play_range()) {
1153 session->request_stop ();
1156 editor->play_selection ();
1160 ARDOUR_UI::transport_rewind (int option)
1162 float current_transport_speed;
1165 current_transport_speed = session->transport_speed();
1167 if (current_transport_speed >= 0.0f) {
1170 session->request_transport_speed (-1.0f);
1173 session->request_transport_speed (-4.0f);
1176 session->request_transport_speed (-0.5f);
1181 session->request_transport_speed (current_transport_speed * 1.5f);
1187 ARDOUR_UI::transport_forward (int option)
1189 float current_transport_speed;
1192 current_transport_speed = session->transport_speed();
1194 if (current_transport_speed <= 0.0f) {
1197 session->request_transport_speed (1.0f);
1200 session->request_transport_speed (4.0f);
1203 session->request_transport_speed (0.5f);
1208 session->request_transport_speed (current_transport_speed * 1.5f);
1214 ARDOUR_UI::toggle_monitor_enable (guint32 dstream)
1222 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1223 Port *port = ds->io()->input (0);
1224 port->request_monitor_input (!port->monitoring_input());
1229 ARDOUR_UI::toggle_record_enable (guint32 dstream)
1237 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1238 ds->set_record_enabled (!ds->record_enabled(), this);
1243 ARDOUR_UI::queue_transport_change ()
1245 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1249 ARDOUR_UI::map_transport_state ()
1251 float sp = session->transport_speed();
1254 transport_rolling ();
1255 } else if (sp < 0.0f) {
1256 transport_rewinding ();
1257 } else if (sp > 0.0f) {
1258 transport_forwarding ();
1260 transport_stopped ();
1265 ARDOUR_UI::send_all_midi_feedback ()
1268 session->send_all_midi_feedback();
1273 ARDOUR_UI::allow_local_only ()
1279 ARDOUR_UI::allow_mmc_only ()
1285 ARDOUR_UI::allow_mmc_and_local ()
1291 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1293 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1294 (int) adj.get_value()].c_str());
1298 ARDOUR_UI::engine_stopped ()
1300 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1301 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1302 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1307 ARDOUR_UI::engine_running ()
1309 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1310 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1311 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1315 ARDOUR_UI::engine_halted ()
1317 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1319 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1320 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1322 update_sample_rate (0);
1324 MessageDialog msg (*editor,
1326 JACK has either been shutdown or it\n\
1327 disconnected Ardour because Ardour\n\
1328 was not fast enough. You can save the\n\
1329 session and/or try to reconnect to JACK ."));
1334 ARDOUR_UI::do_engine_start ()
1340 catch (AudioEngine::PortRegistrationFailure& err) {
1342 error << _("Unable to create all required ports")
1350 error << _("Unable to start the session running")
1360 ARDOUR_UI::start_engine ()
1362 if (do_engine_start () == 0) {
1363 if (session && _session_is_new) {
1364 /* we need to retain initial visual
1365 settings for a new session
1367 session->save_state ("");
1370 /* there is too much going on, in too many threads, for us to
1371 end up with a clean session. So wait 1 second after loading,
1372 and fix it up. its ugly, but until i come across a better
1373 solution, its what we have.
1376 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1383 ARDOUR_UI::update_clocks ()
1385 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1389 ARDOUR_UI::start_clocking ()
1391 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1395 ARDOUR_UI::stop_clocking ()
1397 clock_signal_connection.disconnect ();
1401 ARDOUR_UI::toggle_clocking ()
1404 if (clock_button.get_active()) {
1413 ARDOUR_UI::_blink (void *arg)
1416 ((ARDOUR_UI *) arg)->blink ();
1423 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1427 ARDOUR_UI::start_blinking ()
1429 /* Start the blink signal. Everybody with a blinking widget
1430 uses Blink to drive the widget's state.
1433 if (blink_timeout_tag < 0) {
1435 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1440 ARDOUR_UI::stop_blinking ()
1442 if (blink_timeout_tag >= 0) {
1443 gtk_timeout_remove (blink_timeout_tag);
1444 blink_timeout_tag = -1;
1450 ARDOUR_UI::add_diskstream_to_menu (DiskStream& dstream)
1452 using namespace Gtk;
1453 using namespace Menu_Helpers;
1455 if (dstream.hidden()) {
1459 MenuList& items = diskstream_menu->items();
1460 items.push_back (MenuElem (dstream.name(), bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), (gint32) dstream.id())));
1464 ARDOUR_UI::diskstream_selected (gint32 id)
1466 selected_dstream = id;
1471 ARDOUR_UI::select_diskstream (GdkEventButton *ev)
1473 using namespace Gtk;
1474 using namespace Menu_Helpers;
1480 diskstream_menu = new Menu();
1481 diskstream_menu->set_name ("ArdourContextMenu");
1482 using namespace Gtk;
1483 using namespace Menu_Helpers;
1485 MenuList& items = diskstream_menu->items();
1486 items.push_back (MenuElem (_("No Stream"), (bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), -1))));
1488 session->foreach_diskstream (this, &ARDOUR_UI::add_diskstream_to_menu);
1491 diskstream_menu->popup (ev->button, ev->time);
1493 diskstream_menu->popup (0, 0);
1496 selected_dstream = -1;
1500 delete diskstream_menu;
1502 return selected_dstream;
1506 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1512 if (io.n_inputs() == 0) {
1517 /* XXX we're not handling multiple ports yet. */
1519 const char **connections = io.input(0)->get_connections();
1521 if (connections == 0 || connections[0] == '\0') {
1524 buf = connections[0];
1531 if (io.n_outputs() == 0) {
1536 /* XXX we're not handling multiple ports yet. */
1538 const char **connections = io.output(0)->get_connections();
1540 if (connections == 0 || connections[0] == '\0') {
1543 buf = connections[0];
1551 ARDOUR_UI::snapshot_session ()
1553 ArdourPrompter prompter (true);
1560 now = now.substr (0, now.length() - 1);
1562 prompter.set_name ("Prompter");
1563 prompter.set_prompt (_("Name for snapshot"));
1564 prompter.set_initial_text (now);
1566 switch (prompter.run()) {
1567 case RESPONSE_ACCEPT:
1568 prompter.get_result (snapname);
1569 if (snapname.length()){
1570 save_state (snapname);
1580 ARDOUR_UI::save_state (const string & name)
1582 (void) save_state_canfail (name);
1586 ARDOUR_UI::save_state_canfail (string name)
1591 if (name.length() == 0) {
1592 name = session->snap_name();
1595 if ((ret = session->save_state (name)) != 0) {
1599 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1604 ARDOUR_UI::restore_state (string name)
1607 if (name.length() == 0) {
1608 name = session->name();
1610 session->restore_state (name);
1615 ARDOUR_UI::primary_clock_value_changed ()
1618 session->request_locate (primary_clock.current_time ());
1623 ARDOUR_UI::secondary_clock_value_changed ()
1626 session->request_locate (secondary_clock.current_time ());
1631 ARDOUR_UI::rec_enable_button_blink (bool onoff, DiskStream *dstream, Widget *w)
1633 if (session && dstream && dstream->record_enabled()) {
1635 Session::RecordState rs;
1637 rs = session->record_status ();
1640 case Session::Disabled:
1641 case Session::Enabled:
1642 if (w->get_state() != STATE_SELECTED) {
1643 w->set_state (STATE_SELECTED);
1647 case Session::Recording:
1648 if (w->get_state() != STATE_ACTIVE) {
1649 w->set_state (STATE_ACTIVE);
1655 if (w->get_state() != STATE_NORMAL) {
1656 w->set_state (STATE_NORMAL);
1662 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1668 switch (session->record_status()) {
1669 case Session::Enabled:
1671 rec_button.set_state (1);
1673 rec_button.set_state (0);
1677 case Session::Recording:
1678 rec_button.set_state (2);
1682 rec_button.set_state (0);
1688 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1696 ARDOUR_UI::start_keyboard_prefix ()
1698 keyboard->start_prefix();
1702 ARDOUR_UI::save_template ()
1705 ArdourPrompter prompter (true);
1708 prompter.set_name (X_("Prompter"));
1709 prompter.set_prompt (_("Name for mix template:"));
1710 prompter.set_initial_text(session->name() + _("-template"));
1712 switch (prompter.run()) {
1713 case RESPONSE_ACCEPT:
1714 prompter.get_result (name);
1716 if (name.length()) {
1717 session->save_template (name);
1727 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1729 m_new_session_dialog->show_all();
1730 m_new_session_dialog->set_transient_for(*editor);
1731 m_new_session_dialog->set_name(predetermined_path);
1733 int response = Gtk::RESPONSE_CANCEL;
1736 response = m_new_session_dialog->run ();
1738 if(response == Gtk::RESPONSE_OK) {
1740 _session_is_new = true;
1742 std::string session_name = m_new_session_dialog->session_name();
1743 std::string session_path = m_new_session_dialog->session_folder();
1746 XXX This is needed because session constructor wants a
1747 non-existant path. hopefully this will be fixed at some point.
1749 session_path = Glib::build_filename(session_path, session_name);
1751 std::string template_name = m_new_session_dialog->session_template_name();
1753 if (m_new_session_dialog->use_session_template()) {
1755 load_session (session_path, session_name, &template_name);
1761 Session::AutoConnectOption iconnect;
1762 Session::AutoConnectOption oconnect;
1764 if (m_new_session_dialog->create_control_bus()) {
1765 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1770 if (m_new_session_dialog->create_master_bus()) {
1771 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1776 if (m_new_session_dialog->connect_inputs()) {
1777 iconnect = Session::AutoConnectPhysical;
1779 iconnect = Session::AutoConnectOption (0);
1782 /// @todo some minor tweaks.
1784 if (m_new_session_dialog->connect_outs_to_master()) {
1785 oconnect = Session::AutoConnectMaster;
1786 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1787 oconnect = Session::AutoConnectPhysical;
1789 oconnect = Session::AutoConnectOption (0);
1792 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1793 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1795 build_session (session_path,
1803 engine->frame_rate() * 60 * 5);
1807 } while(response == Gtk::RESPONSE_HELP);
1808 m_new_session_dialog->hide_all();
1812 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1814 Session *new_session;
1816 session_loaded = false;
1817 x = unload_session ();
1825 /* if it already exists, we must have write access */
1827 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1828 MessageDialog msg (*editor, _("\
1829 You do not have write access to this session.\n\
1830 This prevents the session from being loaded."));
1836 new_session = new Session (*engine, path, snap_name, mix_template);
1841 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1845 connect_to_session (new_session);
1847 //if (engine->running()) {
1848 //mixer->show_window();
1850 session_loaded = true;
1855 ARDOUR_UI::make_session_clean ()
1858 session->set_clean ();
1865 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1866 uint32_t control_channels,
1867 uint32_t master_channels,
1868 Session::AutoConnectOption input_connect,
1869 Session::AutoConnectOption output_connect,
1872 jack_nframes_t initial_length)
1874 Session *new_session;
1877 session_loaded = false;
1878 x = unload_session ();
1885 _session_is_new = true;
1888 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1889 control_channels, master_channels, nphysin, nphysout, initial_length);
1894 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1898 connect_to_session (new_session);
1900 //if (engine->running()) {
1901 //mixer->show_window();
1903 session_loaded = true;
1911 editor->show_window ();
1915 if (session && mixer) {
1916 // mixer->show_window ();
1925 ARDOUR_UI::show_splash ()
1928 about = new About();
1934 ARDOUR_UI::hide_splash ()
1942 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1946 removed = rep.paths.size();
1949 MessageDialog msg (*editor, X_("cleanupresults"),
1951 No audio files were ready for cleanup\n\n\
1952 If this seems suprising, check for any existing\n\
1953 snapshots. These may still include regions that\n\
1954 require some unused files to continue to exist."));
1959 ArdourDialog results (_("ardour: cleanup"), true);
1961 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1962 CleanupResultsModelColumns() {
1966 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1967 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1971 Glib::RefPtr<Gtk::ListStore> results_model;
1972 CleanupResultsModelColumns results_columns;
1973 Gtk::TreeView results_display;
1975 results_model = ListStore::create (results_columns);
1976 results_display.set_model (results_model);
1977 results_display.append_column (list_title, results_columns.visible_name);
1978 results_display.set_headers_visible (true);
1980 Gtk::ScrolledWindow list_scroller;
1983 if (rep.space < 1048576.0f) {
1985 txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1024.0f, "kilo"));
1987 txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1024.0f, "kilo"));
1991 txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1048576.0f, "mega"));
1993 txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1048576.0f, "mega"));
1997 results.get_vbox()->pack_start (txt, false, false);
1999 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
2000 TreeModel::Row row = *(results_model->append());
2001 row[results_columns.visible_name] = *i;
2002 row[results_columns.fullpath] = *i;
2005 list_scroller.add (results_display);
2006 list_scroller.set_size_request (-1, 250);
2007 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2009 results.get_vbox()->pack_start (list_scroller, true, true);
2010 results.add_button (Stock::OK, RESPONSE_ACCEPT);
2011 results.set_position (Gtk::WIN_POS_MOUSE);
2017 ARDOUR_UI::cleanup ()
2020 /* shouldn't happen: menu item is insensitive */
2024 ArdourDialog checker (_("ardour cleanup"));
2025 Gtk::Label label (_("\
2026 Cleanup is a destructive operation.\n\
2027 ALL undo/redo information will be lost if you cleanup.\n\
2028 Unused audio files will be moved to a \"dead sounds\" location."));
2030 checker.get_vbox()->pack_start (label, false, false);
2031 checker.add_button (Stock::OK, RESPONSE_ACCEPT);
2032 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2034 checker.set_name (_("CleanupDialog"));
2035 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2036 checker.set_position (Gtk::WIN_POS_MOUSE);
2038 switch (checker.run()) {
2039 case RESPONSE_ACCEPT:
2045 Session::cleanup_report rep;
2047 editor->prepare_for_cleanup ();
2049 if (session->cleanup_sources (rep)) {
2053 display_cleanup_results (rep,
2056 The following %1 %2 were not in use.\n\
2057 The next time you flush the wastebasket\n\
2058 it will release an additional %3 %4bytes\n\
2064 ARDOUR_UI::flush_trash ()
2067 /* shouldn't happen: menu item is insensitive */
2071 Session::cleanup_report rep;
2073 if (session->cleanup_trash_sources (rep)) {
2077 display_cleanup_results (rep,
2079 _("The following %1 file%2 were deleted, releasing %3 %4bytes of disk space"));
2083 ARDOUR_UI::add_route ()
2091 if (add_route_dialog == 0) {
2092 add_route_dialog = new AddRouteDialog;
2093 editor->ensure_float (*add_route_dialog);
2096 if (add_route_dialog->is_visible()) {
2097 /* we're already doing this */
2101 ResponseType r = (ResponseType) add_route_dialog->run ();
2103 add_route_dialog->hide();
2106 case RESPONSE_ACCEPT:
2113 if ((count = add_route_dialog->count()) <= 0) {
2117 uint32_t input_chan = add_route_dialog->channels ();
2118 uint32_t output_chan;
2119 string name_template = add_route_dialog->name_template ();
2120 bool track = add_route_dialog->track ();
2122 Session::AutoConnectOption oac = session->get_output_auto_connect();
2124 if (oac & Session::AutoConnectMaster) {
2125 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2127 output_chan = input_chan;
2130 /* XXX do something with name template */
2134 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2136 session_add_audio_bus (input_chan, output_chan);
2140 while (Main::events_pending()) {
2147 ARDOUR_UI::mixer_settings () const
2152 node = session->instant_xml(X_("Mixer"), session->path());
2154 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2158 node = new XMLNode (X_("Mixer"));
2165 ARDOUR_UI::editor_settings () const
2170 node = session->instant_xml(X_("Editor"), session->path());
2172 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2176 node = new XMLNode (X_("Editor"));
2182 ARDOUR_UI::keyboard_settings () const
2186 node = Config->extra_xml(X_("Keyboard"));
2189 node = new XMLNode (X_("Keyboard"));
2195 ARDOUR_UI::halt_on_xrun_message ()
2197 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2199 MessageDialog msg (*editor,
2200 _("Recording was stopped because your system could not keep up."));
2205 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::Source*>* deletion_list)
2207 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2209 for (list<Source*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2213 delete deletion_list;
2217 ARDOUR_UI::disk_overrun_handler ()
2219 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2221 if (!have_disk_overrun_displayed) {
2222 have_disk_overrun_displayed = true;
2223 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2224 The disk system on your computer\n\
2225 was not able to keep up with Ardour.\n\
2227 Specifically, it failed to write data to disk\n\
2228 quickly enough to keep up with recording.\n"));
2230 have_disk_overrun_displayed = false;
2235 ARDOUR_UI::disk_underrun_handler ()
2237 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2239 if (!have_disk_underrun_displayed) {
2240 have_disk_underrun_displayed = true;
2241 MessageDialog msg (*editor,
2242 (_("The disk system on your computer\n\
2243 was not able to keep up with Ardour.\n\
2245 Specifically, it failed to read data from disk\n\
2246 quickly enough to keep up with playback.\n")));
2248 have_disk_underrun_displayed = false;
2253 ARDOUR_UI::disk_underrun_message_gone ()
2255 have_disk_underrun_displayed = false;
2259 ARDOUR_UI::disk_overrun_message_gone ()
2261 have_disk_underrun_displayed = false;
2265 ARDOUR_UI::pending_state_dialog ()
2267 ArdourDialog dialog ("pending state dialog");
2269 This session appears to have been in\n\
2270 middle of recording when ardour or\n\
2271 the computer was shutdown.\n\
2273 Ardour can recover any captured audio for\n\
2274 you, or it can ignore it. Please decide\n\
2275 what you would like to do.\n"));
2277 dialog.get_vbox()->pack_start (message);
2278 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2279 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2281 dialog.set_position (WIN_POS_CENTER);
2284 switch (dialog.run ()) {
2285 case RESPONSE_ACCEPT:
2293 ARDOUR_UI::disconnect_from_jack ()
2296 if( engine->disconnect_from_jack ()) {
2297 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2301 update_sample_rate (0);
2306 ARDOUR_UI::reconnect_to_jack ()
2309 if (engine->reconnect_to_jack ()) {
2310 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2314 update_sample_rate (0);
2319 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2321 engine->request_buffer_size (nframes);
2322 update_sample_rate (0);
2326 ARDOUR_UI::cmdline_new_session (string path)
2328 if (path[0] != '/') {
2329 char buf[PATH_MAX+1];
2332 getcwd (buf, sizeof (buf));
2339 new_session (false, path);
2341 _will_create_new_session_automatically = false; /* done it */
2342 return FALSE; /* don't call it again */
2346 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2348 Glib::RefPtr<Action> act;
2352 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2355 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2358 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2361 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2364 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2369 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2370 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2371 Config->set_native_file_header_format (hf);
2373 session->reset_native_file_format ();
2380 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2382 Glib::RefPtr<Action> act;
2386 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2389 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2394 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2396 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2397 Config->set_native_file_data_format (sf);
2399 session->reset_native_file_format ();
2406 ARDOUR_UI::use_config ()
2408 Glib::RefPtr<Action> act;
2410 switch (Config->get_native_file_data_format ()) {
2412 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2415 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2420 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2421 ract->set_active ();
2424 switch (Config->get_native_file_header_format ()) {
2426 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2429 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2432 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2435 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2438 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2443 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2444 ract->set_active ();