2 Copyright (C) 1999-2002 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
31 #include <gtkmm/messagedialog.h>
32 #include <gtkmm/accelmap.h>
34 #include <pbd/error.h>
35 #include <pbd/compose.h>
36 #include <pbd/basename.h>
37 #include <pbd/pathscanner.h>
38 #include <pbd/failed_constructor.h>
39 #include <gtkmm2ext/gtk_ui.h>
40 #include <gtkmm2ext/utils.h>
41 #include <gtkmm2ext/click_box.h>
42 #include <gtkmm2ext/fastmeter.h>
43 #include <gtkmm2ext/stop_signal.h>
44 #include <gtkmm2ext/popup.h>
46 #include <midi++/port.h>
47 #include <midi++/mmc.h>
49 #include <ardour/ardour.h>
50 #include <ardour/port.h>
51 #include <ardour/audioengine.h>
52 #include <ardour/playlist.h>
53 #include <ardour/utils.h>
54 #include <ardour/diskstream.h>
55 #include <ardour/filesource.h>
56 #include <ardour/recent_sessions.h>
57 #include <ardour/session_diskstream.h>
58 #include <ardour/port.h>
59 #include <ardour/audio_track.h>
62 #include "ardour_ui.h"
63 #include "public_editor.h"
64 #include "audio_clock.h"
69 #include "keyboard_target.h"
70 #include "add_route_dialog.h"
71 #include "new_session_dialog.h"
74 #include "gui_thread.h"
75 #include "color_manager.h"
79 using namespace ARDOUR;
80 using namespace Gtkmm2ext;
84 ARDOUR_UI *ARDOUR_UI::theArdourUI = 0;
86 sigc::signal<void,bool> ARDOUR_UI::Blink;
87 sigc::signal<void> ARDOUR_UI::RapidScreenUpdate;
88 sigc::signal<void> ARDOUR_UI::SuperRapidScreenUpdate;
89 sigc::signal<void,jack_nframes_t> ARDOUR_UI::Clock;
91 ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
93 : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile),
95 primary_clock (X_("TransportClockDisplay"), true, false, true),
96 secondary_clock (X_("SecondaryClockDisplay"), true, false, true),
97 preroll_clock (X_("PreRollClock"), true, true),
98 postroll_clock (X_("PostRollClock"), true, true),
102 adjuster_table (3, 3),
106 preroll_button (_("pre\nroll")),
107 postroll_button (_("post\nroll")),
111 big_clock ("BigClockDisplay", true),
115 time_master_button (_("time\nmaster")),
117 shuttle_units_button (_("% ")),
119 punch_in_button (_("punch\nin")),
120 punch_out_button (_("punch\nout")),
121 auto_return_button (_("auto\nreturn")),
122 auto_play_button (_("auto\nplay")),
123 auto_input_button (_("auto\ninput")),
124 click_button (_("click")),
125 auditioning_alert_button (_("AUDITIONING")),
126 solo_alert_button (_("SOLO")),
130 using namespace Gtk::Menu_Helpers;
136 if (theArdourUI == 0) {
140 ActionManager::init ();
144 color_manager = new ColorManager();
146 std::string color_file = ARDOUR::find_config_file("ardour.colors");
148 color_manager->load (color_file);
150 m_new_session_dialog = 0;
151 m_new_session_dialog_ref = NewSessionDialogFactory::create();
152 m_new_session_dialog_ref->get_widget_derived (NewSessionDialogFactory::top_level_widget_name(), m_new_session_dialog);
156 _session_is_new = false;
157 big_clock_window = 0;
158 session_selector_window = 0;
159 last_key_press_time = 0;
160 connection_editor = 0;
161 add_route_dialog = 0;
166 open_session_selector = 0;
167 have_configure_timeout = false;
168 have_disk_overrun_displayed = false;
169 have_disk_underrun_displayed = false;
170 _will_create_new_session_automatically = false;
171 session_loaded = false;
172 last_speed_displayed = -1.0f;
174 last_configure_time.tv_sec = 0;
175 last_configure_time.tv_usec = 0;
177 shuttle_grabbed = false;
179 shuttle_max_speed = 8.0f;
181 set_shuttle_units (Percentage);
182 set_shuttle_behaviour (Sprung);
184 shuttle_style_menu = 0;
185 shuttle_unit_menu = 0;
187 gettimeofday (&last_peak_grab, 0);
188 gettimeofday (&last_shuttle_request, 0);
190 ARDOUR::DiskStream::CannotRecordNoInput.connect (mem_fun(*this, &ARDOUR_UI::cannot_record_no_input));
191 ARDOUR::DiskStream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
192 ARDOUR::DiskStream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
193 ARDOUR::DiskStream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
195 /* handle pending state with a dialog */
197 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
199 /* have to wait for AudioEngine and Configuration before proceeding */
203 ARDOUR_UI::cannot_record_no_input (DiskStream* ds)
205 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::cannot_record_no_input), ds));
207 string msg = string_compose (_("\
208 You cannot record-enable\n\
210 because it has no input connections.\n\
211 You would be wasting space recording silence."),
214 MessageDialog message (*editor, msg);
219 ARDOUR_UI::set_engine (AudioEngine& e)
223 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
224 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
225 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
226 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
230 keyboard = new Keyboard;
234 meter_path = ARDOUR::find_data_file("v_meter_strip.xpm", "pixmaps");
235 if (meter_path.empty()) {
236 error << _("no vertical meter strip image found") << endmsg;
239 FastMeter::set_vertical_xpm (meter_path);
241 meter_path = ARDOUR::find_data_file("h_meter_strip.xpm", "pixmaps");
242 if (meter_path.empty()) {
243 error << _("no horizontal meter strip image found") << endmsg;
246 FastMeter::set_horizontal_xpm (meter_path);
248 if (setup_windows ()) {
249 throw failed_constructor ();
252 if (GTK_ARDOUR::show_key_actions) {
253 vector<string> names;
254 vector<string> paths;
256 vector<AccelKey> bindings;
258 ActionManager::get_all_actions (names, paths, keys, bindings);
260 vector<string>::iterator n;
261 vector<string>::iterator k;
262 for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) {
263 cerr << "Action: " << (*n) << " bound to " << (*k) << endl;
269 /* start with timecode, metering enabled
272 blink_timeout_tag = -1;
274 /* the global configuration object is now valid */
278 /* this being a GUI and all, we want peakfiles */
280 FileSource::set_build_peakfiles (true);
281 FileSource::set_build_missing_peakfiles (true);
283 if (Source::start_peak_thread ()) {
284 throw failed_constructor();
287 /* start the time-of-day-clock */
289 update_wall_clock ();
290 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000);
292 update_disk_space ();
294 update_sample_rate (engine->frame_rate());
296 starting.connect (mem_fun(*this, &ARDOUR_UI::startup));
297 stopping.connect (mem_fun(*this, &ARDOUR_UI::shutdown));
300 ARDOUR_UI::~ARDOUR_UI ()
302 save_ardour_state ();
316 if (add_route_dialog) {
317 delete add_route_dialog;
320 Source::stop_peak_thread ();
324 ARDOUR_UI::configure_timeout ()
329 if (last_configure_time.tv_sec == 0 && last_configure_time.tv_usec == 0) {
330 /* no configure events yet */
334 gettimeofday (&now, 0);
335 timersub (&now, &last_configure_time, &diff);
337 /* force a gap of 0.5 seconds since the last configure event
340 if (diff.tv_sec == 0 && diff.tv_usec < 500000) {
343 have_configure_timeout = false;
344 save_ardour_state ();
350 ARDOUR_UI::configure_handler (GdkEventConfigure* conf)
352 if (have_configure_timeout) {
353 gettimeofday (&last_configure_time, 0);
355 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::configure_timeout), 100);
356 have_configure_timeout = true;
363 ARDOUR_UI::save_ardour_state ()
365 if (!keyboard || !mixer || !editor) {
369 /* XXX this is all a bit dubious. add_extra_xml() uses
370 a different lifetime model from add_instant_xml().
373 XMLNode* node = new XMLNode (keyboard->get_state());
374 Config->add_extra_xml (*node);
375 Config->save_state();
377 XMLNode& enode (static_cast<Stateful*>(editor)->get_state());
378 XMLNode& mnode (mixer->get_state());
381 session->add_instant_xml(enode, session->path());
382 session->add_instant_xml(mnode, session->path());
384 Config->add_instant_xml(enode, get_user_ardour_path());
385 Config->add_instant_xml(mnode, get_user_ardour_path());
390 AccelMap::save ("ardour.saved_bindings");
394 ARDOUR_UI::startup ()
396 /* Once the UI is up and running, start the audio engine. Doing
397 this before the UI is up and running can cause problems
398 when not running with SCHED_FIFO, because the amount of
399 CPU and disk work needed to get the UI started can interfere
400 with the scheduling of the audio thread.
403 Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
409 if (session && session->dirty()) {
410 switch (ask_about_saving_session(_("quit"))) {
415 /* use the default name */
416 if (save_state_canfail ("")) {
417 /* failed - don't quit */
418 MessageDialog msg (*editor,
420 Ardour was unable to save your session.\n\n\
421 If you still wish to quit, please use the\n\n\
422 \"Just quit\" option."));
436 ARDOUR_UI::ask_about_saving_session (const string & what)
438 ArdourDialog window (_("ardour: save session?"));
439 Gtk::Label prompt_label;
442 msg = string_compose(_("Save and %1"), what);
443 window.add_button (msg, RESPONSE_ACCEPT);
444 msg = string_compose(_("Just %1"), what);
445 window.add_button (msg, RESPONSE_APPLY);
446 msg = string_compose(_("Don't %1"), what);
447 window.add_button (msg, RESPONSE_REJECT);
449 Gtk::Button noquit_button (msg);
450 noquit_button.set_name ("EditorGTKButton");
455 if (session->snap_name() == session->name()) {
458 type = _("snapshot");
460 prompt = string_compose(_("The %1\n\"%2\"\nhas not been saved.\n\nAny changes made this time\nwill be lost unless you save it.\n\nWhat do you want to do?"),
461 type, session->snap_name());
463 prompt_label.set_text (prompt);
464 prompt_label.set_alignment (0.5, 0.5);
465 prompt_label.set_name (X_("PrompterLabel"));
467 window.get_vbox()->pack_start (prompt_label);
469 window.set_name (_("Prompter"));
470 window.set_position (Gtk::WIN_POS_MOUSE);
471 window.set_modal (true);
474 save_the_session = 0;
476 editor->ensure_float (window);
478 ResponseType r = (ResponseType) window.run();
483 case RESPONSE_ACCEPT: // save and get out of here
485 case RESPONSE_APPLY: // get out of here
495 ARDOUR_UI::every_second ()
498 update_buffer_load ();
499 update_disk_space ();
500 // update_disk_rate ();
505 ARDOUR_UI::every_point_one_seconds ()
510 /* do not attempt to grab peak power more than once per cycle.
513 gettimeofday (&now, 0);
514 timersub (&now, &last_peak_grab, &diff);
516 if ((diff.tv_usec + (diff.tv_sec * 1000000)) >= engine->usecs_per_cycle()) {
517 IO::GrabPeakPower(); /* EMIT_SIGNAL */
518 last_peak_grab = now;
521 update_speed_display ();
522 RapidScreenUpdate(); /* EMIT_SIGNAL */
527 ARDOUR_UI::every_point_zero_one_seconds ()
529 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
534 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
538 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
540 if (!engine->connected()) {
542 snprintf (buf, sizeof (buf), _("disconnected"));
546 jack_nframes_t rate = engine->frame_rate();
548 if (fmod (rate, 1000.0) != 0.0) {
549 snprintf (buf, sizeof (buf), _("SR: %.1f kHz / %4.1f msecs"),
550 (float) rate/1000.0f,
551 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
553 snprintf (buf, sizeof (buf), _("SR: %u kHz / %4.1f msecs"),
555 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
559 sample_rate_label.set_text (buf);
563 ARDOUR_UI::update_cpu_load ()
566 snprintf (buf, sizeof (buf), _("DSP Load: %.1f%%"), engine->get_cpu_load());
567 cpu_load_label.set_text (buf);
571 ARDOUR_UI::update_disk_rate ()
576 snprintf (buf, sizeof (buf), _("Disk r:%5.1f w:%5.1f MB/s"),
577 session->read_data_rate()/1048576.0f, session->write_data_rate()/1048576.0f);
578 disk_rate_label.set_text (buf);
580 disk_rate_label.set_text ("");
585 ARDOUR_UI::update_buffer_load ()
590 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
591 session->playback_load(), session->capture_load());
592 buffer_load_label.set_text (buf);
594 buffer_load_label.set_text ("");
599 ARDOUR_UI::count_recenabled_diskstreams (DiskStream& ds)
601 if (ds.record_enabled()) {
602 rec_enabled_diskstreams++;
607 ARDOUR_UI::update_disk_space()
613 jack_nframes_t frames = session->available_capture_duration();
616 if (frames == max_frames) {
617 strcpy (buf, _("space: 24hrs+"));
622 jack_nframes_t fr = session->frame_rate();
624 if (session->actively_recording()){
626 rec_enabled_diskstreams = 0;
627 session->foreach_diskstream (this, &ARDOUR_UI::count_recenabled_diskstreams);
629 if (rec_enabled_diskstreams) {
630 frames /= rec_enabled_diskstreams;
635 /* hmmm. shall we divide by the route count? or the diskstream count?
636 or what? for now, do nothing ...
641 hrs = frames / (fr * 3600);
642 frames -= hrs * fr * 3600;
643 mins = frames / (fr * 60);
644 frames -= mins * fr * 60;
647 snprintf (buf, sizeof(buf), _("space: %02dh:%02dm:%02ds"), hrs, mins, secs);
650 disk_space_label.set_text (buf);
654 ARDOUR_UI::update_wall_clock ()
661 tm_now = localtime (&now);
663 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
664 wall_clock_label.set_text (buf);
669 ARDOUR_UI::control_methods_adjusted ()
674 which_method = (int) online_control_button->adjustment.get_value();
675 switch (which_method) {
677 allow_mmc_and_local ();
686 fatal << _("programming error: impossible control method") << endmsg;
692 ARDOUR_UI::mmc_device_id_adjusted ()
697 int dev_id = (int) mmc_id_button->adjustment.get_value();
698 mmc->set_device_id (dev_id);
704 ARDOUR_UI::session_menu (GdkEventButton *ev)
706 session_popup_menu->popup (0, 0);
711 ARDOUR_UI::redisplay_recent_sessions ()
713 vector<string *> *sessions;
714 vector<string *>::iterator i;
715 RecentSessionsSorter cmp;
717 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
718 recent_session_model->clear ();
721 ARDOUR::read_recent_sessions (rs);
724 recent_session_display.set_model (recent_session_model);
728 /* sort them alphabetically */
729 sort (rs.begin(), rs.end(), cmp);
730 sessions = new vector<string*>;
732 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
733 sessions->push_back (new string ((*i).second));
736 for (i = sessions->begin(); i != sessions->end(); ++i) {
738 vector<string*>* states;
739 vector<const gchar*> item;
740 string fullpath = *(*i);
742 /* remove any trailing / */
744 if (fullpath[fullpath.length()-1] == '/') {
745 fullpath = fullpath.substr (0, fullpath.length()-1);
748 /* now get available states for this session */
750 if ((states = Session::possible_states (fullpath)) == 0) {
755 TreeModel::Row row = *(recent_session_model->append());
757 row[recent_session_columns.visible_name] = PBD::basename (fullpath);
758 row[recent_session_columns.fullpath] = fullpath;
760 if (states->size() > 1) {
762 /* add the children */
764 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
766 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
768 child_row[recent_session_columns.visible_name] = **i2;
769 child_row[recent_session_columns.fullpath] = fullpath;
778 recent_session_display.set_model (recent_session_model);
783 ARDOUR_UI::build_session_selector ()
785 session_selector_window = new ArdourDialog ("session selector");
787 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
789 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
790 session_selector_window->add_button (Stock::OK, RESPONSE_ACCEPT);
792 recent_session_model = TreeStore::create (recent_session_columns);
793 recent_session_display.set_model (recent_session_model);
794 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
795 recent_session_display.set_headers_visible (false);
796 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
798 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
800 scroller->add (recent_session_display);
801 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
803 session_selector_window->set_name ("SessionSelectorWindow");
804 session_selector_window->set_size_request (200, 400);
805 session_selector_window->get_vbox()->pack_start (*scroller);
806 session_selector_window->show_all_children();
810 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
812 session_selector_window->response (RESPONSE_ACCEPT);
816 ARDOUR_UI::open_recent_session ()
818 /* popup selector window */
820 if (session_selector_window == 0) {
821 build_session_selector ();
824 redisplay_recent_sessions ();
826 ResponseType r = (ResponseType) session_selector_window->run ();
828 session_selector_window->hide();
831 case RESPONSE_ACCEPT:
837 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
839 if (i == recent_session_model->children().end()) {
843 Glib::ustring path = (*i)[recent_session_columns.fullpath];
844 Glib::ustring state = (*i)[recent_session_columns.visible_name];
846 _session_is_new = false;
848 load_session (path, state);
852 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
856 if (stat (info.filename.c_str(), &statbuf) != 0) {
860 if (!S_ISDIR(statbuf.st_mode)) {
864 string session_file = info.filename;
866 session_file += PBD::basename (info.filename);
867 session_file += ".ardour";
869 if (stat (session_file.c_str(), &statbuf) != 0) {
873 return S_ISREG (statbuf.st_mode);
877 ARDOUR_UI::open_session ()
879 /* popup selector window */
881 if (open_session_selector == 0) {
883 /* ardour sessions are folders */
885 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
886 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
887 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
889 FileFilter session_filter;
890 session_filter.add_pattern ("*.ardour");
891 session_filter.set_name (_("Ardour sessions"));
892 open_session_selector->add_filter (session_filter);
893 open_session_selector->set_filter (session_filter);
896 int response = open_session_selector->run();
897 open_session_selector->hide ();
900 case RESPONSE_ACCEPT:
903 open_session_selector->hide();
907 open_session_selector->hide();
908 string session_path = open_session_selector->get_filename();
912 if (session_path.length() > 0) {
913 if (Session::find_session (session_path, path, name, isnew) == 0) {
914 _session_is_new = isnew;
915 load_session (path, name);
922 ARDOUR_UI::session_add_midi_track ()
924 cerr << _("Patience is a virtue.\n");
928 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
933 warning << _("You cannot add a track without a session already loaded.") << endmsg;
939 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
940 error << _("could not create new audio track") << endmsg;
943 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
944 error << _("could not create new audio bus") << endmsg;
949 if (need_control_room_outs) {
955 route->set_stereo_control_outs (control_lr_channels);
956 route->control_outs()->set_stereo_pan (pans, this);
958 #endif /* CONTROLOUTS */
962 MessageDialog msg (*editor,
963 _("There are insufficient JACK ports available\n\
964 to create a new track or bus.\n\
965 You should save Ardour, exit and\n\
966 restart JACK with more ports."));
972 ARDOUR_UI::diskstream_added (DiskStream* ds)
977 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
979 jack_nframes_t _preroll;
982 _preroll = session->convert_to_frames_at (new_position, session->preroll);
984 if (new_position > _preroll) {
985 new_position -= _preroll;
990 session->request_locate (new_position);
995 ARDOUR_UI::transport_goto_start ()
998 session->goto_start();
1001 /* force displayed area in editor to start no matter
1002 what "follow playhead" setting is.
1006 editor->reposition_x_origin (session->current_start_frame());
1012 ARDOUR_UI::transport_goto_zero ()
1015 session->request_locate (0);
1018 /* force displayed area in editor to start no matter
1019 what "follow playhead" setting is.
1023 editor->reposition_x_origin (0);
1029 ARDOUR_UI::transport_goto_end ()
1032 jack_nframes_t frame = session->current_end_frame();
1033 session->request_locate (frame);
1035 /* force displayed area in editor to start no matter
1036 what "follow playhead" setting is.
1040 editor->reposition_x_origin (frame);
1046 ARDOUR_UI::transport_stop ()
1052 if (session->is_auditioning()) {
1053 session->cancel_audition ();
1057 if (session->get_auto_loop()) {
1058 session->request_auto_loop (false);
1061 session->request_stop ();
1065 ARDOUR_UI::transport_stop_and_forget_capture ()
1068 session->request_stop (true);
1073 ARDOUR_UI::remove_last_capture()
1076 editor->remove_last_capture();
1081 ARDOUR_UI::transport_record ()
1084 switch (session->record_status()) {
1085 case Session::Disabled:
1086 if (session->ntracks() == 0) {
1087 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1088 MessageDialog msg (*editor, txt);
1092 session->maybe_enable_record ();
1094 case Session::Recording:
1095 case Session::Enabled:
1096 session->disable_record (true);
1102 ARDOUR_UI::transport_roll ()
1110 rolling = session->transport_rolling ();
1112 if (session->get_auto_loop()) {
1113 session->request_auto_loop (false);
1114 auto_loop_button.set_active (false);
1115 roll_button.set_active (true);
1116 } else if (session->get_play_range ()) {
1117 session->request_play_range (false);
1118 play_selection_button.set_active (false);
1119 } else if (rolling) {
1120 session->request_locate (session->last_transport_start(), true);
1123 session->request_transport_speed (1.0f);
1127 ARDOUR_UI::transport_loop()
1130 if (session->get_auto_loop()) {
1131 if (session->transport_rolling()) {
1132 Location * looploc = session->locations()->auto_loop_location();
1134 session->request_locate (looploc->start(), true);
1139 session->request_auto_loop (true);
1145 ARDOUR_UI::transport_play_selection ()
1151 if (!session->get_play_range()) {
1152 session->request_stop ();
1155 editor->play_selection ();
1159 ARDOUR_UI::transport_rewind (int option)
1161 float current_transport_speed;
1164 current_transport_speed = session->transport_speed();
1166 if (current_transport_speed >= 0.0f) {
1169 session->request_transport_speed (-1.0f);
1172 session->request_transport_speed (-4.0f);
1175 session->request_transport_speed (-0.5f);
1180 session->request_transport_speed (current_transport_speed * 1.5f);
1186 ARDOUR_UI::transport_forward (int option)
1188 float current_transport_speed;
1191 current_transport_speed = session->transport_speed();
1193 if (current_transport_speed <= 0.0f) {
1196 session->request_transport_speed (1.0f);
1199 session->request_transport_speed (4.0f);
1202 session->request_transport_speed (0.5f);
1207 session->request_transport_speed (current_transport_speed * 1.5f);
1213 ARDOUR_UI::toggle_monitor_enable (guint32 dstream)
1221 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1222 Port *port = ds->io()->input (0);
1223 port->request_monitor_input (!port->monitoring_input());
1228 ARDOUR_UI::toggle_record_enable (guint32 dstream)
1236 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1237 ds->set_record_enabled (!ds->record_enabled(), this);
1242 ARDOUR_UI::queue_transport_change ()
1244 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1248 ARDOUR_UI::map_transport_state ()
1250 float sp = session->transport_speed();
1253 transport_rolling ();
1254 } else if (sp < 0.0f) {
1255 transport_rewinding ();
1256 } else if (sp > 0.0f) {
1257 transport_forwarding ();
1259 transport_stopped ();
1264 ARDOUR_UI::allow_local_only ()
1270 ARDOUR_UI::allow_mmc_only ()
1276 ARDOUR_UI::allow_mmc_and_local ()
1282 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1284 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1285 (int) adj.get_value()].c_str());
1289 ARDOUR_UI::engine_stopped ()
1291 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1292 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1293 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1298 ARDOUR_UI::engine_running ()
1300 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1301 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1302 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1306 ARDOUR_UI::engine_halted ()
1308 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1310 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1311 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1313 update_sample_rate (0);
1315 MessageDialog msg (*editor,
1317 JACK has either been shutdown or it\n\
1318 disconnected Ardour because Ardour\n\
1319 was not fast enough. You can save the\n\
1320 session and/or try to reconnect to JACK ."));
1325 ARDOUR_UI::do_engine_start ()
1331 catch (AudioEngine::PortRegistrationFailure& err) {
1333 error << _("Unable to create all required ports")
1341 error << _("Unable to start the session running")
1351 ARDOUR_UI::start_engine ()
1353 if (do_engine_start () == 0) {
1354 if (session && _session_is_new) {
1355 /* we need to retain initial visual
1356 settings for a new session
1358 session->save_state ("");
1361 /* there is too much going on, in too many threads, for us to
1362 end up with a clean session. So wait 1 second after loading,
1363 and fix it up. its ugly, but until i come across a better
1364 solution, its what we have.
1367 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1374 ARDOUR_UI::update_clocks ()
1376 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1380 ARDOUR_UI::start_clocking ()
1382 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1386 ARDOUR_UI::stop_clocking ()
1388 clock_signal_connection.disconnect ();
1392 ARDOUR_UI::toggle_clocking ()
1395 if (clock_button.get_active()) {
1404 ARDOUR_UI::_blink (void *arg)
1407 ((ARDOUR_UI *) arg)->blink ();
1414 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1418 ARDOUR_UI::start_blinking ()
1420 /* Start the blink signal. Everybody with a blinking widget
1421 uses Blink to drive the widget's state.
1424 if (blink_timeout_tag < 0) {
1426 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1431 ARDOUR_UI::stop_blinking ()
1433 if (blink_timeout_tag >= 0) {
1434 gtk_timeout_remove (blink_timeout_tag);
1435 blink_timeout_tag = -1;
1441 ARDOUR_UI::add_diskstream_to_menu (DiskStream& dstream)
1443 using namespace Gtk;
1444 using namespace Menu_Helpers;
1446 if (dstream.hidden()) {
1450 MenuList& items = diskstream_menu->items();
1451 items.push_back (MenuElem (dstream.name(), bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), (gint32) dstream.id())));
1455 ARDOUR_UI::diskstream_selected (gint32 id)
1457 selected_dstream = id;
1462 ARDOUR_UI::select_diskstream (GdkEventButton *ev)
1464 using namespace Gtk;
1465 using namespace Menu_Helpers;
1471 diskstream_menu = new Menu();
1472 diskstream_menu->set_name ("ArdourContextMenu");
1473 using namespace Gtk;
1474 using namespace Menu_Helpers;
1476 MenuList& items = diskstream_menu->items();
1477 items.push_back (MenuElem (_("No Stream"), (bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), -1))));
1479 session->foreach_diskstream (this, &ARDOUR_UI::add_diskstream_to_menu);
1482 diskstream_menu->popup (ev->button, ev->time);
1484 diskstream_menu->popup (0, 0);
1487 selected_dstream = -1;
1491 delete diskstream_menu;
1493 return selected_dstream;
1497 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1503 if (io.n_inputs() == 0) {
1508 /* XXX we're not handling multiple ports yet. */
1510 const char **connections = io.input(0)->get_connections();
1512 if (connections == 0 || connections[0] == '\0') {
1515 buf = connections[0];
1522 if (io.n_outputs() == 0) {
1527 /* XXX we're not handling multiple ports yet. */
1529 const char **connections = io.output(0)->get_connections();
1531 if (connections == 0 || connections[0] == '\0') {
1534 buf = connections[0];
1542 ARDOUR_UI::snapshot_session ()
1544 ArdourPrompter prompter (true);
1551 now = now.substr (0, now.length() - 1);
1553 prompter.set_name ("Prompter");
1554 prompter.set_prompt (_("Name for snapshot"));
1555 prompter.set_initial_text (now);
1557 switch (prompter.run()) {
1558 case RESPONSE_ACCEPT:
1559 prompter.get_result (snapname);
1560 if (snapname.length()){
1561 save_state (snapname);
1571 ARDOUR_UI::save_state (const string & name)
1573 (void) save_state_canfail (name);
1577 ARDOUR_UI::save_state_canfail (string name)
1582 if (name.length() == 0) {
1583 name = session->snap_name();
1586 if ((ret = session->save_state (name)) != 0) {
1590 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1595 ARDOUR_UI::restore_state (string name)
1598 if (name.length() == 0) {
1599 name = session->name();
1601 session->restore_state (name);
1606 ARDOUR_UI::primary_clock_value_changed ()
1609 session->request_locate (primary_clock.current_time ());
1614 ARDOUR_UI::secondary_clock_value_changed ()
1617 session->request_locate (secondary_clock.current_time ());
1622 ARDOUR_UI::rec_enable_button_blink (bool onoff, DiskStream *dstream, Widget *w)
1624 if (session && dstream && dstream->record_enabled()) {
1626 Session::RecordState rs;
1628 rs = session->record_status ();
1631 case Session::Disabled:
1632 case Session::Enabled:
1633 if (w->get_state() != STATE_SELECTED) {
1634 w->set_state (STATE_SELECTED);
1638 case Session::Recording:
1639 if (w->get_state() != STATE_ACTIVE) {
1640 w->set_state (STATE_ACTIVE);
1646 if (w->get_state() != STATE_NORMAL) {
1647 w->set_state (STATE_NORMAL);
1653 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1659 switch (session->record_status()) {
1660 case Session::Enabled:
1662 rec_button.set_state (1);
1664 rec_button.set_state (0);
1668 case Session::Recording:
1669 rec_button.set_state (2);
1673 rec_button.set_state (0);
1679 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1687 ARDOUR_UI::start_keyboard_prefix ()
1689 keyboard->start_prefix();
1693 ARDOUR_UI::save_template ()
1696 ArdourPrompter prompter (true);
1699 prompter.set_name (X_("Prompter"));
1700 prompter.set_prompt (_("Name for mix template:"));
1701 prompter.set_initial_text(session->name() + _("-template"));
1703 switch (prompter.run()) {
1704 case RESPONSE_ACCEPT:
1705 prompter.get_result (name);
1707 if (name.length()) {
1708 session->save_template (name);
1718 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1720 m_new_session_dialog->show_all();
1721 m_new_session_dialog->set_transient_for(*editor);
1722 m_new_session_dialog->set_name(predetermined_path);
1724 int response = Gtk::RESPONSE_CANCEL;
1727 response = m_new_session_dialog->run ();
1729 if(response == Gtk::RESPONSE_OK) {
1731 _session_is_new = true;
1733 std::string session_name = m_new_session_dialog->session_name();
1734 std::string session_path = m_new_session_dialog->session_folder();
1737 XXX This is needed because session constructor wants a
1738 non-existant path. hopefully this will be fixed at some point.
1740 session_path = Glib::build_filename(session_path, session_name);
1742 std::string template_name = m_new_session_dialog->session_template_name();
1744 if (m_new_session_dialog->use_session_template()) {
1746 load_session (session_path, session_name, &template_name);
1752 Session::AutoConnectOption iconnect;
1753 Session::AutoConnectOption oconnect;
1755 if (m_new_session_dialog->create_control_bus()) {
1756 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1761 if (m_new_session_dialog->create_master_bus()) {
1762 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1767 if (m_new_session_dialog->connect_inputs()) {
1768 iconnect = Session::AutoConnectPhysical;
1770 iconnect = Session::AutoConnectOption (0);
1773 /// @todo some minor tweaks.
1775 if (m_new_session_dialog->connect_outs_to_master()) {
1776 oconnect = Session::AutoConnectMaster;
1777 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1778 oconnect = Session::AutoConnectPhysical;
1780 oconnect = Session::AutoConnectOption (0);
1783 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1784 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1786 build_session (session_path,
1794 engine->frame_rate() * 60 * 5);
1798 } while(response == Gtk::RESPONSE_HELP);
1799 m_new_session_dialog->hide_all();
1803 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1805 Session *new_session;
1807 session_loaded = false;
1808 x = unload_session ();
1816 /* if it already exists, we must have write access */
1818 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1819 MessageDialog msg (*editor, _("\
1820 You do not have write access to this session.\n\
1821 This prevents the session from being loaded."));
1827 new_session = new Session (*engine, path, snap_name, mix_template);
1832 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1836 connect_to_session (new_session);
1838 //if (engine->running()) {
1839 //mixer->show_window();
1841 session_loaded = true;
1846 ARDOUR_UI::make_session_clean ()
1849 session->set_clean ();
1856 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1857 uint32_t control_channels,
1858 uint32_t master_channels,
1859 Session::AutoConnectOption input_connect,
1860 Session::AutoConnectOption output_connect,
1863 jack_nframes_t initial_length)
1865 Session *new_session;
1868 session_loaded = false;
1869 x = unload_session ();
1876 _session_is_new = true;
1879 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1880 control_channels, master_channels, nphysin, nphysout, initial_length);
1885 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1889 connect_to_session (new_session);
1891 //if (engine->running()) {
1892 //mixer->show_window();
1894 session_loaded = true;
1902 editor->show_window ();
1906 if (session && mixer) {
1907 // mixer->show_window ();
1916 ARDOUR_UI::show_splash ()
1919 about = new About();
1925 ARDOUR_UI::hide_splash ()
1933 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1937 removed = rep.paths.size();
1940 MessageDialog msg (*editor, X_("cleanupresults"),
1942 No audio files were ready for cleanup\n\n\
1943 If this seems suprising, check for any existing\n\
1944 snapshots. These may still include regions that\n\
1945 require some unused files to continue to exist."));
1950 ArdourDialog results (_("ardour: cleanup"), true);
1952 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1953 CleanupResultsModelColumns() {
1957 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1958 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1962 Glib::RefPtr<Gtk::ListStore> results_model;
1963 CleanupResultsModelColumns results_columns;
1964 Gtk::TreeView results_display;
1966 results_model = ListStore::create (results_columns);
1967 results_display.set_model (results_model);
1968 results_display.append_column (list_title, results_columns.visible_name);
1969 results_display.set_headers_visible (true);
1971 Gtk::ScrolledWindow list_scroller;
1974 if (rep.space < 1048576.0f) {
1976 txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1024.0f, "kilo"));
1978 txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1024.0f, "kilo"));
1982 txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1048576.0f, "mega"));
1984 txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1048576.0f, "mega"));
1988 results.get_vbox()->pack_start (txt, false, false);
1990 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1991 TreeModel::Row row = *(results_model->append());
1992 row[results_columns.visible_name] = *i;
1993 row[results_columns.fullpath] = *i;
1996 list_scroller.add (results_display);
1997 list_scroller.set_size_request (-1, 250);
1998 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
2000 results.get_vbox()->pack_start (list_scroller, true, true);
2001 results.add_button (Stock::OK, RESPONSE_ACCEPT);
2002 results.set_position (Gtk::WIN_POS_MOUSE);
2008 ARDOUR_UI::cleanup ()
2011 /* shouldn't happen: menu item is insensitive */
2015 ArdourDialog checker (_("ardour cleanup"));
2016 Gtk::Label label (_("\
2017 Cleanup is a destructive operation.\n\
2018 ALL undo/redo information will be lost if you cleanup.\n\
2019 Unused audio files will be moved to a \"dead sounds\" location."));
2021 checker.get_vbox()->pack_start (label, false, false);
2022 checker.add_button (Stock::OK, RESPONSE_ACCEPT);
2023 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2025 checker.set_name (_("CleanupDialog"));
2026 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2027 checker.set_position (Gtk::WIN_POS_MOUSE);
2029 switch (checker.run()) {
2030 case RESPONSE_ACCEPT:
2036 Session::cleanup_report rep;
2038 editor->prepare_for_cleanup ();
2040 if (session->cleanup_sources (rep)) {
2044 display_cleanup_results (rep,
2047 The following %1 %2 were not in use.\n\
2048 The next time you flush the wastebasket\n\
2049 it will release an additional %3 %4bytes\n\
2055 ARDOUR_UI::flush_trash ()
2058 /* shouldn't happen: menu item is insensitive */
2062 Session::cleanup_report rep;
2064 if (session->cleanup_trash_sources (rep)) {
2068 display_cleanup_results (rep,
2070 _("The following %1 file%2 were deleted, releasing %3 %4bytes of disk space"));
2074 ARDOUR_UI::add_route ()
2082 if (add_route_dialog == 0) {
2083 add_route_dialog = new AddRouteDialog;
2084 editor->ensure_float (*add_route_dialog);
2087 if (add_route_dialog->is_visible()) {
2088 /* we're already doing this */
2092 ResponseType r = (ResponseType) add_route_dialog->run ();
2094 add_route_dialog->hide();
2097 case RESPONSE_ACCEPT:
2104 if ((count = add_route_dialog->count()) <= 0) {
2108 uint32_t input_chan = add_route_dialog->channels ();
2109 uint32_t output_chan;
2110 string name_template = add_route_dialog->name_template ();
2111 bool track = add_route_dialog->track ();
2113 Session::AutoConnectOption oac = session->get_output_auto_connect();
2115 if (oac & Session::AutoConnectMaster) {
2116 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2118 output_chan = input_chan;
2121 /* XXX do something with name template */
2125 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2127 session_add_audio_bus (input_chan, output_chan);
2131 while (Main::events_pending()) {
2138 ARDOUR_UI::mixer_settings () const
2143 node = session->instant_xml(X_("Mixer"), session->path());
2145 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2149 node = new XMLNode (X_("Mixer"));
2156 ARDOUR_UI::editor_settings () const
2161 node = session->instant_xml(X_("Editor"), session->path());
2163 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2167 node = new XMLNode (X_("Editor"));
2173 ARDOUR_UI::keyboard_settings () const
2177 node = Config->extra_xml(X_("Keyboard"));
2180 node = new XMLNode (X_("Keyboard"));
2186 ARDOUR_UI::halt_on_xrun_message ()
2188 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2190 MessageDialog msg (*editor,
2191 _("Recording was stopped because your system could not keep up."));
2196 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::Source*>* deletion_list)
2198 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2200 for (list<Source*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2204 delete deletion_list;
2208 ARDOUR_UI::disk_overrun_handler ()
2210 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2212 if (!have_disk_overrun_displayed) {
2213 have_disk_overrun_displayed = true;
2214 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2215 The disk system on your computer\n\
2216 was not able to keep up with Ardour.\n\
2218 Specifically, it failed to write data to disk\n\
2219 quickly enough to keep up with recording.\n"));
2221 have_disk_overrun_displayed = false;
2226 ARDOUR_UI::disk_underrun_handler ()
2228 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2230 if (!have_disk_underrun_displayed) {
2231 have_disk_underrun_displayed = true;
2232 MessageDialog msg (*editor,
2233 (_("The disk system on your computer\n\
2234 was not able to keep up with Ardour.\n\
2236 Specifically, it failed to read data from disk\n\
2237 quickly enough to keep up with playback.\n")));
2239 have_disk_underrun_displayed = false;
2244 ARDOUR_UI::disk_underrun_message_gone ()
2246 have_disk_underrun_displayed = false;
2250 ARDOUR_UI::disk_overrun_message_gone ()
2252 have_disk_underrun_displayed = false;
2256 ARDOUR_UI::pending_state_dialog ()
2258 ArdourDialog dialog ("pending state dialog");
2260 This session appears to have been in\n\
2261 middle of recording when ardour or\n\
2262 the computer was shutdown.\n\
2264 Ardour can recover any captured audio for\n\
2265 you, or it can ignore it. Please decide\n\
2266 what you would like to do.\n"));
2268 dialog.get_vbox()->pack_start (message);
2269 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2270 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2272 dialog.set_position (WIN_POS_CENTER);
2275 switch (dialog.run ()) {
2276 case RESPONSE_ACCEPT:
2284 ARDOUR_UI::disconnect_from_jack ()
2287 if( engine->disconnect_from_jack ()) {
2288 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2292 update_sample_rate (0);
2297 ARDOUR_UI::reconnect_to_jack ()
2300 if (engine->reconnect_to_jack ()) {
2301 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2305 update_sample_rate (0);
2310 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2312 engine->request_buffer_size (nframes);
2313 update_sample_rate (0);
2317 ARDOUR_UI::cmdline_new_session (string path)
2319 if (path[0] != '/') {
2320 char buf[PATH_MAX+1];
2323 getcwd (buf, sizeof (buf));
2330 new_session (false, path);
2332 _will_create_new_session_automatically = false; /* done it */
2333 return FALSE; /* don't call it again */
2337 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2339 Glib::RefPtr<Action> act;
2343 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2346 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2349 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2352 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2355 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2360 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2361 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2362 Config->set_native_file_header_format (hf);
2364 session->reset_native_file_format ();
2371 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2373 Glib::RefPtr<Action> act;
2377 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2380 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2385 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2387 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2388 Config->set_native_file_data_format (sf);
2390 session->reset_native_file_format ();
2397 ARDOUR_UI::use_config ()
2399 Glib::RefPtr<Action> act;
2401 switch (Config->get_native_file_data_format ()) {
2403 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2406 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2411 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2412 ract->set_active ();
2415 switch (Config->get_native_file_header_format ()) {
2417 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2420 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2423 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2426 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2429 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2434 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2435 ract->set_active ();