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"))) {
380 /* use the default name */
381 if (save_state_canfail ("")) {
382 /* failed - don't quit */
383 MessageDialog msg (*editor,
385 Ardour was unable to save your session.\n\n\
386 If you still wish to quit, please use the\n\n\
387 \"Just quit\" option."));
396 Config->save_state();
401 ARDOUR_UI::ask_about_saving_session (const string & what)
403 ArdourDialog window (_("ardour: save session?"));
404 Gtk::HBox dhbox; // the hbox for the image and text
405 Gtk::Label prompt_label;
406 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
410 msg = string_compose(_("Don't %1"), what);
411 window.add_button (msg, RESPONSE_REJECT);
412 msg = string_compose(_("Just %1"), what);
413 window.add_button (msg, RESPONSE_APPLY);
414 msg = string_compose(_("Save and %1"), what);
415 window.add_button (msg, RESPONSE_ACCEPT);
417 window.set_default_response (RESPONSE_ACCEPT);
419 Gtk::Button noquit_button (msg);
420 noquit_button.set_name ("EditorGTKButton");
425 if (session->snap_name() == session->name()) {
428 type = _("snapshot");
430 prompt = string_compose(_("The %1\"%2\"\nhas not been saved.\n\nAny changes made this time\nwill be lost unless you save it.\n\nWhat do you want to do?"),
431 type, session->snap_name());
433 prompt_label.set_text (prompt);
434 prompt_label.set_name (X_("PrompterLabel"));
435 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
437 dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP)
439 dhbox.set_homogeneous (false);
440 dhbox.pack_start (*dimage, false, false, 5);
441 dhbox.pack_start (prompt_label, true, false, 5);
442 window.get_vbox()->pack_start (dhbox);
444 window.set_name (_("Prompter"));
445 window.set_position (Gtk::WIN_POS_MOUSE);
446 window.set_modal (true);
447 window.set_resizable (false);
450 save_the_session = 0;
452 editor->ensure_float (window);
454 ResponseType r = (ResponseType) window.run();
459 case RESPONSE_ACCEPT: // save and get out of here
461 case RESPONSE_APPLY: // get out of here
471 ARDOUR_UI::every_second ()
474 update_buffer_load ();
475 update_disk_space ();
480 ARDOUR_UI::every_point_one_seconds ()
482 update_speed_display ();
483 RapidScreenUpdate(); /* EMIT_SIGNAL */
488 ARDOUR_UI::every_point_zero_one_seconds ()
490 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
495 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
499 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
501 if (!engine->connected()) {
503 snprintf (buf, sizeof (buf), _("disconnected"));
507 jack_nframes_t rate = engine->frame_rate();
509 if (fmod (rate, 1000.0) != 0.0) {
510 snprintf (buf, sizeof (buf), _("SR: %.1f kHz / %4.1f msecs"),
511 (float) rate/1000.0f,
512 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
514 snprintf (buf, sizeof (buf), _("SR: %u kHz / %4.1f msecs"),
516 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
520 sample_rate_label.set_text (buf);
524 ARDOUR_UI::update_cpu_load ()
527 snprintf (buf, sizeof (buf), _("DSP Load: %.1f%%"), engine->get_cpu_load());
528 cpu_load_label.set_text (buf);
532 ARDOUR_UI::update_buffer_load ()
537 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
538 session->playback_load(), session->capture_load());
539 buffer_load_label.set_text (buf);
541 buffer_load_label.set_text ("");
546 ARDOUR_UI::count_recenabled_diskstreams (AudioDiskstream& ds)
548 if (ds.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, _("space: 24hrs+"));
569 jack_nframes_t fr = session->frame_rate();
571 if (session->actively_recording()){
573 rec_enabled_diskstreams = 0;
574 session->foreach_audio_diskstream (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), _("space: %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)
882 warning << _("You cannot add a track without a session already loaded.") << endmsg;
888 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
889 error << _("could not create new audio track") << endmsg;
892 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
893 error << _("could not create new audio bus") << endmsg;
898 if (need_control_room_outs) {
904 route->set_stereo_control_outs (control_lr_channels);
905 route->control_outs()->set_stereo_pan (pans, this);
907 #endif /* CONTROLOUTS */
911 MessageDialog msg (*editor,
912 _("There are insufficient JACK ports available\n\
913 to create a new track or bus.\n\
914 You should save Ardour, exit and\n\
915 restart JACK with more ports."));
921 ARDOUR_UI::diskstream_added (AudioDiskstream* ds)
926 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
928 jack_nframes_t _preroll;
931 _preroll = session->convert_to_frames_at (new_position, session->preroll);
933 if (new_position > _preroll) {
934 new_position -= _preroll;
939 session->request_locate (new_position);
944 ARDOUR_UI::transport_goto_start ()
947 session->goto_start();
950 /* force displayed area in editor to start no matter
951 what "follow playhead" setting is.
955 editor->reposition_x_origin (session->current_start_frame());
961 ARDOUR_UI::transport_goto_zero ()
964 session->request_locate (0);
967 /* force displayed area in editor to start no matter
968 what "follow playhead" setting is.
972 editor->reposition_x_origin (0);
978 ARDOUR_UI::transport_goto_end ()
981 jack_nframes_t frame = session->current_end_frame();
982 session->request_locate (frame);
984 /* force displayed area in editor to start no matter
985 what "follow playhead" setting is.
989 editor->reposition_x_origin (frame);
995 ARDOUR_UI::transport_stop ()
1001 if (session->is_auditioning()) {
1002 session->cancel_audition ();
1006 if (session->get_auto_loop()) {
1007 session->request_auto_loop (false);
1010 session->request_stop ();
1014 ARDOUR_UI::transport_stop_and_forget_capture ()
1017 session->request_stop (true);
1022 ARDOUR_UI::remove_last_capture()
1025 editor->remove_last_capture();
1030 ARDOUR_UI::transport_record ()
1033 switch (session->record_status()) {
1034 case Session::Disabled:
1035 if (session->ntracks() == 0) {
1036 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1037 MessageDialog msg (*editor, txt);
1041 session->maybe_enable_record ();
1043 case Session::Recording:
1044 case Session::Enabled:
1045 session->disable_record (true);
1051 ARDOUR_UI::transport_roll ()
1059 rolling = session->transport_rolling ();
1061 if (session->get_auto_loop()) {
1062 session->request_auto_loop (false);
1063 auto_loop_button.set_active (false);
1064 roll_button.set_active (true);
1065 } else if (session->get_play_range ()) {
1066 session->request_play_range (false);
1067 play_selection_button.set_active (false);
1068 } else if (rolling) {
1069 session->request_locate (session->last_transport_start(), true);
1072 session->request_transport_speed (1.0f);
1076 ARDOUR_UI::transport_loop()
1079 if (session->get_auto_loop()) {
1080 if (session->transport_rolling()) {
1081 Location * looploc = session->locations()->auto_loop_location();
1083 session->request_locate (looploc->start(), true);
1088 session->request_auto_loop (true);
1094 ARDOUR_UI::transport_play_selection ()
1100 if (!session->get_play_range()) {
1101 session->request_stop ();
1104 editor->play_selection ();
1108 ARDOUR_UI::transport_rewind (int option)
1110 float current_transport_speed;
1113 current_transport_speed = session->transport_speed();
1115 if (current_transport_speed >= 0.0f) {
1118 session->request_transport_speed (-1.0f);
1121 session->request_transport_speed (-4.0f);
1124 session->request_transport_speed (-0.5f);
1129 session->request_transport_speed (current_transport_speed * 1.5f);
1135 ARDOUR_UI::transport_forward (int option)
1137 float current_transport_speed;
1140 current_transport_speed = session->transport_speed();
1142 if (current_transport_speed <= 0.0f) {
1145 session->request_transport_speed (1.0f);
1148 session->request_transport_speed (4.0f);
1151 session->request_transport_speed (0.5f);
1156 session->request_transport_speed (current_transport_speed * 1.5f);
1162 ARDOUR_UI::toggle_record_enable (uint32_t dstream)
1170 if ((r = session->route_by_remote_id (dstream)) != 0) {
1174 if ((at = dynamic_cast<AudioTrack*>(r)) != 0) {
1175 at->disk_stream().set_record_enabled (!at->disk_stream().record_enabled(), this);
1181 ARDOUR_UI::queue_transport_change ()
1183 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1187 ARDOUR_UI::map_transport_state ()
1189 float sp = session->transport_speed();
1192 transport_rolling ();
1193 } else if (sp < 0.0f) {
1194 transport_rewinding ();
1195 } else if (sp > 0.0f) {
1196 transport_forwarding ();
1198 transport_stopped ();
1203 ARDOUR_UI::allow_local_only ()
1209 ARDOUR_UI::allow_mmc_only ()
1215 ARDOUR_UI::allow_mmc_and_local ()
1221 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1223 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1224 (int) adj.get_value()].c_str());
1228 ARDOUR_UI::engine_stopped ()
1230 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1231 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1232 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1237 ARDOUR_UI::engine_running ()
1239 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1240 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1241 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1245 ARDOUR_UI::engine_halted ()
1247 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1249 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1250 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1252 update_sample_rate (0);
1254 MessageDialog msg (*editor,
1256 JACK has either been shutdown or it\n\
1257 disconnected Ardour because Ardour\n\
1258 was not fast enough. You can save the\n\
1259 session and/or try to reconnect to JACK ."));
1264 ARDOUR_UI::do_engine_start ()
1270 catch (AudioEngine::PortRegistrationFailure& err) {
1272 error << _("Unable to create all required ports")
1280 error << _("Unable to start the session running")
1290 ARDOUR_UI::start_engine ()
1292 if (do_engine_start () == 0) {
1293 if (session && _session_is_new) {
1294 /* we need to retain initial visual
1295 settings for a new session
1297 session->save_state ("");
1300 /* there is too much going on, in too many threads, for us to
1301 end up with a clean session. So wait 1 second after loading,
1302 and fix it up. its ugly, but until i come across a better
1303 solution, its what we have.
1306 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1313 ARDOUR_UI::update_clocks ()
1315 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1319 ARDOUR_UI::start_clocking ()
1321 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1325 ARDOUR_UI::stop_clocking ()
1327 clock_signal_connection.disconnect ();
1331 ARDOUR_UI::toggle_clocking ()
1334 if (clock_button.get_active()) {
1343 ARDOUR_UI::_blink (void *arg)
1346 ((ARDOUR_UI *) arg)->blink ();
1353 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1357 ARDOUR_UI::start_blinking ()
1359 /* Start the blink signal. Everybody with a blinking widget
1360 uses Blink to drive the widget's state.
1363 if (blink_timeout_tag < 0) {
1365 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1370 ARDOUR_UI::stop_blinking ()
1372 if (blink_timeout_tag >= 0) {
1373 gtk_timeout_remove (blink_timeout_tag);
1374 blink_timeout_tag = -1;
1379 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1385 if (io.n_inputs() == 0) {
1390 /* XXX we're not handling multiple ports yet. */
1392 const char **connections = io.input(0)->get_connections();
1394 if (connections == 0 || connections[0] == '\0') {
1397 buf = connections[0];
1404 if (io.n_outputs() == 0) {
1409 /* XXX we're not handling multiple ports yet. */
1411 const char **connections = io.output(0)->get_connections();
1413 if (connections == 0 || connections[0] == '\0') {
1416 buf = connections[0];
1424 ARDOUR_UI::snapshot_session ()
1426 ArdourPrompter prompter (true);
1433 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1435 prompter.set_name ("Prompter");
1436 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1437 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1438 prompter.set_prompt (_("Name of New Snapshot"));
1439 prompter.set_initial_text (now);
1441 switch (prompter.run()) {
1442 case RESPONSE_ACCEPT:
1443 prompter.get_result (snapname);
1444 if (snapname.length()){
1445 save_state (snapname);
1455 ARDOUR_UI::save_state (const string & name)
1457 (void) save_state_canfail (name);
1461 ARDOUR_UI::save_state_canfail (string name)
1466 if (name.length() == 0) {
1467 name = session->snap_name();
1470 if ((ret = session->save_state (name)) != 0) {
1474 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1479 ARDOUR_UI::restore_state (string name)
1482 if (name.length() == 0) {
1483 name = session->name();
1485 session->restore_state (name);
1490 ARDOUR_UI::primary_clock_value_changed ()
1493 session->request_locate (primary_clock.current_time ());
1498 ARDOUR_UI::secondary_clock_value_changed ()
1501 session->request_locate (secondary_clock.current_time ());
1506 ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w)
1508 if (session && dstream && dstream->record_enabled()) {
1510 Session::RecordState rs;
1512 rs = session->record_status ();
1515 case Session::Disabled:
1516 case Session::Enabled:
1517 if (w->get_state() != STATE_SELECTED) {
1518 w->set_state (STATE_SELECTED);
1522 case Session::Recording:
1523 if (w->get_state() != STATE_ACTIVE) {
1524 w->set_state (STATE_ACTIVE);
1530 if (w->get_state() != STATE_NORMAL) {
1531 w->set_state (STATE_NORMAL);
1537 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1543 switch (session->record_status()) {
1544 case Session::Enabled:
1546 rec_button.set_state (1);
1548 rec_button.set_state (0);
1552 case Session::Recording:
1553 rec_button.set_state (2);
1557 rec_button.set_state (0);
1563 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1571 ARDOUR_UI::start_keyboard_prefix ()
1573 keyboard->start_prefix();
1577 ARDOUR_UI::save_template ()
1580 ArdourPrompter prompter (true);
1583 prompter.set_name (X_("Prompter"));
1584 prompter.set_prompt (_("Name for mix template:"));
1585 prompter.set_initial_text(session->name() + _("-template"));
1586 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1587 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
1589 switch (prompter.run()) {
1590 case RESPONSE_ACCEPT:
1591 prompter.get_result (name);
1593 if (name.length()) {
1594 session->save_template (name);
1604 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1606 m_new_session_dialog->show();
1607 m_new_session_dialog->set_modal(true);
1608 m_new_session_dialog->set_name(predetermined_path);
1609 m_new_session_dialog->reset_recent();
1611 int response = Gtk::RESPONSE_CANCEL;
1614 response = m_new_session_dialog->run ();
1615 if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) {
1619 } else if (response == Gtk::RESPONSE_NONE) {
1620 /* Clear was pressed */
1621 m_new_session_dialog->reset();
1623 } else if (response == Gtk::RESPONSE_YES) {
1624 /* YES == OPEN, but there's no enum for that */
1625 std::string session_name = m_new_session_dialog->session_name();
1626 std::string session_path = m_new_session_dialog->session_folder();
1627 load_session (session_path, session_name);
1630 } else if (response == Gtk::RESPONSE_OK) {
1631 if (m_new_session_dialog->get_current_page() == 1) {
1633 /* XXX this is a bit of a hack..
1634 i really want the new sesion dialog to return RESPONSE_YES
1635 if we're on page 1 (the load page)
1636 Unfortunately i can't see how atm..
1638 std::string session_name = m_new_session_dialog->session_name();
1639 std::string session_path = m_new_session_dialog->session_folder();
1640 load_session (session_path, session_name);
1644 _session_is_new = true;
1646 std::string session_name = m_new_session_dialog->session_name();
1647 std::string session_path = m_new_session_dialog->session_folder();
1650 //XXX This is needed because session constructor wants a
1651 //non-existant path. hopefully this will be fixed at some point.
1653 session_path = Glib::build_filename(session_path, session_name);
1655 std::string template_name = m_new_session_dialog->session_template_name();
1657 if (m_new_session_dialog->use_session_template()) {
1659 load_session (session_path, session_name, &template_name);
1665 Session::AutoConnectOption iconnect;
1666 Session::AutoConnectOption oconnect;
1668 if (m_new_session_dialog->create_control_bus()) {
1669 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1674 if (m_new_session_dialog->create_master_bus()) {
1675 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1680 if (m_new_session_dialog->connect_inputs()) {
1681 iconnect = Session::AutoConnectPhysical;
1683 iconnect = Session::AutoConnectOption (0);
1686 /// @todo some minor tweaks.
1688 if (m_new_session_dialog->connect_outs_to_master()) {
1689 oconnect = Session::AutoConnectMaster;
1690 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1691 oconnect = Session::AutoConnectPhysical;
1693 oconnect = Session::AutoConnectOption (0);
1696 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1697 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1699 build_session (session_path,
1707 engine->frame_rate() * 60 * 5);
1712 } while (response == Gtk::RESPONSE_NONE);
1713 m_new_session_dialog->hide();
1719 ARDOUR_UI::close_session()
1726 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1728 Session *new_session;
1730 session_loaded = false;
1731 x = unload_session ();
1739 /* if it already exists, we must have write access */
1741 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1742 MessageDialog msg (*editor, _("\
1743 You do not have write access to this session.\n\
1744 This prevents the session from being loaded."));
1750 new_session = new Session (*engine, path, snap_name, mix_template);
1755 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1759 connect_to_session (new_session);
1761 //if (engine->running()) {
1762 //mixer->show_window();
1764 session_loaded = true;
1769 ARDOUR_UI::make_session_clean ()
1772 session->set_clean ();
1781 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1782 uint32_t control_channels,
1783 uint32_t master_channels,
1784 Session::AutoConnectOption input_connect,
1785 Session::AutoConnectOption output_connect,
1788 jack_nframes_t initial_length)
1790 Session *new_session;
1793 session_loaded = false;
1794 x = unload_session ();
1801 _session_is_new = true;
1804 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1805 control_channels, master_channels, nphysin, nphysout, initial_length);
1810 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1814 connect_to_session (new_session);
1816 //if (engine->running()) {
1817 //mixer->show_window();
1819 session_loaded = true;
1827 editor->show_window ();
1831 if (session && mixer) {
1832 // mixer->show_window ();
1841 ARDOUR_UI::show_splash ()
1844 about = new About();
1850 ARDOUR_UI::hide_splash ()
1858 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1862 removed = rep.paths.size();
1865 MessageDialog msgd (*editor,
1866 _("No audio files were ready for cleanup"),
1869 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1870 msgd.set_secondary_text (_("If this seems suprising, \n\
1871 check for any existing snapshots.\n\
1872 These may still include regions that\n\
1873 require some unused files to continue to exist."));
1879 ArdourDialog results (_("ardour: cleanup"), true, false);
1881 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1882 CleanupResultsModelColumns() {
1886 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1887 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1891 CleanupResultsModelColumns results_columns;
1892 Glib::RefPtr<Gtk::ListStore> results_model;
1893 Gtk::TreeView results_display;
1895 results_model = ListStore::create (results_columns);
1896 results_display.set_model (results_model);
1897 results_display.append_column (list_title, results_columns.visible_name);
1899 results_display.set_name ("CleanupResultsList");
1900 results_display.set_headers_visible (true);
1901 results_display.set_headers_clickable (false);
1902 results_display.set_reorderable (false);
1904 Gtk::ScrolledWindow list_scroller;
1907 Gtk::HBox dhbox; // the hbox for the image and text
1908 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1909 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1911 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1913 if (rep.space < 1048576.0f) {
1915 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1917 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1921 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1923 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1927 dhbox.pack_start (*dimage, true, false, 5);
1928 dhbox.pack_start (txt, true, false, 5);
1930 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1931 TreeModel::Row row = *(results_model->append());
1932 row[results_columns.visible_name] = *i;
1933 row[results_columns.fullpath] = *i;
1936 list_scroller.add (results_display);
1937 list_scroller.set_size_request (-1, 150);
1938 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
1940 dvbox.pack_start (dhbox, true, false, 5);
1941 dvbox.pack_start (list_scroller, true, false, 5);
1942 ddhbox.pack_start (dvbox, true, false, 5);
1944 results.get_vbox()->pack_start (ddhbox, true, false, 5);
1945 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
1946 results.set_default_response (RESPONSE_CLOSE);
1947 results.set_position (Gtk::WIN_POS_MOUSE);
1948 results.show_all_children ();
1949 results.set_resizable (false);
1956 ARDOUR_UI::cleanup ()
1959 /* shouldn't happen: menu item is insensitive */
1964 MessageDialog checker (_("Are you sure you want to cleanup?"),
1966 Gtk::MESSAGE_QUESTION,
1967 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
1969 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
1970 ALL undo/redo information will be lost if you cleanup.\n\
1971 After cleanup, unused audio files will be moved to a \
1972 \"dead sounds\" location."));
1974 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
1975 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
1976 checker.set_default_response (RESPONSE_CANCEL);
1978 checker.set_name (_("CleanupDialog"));
1979 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
1980 checker.set_position (Gtk::WIN_POS_MOUSE);
1982 switch (checker.run()) {
1983 case RESPONSE_ACCEPT:
1989 Session::cleanup_report rep;
1991 editor->prepare_for_cleanup ();
1993 if (session->cleanup_sources (rep)) {
1997 display_cleanup_results (rep,
2000 The following %1 %2 not in use and \n\
2001 have been moved to:\n\
2003 Flushing the wastebasket will \n\
2004 release an additional\n\
2005 %4 %5bytes of disk space.\n"
2010 ARDOUR_UI::flush_trash ()
2013 /* shouldn't happen: menu item is insensitive */
2017 Session::cleanup_report rep;
2019 if (session->cleanup_trash_sources (rep)) {
2023 display_cleanup_results (rep,
2025 _("The following %1 %2 deleted from\n\
2027 releasing %4 %5bytes of disk space"));
2031 ARDOUR_UI::add_route ()
2039 if (add_route_dialog == 0) {
2040 add_route_dialog = new AddRouteDialog;
2041 editor->ensure_float (*add_route_dialog);
2044 if (add_route_dialog->is_visible()) {
2045 /* we're already doing this */
2049 ResponseType r = (ResponseType) add_route_dialog->run ();
2051 add_route_dialog->hide();
2054 case RESPONSE_ACCEPT:
2061 if ((count = add_route_dialog->count()) <= 0) {
2065 uint32_t input_chan = add_route_dialog->channels ();
2066 uint32_t output_chan;
2067 string name_template = add_route_dialog->name_template ();
2068 bool track = add_route_dialog->track ();
2070 Session::AutoConnectOption oac = session->get_output_auto_connect();
2072 if (oac & Session::AutoConnectMaster) {
2073 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2075 output_chan = input_chan;
2078 /* XXX do something with name template */
2082 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2084 session_add_audio_bus (input_chan, output_chan);
2088 while (Main::events_pending()) {
2095 ARDOUR_UI::mixer_settings () const
2100 node = session->instant_xml(X_("Mixer"), session->path());
2102 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2106 node = new XMLNode (X_("Mixer"));
2113 ARDOUR_UI::editor_settings () const
2118 node = session->instant_xml(X_("Editor"), session->path());
2120 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2124 node = new XMLNode (X_("Editor"));
2130 ARDOUR_UI::keyboard_settings () const
2134 node = Config->extra_xml(X_("Keyboard"));
2137 node = new XMLNode (X_("Keyboard"));
2143 ARDOUR_UI::halt_on_xrun_message ()
2145 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2147 MessageDialog msg (*editor,
2148 _("Recording was stopped because your system could not keep up."));
2153 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::AudioFileSource*>* deletion_list)
2155 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2157 for (list<AudioFileSource*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2161 delete deletion_list;
2165 ARDOUR_UI::disk_overrun_handler ()
2167 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2169 if (!have_disk_overrun_displayed) {
2170 have_disk_overrun_displayed = true;
2171 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2172 The disk system on your computer\n\
2173 was not able to keep up with Ardour.\n\
2175 Specifically, it failed to write data to disk\n\
2176 quickly enough to keep up with recording.\n"));
2178 have_disk_overrun_displayed = false;
2183 ARDOUR_UI::disk_underrun_handler ()
2185 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2187 if (!have_disk_underrun_displayed) {
2188 have_disk_underrun_displayed = true;
2189 MessageDialog msg (*editor,
2190 (_("The disk system on your computer\n\
2191 was not able to keep up with Ardour.\n\
2193 Specifically, it failed to read data from disk\n\
2194 quickly enough to keep up with playback.\n")));
2196 have_disk_underrun_displayed = false;
2201 ARDOUR_UI::disk_underrun_message_gone ()
2203 have_disk_underrun_displayed = false;
2207 ARDOUR_UI::disk_overrun_message_gone ()
2209 have_disk_underrun_displayed = false;
2213 ARDOUR_UI::pending_state_dialog ()
2215 ArdourDialog dialog ("pending state dialog");
2217 This session appears to have been in\n\
2218 middle of recording when ardour or\n\
2219 the computer was shutdown.\n\
2221 Ardour can recover any captured audio for\n\
2222 you, or it can ignore it. Please decide\n\
2223 what you would like to do.\n"));
2225 dialog.get_vbox()->pack_start (message);
2226 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2227 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2229 dialog.set_position (WIN_POS_CENTER);
2232 switch (dialog.run ()) {
2233 case RESPONSE_ACCEPT:
2241 ARDOUR_UI::disconnect_from_jack ()
2244 if( engine->disconnect_from_jack ()) {
2245 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2249 update_sample_rate (0);
2254 ARDOUR_UI::reconnect_to_jack ()
2257 if (engine->reconnect_to_jack ()) {
2258 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2262 update_sample_rate (0);
2267 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2269 engine->request_buffer_size (nframes);
2270 update_sample_rate (0);
2274 ARDOUR_UI::cmdline_new_session (string path)
2276 if (path[0] != '/') {
2277 char buf[PATH_MAX+1];
2280 getcwd (buf, sizeof (buf));
2287 new_session (false, path);
2289 _will_create_new_session_automatically = false; /* done it */
2290 return FALSE; /* don't call it again */
2294 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2296 Glib::RefPtr<Action> act;
2300 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2303 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2306 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2309 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2312 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2315 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2318 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2323 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2324 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2325 Config->set_native_file_header_format (hf);
2327 session->reset_native_file_format ();
2334 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2336 Glib::RefPtr<Action> act;
2340 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2343 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2348 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2350 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2351 Config->set_native_file_data_format (sf);
2353 session->reset_native_file_format ();
2360 ARDOUR_UI::use_config ()
2362 Glib::RefPtr<Action> act;
2364 switch (Config->get_native_file_data_format ()) {
2366 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2369 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2374 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2375 ract->set_active ();
2378 switch (Config->get_native_file_header_format ()) {
2380 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2383 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2386 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2389 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2392 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2395 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF"));
2398 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF"));
2403 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2404 ract->set_active ();