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 ();
504 ARDOUR_UI::every_point_one_seconds ()
506 update_speed_display ();
507 RapidScreenUpdate(); /* EMIT_SIGNAL */
512 ARDOUR_UI::every_point_zero_one_seconds ()
514 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
519 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
523 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
525 if (!engine->connected()) {
527 snprintf (buf, sizeof (buf), _("disconnected"));
531 jack_nframes_t rate = engine->frame_rate();
533 if (fmod (rate, 1000.0) != 0.0) {
534 snprintf (buf, sizeof (buf), _("SR: %.1f kHz / %4.1f msecs"),
535 (float) rate/1000.0f,
536 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
538 snprintf (buf, sizeof (buf), _("SR: %u kHz / %4.1f msecs"),
540 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
544 sample_rate_label.set_text (buf);
548 ARDOUR_UI::update_cpu_load ()
551 snprintf (buf, sizeof (buf), _("DSP Load: %.1f%%"), engine->get_cpu_load());
552 cpu_load_label.set_text (buf);
556 ARDOUR_UI::update_buffer_load ()
561 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
562 session->playback_load(), session->capture_load());
563 buffer_load_label.set_text (buf);
565 buffer_load_label.set_text ("");
570 ARDOUR_UI::count_recenabled_diskstreams (DiskStream& ds)
572 if (ds.record_enabled()) {
573 rec_enabled_diskstreams++;
578 ARDOUR_UI::update_disk_space()
584 jack_nframes_t frames = session->available_capture_duration();
587 if (frames == max_frames) {
588 strcpy (buf, _("space: 24hrs+"));
593 jack_nframes_t fr = session->frame_rate();
595 if (session->actively_recording()){
597 rec_enabled_diskstreams = 0;
598 session->foreach_diskstream (this, &ARDOUR_UI::count_recenabled_diskstreams);
600 if (rec_enabled_diskstreams) {
601 frames /= rec_enabled_diskstreams;
606 /* hmmm. shall we divide by the route count? or the diskstream count?
607 or what? for now, do nothing ...
612 hrs = frames / (fr * 3600);
613 frames -= hrs * fr * 3600;
614 mins = frames / (fr * 60);
615 frames -= mins * fr * 60;
618 snprintf (buf, sizeof(buf), _("space: %02dh:%02dm:%02ds"), hrs, mins, secs);
621 disk_space_label.set_text (buf);
625 ARDOUR_UI::update_wall_clock ()
632 tm_now = localtime (&now);
634 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
635 wall_clock_label.set_text (buf);
640 ARDOUR_UI::control_methods_adjusted ()
645 which_method = (int) online_control_button->adjustment.get_value();
646 switch (which_method) {
648 allow_mmc_and_local ();
657 fatal << _("programming error: impossible control method") << endmsg;
663 ARDOUR_UI::mmc_device_id_adjusted ()
668 int dev_id = (int) mmc_id_button->adjustment.get_value();
669 mmc->set_device_id (dev_id);
675 ARDOUR_UI::session_menu (GdkEventButton *ev)
677 session_popup_menu->popup (0, 0);
682 ARDOUR_UI::redisplay_recent_sessions ()
684 vector<string *> *sessions;
685 vector<string *>::iterator i;
686 RecentSessionsSorter cmp;
688 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
689 recent_session_model->clear ();
692 ARDOUR::read_recent_sessions (rs);
695 recent_session_display.set_model (recent_session_model);
699 /* sort them alphabetically */
700 sort (rs.begin(), rs.end(), cmp);
701 sessions = new vector<string*>;
703 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
704 sessions->push_back (new string ((*i).second));
707 for (i = sessions->begin(); i != sessions->end(); ++i) {
709 vector<string*>* states;
710 vector<const gchar*> item;
711 string fullpath = *(*i);
713 /* remove any trailing / */
715 if (fullpath[fullpath.length()-1] == '/') {
716 fullpath = fullpath.substr (0, fullpath.length()-1);
719 /* now get available states for this session */
721 if ((states = Session::possible_states (fullpath)) == 0) {
726 TreeModel::Row row = *(recent_session_model->append());
728 row[recent_session_columns.visible_name] = PBD::basename (fullpath);
729 row[recent_session_columns.fullpath] = fullpath;
731 if (states->size() > 1) {
733 /* add the children */
735 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
737 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
739 child_row[recent_session_columns.visible_name] = **i2;
740 child_row[recent_session_columns.fullpath] = fullpath;
749 recent_session_display.set_model (recent_session_model);
754 ARDOUR_UI::build_session_selector ()
756 session_selector_window = new ArdourDialog ("session selector");
758 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
760 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
761 session_selector_window->add_button (Stock::OK, RESPONSE_ACCEPT);
763 recent_session_model = TreeStore::create (recent_session_columns);
764 recent_session_display.set_model (recent_session_model);
765 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
766 recent_session_display.set_headers_visible (false);
767 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
769 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
771 scroller->add (recent_session_display);
772 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
774 session_selector_window->set_name ("SessionSelectorWindow");
775 session_selector_window->set_size_request (200, 400);
776 session_selector_window->get_vbox()->pack_start (*scroller);
777 session_selector_window->show_all_children();
781 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
783 session_selector_window->response (RESPONSE_ACCEPT);
787 ARDOUR_UI::open_recent_session ()
789 /* popup selector window */
791 if (session_selector_window == 0) {
792 build_session_selector ();
795 redisplay_recent_sessions ();
797 ResponseType r = (ResponseType) session_selector_window->run ();
799 session_selector_window->hide();
802 case RESPONSE_ACCEPT:
808 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
810 if (i == recent_session_model->children().end()) {
814 Glib::ustring path = (*i)[recent_session_columns.fullpath];
815 Glib::ustring state = (*i)[recent_session_columns.visible_name];
817 _session_is_new = false;
819 load_session (path, state);
823 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
827 if (stat (info.filename.c_str(), &statbuf) != 0) {
831 if (!S_ISDIR(statbuf.st_mode)) {
835 string session_file = info.filename;
837 session_file += PBD::basename (info.filename);
838 session_file += ".ardour";
840 if (stat (session_file.c_str(), &statbuf) != 0) {
844 return S_ISREG (statbuf.st_mode);
848 ARDOUR_UI::open_session ()
850 /* popup selector window */
852 if (open_session_selector == 0) {
854 /* ardour sessions are folders */
856 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
857 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
858 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
860 FileFilter session_filter;
861 session_filter.add_pattern ("*.ardour");
862 session_filter.set_name (_("Ardour sessions"));
863 open_session_selector->add_filter (session_filter);
864 open_session_selector->set_filter (session_filter);
867 int response = open_session_selector->run();
868 open_session_selector->hide ();
871 case RESPONSE_ACCEPT:
874 open_session_selector->hide();
878 open_session_selector->hide();
879 string session_path = open_session_selector->get_filename();
883 if (session_path.length() > 0) {
884 if (Session::find_session (session_path, path, name, isnew) == 0) {
885 _session_is_new = isnew;
886 load_session (path, name);
893 ARDOUR_UI::session_add_midi_track ()
895 cerr << _("Patience is a virtue.\n");
899 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
904 warning << _("You cannot add a track without a session already loaded.") << endmsg;
910 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
911 error << _("could not create new audio track") << endmsg;
914 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
915 error << _("could not create new audio bus") << endmsg;
920 if (need_control_room_outs) {
926 route->set_stereo_control_outs (control_lr_channels);
927 route->control_outs()->set_stereo_pan (pans, this);
929 #endif /* CONTROLOUTS */
933 MessageDialog msg (*editor,
934 _("There are insufficient JACK ports available\n\
935 to create a new track or bus.\n\
936 You should save Ardour, exit and\n\
937 restart JACK with more ports."));
943 ARDOUR_UI::diskstream_added (DiskStream* ds)
948 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
950 jack_nframes_t _preroll;
953 _preroll = session->convert_to_frames_at (new_position, session->preroll);
955 if (new_position > _preroll) {
956 new_position -= _preroll;
961 session->request_locate (new_position);
966 ARDOUR_UI::transport_goto_start ()
969 session->goto_start();
972 /* force displayed area in editor to start no matter
973 what "follow playhead" setting is.
977 editor->reposition_x_origin (session->current_start_frame());
983 ARDOUR_UI::transport_goto_zero ()
986 session->request_locate (0);
989 /* force displayed area in editor to start no matter
990 what "follow playhead" setting is.
994 editor->reposition_x_origin (0);
1000 ARDOUR_UI::transport_goto_end ()
1003 jack_nframes_t frame = session->current_end_frame();
1004 session->request_locate (frame);
1006 /* force displayed area in editor to start no matter
1007 what "follow playhead" setting is.
1011 editor->reposition_x_origin (frame);
1017 ARDOUR_UI::transport_stop ()
1023 if (session->is_auditioning()) {
1024 session->cancel_audition ();
1028 if (session->get_auto_loop()) {
1029 session->request_auto_loop (false);
1032 session->request_stop ();
1036 ARDOUR_UI::transport_stop_and_forget_capture ()
1039 session->request_stop (true);
1044 ARDOUR_UI::remove_last_capture()
1047 editor->remove_last_capture();
1052 ARDOUR_UI::transport_record ()
1055 switch (session->record_status()) {
1056 case Session::Disabled:
1057 if (session->ntracks() == 0) {
1058 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1059 MessageDialog msg (*editor, txt);
1063 session->maybe_enable_record ();
1065 case Session::Recording:
1066 case Session::Enabled:
1067 session->disable_record (true);
1073 ARDOUR_UI::transport_roll ()
1081 rolling = session->transport_rolling ();
1083 if (session->get_auto_loop()) {
1084 session->request_auto_loop (false);
1085 auto_loop_button.set_active (false);
1086 roll_button.set_active (true);
1087 } else if (session->get_play_range ()) {
1088 session->request_play_range (false);
1089 play_selection_button.set_active (false);
1090 } else if (rolling) {
1091 session->request_locate (session->last_transport_start(), true);
1094 session->request_transport_speed (1.0f);
1098 ARDOUR_UI::transport_loop()
1101 if (session->get_auto_loop()) {
1102 if (session->transport_rolling()) {
1103 Location * looploc = session->locations()->auto_loop_location();
1105 session->request_locate (looploc->start(), true);
1110 session->request_auto_loop (true);
1116 ARDOUR_UI::transport_play_selection ()
1122 if (!session->get_play_range()) {
1123 session->request_stop ();
1126 editor->play_selection ();
1130 ARDOUR_UI::transport_rewind (int option)
1132 float current_transport_speed;
1135 current_transport_speed = session->transport_speed();
1137 if (current_transport_speed >= 0.0f) {
1140 session->request_transport_speed (-1.0f);
1143 session->request_transport_speed (-4.0f);
1146 session->request_transport_speed (-0.5f);
1151 session->request_transport_speed (current_transport_speed * 1.5f);
1157 ARDOUR_UI::transport_forward (int option)
1159 float current_transport_speed;
1162 current_transport_speed = session->transport_speed();
1164 if (current_transport_speed <= 0.0f) {
1167 session->request_transport_speed (1.0f);
1170 session->request_transport_speed (4.0f);
1173 session->request_transport_speed (0.5f);
1178 session->request_transport_speed (current_transport_speed * 1.5f);
1184 ARDOUR_UI::toggle_monitor_enable (guint32 dstream)
1192 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1193 Port *port = ds->io()->input (0);
1194 port->request_monitor_input (!port->monitoring_input());
1199 ARDOUR_UI::toggle_record_enable (guint32 dstream)
1207 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1208 ds->set_record_enabled (!ds->record_enabled(), this);
1213 ARDOUR_UI::queue_transport_change ()
1215 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1219 ARDOUR_UI::map_transport_state ()
1221 float sp = session->transport_speed();
1224 transport_rolling ();
1225 } else if (sp < 0.0f) {
1226 transport_rewinding ();
1227 } else if (sp > 0.0f) {
1228 transport_forwarding ();
1230 transport_stopped ();
1235 ARDOUR_UI::allow_local_only ()
1241 ARDOUR_UI::allow_mmc_only ()
1247 ARDOUR_UI::allow_mmc_and_local ()
1253 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1255 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1256 (int) adj.get_value()].c_str());
1260 ARDOUR_UI::engine_stopped ()
1262 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1263 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1264 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1269 ARDOUR_UI::engine_running ()
1271 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1272 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1273 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1277 ARDOUR_UI::engine_halted ()
1279 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1281 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1282 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1284 update_sample_rate (0);
1286 MessageDialog msg (*editor,
1288 JACK has either been shutdown or it\n\
1289 disconnected Ardour because Ardour\n\
1290 was not fast enough. You can save the\n\
1291 session and/or try to reconnect to JACK ."));
1296 ARDOUR_UI::do_engine_start ()
1302 catch (AudioEngine::PortRegistrationFailure& err) {
1304 error << _("Unable to create all required ports")
1312 error << _("Unable to start the session running")
1322 ARDOUR_UI::start_engine ()
1324 if (do_engine_start () == 0) {
1325 if (session && _session_is_new) {
1326 /* we need to retain initial visual
1327 settings for a new session
1329 session->save_state ("");
1332 /* there is too much going on, in too many threads, for us to
1333 end up with a clean session. So wait 1 second after loading,
1334 and fix it up. its ugly, but until i come across a better
1335 solution, its what we have.
1338 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1345 ARDOUR_UI::update_clocks ()
1347 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1351 ARDOUR_UI::start_clocking ()
1353 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1357 ARDOUR_UI::stop_clocking ()
1359 clock_signal_connection.disconnect ();
1363 ARDOUR_UI::toggle_clocking ()
1366 if (clock_button.get_active()) {
1375 ARDOUR_UI::_blink (void *arg)
1378 ((ARDOUR_UI *) arg)->blink ();
1385 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1389 ARDOUR_UI::start_blinking ()
1391 /* Start the blink signal. Everybody with a blinking widget
1392 uses Blink to drive the widget's state.
1395 if (blink_timeout_tag < 0) {
1397 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1402 ARDOUR_UI::stop_blinking ()
1404 if (blink_timeout_tag >= 0) {
1405 gtk_timeout_remove (blink_timeout_tag);
1406 blink_timeout_tag = -1;
1412 ARDOUR_UI::add_diskstream_to_menu (DiskStream& dstream)
1414 using namespace Gtk;
1415 using namespace Menu_Helpers;
1417 if (dstream.hidden()) {
1421 MenuList& items = diskstream_menu->items();
1422 items.push_back (MenuElem (dstream.name(), bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), (gint32) dstream.id())));
1426 ARDOUR_UI::diskstream_selected (gint32 id)
1428 selected_dstream = id;
1433 ARDOUR_UI::select_diskstream (GdkEventButton *ev)
1435 using namespace Gtk;
1436 using namespace Menu_Helpers;
1442 diskstream_menu = new Menu();
1443 diskstream_menu->set_name ("ArdourContextMenu");
1444 using namespace Gtk;
1445 using namespace Menu_Helpers;
1447 MenuList& items = diskstream_menu->items();
1448 items.push_back (MenuElem (_("No Stream"), (bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), -1))));
1450 session->foreach_diskstream (this, &ARDOUR_UI::add_diskstream_to_menu);
1453 diskstream_menu->popup (ev->button, ev->time);
1455 diskstream_menu->popup (0, 0);
1458 selected_dstream = -1;
1462 delete diskstream_menu;
1464 return selected_dstream;
1468 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1474 if (io.n_inputs() == 0) {
1479 /* XXX we're not handling multiple ports yet. */
1481 const char **connections = io.input(0)->get_connections();
1483 if (connections == 0 || connections[0] == '\0') {
1486 buf = connections[0];
1493 if (io.n_outputs() == 0) {
1498 /* XXX we're not handling multiple ports yet. */
1500 const char **connections = io.output(0)->get_connections();
1502 if (connections == 0 || connections[0] == '\0') {
1505 buf = connections[0];
1513 ARDOUR_UI::snapshot_session ()
1515 ArdourPrompter prompter (true);
1522 now = now.substr (0, now.length() - 1);
1524 prompter.set_name ("Prompter");
1525 prompter.set_prompt (_("Name for snapshot"));
1526 prompter.set_initial_text (now);
1528 switch (prompter.run()) {
1529 case RESPONSE_ACCEPT:
1530 prompter.get_result (snapname);
1531 if (snapname.length()){
1532 save_state (snapname);
1542 ARDOUR_UI::save_state (const string & name)
1544 (void) save_state_canfail (name);
1548 ARDOUR_UI::save_state_canfail (string name)
1553 if (name.length() == 0) {
1554 name = session->snap_name();
1557 if ((ret = session->save_state (name)) != 0) {
1561 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1566 ARDOUR_UI::restore_state (string name)
1569 if (name.length() == 0) {
1570 name = session->name();
1572 session->restore_state (name);
1577 ARDOUR_UI::primary_clock_value_changed ()
1580 session->request_locate (primary_clock.current_time ());
1585 ARDOUR_UI::secondary_clock_value_changed ()
1588 session->request_locate (secondary_clock.current_time ());
1593 ARDOUR_UI::rec_enable_button_blink (bool onoff, DiskStream *dstream, Widget *w)
1595 if (session && dstream && dstream->record_enabled()) {
1597 Session::RecordState rs;
1599 rs = session->record_status ();
1602 case Session::Disabled:
1603 case Session::Enabled:
1604 if (w->get_state() != STATE_SELECTED) {
1605 w->set_state (STATE_SELECTED);
1609 case Session::Recording:
1610 if (w->get_state() != STATE_ACTIVE) {
1611 w->set_state (STATE_ACTIVE);
1617 if (w->get_state() != STATE_NORMAL) {
1618 w->set_state (STATE_NORMAL);
1624 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1630 switch (session->record_status()) {
1631 case Session::Enabled:
1633 rec_button.set_state (1);
1635 rec_button.set_state (0);
1639 case Session::Recording:
1640 rec_button.set_state (2);
1644 rec_button.set_state (0);
1650 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1658 ARDOUR_UI::start_keyboard_prefix ()
1660 keyboard->start_prefix();
1664 ARDOUR_UI::save_template ()
1667 ArdourPrompter prompter (true);
1670 prompter.set_name (X_("Prompter"));
1671 prompter.set_prompt (_("Name for mix template:"));
1672 prompter.set_initial_text(session->name() + _("-template"));
1674 switch (prompter.run()) {
1675 case RESPONSE_ACCEPT:
1676 prompter.get_result (name);
1678 if (name.length()) {
1679 session->save_template (name);
1689 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1691 m_new_session_dialog->show_all();
1692 m_new_session_dialog->set_transient_for(*editor);
1693 m_new_session_dialog->set_name(predetermined_path);
1695 int response = Gtk::RESPONSE_CANCEL;
1698 response = m_new_session_dialog->run ();
1700 if(response == Gtk::RESPONSE_OK) {
1702 _session_is_new = true;
1704 std::string session_name = m_new_session_dialog->session_name();
1705 std::string session_path = m_new_session_dialog->session_folder();
1708 XXX This is needed because session constructor wants a
1709 non-existant path. hopefully this will be fixed at some point.
1711 session_path = Glib::build_filename(session_path, session_name);
1713 std::string template_name = m_new_session_dialog->session_template_name();
1715 if (m_new_session_dialog->use_session_template()) {
1717 load_session (session_path, session_name, &template_name);
1723 Session::AutoConnectOption iconnect;
1724 Session::AutoConnectOption oconnect;
1726 if (m_new_session_dialog->create_control_bus()) {
1727 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1732 if (m_new_session_dialog->create_master_bus()) {
1733 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1738 if (m_new_session_dialog->connect_inputs()) {
1739 iconnect = Session::AutoConnectPhysical;
1741 iconnect = Session::AutoConnectOption (0);
1744 /// @todo some minor tweaks.
1746 if (m_new_session_dialog->connect_outs_to_master()) {
1747 oconnect = Session::AutoConnectMaster;
1748 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1749 oconnect = Session::AutoConnectPhysical;
1751 oconnect = Session::AutoConnectOption (0);
1754 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1755 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1757 build_session (session_path,
1765 engine->frame_rate() * 60 * 5);
1769 } while(response == Gtk::RESPONSE_HELP);
1770 m_new_session_dialog->hide_all();
1774 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1776 Session *new_session;
1778 session_loaded = false;
1779 x = unload_session ();
1787 /* if it already exists, we must have write access */
1789 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1790 MessageDialog msg (*editor, _("\
1791 You do not have write access to this session.\n\
1792 This prevents the session from being loaded."));
1798 new_session = new Session (*engine, path, snap_name, mix_template);
1803 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1807 connect_to_session (new_session);
1809 //if (engine->running()) {
1810 //mixer->show_window();
1812 session_loaded = true;
1817 ARDOUR_UI::make_session_clean ()
1820 session->set_clean ();
1827 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1828 uint32_t control_channels,
1829 uint32_t master_channels,
1830 Session::AutoConnectOption input_connect,
1831 Session::AutoConnectOption output_connect,
1834 jack_nframes_t initial_length)
1836 Session *new_session;
1839 session_loaded = false;
1840 x = unload_session ();
1847 _session_is_new = true;
1850 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1851 control_channels, master_channels, nphysin, nphysout, initial_length);
1856 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1860 connect_to_session (new_session);
1862 //if (engine->running()) {
1863 //mixer->show_window();
1865 session_loaded = true;
1873 editor->show_window ();
1877 if (session && mixer) {
1878 // mixer->show_window ();
1887 ARDOUR_UI::show_splash ()
1890 about = new About();
1896 ARDOUR_UI::hide_splash ()
1904 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1908 removed = rep.paths.size();
1911 MessageDialog msg (*editor, X_("cleanupresults"),
1913 No audio files were ready for cleanup\n\n\
1914 If this seems suprising, check for any existing\n\
1915 snapshots. These may still include regions that\n\
1916 require some unused files to continue to exist."));
1921 ArdourDialog results (_("ardour: cleanup"), true);
1923 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1924 CleanupResultsModelColumns() {
1928 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1929 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1933 Glib::RefPtr<Gtk::ListStore> results_model;
1934 CleanupResultsModelColumns results_columns;
1935 Gtk::TreeView results_display;
1937 results_model = ListStore::create (results_columns);
1938 results_display.set_model (results_model);
1939 results_display.append_column (list_title, results_columns.visible_name);
1940 results_display.set_headers_visible (true);
1942 Gtk::ScrolledWindow list_scroller;
1945 if (rep.space < 1048576.0f) {
1947 txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1024.0f, "kilo"));
1949 txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1024.0f, "kilo"));
1953 txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1048576.0f, "mega"));
1955 txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1048576.0f, "mega"));
1959 results.get_vbox()->pack_start (txt, false, false);
1961 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1962 TreeModel::Row row = *(results_model->append());
1963 row[results_columns.visible_name] = *i;
1964 row[results_columns.fullpath] = *i;
1967 list_scroller.add (results_display);
1968 list_scroller.set_size_request (-1, 250);
1969 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
1971 results.get_vbox()->pack_start (list_scroller, true, true);
1972 results.add_button (Stock::OK, RESPONSE_ACCEPT);
1973 results.set_position (Gtk::WIN_POS_MOUSE);
1979 ARDOUR_UI::cleanup ()
1982 /* shouldn't happen: menu item is insensitive */
1986 ArdourDialog checker (_("ardour cleanup"));
1987 Gtk::Label label (_("\
1988 Cleanup is a destructive operation.\n\
1989 ALL undo/redo information will be lost if you cleanup.\n\
1990 Unused audio files will be moved to a \"dead sounds\" location."));
1992 checker.get_vbox()->pack_start (label, false, false);
1993 checker.add_button (Stock::OK, RESPONSE_ACCEPT);
1994 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
1996 checker.set_name (_("CleanupDialog"));
1997 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
1998 checker.set_position (Gtk::WIN_POS_MOUSE);
2000 switch (checker.run()) {
2001 case RESPONSE_ACCEPT:
2007 Session::cleanup_report rep;
2009 editor->prepare_for_cleanup ();
2011 if (session->cleanup_sources (rep)) {
2015 display_cleanup_results (rep,
2018 The following %1 %2 were not in use.\n\
2019 The next time you flush the wastebasket\n\
2020 it will release an additional %3 %4bytes\n\
2026 ARDOUR_UI::flush_trash ()
2029 /* shouldn't happen: menu item is insensitive */
2033 Session::cleanup_report rep;
2035 if (session->cleanup_trash_sources (rep)) {
2039 display_cleanup_results (rep,
2041 _("The following %1 file%2 were deleted, releasing %3 %4bytes of disk space"));
2045 ARDOUR_UI::add_route ()
2053 if (add_route_dialog == 0) {
2054 add_route_dialog = new AddRouteDialog;
2055 editor->ensure_float (*add_route_dialog);
2058 if (add_route_dialog->is_visible()) {
2059 /* we're already doing this */
2063 ResponseType r = (ResponseType) add_route_dialog->run ();
2065 add_route_dialog->hide();
2068 case RESPONSE_ACCEPT:
2075 if ((count = add_route_dialog->count()) <= 0) {
2079 uint32_t input_chan = add_route_dialog->channels ();
2080 uint32_t output_chan;
2081 string name_template = add_route_dialog->name_template ();
2082 bool track = add_route_dialog->track ();
2084 Session::AutoConnectOption oac = session->get_output_auto_connect();
2086 if (oac & Session::AutoConnectMaster) {
2087 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2089 output_chan = input_chan;
2092 /* XXX do something with name template */
2096 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2098 session_add_audio_bus (input_chan, output_chan);
2102 while (Main::events_pending()) {
2109 ARDOUR_UI::mixer_settings () const
2114 node = session->instant_xml(X_("Mixer"), session->path());
2116 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2120 node = new XMLNode (X_("Mixer"));
2127 ARDOUR_UI::editor_settings () const
2132 node = session->instant_xml(X_("Editor"), session->path());
2134 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2138 node = new XMLNode (X_("Editor"));
2144 ARDOUR_UI::keyboard_settings () const
2148 node = Config->extra_xml(X_("Keyboard"));
2151 node = new XMLNode (X_("Keyboard"));
2157 ARDOUR_UI::halt_on_xrun_message ()
2159 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2161 MessageDialog msg (*editor,
2162 _("Recording was stopped because your system could not keep up."));
2167 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::Source*>* deletion_list)
2169 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2171 for (list<Source*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2175 delete deletion_list;
2179 ARDOUR_UI::disk_overrun_handler ()
2181 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2183 if (!have_disk_overrun_displayed) {
2184 have_disk_overrun_displayed = true;
2185 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2186 The disk system on your computer\n\
2187 was not able to keep up with Ardour.\n\
2189 Specifically, it failed to write data to disk\n\
2190 quickly enough to keep up with recording.\n"));
2192 have_disk_overrun_displayed = false;
2197 ARDOUR_UI::disk_underrun_handler ()
2199 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2201 if (!have_disk_underrun_displayed) {
2202 have_disk_underrun_displayed = true;
2203 MessageDialog msg (*editor,
2204 (_("The disk system on your computer\n\
2205 was not able to keep up with Ardour.\n\
2207 Specifically, it failed to read data from disk\n\
2208 quickly enough to keep up with playback.\n")));
2210 have_disk_underrun_displayed = false;
2215 ARDOUR_UI::disk_underrun_message_gone ()
2217 have_disk_underrun_displayed = false;
2221 ARDOUR_UI::disk_overrun_message_gone ()
2223 have_disk_underrun_displayed = false;
2227 ARDOUR_UI::pending_state_dialog ()
2229 ArdourDialog dialog ("pending state dialog");
2231 This session appears to have been in\n\
2232 middle of recording when ardour or\n\
2233 the computer was shutdown.\n\
2235 Ardour can recover any captured audio for\n\
2236 you, or it can ignore it. Please decide\n\
2237 what you would like to do.\n"));
2239 dialog.get_vbox()->pack_start (message);
2240 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2241 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2243 dialog.set_position (WIN_POS_CENTER);
2246 switch (dialog.run ()) {
2247 case RESPONSE_ACCEPT:
2255 ARDOUR_UI::disconnect_from_jack ()
2258 if( engine->disconnect_from_jack ()) {
2259 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2263 update_sample_rate (0);
2268 ARDOUR_UI::reconnect_to_jack ()
2271 if (engine->reconnect_to_jack ()) {
2272 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2276 update_sample_rate (0);
2281 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2283 engine->request_buffer_size (nframes);
2284 update_sample_rate (0);
2288 ARDOUR_UI::cmdline_new_session (string path)
2290 if (path[0] != '/') {
2291 char buf[PATH_MAX+1];
2294 getcwd (buf, sizeof (buf));
2301 new_session (false, path);
2303 _will_create_new_session_automatically = false; /* done it */
2304 return FALSE; /* don't call it again */
2308 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2310 Glib::RefPtr<Action> act;
2314 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2317 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2320 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2323 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2326 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2331 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2332 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2333 Config->set_native_file_header_format (hf);
2335 session->reset_native_file_format ();
2342 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2344 Glib::RefPtr<Action> act;
2348 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2351 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2356 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2358 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2359 Config->set_native_file_data_format (sf);
2361 session->reset_native_file_format ();
2368 ARDOUR_UI::use_config ()
2370 Glib::RefPtr<Action> act;
2372 switch (Config->get_native_file_data_format ()) {
2374 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2377 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2382 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2383 ract->set_active ();
2386 switch (Config->get_native_file_header_format ()) {
2388 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2391 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2394 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2397 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2400 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2405 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2406 ract->set_active ();