2 Copyright (C) 1999-2002 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
31 #include <gtkmm/messagedialog.h>
32 #include <gtkmm/accelmap.h>
34 #include <pbd/error.h>
35 #include <pbd/compose.h>
36 #include <pbd/pathscanner.h>
37 #include <pbd/failed_constructor.h>
38 #include <gtkmm2ext/gtk_ui.h>
39 #include <gtkmm2ext/utils.h>
40 #include <gtkmm2ext/click_box.h>
41 #include <gtkmm2ext/fastmeter.h>
42 #include <gtkmm2ext/stop_signal.h>
43 #include <gtkmm2ext/popup.h>
45 #include <midi++/port.h>
46 #include <midi++/mmc.h>
48 #include <ardour/ardour.h>
49 #include <ardour/session_route.h>
50 #include <ardour/port.h>
51 #include <ardour/audioengine.h>
52 #include <ardour/playlist.h>
53 #include <ardour/utils.h>
54 #include <ardour/audio_diskstream.h>
55 #include <ardour/audiofilesource.h>
56 #include <ardour/recent_sessions.h>
57 #include <ardour/port.h>
58 #include <ardour/audio_track.h>
61 #include "ardour_ui.h"
62 #include "public_editor.h"
63 #include "audio_clock.h"
68 #include "keyboard_target.h"
69 #include "add_route_dialog.h"
70 #include "new_session_dialog.h"
73 #include "gui_thread.h"
74 #include "color_manager.h"
78 using namespace ARDOUR;
80 using namespace Gtkmm2ext;
84 ARDOUR_UI *ARDOUR_UI::theArdourUI = 0;
86 sigc::signal<void,bool> ARDOUR_UI::Blink;
87 sigc::signal<void> ARDOUR_UI::RapidScreenUpdate;
88 sigc::signal<void> ARDOUR_UI::SuperRapidScreenUpdate;
89 sigc::signal<void,jack_nframes_t> ARDOUR_UI::Clock;
91 ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
93 : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile),
95 primary_clock (X_("TransportClockDisplay"), true, false, true),
96 secondary_clock (X_("SecondaryClockDisplay"), true, false, true),
97 preroll_clock (X_("PreRollClock"), true, true),
98 postroll_clock (X_("PostRollClock"), true, true),
102 adjuster_table (3, 3),
106 preroll_button (_("pre\nroll")),
107 postroll_button (_("post\nroll")),
111 big_clock ("BigClockDisplay", true),
115 time_master_button (_("time\nmaster")),
117 shuttle_units_button (_("% ")),
119 punch_in_button (_("Punch In")),
120 punch_out_button (_("Punch Out")),
121 auto_return_button (_("Auto Return")),
122 auto_play_button (_("Autuo Play")),
123 auto_input_button (_("Auto Input")),
124 click_button (_("Click")),
125 auditioning_alert_button (_("AUDITION")),
126 solo_alert_button (_("SOLO")),
129 using namespace Gtk::Menu_Helpers;
135 if (theArdourUI == 0) {
139 ActionManager::init ();
143 color_manager = new ColorManager();
145 std::string color_file = ARDOUR::find_config_file("ardour.colors");
147 color_manager->load (color_file);
149 m_new_session_dialog = new NewSessionDialog();
153 _session_is_new = false;
154 big_clock_window = 0;
155 session_selector_window = 0;
156 last_key_press_time = 0;
157 connection_editor = 0;
158 add_route_dialog = 0;
163 open_session_selector = 0;
164 have_configure_timeout = false;
165 have_disk_overrun_displayed = false;
166 have_disk_underrun_displayed = false;
167 _will_create_new_session_automatically = false;
168 session_loaded = false;
169 last_speed_displayed = -1.0f;
171 last_configure_time.tv_sec = 0;
172 last_configure_time.tv_usec = 0;
174 shuttle_grabbed = false;
176 shuttle_max_speed = 8.0f;
178 set_shuttle_units (Percentage);
179 set_shuttle_behaviour (Sprung);
181 shuttle_style_menu = 0;
182 shuttle_unit_menu = 0;
184 gettimeofday (&last_peak_grab, 0);
185 gettimeofday (&last_shuttle_request, 0);
187 ARDOUR::AudioDiskstream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
188 ARDOUR::Diskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
189 ARDOUR::Diskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
191 /* handle pending state with a dialog */
193 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
195 /* have to wait for AudioEngine and Configuration before proceeding */
199 ARDOUR_UI::set_engine (AudioEngine& e)
203 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
204 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
205 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
206 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
210 keyboard = new Keyboard;
212 if (setup_windows ()) {
213 throw failed_constructor ();
216 if (GTK_ARDOUR::show_key_actions) {
217 vector<string> names;
218 vector<string> paths;
220 vector<AccelKey> bindings;
222 ActionManager::get_all_actions (names, paths, keys, bindings);
224 vector<string>::iterator n;
225 vector<string>::iterator k;
226 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
227 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
233 /* start with timecode, metering enabled
236 blink_timeout_tag = -1;
238 /* the global configuration object is now valid */
242 /* this being a GUI and all, we want peakfiles */
244 AudioFileSource::set_build_peakfiles (true);
245 AudioFileSource::set_build_missing_peakfiles (true);
247 if (AudioSource::start_peak_thread ()) {
248 throw failed_constructor();
251 /* start the time-of-day-clock */
253 update_wall_clock ();
254 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
256 update_disk_space ();
258 update_sample_rate (engine->frame_rate());
260 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
261 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
264 ARDOUR_UI::~ARDOUR_UI ()
266 save_ardour_state ();
280 if (add_route_dialog) {
281 delete add_route_dialog;
284 AudioSource::stop_peak_thread ();
288 ARDOUR_UI::configure_timeout ()
293 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
294 /* no configure events yet */
298 gettimeofday (&now, 0);
299 timersub (&now, &last_configure_time, &diff);
301 /* force a gap of 0.5 seconds since the last configure event
304 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
307 have_configure_timeout = false;
308 save_ardour_state ();
314 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
316 if (have_configure_timeout) {
317 gettimeofday (&last_configure_time, 0);
319 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
320 have_configure_timeout = true;
327 ARDOUR_UI::save_ardour_state ()
329 if (!keyboard || !mixer || !editor) {
333 /* XXX this is all a bit dubious. add_extra_xml() uses
334 a different lifetime model from add_instant_xml().
337 XMLNode* node = new XMLNode (keyboard->get_state());
338 Config->add_extra_xml (*node);
339 Config->save_state();
341 XMLNode enode(static_cast<Stateful*>(editor)->get_state());
342 XMLNode mnode(mixer->get_state());
345 session->add_instant_xml (enode, session->path());
346 session->add_instant_xml (mnode, session->path());
348 Config->add_instant_xml (enode, get_user_ardour_path());
349 Config->add_instant_xml (mnode, get_user_ardour_path());
354 AccelMap::save ("ardour.saved_bindings");
358 ARDOUR_UI::startup ()
360 /* Once the UI is up and running, start the audio engine. Doing
361 this before the UI is up and running can cause problems
362 when not running with SCHED_FIFO, because the amount of
363 CPU and disk work needed to get the UI started can interfere
364 with the scheduling of the audio thread.
367 Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
373 if (session && session->dirty()) {
374 switch (ask_about_saving_session(_("quit"))) {
379 /* use the default name */
380 if (save_state_canfail ("")) {
381 /* failed - don't quit */
382 MessageDialog msg (*editor,
384 Ardour was unable to save your session.\n\n\
385 If you still wish to quit, please use the\n\n\
386 \"Just quit\" option."));
395 Config->save_state();
400 ARDOUR_UI::ask_about_saving_session (const string & what)
402 ArdourDialog window (_("ardour: save session?"));
403 Gtk::HBox dhbox; // the hbox for the image and text
404 Gtk::Label prompt_label;
405 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
409 msg = string_compose(_("Don't %1"), what);
410 window.add_button (msg, RESPONSE_REJECT);
411 msg = string_compose(_("Just %1"), what);
412 window.add_button (msg, RESPONSE_APPLY);
413 msg = string_compose(_("Save and %1"), what);
414 window.add_button (msg, RESPONSE_ACCEPT);
416 window.set_default_response (RESPONSE_ACCEPT);
418 Gtk::Button noquit_button (msg);
419 noquit_button.set_name ("EditorGTKButton");
424 if (session->snap_name() == session->name()) {
427 type = _("snapshot");
429 prompt = string_compose(_("The %1\"%2\"\nhas not been saved.\n\nAny changes made this time\nwill be lost unless you save it.\n\nWhat do you want to do?"),
430 type, session->snap_name());
432 prompt_label.set_text (prompt);
433 prompt_label.set_name (X_("PrompterLabel"));
434 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
436 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
438 dhbox.set_homogeneous (false);
439 dhbox.pack_start (*dimage, false, false, 5);
440 dhbox.pack_start (prompt_label, true, false, 5);
441 window.get_vbox()->pack_start (dhbox);
443 window.set_name (_("Prompter"));
444 window.set_position (Gtk::WIN_POS_MOUSE);
445 window.set_modal (true);
446 window.set_resizable (false);
449 save_the_session = 0;
451 editor->ensure_float (window);
453 ResponseType r = (ResponseType) window.run();
458 case RESPONSE_ACCEPT: // save and get out of here
460 case RESPONSE_APPLY: // get out of here
470 ARDOUR_UI::every_second ()
473 update_buffer_load ();
474 update_disk_space ();
479 ARDOUR_UI::every_point_one_seconds ()
481 update_speed_display ();
482 RapidScreenUpdate(); /* EMIT_SIGNAL */
487 ARDOUR_UI::every_point_zero_one_seconds ()
489 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
494 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
498 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
500 if (!engine->connected()) {
502 snprintf (buf, sizeof (buf), _("disconnected"));
506 jack_nframes_t rate = engine->frame_rate();
508 if (fmod (rate, 1000.0) != 0.0) {
509 snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"),
510 (float) rate/1000.0f,
511 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
513 snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"),
515 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
519 sample_rate_label.set_text (buf);
523 ARDOUR_UI::update_cpu_load ()
526 snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load());
527 cpu_load_label.set_text (buf);
531 ARDOUR_UI::update_buffer_load ()
536 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
537 session->playback_load(), session->capture_load());
538 buffer_load_label.set_text (buf);
540 buffer_load_label.set_text ("");
545 ARDOUR_UI::count_recenabled_diskstreams (Route& route)
547 Track* track = dynamic_cast<Track*>(&route);
548 if (track && track->diskstream()->record_enabled()) {
549 rec_enabled_diskstreams++;
554 ARDOUR_UI::update_disk_space()
560 jack_nframes_t frames = session->available_capture_duration();
563 if (frames == max_frames) {
564 strcpy (buf, _("Disk: 24hrs+"));
569 jack_nframes_t fr = session->frame_rate();
571 if (session->actively_recording()){
573 rec_enabled_diskstreams = 0;
574 session->foreach_route (this, &ARDOUR_UI::count_recenabled_diskstreams);
576 if (rec_enabled_diskstreams) {
577 frames /= rec_enabled_diskstreams;
582 /* hmmm. shall we divide by the route count? or the diskstream count?
583 or what? for now, do nothing ...
588 hrs = frames / (fr * 3600);
589 frames -= hrs * fr * 3600;
590 mins = frames / (fr * 60);
591 frames -= mins * fr * 60;
594 snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs);
597 disk_space_label.set_text (buf);
601 ARDOUR_UI::update_wall_clock ()
608 tm_now = localtime (&now);
610 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
611 wall_clock_label.set_text (buf);
616 ARDOUR_UI::control_methods_adjusted ()
621 which_method = (int) online_control_button->adjustment.get_value();
622 switch (which_method) {
624 allow_mmc_and_local ();
633 fatal << _("programming error: impossible control method") << endmsg;
639 ARDOUR_UI::mmc_device_id_adjusted ()
644 int dev_id = (int) mmc_id_button->adjustment.get_value();
645 mmc->set_device_id (dev_id);
651 ARDOUR_UI::session_menu (GdkEventButton *ev)
653 session_popup_menu->popup (0, 0);
658 ARDOUR_UI::redisplay_recent_sessions ()
660 vector<string *> *sessions;
661 vector<string *>::iterator i;
662 RecentSessionsSorter cmp;
664 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
665 recent_session_model->clear ();
668 ARDOUR::read_recent_sessions (rs);
671 recent_session_display.set_model (recent_session_model);
675 /* sort them alphabetically */
676 sort (rs.begin(), rs.end(), cmp);
677 sessions = new vector<string*>;
679 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
680 sessions->push_back (new string ((*i).second));
683 for (i = sessions->begin(); i != sessions->end(); ++i) {
685 vector<string*>* states;
686 vector<const gchar*> item;
687 string fullpath = *(*i);
689 /* remove any trailing / */
691 if (fullpath[fullpath.length()-1] == '/') {
692 fullpath = fullpath.substr (0, fullpath.length()-1);
695 /* now get available states for this session */
697 if ((states = Session::possible_states (fullpath)) == 0) {
702 TreeModel::Row row = *(recent_session_model->append());
704 row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
705 row[recent_session_columns.fullpath] = fullpath;
707 if (states->size() > 1) {
709 /* add the children */
711 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
713 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
715 child_row[recent_session_columns.visible_name] = **i2;
716 child_row[recent_session_columns.fullpath] = fullpath;
725 recent_session_display.set_model (recent_session_model);
730 ARDOUR_UI::build_session_selector ()
732 session_selector_window = new ArdourDialog ("session selector");
734 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
736 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
737 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
738 session_selector_window->set_default_response (RESPONSE_ACCEPT);
739 recent_session_model = TreeStore::create (recent_session_columns);
740 recent_session_display.set_model (recent_session_model);
741 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
742 recent_session_display.set_headers_visible (false);
743 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
745 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
747 scroller->add (recent_session_display);
748 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
750 session_selector_window->set_name ("SessionSelectorWindow");
751 session_selector_window->set_size_request (200, 400);
752 session_selector_window->get_vbox()->pack_start (*scroller);
753 session_selector_window->show_all_children();
757 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
759 session_selector_window->response (RESPONSE_ACCEPT);
763 ARDOUR_UI::open_recent_session ()
765 /* popup selector window */
767 if (session_selector_window == 0) {
768 build_session_selector ();
771 redisplay_recent_sessions ();
773 ResponseType r = (ResponseType) session_selector_window->run ();
775 session_selector_window->hide();
778 case RESPONSE_ACCEPT:
784 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
786 if (i == recent_session_model->children().end()) {
790 Glib::ustring path = (*i)[recent_session_columns.fullpath];
791 Glib::ustring state = (*i)[recent_session_columns.visible_name];
793 _session_is_new = false;
795 load_session (path, state);
799 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
803 if (stat (info.filename.c_str(), &statbuf) != 0) {
807 if (!S_ISDIR(statbuf.st_mode)) {
813 string session_file = info.filename;
815 session_file += Glib::path_get_basename (info.filename);
816 session_file += ".ardour";
818 if (stat (session_file.c_str(), &statbuf) != 0) {
822 return S_ISREG (statbuf.st_mode);
826 ARDOUR_UI::open_session ()
828 /* popup selector window */
830 if (open_session_selector == 0) {
832 /* ardour sessions are folders */
834 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
835 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
836 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
838 FileFilter session_filter;
839 session_filter.add_pattern ("*.ardour");
840 session_filter.set_name (_("Ardour sessions"));
841 open_session_selector->add_filter (session_filter);
842 open_session_selector->set_filter (session_filter);
845 int response = open_session_selector->run();
846 open_session_selector->hide ();
849 case RESPONSE_ACCEPT:
852 open_session_selector->hide();
856 open_session_selector->hide();
857 string session_path = open_session_selector->get_filename();
861 if (session_path.length() > 0) {
862 if (Session::find_session (session_path, path, name, isnew) == 0) {
863 _session_is_new = isnew;
864 load_session (path, name);
871 ARDOUR_UI::session_add_midi_track ()
873 cerr << _("Patience is a virtue.\n");
877 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
879 boost::shared_ptr<Route> route;
882 warning << _("You cannot add a track without a session already loaded.") << endmsg;
888 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
889 error << _("could not create new audio track") << endmsg;
892 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
893 error << _("could not create new audio bus") << endmsg;
898 if (need_control_room_outs) {
904 route->set_stereo_control_outs (control_lr_channels);
905 route->control_outs()->set_stereo_pan (pans, this);
907 #endif /* CONTROLOUTS */
911 MessageDialog msg (*editor,
912 _("There are insufficient JACK ports available\n\
913 to create a new track or bus.\n\
914 You should save Ardour, exit and\n\
915 restart JACK with more ports."));
921 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
923 jack_nframes_t _preroll;
926 _preroll = session->convert_to_frames_at (new_position, session->preroll);
928 if (new_position > _preroll) {
929 new_position -= _preroll;
934 session->request_locate (new_position);
939 ARDOUR_UI::transport_goto_start ()
942 session->goto_start();
945 /* force displayed area in editor to start no matter
946 what "follow playhead" setting is.
950 editor->reposition_x_origin (session->current_start_frame());
956 ARDOUR_UI::transport_goto_zero ()
959 session->request_locate (0);
962 /* force displayed area in editor to start no matter
963 what "follow playhead" setting is.
967 editor->reposition_x_origin (0);
973 ARDOUR_UI::transport_goto_end ()
976 jack_nframes_t frame = session->current_end_frame();
977 session->request_locate (frame);
979 /* force displayed area in editor to start no matter
980 what "follow playhead" setting is.
984 editor->reposition_x_origin (frame);
990 ARDOUR_UI::transport_stop ()
996 if (session->is_auditioning()) {
997 session->cancel_audition ();
1001 if (session->get_auto_loop()) {
1002 session->request_auto_loop (false);
1005 session->request_stop ();
1009 ARDOUR_UI::transport_stop_and_forget_capture ()
1012 session->request_stop (true);
1017 ARDOUR_UI::remove_last_capture()
1020 editor->remove_last_capture();
1025 ARDOUR_UI::transport_record ()
1028 switch (session->record_status()) {
1029 case Session::Disabled:
1030 if (session->ntracks() == 0) {
1031 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1032 MessageDialog msg (*editor, txt);
1036 session->maybe_enable_record ();
1038 case Session::Recording:
1039 case Session::Enabled:
1040 session->disable_record (true);
1046 ARDOUR_UI::transport_roll ()
1054 rolling = session->transport_rolling ();
1056 if (session->get_auto_loop()) {
1057 session->request_auto_loop (false);
1058 auto_loop_button.set_active (false);
1059 roll_button.set_active (true);
1060 } else if (session->get_play_range ()) {
1061 session->request_play_range (false);
1062 play_selection_button.set_active (false);
1063 } else if (rolling) {
1064 session->request_locate (session->last_transport_start(), true);
1067 session->request_transport_speed (1.0f);
1071 ARDOUR_UI::transport_loop()
1074 if (session->get_auto_loop()) {
1075 if (session->transport_rolling()) {
1076 Location * looploc = session->locations()->auto_loop_location();
1078 session->request_locate (looploc->start(), true);
1083 session->request_auto_loop (true);
1089 ARDOUR_UI::transport_play_selection ()
1095 if (!session->get_play_range()) {
1096 session->request_stop ();
1099 editor->play_selection ();
1103 ARDOUR_UI::transport_rewind (int option)
1105 float current_transport_speed;
1108 current_transport_speed = session->transport_speed();
1110 if (current_transport_speed >= 0.0f) {
1113 session->request_transport_speed (-1.0f);
1116 session->request_transport_speed (-4.0f);
1119 session->request_transport_speed (-0.5f);
1124 session->request_transport_speed (current_transport_speed * 1.5f);
1130 ARDOUR_UI::transport_forward (int option)
1132 float current_transport_speed;
1135 current_transport_speed = session->transport_speed();
1137 if (current_transport_speed <= 0.0f) {
1140 session->request_transport_speed (1.0f);
1143 session->request_transport_speed (4.0f);
1146 session->request_transport_speed (0.5f);
1151 session->request_transport_speed (current_transport_speed * 1.5f);
1157 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1163 boost::shared_ptr<Route> r;
1165 if ((r = session->route_by_remote_id (dstream)) != 0) {
1169 if ((t = dynamic_cast<Track*>(r.get())) != 0) {
1170 t->diskstream()->set_record_enabled (!t->diskstream()->record_enabled());
1179 ARDOUR_UI::queue_transport_change ()
1181 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1185 ARDOUR_UI::map_transport_state ()
1187 float sp = session->transport_speed();
1190 transport_rolling ();
1191 } else if (sp < 0.0f) {
1192 transport_rewinding ();
1193 } else if (sp > 0.0f) {
1194 transport_forwarding ();
1196 transport_stopped ();
1201 ARDOUR_UI::allow_local_only ()
1207 ARDOUR_UI::allow_mmc_only ()
1213 ARDOUR_UI::allow_mmc_and_local ()
1219 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1221 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1222 (int) adj.get_value()].c_str());
1226 ARDOUR_UI::engine_stopped ()
1228 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1229 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1230 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1235 ARDOUR_UI::engine_running ()
1237 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1238 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1239 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1243 ARDOUR_UI::engine_halted ()
1245 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1247 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1248 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1250 update_sample_rate (0);
1252 MessageDialog msg (*editor,
1254 JACK has either been shutdown or it\n\
1255 disconnected Ardour because Ardour\n\
1256 was not fast enough. You can save the\n\
1257 session and/or try to reconnect to JACK ."));
1262 ARDOUR_UI::do_engine_start ()
1268 catch (AudioEngine::PortRegistrationFailure& err) {
1270 error << _("Unable to create all required ports")
1278 error << _("Unable to start the session running")
1288 ARDOUR_UI::start_engine ()
1290 if (do_engine_start () == 0) {
1291 if (session && _session_is_new) {
1292 /* we need to retain initial visual
1293 settings for a new session
1295 session->save_state ("");
1298 /* there is too much going on, in too many threads, for us to
1299 end up with a clean session. So wait 1 second after loading,
1300 and fix it up. its ugly, but until i come across a better
1301 solution, its what we have.
1304 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1311 ARDOUR_UI::update_clocks ()
1313 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1317 ARDOUR_UI::start_clocking ()
1319 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1323 ARDOUR_UI::stop_clocking ()
1325 clock_signal_connection.disconnect ();
1329 ARDOUR_UI::toggle_clocking ()
1332 if (clock_button.get_active()) {
1341 ARDOUR_UI::_blink (void *arg)
1344 ((ARDOUR_UI *) arg)->blink ();
1351 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1355 ARDOUR_UI::start_blinking ()
1357 /* Start the blink signal. Everybody with a blinking widget
1358 uses Blink to drive the widget's state.
1361 if (blink_timeout_tag < 0) {
1363 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1368 ARDOUR_UI::stop_blinking ()
1370 if (blink_timeout_tag >= 0) {
1371 gtk_timeout_remove (blink_timeout_tag);
1372 blink_timeout_tag = -1;
1377 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1383 if (io.n_inputs() == 0) {
1388 /* XXX we're not handling multiple ports yet. */
1390 const char **connections = io.input(0)->get_connections();
1392 if (connections == 0 || connections[0] == '\0') {
1395 buf = connections[0];
1402 if (io.n_outputs() == 0) {
1407 /* XXX we're not handling multiple ports yet. */
1409 const char **connections = io.output(0)->get_connections();
1411 if (connections == 0 || connections[0] == '\0') {
1414 buf = connections[0];
1422 ARDOUR_UI::snapshot_session ()
1424 ArdourPrompter prompter (true);
1431 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1433 prompter.set_name ("Prompter");
1434 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1435 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1436 prompter.set_prompt (_("Name of New Snapshot"));
1437 prompter.set_initial_text (now);
1439 switch (prompter.run()) {
1440 case RESPONSE_ACCEPT:
1441 prompter.get_result (snapname);
1442 if (snapname.length()){
1443 save_state (snapname);
1453 ARDOUR_UI::save_state (const string & name)
1455 (void) save_state_canfail (name);
1459 ARDOUR_UI::save_state_canfail (string name)
1464 if (name.length() == 0) {
1465 name = session->snap_name();
1468 if ((ret = session->save_state (name)) != 0) {
1472 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1477 ARDOUR_UI::restore_state (string name)
1480 if (name.length() == 0) {
1481 name = session->name();
1483 session->restore_state (name);
1488 ARDOUR_UI::primary_clock_value_changed ()
1491 session->request_locate (primary_clock.current_time ());
1496 ARDOUR_UI::secondary_clock_value_changed ()
1499 session->request_locate (secondary_clock.current_time ());
1504 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1506 if (session && dstream && dstream->record_enabled()) {
1508 Session::RecordState rs;
1510 rs = session->record_status ();
1513 case Session::Disabled:
1514 case Session::Enabled:
1515 if (w->get_state() != STATE_SELECTED) {
1516 w->set_state (STATE_SELECTED);
1520 case Session::Recording:
1521 if (w->get_state() != STATE_ACTIVE) {
1522 w->set_state (STATE_ACTIVE);
1528 if (w->get_state() != STATE_NORMAL) {
1529 w->set_state (STATE_NORMAL);
1535 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1541 switch (session->record_status()) {
1542 case Session::Enabled:
1544 rec_button.set_state (1);
1546 rec_button.set_state (0);
1550 case Session::Recording:
1551 rec_button.set_state (2);
1555 rec_button.set_state (0);
1561 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1569 ARDOUR_UI::start_keyboard_prefix ()
1571 keyboard->start_prefix();
1575 ARDOUR_UI::save_template ()
1578 ArdourPrompter prompter (true);
1581 prompter.set_name (X_("Prompter"));
1582 prompter.set_prompt (_("Name for mix template:"));
1583 prompter.set_initial_text(session->name() + _("-template"));
1584 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1585 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1587 switch (prompter.run()) {
1588 case RESPONSE_ACCEPT:
1589 prompter.get_result (name);
1591 if (name.length()) {
1592 session->save_template (name);
1602 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1604 m_new_session_dialog->show();
1605 m_new_session_dialog->set_modal(true);
1606 m_new_session_dialog->set_name(predetermined_path);
1607 m_new_session_dialog->reset_recent();
1609 int response = Gtk::RESPONSE_CANCEL;
1612 response = m_new_session_dialog->run ();
1613 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1617 } else if (response == Gtk::RESPONSE_NONE) {
1618 /* Clear was pressed */
1619 m_new_session_dialog->reset();
1621 } else if (response == Gtk::RESPONSE_YES) {
1622 /* YES == OPEN, but there's no enum for that */
1623 std::string session_name = m_new_session_dialog->session_name();
1624 std::string session_path = m_new_session_dialog->session_folder();
1625 load_session (session_path, session_name);
1628 } else if (response == Gtk::RESPONSE_OK) {
1629 if (m_new_session_dialog->get_current_page() == 1) {
1631 /* XXX this is a bit of a hack..
1632 i really want the new sesion dialog to return RESPONSE_YES
1633 if we're on page 1 (the load page)
1634 Unfortunately i can't see how atm..
1636 std::string session_name = m_new_session_dialog->session_name();
1637 std::string session_path = m_new_session_dialog->session_folder();
1638 load_session (session_path, session_name);
1642 _session_is_new = true;
1644 std::string session_name = m_new_session_dialog->session_name();
1645 std::string session_path = m_new_session_dialog->session_folder();
1648 //XXX This is needed because session constructor wants a
1649 //non-existant path. hopefully this will be fixed at some point.
1651 session_path = Glib::build_filename(session_path, session_name);
1653 std::string template_name = m_new_session_dialog->session_template_name();
1655 if (m_new_session_dialog->use_session_template()) {
1657 load_session (session_path, session_name, &template_name);
1663 Session::AutoConnectOption iconnect;
1664 Session::AutoConnectOption oconnect;
1666 if (m_new_session_dialog->create_control_bus()) {
1667 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1672 if (m_new_session_dialog->create_master_bus()) {
1673 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1678 if (m_new_session_dialog->connect_inputs()) {
1679 iconnect = Session::AutoConnectPhysical;
1681 iconnect = Session::AutoConnectOption (0);
1684 /// @todo some minor tweaks.
1686 if (m_new_session_dialog->connect_outs_to_master()) {
1687 oconnect = Session::AutoConnectMaster;
1688 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1689 oconnect = Session::AutoConnectPhysical;
1691 oconnect = Session::AutoConnectOption (0);
1694 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1695 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1697 build_session (session_path,
1705 engine->frame_rate() * 60 * 5);
1710 } while (response == Gtk::RESPONSE_NONE);
1711 m_new_session_dialog->hide();
1717 ARDOUR_UI::close_session()
1724 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1726 Session *new_session;
1728 session_loaded = false;
1729 x = unload_session ();
1737 /* if it already exists, we must have write access */
1739 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1740 MessageDialog msg (*editor, _("\
1741 You do not have write access to this session.\n\
1742 This prevents the session from being loaded."));
1748 new_session = new Session (*engine, path, snap_name, mix_template);
1753 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1757 connect_to_session (new_session);
1759 //if (engine->running()) {
1760 //mixer->show_window();
1762 session_loaded = true;
1767 ARDOUR_UI::make_session_clean ()
1770 session->set_clean ();
1779 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1780 uint32_t control_channels,
1781 uint32_t master_channels,
1782 Session::AutoConnectOption input_connect,
1783 Session::AutoConnectOption output_connect,
1786 jack_nframes_t initial_length)
1788 Session *new_session;
1791 session_loaded = false;
1792 x = unload_session ();
1799 _session_is_new = true;
1802 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1803 control_channels, master_channels, nphysin, nphysout, initial_length);
1808 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1812 connect_to_session (new_session);
1814 //if (engine->running()) {
1815 //mixer->show_window();
1817 session_loaded = true;
1825 editor->show_window ();
1829 if (session && mixer) {
1830 // mixer->show_window ();
1839 ARDOUR_UI::show_splash ()
1842 about = new About();
1848 ARDOUR_UI::hide_splash ()
1856 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1860 removed = rep.paths.size();
1863 MessageDialog msgd (*editor,
1864 _("No audio files were ready for cleanup"),
1867 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1868 msgd.set_secondary_text (_("If this seems suprising, \n\
1869 check for any existing snapshots.\n\
1870 These may still include regions that\n\
1871 require some unused files to continue to exist."));
1877 ArdourDialog results (_("ardour: cleanup"), true, false);
1879 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1880 CleanupResultsModelColumns() {
1884 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1885 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1889 CleanupResultsModelColumns results_columns;
1890 Glib::RefPtr<Gtk::ListStore> results_model;
1891 Gtk::TreeView results_display;
1893 results_model = ListStore::create (results_columns);
1894 results_display.set_model (results_model);
1895 results_display.append_column (list_title, results_columns.visible_name);
1897 results_display.set_name ("CleanupResultsList");
1898 results_display.set_headers_visible (true);
1899 results_display.set_headers_clickable (false);
1900 results_display.set_reorderable (false);
1902 Gtk::ScrolledWindow list_scroller;
1905 Gtk::HBox dhbox; // the hbox for the image and text
1906 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1907 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1909 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1911 if (rep.space < 1048576.0f) {
1913 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1915 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1919 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1921 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1925 dhbox.pack_start (*dimage, true, false, 5);
1926 dhbox.pack_start (txt, true, false, 5);
1928 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1929 TreeModel::Row row = *(results_model->append());
1930 row[results_columns.visible_name] = *i;
1931 row[results_columns.fullpath] = *i;
1934 list_scroller.add (results_display);
1935 list_scroller.set_size_request (-1, 150);
1936 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
1938 dvbox.pack_start (dhbox, true, false, 5);
1939 dvbox.pack_start (list_scroller, true, false, 5);
1940 ddhbox.pack_start (dvbox, true, false, 5);
1942 results.get_vbox()->pack_start (ddhbox, true, false, 5);
1943 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
1944 results.set_default_response (RESPONSE_CLOSE);
1945 results.set_position (Gtk::WIN_POS_MOUSE);
1946 results.show_all_children ();
1947 results.set_resizable (false);
1954 ARDOUR_UI::cleanup ()
1957 /* shouldn't happen: menu item is insensitive */
1962 MessageDialog checker (_("Are you sure you want to cleanup?"),
1964 Gtk::MESSAGE_QUESTION,
1965 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
1967 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
1968 ALL undo/redo information will be lost if you cleanup.\n\
1969 After cleanup, unused audio files will be moved to a \
1970 \"dead sounds\" location."));
1972 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
1973 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
1974 checker.set_default_response (RESPONSE_CANCEL);
1976 checker.set_name (_("CleanupDialog"));
1977 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
1978 checker.set_position (Gtk::WIN_POS_MOUSE);
1980 switch (checker.run()) {
1981 case RESPONSE_ACCEPT:
1987 Session::cleanup_report rep;
1989 editor->prepare_for_cleanup ();
1991 if (session->cleanup_sources (rep)) {
1995 display_cleanup_results (rep,
1998 The following %1 %2 not in use and \n\
1999 have been moved to:\n\
2001 Flushing the wastebasket will \n\
2002 release an additional\n\
2003 %4 %5bytes of disk space.\n"
2008 ARDOUR_UI::flush_trash ()
2011 /* shouldn't happen: menu item is insensitive */
2015 Session::cleanup_report rep;
2017 if (session->cleanup_trash_sources (rep)) {
2021 display_cleanup_results (rep,
2023 _("The following %1 %2 deleted from\n\
2025 releasing %4 %5bytes of disk space"));
2029 ARDOUR_UI::add_route ()
2037 if (add_route_dialog == 0) {
2038 add_route_dialog = new AddRouteDialog;
2039 editor->ensure_float (*add_route_dialog);
2042 if (add_route_dialog->is_visible()) {
2043 /* we're already doing this */
2047 ResponseType r = (ResponseType) add_route_dialog->run ();
2049 add_route_dialog->hide();
2052 case RESPONSE_ACCEPT:
2059 if ((count = add_route_dialog->count()) <= 0) {
2063 uint32_t input_chan = add_route_dialog->channels ();
2064 uint32_t output_chan;
2065 string name_template = add_route_dialog->name_template ();
2066 bool track = add_route_dialog->track ();
2068 Session::AutoConnectOption oac = session->get_output_auto_connect();
2070 if (oac & Session::AutoConnectMaster) {
2071 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2073 output_chan = input_chan;
2076 /* XXX do something with name template */
2080 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2082 session_add_audio_bus (input_chan, output_chan);
2086 while (Main::events_pending()) {
2093 ARDOUR_UI::mixer_settings () const
2098 node = session->instant_xml(X_("Mixer"), session->path());
2100 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2104 node = new XMLNode (X_("Mixer"));
2111 ARDOUR_UI::editor_settings () const
2116 node = session->instant_xml(X_("Editor"), session->path());
2118 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2122 node = new XMLNode (X_("Editor"));
2128 ARDOUR_UI::keyboard_settings () const
2132 node = Config->extra_xml(X_("Keyboard"));
2135 node = new XMLNode (X_("Keyboard"));
2141 ARDOUR_UI::halt_on_xrun_message ()
2143 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2145 MessageDialog msg (*editor,
2146 _("Recording was stopped because your system could not keep up."));
2151 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::Source*>* deletion_list)
2153 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2155 for (list<Source*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2159 delete deletion_list;
2163 ARDOUR_UI::disk_overrun_handler ()
2165 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2167 if (!have_disk_overrun_displayed) {
2168 have_disk_overrun_displayed = true;
2169 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2170 The disk system on your computer\n\
2171 was not able to keep up with Ardour.\n\
2173 Specifically, it failed to write data to disk\n\
2174 quickly enough to keep up with recording.\n"));
2176 have_disk_overrun_displayed = false;
2181 ARDOUR_UI::disk_underrun_handler ()
2183 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2185 if (!have_disk_underrun_displayed) {
2186 have_disk_underrun_displayed = true;
2187 MessageDialog msg (*editor,
2188 (_("The disk system on your computer\n\
2189 was not able to keep up with Ardour.\n\
2191 Specifically, it failed to read data from disk\n\
2192 quickly enough to keep up with playback.\n")));
2194 have_disk_underrun_displayed = false;
2199 ARDOUR_UI::disk_underrun_message_gone ()
2201 have_disk_underrun_displayed = false;
2205 ARDOUR_UI::disk_overrun_message_gone ()
2207 have_disk_underrun_displayed = false;
2211 ARDOUR_UI::pending_state_dialog ()
2213 ArdourDialog dialog ("pending state dialog");
2215 This session appears to have been in\n\
2216 middle of recording when ardour or\n\
2217 the computer was shutdown.\n\
2219 Ardour can recover any captured audio for\n\
2220 you, or it can ignore it. Please decide\n\
2221 what you would like to do.\n"));
2223 dialog.get_vbox()->pack_start (message);
2224 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2225 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2227 dialog.set_position (WIN_POS_CENTER);
2230 switch (dialog.run ()) {
2231 case RESPONSE_ACCEPT:
2239 ARDOUR_UI::disconnect_from_jack ()
2242 if( engine->disconnect_from_jack ()) {
2243 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2247 update_sample_rate (0);
2252 ARDOUR_UI::reconnect_to_jack ()
2255 if (engine->reconnect_to_jack ()) {
2256 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2260 update_sample_rate (0);
2265 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2267 engine->request_buffer_size (nframes);
2268 update_sample_rate (0);
2272 ARDOUR_UI::cmdline_new_session (string path)
2274 if (path[0] != '/') {
2275 char buf[PATH_MAX+1];
2278 getcwd (buf, sizeof (buf));
2285 new_session (false, path);
2287 _will_create_new_session_automatically = false; /* done it */
2288 return FALSE; /* don't call it again */
2292 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2294 Glib::RefPtr<Action> act;
2298 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2301 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2304 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2307 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2310 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2313 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2316 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2321 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2322 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2323 Config->set_native_file_header_format (hf);
2325 session->reset_native_file_format ();
2332 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2334 Glib::RefPtr<Action> act;
2338 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2341 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2346 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2348 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2349 Config->set_native_file_data_format (sf);
2351 session->reset_native_file_format ();
2358 ARDOUR_UI::use_config ()
2360 Glib::RefPtr<Action> act;
2362 switch (Config->get_native_file_data_format ()) {
2364 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2367 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2372 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2373 ract->set_active ();
2376 switch (Config->get_native_file_header_format ()) {
2378 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2381 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2384 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2387 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2390 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2393 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2396 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2401 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2402 ract->set_active ();