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>
33 #include <pbd/error.h>
34 #include <pbd/compose.h>
35 #include <pbd/basename.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/diskstream.h>
54 #include <ardour/filesource.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;
79 using namespace Gtkmm2ext;
83 ARDOUR_UI *ARDOUR_UI::theArdourUI = 0;
85 sigc::signal<void,bool> ARDOUR_UI::Blink;
86 sigc::signal<void> ARDOUR_UI::RapidScreenUpdate;
87 sigc::signal<void> ARDOUR_UI::SuperRapidScreenUpdate;
88 sigc::signal<void,jack_nframes_t> ARDOUR_UI::Clock;
90 ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
92 : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile),
94 primary_clock (X_("TransportClockDisplay"), true, false, true),
95 secondary_clock (X_("SecondaryClockDisplay"), true, false, true),
96 preroll_clock (X_("PreRollClock"), true, true),
97 postroll_clock (X_("PostRollClock"), true, true),
101 adjuster_table (3, 3),
105 preroll_button (_("pre\nroll")),
106 postroll_button (_("post\nroll")),
110 big_clock ("BigClockDisplay", true),
114 time_master_button (_("time\nmaster")),
116 shuttle_units_button (_("% ")),
118 punch_in_button (_("punch\nin")),
119 punch_out_button (_("punch\nout")),
120 auto_return_button (_("auto\nreturn")),
121 auto_play_button (_("auto\nplay")),
122 auto_input_button (_("auto\ninput")),
123 click_button (_("click")),
124 auditioning_alert_button (_("AUDITIONING")),
125 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 = 0;
150 m_new_session_dialog_ref = NewSessionDialogFactory::create();
151 m_new_session_dialog_ref->get_widget_derived (NewSessionDialogFactory::top_level_widget_name(), m_new_session_dialog);
155 _session_is_new = false;
156 big_clock_window = 0;
157 session_selector_window = 0;
158 last_key_press_time = 0;
159 connection_editor = 0;
160 add_route_dialog = 0;
165 open_session_selector = 0;
166 have_configure_timeout = false;
167 have_disk_overrun_displayed = false;
168 have_disk_underrun_displayed = false;
169 _will_create_new_session_automatically = false;
170 session_loaded = false;
171 last_speed_displayed = -1.0f;
173 last_configure_time.tv_sec = 0;
174 last_configure_time.tv_usec = 0;
176 shuttle_grabbed = false;
178 shuttle_max_speed = 8.0f;
180 set_shuttle_units (Percentage);
181 set_shuttle_behaviour (Sprung);
183 shuttle_style_menu = 0;
184 shuttle_unit_menu = 0;
186 gettimeofday (&last_peak_grab, 0);
187 gettimeofday (&last_shuttle_request, 0);
189 ARDOUR::DiskStream::CannotRecordNoInput.connect (mem_fun(*this, &ARDOUR_UI::cannot_record_no_input));
190 ARDOUR::DiskStream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread));
191 ARDOUR::DiskStream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler));
192 ARDOUR::DiskStream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
194 /* handle pending state with a dialog */
196 ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog));
198 /* have to wait for AudioEngine and Configuration before proceeding */
202 ARDOUR_UI::cannot_record_no_input (DiskStream* ds)
204 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::cannot_record_no_input), ds));
206 string msg = string_compose (_("\
207 You cannot record-enable\n\
209 because it has no input connections.\n\
210 You would be wasting space recording silence."),
213 MessageDialog message (*editor, msg);
218 ARDOUR_UI::set_engine (AudioEngine& e)
222 engine->Stopped.connect (mem_fun(*this, &ARDOUR_UI::engine_stopped));
223 engine->Running.connect (mem_fun(*this, &ARDOUR_UI::engine_running));
224 engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted));
225 engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate));
229 keyboard = new Keyboard;
230 install_keybindings ();
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 ARDOUR_UI::startup ()
392 /* Once the UI is up and running, start the audio engine. Doing
393 this before the UI is up and running can cause problems
394 when not running with SCHED_FIFO, because the amount of
395 CPU and disk work needed to get the UI started can interfere
396 with the scheduling of the audio thread.
399 Glib::signal_idle().connect (mem_fun(*this, &ARDOUR_UI::start_engine));
405 if (session && session->dirty()) {
406 switch (ask_about_saving_session(_("quit"))) {
411 /* use the default name */
412 if (save_state_canfail ("")) {
413 /* failed - don't quit */
414 MessageDialog msg (*editor,
416 Ardour was unable to save your session.\n\n\
417 If you still wish to quit, please use the\n\n\
418 \"Just quit\" option."));
432 ARDOUR_UI::ask_about_saving_session (const string & what)
434 ArdourDialog window (_("ardour: save session?"));
435 Gtk::Label prompt_label;
438 msg = string_compose(_("Save and %1"), what);
439 window.add_button (msg, RESPONSE_ACCEPT);
440 msg = string_compose(_("Just %1"), what);
441 window.add_button (msg, RESPONSE_APPLY);
442 msg = string_compose(_("Don't %1"), what);
443 window.add_button (msg, RESPONSE_REJECT);
445 Gtk::Button noquit_button (msg);
446 noquit_button.set_name ("EditorGTKButton");
451 if (session->snap_name() == session->name()) {
454 type = _("snapshot");
456 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?"),
457 type, session->snap_name());
459 prompt_label.set_text (prompt);
460 prompt_label.set_alignment (0.5, 0.5);
461 prompt_label.set_name (X_("PrompterLabel"));
463 window.get_vbox()->pack_start (prompt_label);
465 window.set_name (_("Prompter"));
466 window.set_position (Gtk::WIN_POS_MOUSE);
467 window.set_modal (true);
470 save_the_session = 0;
472 editor->ensure_float (window);
474 ResponseType r = (ResponseType) window.run();
479 case RESPONSE_ACCEPT: // save and get out of here
481 case RESPONSE_APPLY: // get out of here
491 ARDOUR_UI::every_second ()
494 update_buffer_load ();
495 update_disk_space ();
496 // update_disk_rate ();
501 ARDOUR_UI::every_point_one_seconds ()
506 /* do not attempt to grab peak power more than once per cycle.
509 gettimeofday (&now, 0);
510 timersub (&now, &last_peak_grab, &diff);
512 if ((diff.tv_usec + (diff.tv_sec * 1000000)) >= engine->usecs_per_cycle()) {
513 IO::GrabPeakPower(); /* EMIT_SIGNAL */
514 last_peak_grab = now;
517 update_speed_display ();
518 RapidScreenUpdate(); /* EMIT_SIGNAL */
523 ARDOUR_UI::every_point_zero_one_seconds ()
525 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
530 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
534 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
536 if (!engine->connected()) {
538 snprintf (buf, sizeof (buf), _("disconnected"));
542 jack_nframes_t rate = engine->frame_rate();
544 if (fmod (rate, 1000.0) != 0.0) {
545 snprintf (buf, sizeof (buf), _("SR: %.1f kHz / %4.1f msecs"),
546 (float) rate/1000.0f,
547 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
549 snprintf (buf, sizeof (buf), _("SR: %u kHz / %4.1f msecs"),
551 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
555 sample_rate_label.set_text (buf);
559 ARDOUR_UI::update_cpu_load ()
562 snprintf (buf, sizeof (buf), _("DSP Load: %.1f%%"), engine->get_cpu_load());
563 cpu_load_label.set_text (buf);
567 ARDOUR_UI::update_disk_rate ()
572 snprintf (buf, sizeof (buf), _("Disk r:%5.1f w:%5.1f MB/s"),
573 session->read_data_rate()/1048576.0f, session->write_data_rate()/1048576.0f);
574 disk_rate_label.set_text (buf);
576 disk_rate_label.set_text ("");
581 ARDOUR_UI::update_buffer_load ()
586 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
587 session->playback_load(), session->capture_load());
588 buffer_load_label.set_text (buf);
590 buffer_load_label.set_text ("");
595 ARDOUR_UI::count_recenabled_diskstreams (DiskStream& ds)
597 if (ds.record_enabled()) {
598 rec_enabled_diskstreams++;
603 ARDOUR_UI::update_disk_space()
609 jack_nframes_t frames = session->available_capture_duration();
612 if (frames == max_frames) {
613 strcpy (buf, _("space: 24hrs+"));
618 jack_nframes_t fr = session->frame_rate();
620 if (session->actively_recording()){
622 rec_enabled_diskstreams = 0;
623 session->foreach_diskstream (this, &ARDOUR_UI::count_recenabled_diskstreams);
625 if (rec_enabled_diskstreams) {
626 frames /= rec_enabled_diskstreams;
631 /* hmmm. shall we divide by the route count? or the diskstream count?
632 or what? for now, do nothing ...
637 hrs = frames / (fr * 3600);
638 frames -= hrs * fr * 3600;
639 mins = frames / (fr * 60);
640 frames -= mins * fr * 60;
643 snprintf (buf, sizeof(buf), _("space: %02dh:%02dm:%02ds"), hrs, mins, secs);
646 disk_space_label.set_text (buf);
650 ARDOUR_UI::update_wall_clock ()
657 tm_now = localtime (&now);
659 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
660 wall_clock_label.set_text (buf);
665 ARDOUR_UI::control_methods_adjusted ()
670 which_method = (int) online_control_button->adjustment.get_value();
671 switch (which_method) {
673 allow_mmc_and_local ();
682 fatal << _("programming error: impossible control method") << endmsg;
688 ARDOUR_UI::mmc_device_id_adjusted ()
693 int dev_id = (int) mmc_id_button->adjustment.get_value();
694 mmc->set_device_id (dev_id);
700 ARDOUR_UI::session_menu (GdkEventButton *ev)
702 session_popup_menu->popup (0, 0);
707 ARDOUR_UI::redisplay_recent_sessions ()
709 vector<string *> *sessions;
710 vector<string *>::iterator i;
711 RecentSessionsSorter cmp;
713 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
714 recent_session_model->clear ();
717 ARDOUR::read_recent_sessions (rs);
720 recent_session_display.set_model (recent_session_model);
724 /* sort them alphabetically */
725 sort (rs.begin(), rs.end(), cmp);
726 sessions = new vector<string*>;
728 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
729 sessions->push_back (new string ((*i).second));
732 for (i = sessions->begin(); i != sessions->end(); ++i) {
734 vector<string*>* states;
735 vector<const gchar*> item;
736 string fullpath = *(*i);
738 /* remove any trailing / */
740 if (fullpath[fullpath.length()-1] == '/') {
741 fullpath = fullpath.substr (0, fullpath.length()-1);
744 /* now get available states for this session */
746 if ((states = Session::possible_states (fullpath)) == 0) {
751 TreeModel::Row row = *(recent_session_model->append());
753 row[recent_session_columns.visible_name] = PBD::basename (fullpath);
754 row[recent_session_columns.fullpath] = fullpath;
756 if (states->size() > 1) {
758 /* add the children */
760 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
762 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
764 child_row[recent_session_columns.visible_name] = **i2;
765 child_row[recent_session_columns.fullpath] = fullpath;
774 recent_session_display.set_model (recent_session_model);
779 ARDOUR_UI::build_session_selector ()
781 session_selector_window = new ArdourDialog ("session selector");
783 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
785 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
786 session_selector_window->add_button (Stock::OK, RESPONSE_ACCEPT);
788 recent_session_model = TreeStore::create (recent_session_columns);
789 recent_session_display.set_model (recent_session_model);
790 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
791 recent_session_display.set_headers_visible (false);
793 scroller->add (recent_session_display);
794 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
796 session_selector_window->set_name ("SessionSelectorWindow");
797 session_selector_window->set_size_request (200, 400);
798 session_selector_window->get_vbox()->pack_start (*scroller);
799 session_selector_window->show_all_children();
803 ARDOUR_UI::open_recent_session ()
805 /* popup selector window */
807 if (session_selector_window == 0) {
808 build_session_selector ();
811 redisplay_recent_sessions ();
813 ResponseType r = (ResponseType) session_selector_window->run ();
815 session_selector_window->hide();
818 case RESPONSE_ACCEPT:
824 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
826 if (i == recent_session_model->children().end()) {
830 Glib::ustring path = (*i)[recent_session_columns.fullpath];
831 Glib::ustring state = (*i)[recent_session_columns.visible_name];
833 _session_is_new = false;
835 load_session (path, state);
839 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
843 if (stat (info.filename.c_str(), &statbuf) != 0) {
847 if (!S_ISDIR(statbuf.st_mode)) {
851 string session_file = info.filename;
853 session_file += PBD::basename (info.filename);
854 session_file += ".ardour";
856 if (stat (session_file.c_str(), &statbuf) != 0) {
860 return S_ISREG (statbuf.st_mode);
864 ARDOUR_UI::open_session ()
866 /* popup selector window */
868 if (open_session_selector == 0) {
870 /* ardour sessions are folders */
872 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
873 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
874 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
876 FileFilter session_filter;
877 session_filter.add_pattern ("*.ardour");
878 session_filter.set_name (_("Ardour sessions"));
879 open_session_selector->add_filter (session_filter);
880 open_session_selector->set_filter (session_filter);
883 int response = open_session_selector->run();
884 open_session_selector->hide ();
887 case RESPONSE_ACCEPT:
890 open_session_selector->hide();
894 open_session_selector->hide();
895 string session_path = open_session_selector->get_filename();
899 if (session_path.length() > 0) {
900 if (Session::find_session (session_path, path, name, isnew) == 0) {
901 _session_is_new = isnew;
902 load_session (path, name);
909 ARDOUR_UI::session_add_midi_track ()
911 cerr << _("Patience is a virtue.\n");
915 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
920 warning << _("You cannot add a track without a session already loaded.") << endmsg;
926 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
927 error << _("could not create new audio track") << endmsg;
930 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
931 error << _("could not create new audio bus") << endmsg;
936 if (need_control_room_outs) {
942 route->set_stereo_control_outs (control_lr_channels);
943 route->control_outs()->set_stereo_pan (pans, this);
945 #endif /* CONTROLOUTS */
949 MessageDialog msg (*editor,
950 _("There are insufficient JACK ports available\n\
951 to create a new track or bus.\n\
952 You should save Ardour, exit and\n\
953 restart JACK with more ports."));
959 ARDOUR_UI::diskstream_added (DiskStream* ds)
964 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
966 jack_nframes_t _preroll;
969 _preroll = session->convert_to_frames_at (new_position, session->preroll);
971 if (new_position > _preroll) {
972 new_position -= _preroll;
977 session->request_locate (new_position);
982 ARDOUR_UI::transport_goto_start ()
985 session->goto_start();
988 /* force displayed area in editor to start no matter
989 what "follow playhead" setting is.
993 editor->reposition_x_origin (session->current_start_frame());
999 ARDOUR_UI::transport_goto_zero ()
1002 session->request_locate (0);
1005 /* force displayed area in editor to start no matter
1006 what "follow playhead" setting is.
1010 editor->reposition_x_origin (0);
1016 ARDOUR_UI::transport_goto_end ()
1019 jack_nframes_t frame = session->current_end_frame();
1020 session->request_locate (frame);
1022 /* force displayed area in editor to start no matter
1023 what "follow playhead" setting is.
1027 editor->reposition_x_origin (frame);
1033 ARDOUR_UI::transport_stop ()
1039 if (session->is_auditioning()) {
1040 session->cancel_audition ();
1044 if (session->get_auto_loop()) {
1045 session->request_auto_loop (false);
1048 session->request_stop ();
1052 ARDOUR_UI::transport_stop_and_forget_capture ()
1055 session->request_stop (true);
1060 ARDOUR_UI::remove_last_capture()
1063 editor->remove_last_capture();
1068 ARDOUR_UI::transport_record ()
1071 switch (session->record_status()) {
1072 case Session::Disabled:
1073 if (session->ntracks() == 0) {
1074 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1075 MessageDialog msg (*editor, txt);
1079 session->maybe_enable_record ();
1081 case Session::Recording:
1082 case Session::Enabled:
1083 session->disable_record (true);
1089 ARDOUR_UI::transport_roll ()
1097 rolling = session->transport_rolling ();
1099 if (session->get_auto_loop()) {
1100 session->request_auto_loop (false);
1101 auto_loop_button.set_active (false);
1102 roll_button.set_active (true);
1103 } else if (session->get_play_range ()) {
1104 session->request_play_range (false);
1105 play_selection_button.set_active (false);
1106 } else if (rolling) {
1107 session->request_locate (session->last_transport_start(), true);
1110 session->request_transport_speed (1.0f);
1114 ARDOUR_UI::transport_loop()
1117 if (session->get_auto_loop()) {
1118 if (session->transport_rolling()) {
1119 Location * looploc = session->locations()->auto_loop_location();
1121 session->request_locate (looploc->start(), true);
1126 session->request_auto_loop (true);
1132 ARDOUR_UI::transport_play_selection ()
1138 if (!session->get_play_range()) {
1139 session->request_stop ();
1142 editor->play_selection ();
1146 ARDOUR_UI::transport_rewind (int option)
1148 float current_transport_speed;
1151 current_transport_speed = session->transport_speed();
1153 if (current_transport_speed >= 0.0f) {
1156 session->request_transport_speed (-1.0f);
1159 session->request_transport_speed (-4.0f);
1162 session->request_transport_speed (-0.5f);
1167 session->request_transport_speed (current_transport_speed * 1.5f);
1173 ARDOUR_UI::transport_forward (int option)
1175 float current_transport_speed;
1178 current_transport_speed = session->transport_speed();
1180 if (current_transport_speed <= 0.0f) {
1183 session->request_transport_speed (1.0f);
1186 session->request_transport_speed (4.0f);
1189 session->request_transport_speed (0.5f);
1194 session->request_transport_speed (current_transport_speed * 1.5f);
1200 ARDOUR_UI::toggle_monitor_enable (guint32 dstream)
1208 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1209 Port *port = ds->io()->input (0);
1210 port->request_monitor_input (!port->monitoring_input());
1215 ARDOUR_UI::toggle_record_enable (guint32 dstream)
1223 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1224 ds->set_record_enabled (!ds->record_enabled(), this);
1229 ARDOUR_UI::queue_transport_change ()
1231 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1235 ARDOUR_UI::map_transport_state ()
1237 float sp = session->transport_speed();
1240 transport_rolling ();
1241 } else if (sp < 0.0f) {
1242 transport_rewinding ();
1243 } else if (sp > 0.0f) {
1244 transport_forwarding ();
1246 transport_stopped ();
1251 ARDOUR_UI::send_all_midi_feedback ()
1254 session->send_all_midi_feedback();
1259 ARDOUR_UI::allow_local_only ()
1265 ARDOUR_UI::allow_mmc_only ()
1271 ARDOUR_UI::allow_mmc_and_local ()
1277 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1279 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1280 (int) adj.get_value()].c_str());
1284 ARDOUR_UI::engine_stopped ()
1286 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1287 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1288 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1293 ARDOUR_UI::engine_running ()
1295 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1296 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1297 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1301 ARDOUR_UI::engine_halted ()
1303 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1305 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1306 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1308 update_sample_rate (0);
1310 MessageDialog msg (*editor,
1312 JACK has either been shutdown or it\n\
1313 disconnected Ardour because Ardour\n\
1314 was not fast enough. You can save the\n\
1315 session and/or try to reconnect to JACK ."));
1320 ARDOUR_UI::do_engine_start ()
1326 catch (AudioEngine::PortRegistrationFailure& err) {
1328 error << _("Unable to create all required ports")
1336 error << _("Unable to start the session running")
1346 ARDOUR_UI::start_engine ()
1348 if (do_engine_start () == 0) {
1349 if (session && _session_is_new) {
1350 /* we need to retain initial visual
1351 settings for a new session
1353 session->save_state ("");
1356 /* there is too much going on, in too many threads, for us to
1357 end up with a clean session. So wait 1 second after loading,
1358 and fix it up. its ugly, but until i come across a better
1359 solution, its what we have.
1362 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1369 ARDOUR_UI::update_clocks ()
1371 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1375 ARDOUR_UI::start_clocking ()
1377 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1381 ARDOUR_UI::stop_clocking ()
1383 clock_signal_connection.disconnect ();
1387 ARDOUR_UI::toggle_clocking ()
1390 if (clock_button.get_active()) {
1399 ARDOUR_UI::_blink (void *arg)
1402 ((ARDOUR_UI *) arg)->blink ();
1409 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1413 ARDOUR_UI::start_blinking ()
1415 /* Start the blink signal. Everybody with a blinking widget
1416 uses Blink to drive the widget's state.
1419 if (blink_timeout_tag < 0) {
1421 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1426 ARDOUR_UI::stop_blinking ()
1428 if (blink_timeout_tag >= 0) {
1429 gtk_timeout_remove (blink_timeout_tag);
1430 blink_timeout_tag = -1;
1436 ARDOUR_UI::add_diskstream_to_menu (DiskStream& dstream)
1438 using namespace Gtk;
1439 using namespace Menu_Helpers;
1441 if (dstream.hidden()) {
1445 MenuList& items = diskstream_menu->items();
1446 items.push_back (MenuElem (dstream.name(), bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), (gint32) dstream.id())));
1450 ARDOUR_UI::diskstream_selected (gint32 id)
1452 selected_dstream = id;
1457 ARDOUR_UI::select_diskstream (GdkEventButton *ev)
1459 using namespace Gtk;
1460 using namespace Menu_Helpers;
1466 diskstream_menu = new Menu();
1467 diskstream_menu->set_name ("ArdourContextMenu");
1468 using namespace Gtk;
1469 using namespace Menu_Helpers;
1471 MenuList& items = diskstream_menu->items();
1472 items.push_back (MenuElem (_("No Stream"), (bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), -1))));
1474 session->foreach_diskstream (this, &ARDOUR_UI::add_diskstream_to_menu);
1477 diskstream_menu->popup (ev->button, ev->time);
1479 diskstream_menu->popup (0, 0);
1482 selected_dstream = -1;
1486 delete diskstream_menu;
1488 return selected_dstream;
1492 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1498 if (io.n_inputs() == 0) {
1503 /* XXX we're not handling multiple ports yet. */
1505 const char **connections = io.input(0)->get_connections();
1507 if (connections == 0 || connections[0] == '\0') {
1510 buf = connections[0];
1517 if (io.n_outputs() == 0) {
1522 /* XXX we're not handling multiple ports yet. */
1524 const char **connections = io.output(0)->get_connections();
1526 if (connections == 0 || connections[0] == '\0') {
1529 buf = connections[0];
1537 ARDOUR_UI::snapshot_session ()
1539 ArdourPrompter prompter (true);
1546 now = now.substr (0, now.length() - 1);
1548 prompter.set_name ("Prompter");
1549 prompter.set_prompt (_("Name for snapshot"));
1550 prompter.set_initial_text (now);
1552 switch (prompter.run()) {
1553 case RESPONSE_ACCEPT:
1554 prompter.get_result (snapname);
1555 if (snapname.length()){
1556 save_state (snapname);
1566 ARDOUR_UI::save_state (const string & name)
1568 (void) save_state_canfail (name);
1572 ARDOUR_UI::save_state_canfail (string name)
1577 if (name.length() == 0) {
1578 name = session->snap_name();
1581 if ((ret = session->save_state (name)) != 0) {
1585 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1590 ARDOUR_UI::restore_state (string name)
1593 if (name.length() == 0) {
1594 name = session->name();
1596 session->restore_state (name);
1601 ARDOUR_UI::primary_clock_value_changed ()
1604 session->request_locate (primary_clock.current_time ());
1609 ARDOUR_UI::secondary_clock_value_changed ()
1612 session->request_locate (secondary_clock.current_time ());
1617 ARDOUR_UI::rec_enable_button_blink (bool onoff, DiskStream *dstream, Widget *w)
1619 if (session && dstream && dstream->record_enabled()) {
1621 Session::RecordState rs;
1623 rs = session->record_status ();
1626 case Session::Disabled:
1627 case Session::Enabled:
1628 if (w->get_state() != STATE_SELECTED) {
1629 w->set_state (STATE_SELECTED);
1633 case Session::Recording:
1634 if (w->get_state() != STATE_ACTIVE) {
1635 w->set_state (STATE_ACTIVE);
1641 if (w->get_state() != STATE_NORMAL) {
1642 w->set_state (STATE_NORMAL);
1648 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1654 switch (session->record_status()) {
1655 case Session::Enabled:
1657 rec_button.set_state (1);
1659 rec_button.set_state (0);
1663 case Session::Recording:
1664 rec_button.set_state (2);
1668 rec_button.set_state (0);
1674 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1682 ARDOUR_UI::start_keyboard_prefix ()
1684 keyboard->start_prefix();
1688 ARDOUR_UI::save_template ()
1691 ArdourPrompter prompter (true);
1694 prompter.set_name (X_("Prompter"));
1695 prompter.set_prompt (_("Name for mix template:"));
1696 prompter.set_initial_text(session->name() + _("-template"));
1698 switch (prompter.run()) {
1699 case RESPONSE_ACCEPT:
1700 prompter.get_result (name);
1702 if (name.length()) {
1703 session->save_template (name);
1713 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1715 m_new_session_dialog->show_all();
1716 m_new_session_dialog->set_transient_for(*editor);
1717 m_new_session_dialog->set_name(predetermined_path);
1719 int response = Gtk::RESPONSE_CANCEL;
1722 response = m_new_session_dialog->run ();
1724 if(response == Gtk::RESPONSE_OK) {
1726 _session_is_new = true;
1728 std::string session_name = m_new_session_dialog->session_name();
1729 std::string session_path = m_new_session_dialog->session_folder();
1732 XXX This is needed because session constructor wants a
1733 non-existant path. hopefully this will be fixed at some point.
1735 session_path = Glib::build_filename(session_path, session_name);
1737 std::string template_name = m_new_session_dialog->session_template_name();
1739 if (m_new_session_dialog->use_session_template()) {
1741 load_session (session_path, session_name, &template_name);
1747 Session::AutoConnectOption iconnect;
1748 Session::AutoConnectOption oconnect;
1750 if (m_new_session_dialog->create_control_bus()) {
1751 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1756 if (m_new_session_dialog->create_master_bus()) {
1757 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1762 if (m_new_session_dialog->connect_inputs()) {
1763 iconnect = Session::AutoConnectPhysical;
1765 iconnect = Session::AutoConnectOption (0);
1768 /// @todo some minor tweaks.
1770 if (m_new_session_dialog->connect_outs_to_master()) {
1771 oconnect = Session::AutoConnectMaster;
1772 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1773 oconnect = Session::AutoConnectPhysical;
1775 oconnect = Session::AutoConnectOption (0);
1778 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1779 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1781 build_session (session_path,
1789 engine->frame_rate() * 60 * 5);
1793 } while(response == Gtk::RESPONSE_HELP);
1794 m_new_session_dialog->hide_all();
1798 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1800 Session *new_session;
1802 session_loaded = false;
1803 x = unload_session ();
1811 /* if it already exists, we must have write access */
1813 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1814 MessageDialog msg (*editor, _("\
1815 You do not have write access to this session.\n\
1816 This prevents the session from being loaded."));
1822 new_session = new Session (*engine, path, snap_name, mix_template);
1827 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1831 connect_to_session (new_session);
1833 //if (engine->running()) {
1834 //mixer->show_window();
1836 session_loaded = true;
1841 ARDOUR_UI::make_session_clean ()
1844 session->set_clean ();
1851 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1852 uint32_t control_channels,
1853 uint32_t master_channels,
1854 Session::AutoConnectOption input_connect,
1855 Session::AutoConnectOption output_connect,
1858 jack_nframes_t initial_length)
1860 Session *new_session;
1863 session_loaded = false;
1864 x = unload_session ();
1871 _session_is_new = true;
1874 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1875 control_channels, master_channels, nphysin, nphysout, initial_length);
1880 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1884 connect_to_session (new_session);
1886 //if (engine->running()) {
1887 //mixer->show_window();
1889 session_loaded = true;
1897 editor->show_window ();
1901 if (session && mixer) {
1902 // mixer->show_window ();
1911 ARDOUR_UI::show_splash ()
1914 about = new About();
1920 ARDOUR_UI::hide_splash ()
1928 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1932 removed = rep.paths.size();
1935 MessageDialog msg (*editor, X_("cleanupresults"),
1937 No audio files were ready for cleanup\n\n\
1938 If this seems suprising, check for any existing\n\
1939 snapshots. These may still include regions that\n\
1940 require some unused files to continue to exist."));
1945 ArdourDialog results (_("ardour: cleanup"), true);
1947 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1948 CleanupResultsModelColumns() {
1952 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1953 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1957 Glib::RefPtr<Gtk::ListStore> results_model;
1958 CleanupResultsModelColumns results_columns;
1959 Gtk::TreeView results_display;
1961 results_model = ListStore::create (results_columns);
1962 results_display.set_model (results_model);
1963 results_display.append_column (list_title, results_columns.visible_name);
1964 results_display.set_headers_visible (true);
1966 Gtk::ScrolledWindow list_scroller;
1969 if (rep.space < 1048576.0f) {
1971 txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1024.0f, "kilo"));
1973 txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1024.0f, "kilo"));
1977 txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1048576.0f, "mega"));
1979 txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1048576.0f, "mega"));
1983 results.get_vbox()->pack_start (txt, false, false);
1985 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1986 TreeModel::Row row = *(results_model->append());
1987 row[results_columns.visible_name] = *i;
1988 row[results_columns.fullpath] = *i;
1991 list_scroller.add (results_display);
1992 list_scroller.set_size_request (-1, 250);
1993 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
1995 results.get_vbox()->pack_start (list_scroller, true, true);
1996 results.add_button (Stock::OK, RESPONSE_ACCEPT);
1997 results.set_position (Gtk::WIN_POS_MOUSE);
2003 ARDOUR_UI::cleanup ()
2006 /* shouldn't happen: menu item is insensitive */
2010 ArdourDialog checker (_("ardour cleanup"));
2011 Gtk::Label label (_("\
2012 Cleanup is a destructive operation.\n\
2013 ALL undo/redo information will be lost if you cleanup.\n\
2014 Unused audio files will be moved to a \"dead sounds\" location."));
2016 checker.get_vbox()->pack_start (label, false, false);
2017 checker.add_button (Stock::OK, RESPONSE_ACCEPT);
2018 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2020 checker.set_name (_("CleanupDialog"));
2021 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2022 checker.set_position (Gtk::WIN_POS_MOUSE);
2024 switch (checker.run()) {
2025 case RESPONSE_ACCEPT:
2031 Session::cleanup_report rep;
2033 editor->prepare_for_cleanup ();
2035 if (session->cleanup_sources (rep)) {
2039 display_cleanup_results (rep,
2042 The following %1 %2 were not in use.\n\
2043 The next time you flush the wastebasket\n\
2044 it will release an additional %3 %4bytes\n\
2050 ARDOUR_UI::flush_trash ()
2053 /* shouldn't happen: menu item is insensitive */
2057 Session::cleanup_report rep;
2059 if (session->cleanup_trash_sources (rep)) {
2063 display_cleanup_results (rep,
2065 _("The following %1 file%2 were deleted, releasing %3 %4bytes of disk space"));
2069 ARDOUR_UI::add_route ()
2077 if (add_route_dialog == 0) {
2078 add_route_dialog = new AddRouteDialog;
2079 editor->ensure_float (*add_route_dialog);
2082 if (add_route_dialog->is_visible()) {
2083 /* we're already doing this */
2087 ResponseType r = (ResponseType) add_route_dialog->run ();
2089 add_route_dialog->hide();
2092 case RESPONSE_ACCEPT:
2099 if ((count = add_route_dialog->count()) <= 0) {
2103 uint32_t input_chan = add_route_dialog->channels ();
2104 uint32_t output_chan;
2105 string name_template = add_route_dialog->name_template ();
2106 bool track = add_route_dialog->track ();
2108 Session::AutoConnectOption oac = session->get_output_auto_connect();
2110 if (oac & Session::AutoConnectMaster) {
2111 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2113 output_chan = input_chan;
2116 /* XXX do something with name template */
2120 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2122 session_add_audio_bus (input_chan, output_chan);
2126 while (Main::events_pending()) {
2133 ARDOUR_UI::mixer_settings () const
2138 node = session->instant_xml(X_("Mixer"), session->path());
2140 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2144 node = new XMLNode (X_("Mixer"));
2151 ARDOUR_UI::editor_settings () const
2156 node = session->instant_xml(X_("Editor"), session->path());
2158 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2162 node = new XMLNode (X_("Editor"));
2168 ARDOUR_UI::keyboard_settings () const
2172 node = Config->extra_xml(X_("Keyboard"));
2175 node = new XMLNode (X_("Keyboard"));
2181 ARDOUR_UI::halt_on_xrun_message ()
2183 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2185 MessageDialog msg (*editor,
2186 _("Recording was stopped because your system could not keep up."));
2191 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::Source*>* deletion_list)
2193 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2195 for (list<Source*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2199 delete deletion_list;
2203 ARDOUR_UI::disk_overrun_handler ()
2205 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2207 if (!have_disk_overrun_displayed) {
2208 have_disk_overrun_displayed = true;
2209 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2210 The disk system on your computer\n\
2211 was not able to keep up with Ardour.\n\
2213 Specifically, it failed to write data to disk\n\
2214 quickly enough to keep up with recording.\n"));
2216 have_disk_overrun_displayed = false;
2221 ARDOUR_UI::disk_underrun_handler ()
2223 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2225 if (!have_disk_underrun_displayed) {
2226 have_disk_underrun_displayed = true;
2227 MessageDialog msg (*editor,
2228 (_("The disk system on your computer\n\
2229 was not able to keep up with Ardour.\n\
2231 Specifically, it failed to read data from disk\n\
2232 quickly enough to keep up with playback.\n")));
2234 have_disk_underrun_displayed = false;
2239 ARDOUR_UI::disk_underrun_message_gone ()
2241 have_disk_underrun_displayed = false;
2245 ARDOUR_UI::disk_overrun_message_gone ()
2247 have_disk_underrun_displayed = false;
2251 ARDOUR_UI::pending_state_dialog ()
2253 ArdourDialog dialog ("pending state dialog");
2255 This session appears to have been in\n\
2256 middle of recording when ardour or\n\
2257 the computer was shutdown.\n\
2259 Ardour can recover any captured audio for\n\
2260 you, or it can ignore it. Please decide\n\
2261 what you would like to do.\n"));
2263 dialog.get_vbox()->pack_start (message);
2264 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2265 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2267 dialog.set_position (WIN_POS_CENTER);
2270 switch (dialog.run ()) {
2271 case RESPONSE_ACCEPT:
2279 ARDOUR_UI::disconnect_from_jack ()
2282 if( engine->disconnect_from_jack ()) {
2283 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2287 update_sample_rate (0);
2292 ARDOUR_UI::reconnect_to_jack ()
2295 if (engine->reconnect_to_jack ()) {
2296 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2300 update_sample_rate (0);
2305 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2307 engine->request_buffer_size (nframes);
2308 update_sample_rate (0);
2312 ARDOUR_UI::cmdline_new_session (string path)
2314 if (path[0] != '/') {
2315 char buf[PATH_MAX+1];
2318 getcwd (buf, sizeof (buf));
2325 new_session (false, path);
2327 _will_create_new_session_automatically = false; /* done it */
2328 return FALSE; /* don't call it again */
2332 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2334 Glib::RefPtr<Action> act;
2338 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2341 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2344 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2347 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2350 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2355 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2356 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2357 Config->set_native_file_header_format (hf);
2359 session->reset_native_file_format ();
2366 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2368 Glib::RefPtr<Action> act;
2372 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2375 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2380 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2382 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2383 Config->set_native_file_data_format (sf);
2385 session->reset_native_file_format ();
2392 ARDOUR_UI::use_config ()
2394 Glib::RefPtr<Action> act;
2396 switch (Config->get_native_file_data_format ()) {
2398 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2401 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2406 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2407 ract->set_active ();
2410 switch (Config->get_native_file_header_format ()) {
2412 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2415 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2418 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2421 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2424 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2429 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2430 ract->set_active ();