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::HBox dhbox; // the hbox for the image and text
440 Gtk::Label prompt_label;
441 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG));
443 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
447 msg = string_compose(_("Don't %1"), what);
448 window.add_button (msg, RESPONSE_REJECT);
449 msg = string_compose(_("Just %1"), what);
450 window.add_button (msg, RESPONSE_APPLY);
451 msg = string_compose(_("Save and %1"), what);
452 window.add_button (msg, RESPONSE_ACCEPT);
454 window.set_default_response (RESPONSE_ACCEPT);
456 Gtk::Button noquit_button (msg);
457 noquit_button.set_name ("EditorGTKButton");
462 if (session->snap_name() == session->name()) {
465 type = _("snapshot");
467 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?"),
468 type, session->snap_name());
470 prompt_label.set_text (prompt);
471 prompt_label.set_name (X_("PrompterLabel"));
472 prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP);
473 dhbox.pack_start (*dimage, true, false, 5);
474 dhbox.pack_start (prompt_label, true, false, 5);
475 window.get_vbox()->pack_start (dhbox);
477 window.set_name (_("Prompter"));
478 window.set_position (Gtk::WIN_POS_MOUSE);
479 window.set_modal (true);
480 window.set_resizable (false);
483 save_the_session = 0;
485 editor->ensure_float (window);
487 ResponseType r = (ResponseType) window.run();
492 case RESPONSE_ACCEPT: // save and get out of here
494 case RESPONSE_APPLY: // get out of here
504 ARDOUR_UI::every_second ()
507 update_buffer_load ();
508 update_disk_space ();
513 ARDOUR_UI::every_point_one_seconds ()
515 update_speed_display ();
516 RapidScreenUpdate(); /* EMIT_SIGNAL */
521 ARDOUR_UI::every_point_zero_one_seconds ()
523 SuperRapidScreenUpdate(); /* EMIT_SIGNAL */
528 ARDOUR_UI::update_sample_rate (jack_nframes_t ignored)
532 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::update_sample_rate), ignored));
534 if (!engine->connected()) {
536 snprintf (buf, sizeof (buf), _("disconnected"));
540 jack_nframes_t rate = engine->frame_rate();
542 if (fmod (rate, 1000.0) != 0.0) {
543 snprintf (buf, sizeof (buf), _("SR: %.1f kHz / %4.1f msecs"),
544 (float) rate/1000.0f,
545 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
547 snprintf (buf, sizeof (buf), _("SR: %u kHz / %4.1f msecs"),
549 (engine->frames_per_cycle() / (float) rate) * 1000.0f);
553 sample_rate_label.set_text (buf);
557 ARDOUR_UI::update_cpu_load ()
560 snprintf (buf, sizeof (buf), _("DSP Load: %.1f%%"), engine->get_cpu_load());
561 cpu_load_label.set_text (buf);
565 ARDOUR_UI::update_buffer_load ()
570 snprintf (buf, sizeof (buf), _("Buffers p:%" PRIu32 "%% c:%" PRIu32 "%%"),
571 session->playback_load(), session->capture_load());
572 buffer_load_label.set_text (buf);
574 buffer_load_label.set_text ("");
579 ARDOUR_UI::count_recenabled_diskstreams (DiskStream& ds)
581 if (ds.record_enabled()) {
582 rec_enabled_diskstreams++;
587 ARDOUR_UI::update_disk_space()
593 jack_nframes_t frames = session->available_capture_duration();
596 if (frames == max_frames) {
597 strcpy (buf, _("space: 24hrs+"));
602 jack_nframes_t fr = session->frame_rate();
604 if (session->actively_recording()){
606 rec_enabled_diskstreams = 0;
607 session->foreach_diskstream (this, &ARDOUR_UI::count_recenabled_diskstreams);
609 if (rec_enabled_diskstreams) {
610 frames /= rec_enabled_diskstreams;
615 /* hmmm. shall we divide by the route count? or the diskstream count?
616 or what? for now, do nothing ...
621 hrs = frames / (fr * 3600);
622 frames -= hrs * fr * 3600;
623 mins = frames / (fr * 60);
624 frames -= mins * fr * 60;
627 snprintf (buf, sizeof(buf), _("space: %02dh:%02dm:%02ds"), hrs, mins, secs);
630 disk_space_label.set_text (buf);
634 ARDOUR_UI::update_wall_clock ()
641 tm_now = localtime (&now);
643 sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min);
644 wall_clock_label.set_text (buf);
649 ARDOUR_UI::control_methods_adjusted ()
654 which_method = (int) online_control_button->adjustment.get_value();
655 switch (which_method) {
657 allow_mmc_and_local ();
666 fatal << _("programming error: impossible control method") << endmsg;
672 ARDOUR_UI::mmc_device_id_adjusted ()
677 int dev_id = (int) mmc_id_button->adjustment.get_value();
678 mmc->set_device_id (dev_id);
684 ARDOUR_UI::session_menu (GdkEventButton *ev)
686 session_popup_menu->popup (0, 0);
691 ARDOUR_UI::redisplay_recent_sessions ()
693 vector<string *> *sessions;
694 vector<string *>::iterator i;
695 RecentSessionsSorter cmp;
697 recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
698 recent_session_model->clear ();
701 ARDOUR::read_recent_sessions (rs);
704 recent_session_display.set_model (recent_session_model);
708 /* sort them alphabetically */
709 sort (rs.begin(), rs.end(), cmp);
710 sessions = new vector<string*>;
712 for (RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
713 sessions->push_back (new string ((*i).second));
716 for (i = sessions->begin(); i != sessions->end(); ++i) {
718 vector<string*>* states;
719 vector<const gchar*> item;
720 string fullpath = *(*i);
722 /* remove any trailing / */
724 if (fullpath[fullpath.length()-1] == '/') {
725 fullpath = fullpath.substr (0, fullpath.length()-1);
728 /* now get available states for this session */
730 if ((states = Session::possible_states (fullpath)) == 0) {
735 TreeModel::Row row = *(recent_session_model->append());
737 row[recent_session_columns.visible_name] = PBD::basename (fullpath);
738 row[recent_session_columns.fullpath] = fullpath;
740 if (states->size() > 1) {
742 /* add the children */
744 for (vector<string*>::iterator i2 = states->begin(); i2 != states->end(); ++i2) {
746 TreeModel::Row child_row = *(recent_session_model->append (row.children()));
748 child_row[recent_session_columns.visible_name] = **i2;
749 child_row[recent_session_columns.fullpath] = fullpath;
758 recent_session_display.set_model (recent_session_model);
763 ARDOUR_UI::build_session_selector ()
765 session_selector_window = new ArdourDialog ("session selector");
767 Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow);
769 session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL);
770 session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT);
771 session_selector_window->set_default_response (RESPONSE_ACCEPT);
772 recent_session_model = TreeStore::create (recent_session_columns);
773 recent_session_display.set_model (recent_session_model);
774 recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
775 recent_session_display.set_headers_visible (false);
776 recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
778 recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated));
780 scroller->add (recent_session_display);
781 scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
783 session_selector_window->set_name ("SessionSelectorWindow");
784 session_selector_window->set_size_request (200, 400);
785 session_selector_window->get_vbox()->pack_start (*scroller);
786 session_selector_window->show_all_children();
790 ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col)
792 session_selector_window->response (RESPONSE_ACCEPT);
796 ARDOUR_UI::open_recent_session ()
798 /* popup selector window */
800 if (session_selector_window == 0) {
801 build_session_selector ();
804 redisplay_recent_sessions ();
806 ResponseType r = (ResponseType) session_selector_window->run ();
808 session_selector_window->hide();
811 case RESPONSE_ACCEPT:
817 Gtk::TreeModel::iterator i = recent_session_display.get_selection()->get_selected();
819 if (i == recent_session_model->children().end()) {
823 Glib::ustring path = (*i)[recent_session_columns.fullpath];
824 Glib::ustring state = (*i)[recent_session_columns.visible_name];
826 _session_is_new = false;
828 load_session (path, state);
832 ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info)
836 if (stat (info.filename.c_str(), &statbuf) != 0) {
840 if (!S_ISDIR(statbuf.st_mode)) {
844 string session_file = info.filename;
846 session_file += PBD::basename (info.filename);
847 session_file += ".ardour";
849 if (stat (session_file.c_str(), &statbuf) != 0) {
853 return S_ISREG (statbuf.st_mode);
857 ARDOUR_UI::open_session ()
859 /* popup selector window */
861 if (open_session_selector == 0) {
863 /* ardour sessions are folders */
865 open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
866 open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
867 open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
869 FileFilter session_filter;
870 session_filter.add_pattern ("*.ardour");
871 session_filter.set_name (_("Ardour sessions"));
872 open_session_selector->add_filter (session_filter);
873 open_session_selector->set_filter (session_filter);
876 int response = open_session_selector->run();
877 open_session_selector->hide ();
880 case RESPONSE_ACCEPT:
883 open_session_selector->hide();
887 open_session_selector->hide();
888 string session_path = open_session_selector->get_filename();
892 if (session_path.length() > 0) {
893 if (Session::find_session (session_path, path, name, isnew) == 0) {
894 _session_is_new = isnew;
895 load_session (path, name);
902 ARDOUR_UI::session_add_midi_track ()
904 cerr << _("Patience is a virtue.\n");
908 ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode)
913 warning << _("You cannot add a track without a session already loaded.") << endmsg;
919 if ((route = session->new_audio_track (input_channels, output_channels, mode)) == 0) {
920 error << _("could not create new audio track") << endmsg;
923 if ((route = session->new_audio_route (input_channels, output_channels)) == 0) {
924 error << _("could not create new audio bus") << endmsg;
929 if (need_control_room_outs) {
935 route->set_stereo_control_outs (control_lr_channels);
936 route->control_outs()->set_stereo_pan (pans, this);
938 #endif /* CONTROLOUTS */
942 MessageDialog msg (*editor,
943 _("There are insufficient JACK ports available\n\
944 to create a new track or bus.\n\
945 You should save Ardour, exit and\n\
946 restart JACK with more ports."));
952 ARDOUR_UI::diskstream_added (DiskStream* ds)
957 ARDOUR_UI::do_transport_locate (jack_nframes_t new_position)
959 jack_nframes_t _preroll;
962 _preroll = session->convert_to_frames_at (new_position, session->preroll);
964 if (new_position > _preroll) {
965 new_position -= _preroll;
970 session->request_locate (new_position);
975 ARDOUR_UI::transport_goto_start ()
978 session->goto_start();
981 /* force displayed area in editor to start no matter
982 what "follow playhead" setting is.
986 editor->reposition_x_origin (session->current_start_frame());
992 ARDOUR_UI::transport_goto_zero ()
995 session->request_locate (0);
998 /* force displayed area in editor to start no matter
999 what "follow playhead" setting is.
1003 editor->reposition_x_origin (0);
1009 ARDOUR_UI::transport_goto_end ()
1012 jack_nframes_t frame = session->current_end_frame();
1013 session->request_locate (frame);
1015 /* force displayed area in editor to start no matter
1016 what "follow playhead" setting is.
1020 editor->reposition_x_origin (frame);
1026 ARDOUR_UI::transport_stop ()
1032 if (session->is_auditioning()) {
1033 session->cancel_audition ();
1037 if (session->get_auto_loop()) {
1038 session->request_auto_loop (false);
1041 session->request_stop ();
1045 ARDOUR_UI::transport_stop_and_forget_capture ()
1048 session->request_stop (true);
1053 ARDOUR_UI::remove_last_capture()
1056 editor->remove_last_capture();
1061 ARDOUR_UI::transport_record ()
1064 switch (session->record_status()) {
1065 case Session::Disabled:
1066 if (session->ntracks() == 0) {
1067 string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.");
1068 MessageDialog msg (*editor, txt);
1072 session->maybe_enable_record ();
1074 case Session::Recording:
1075 case Session::Enabled:
1076 session->disable_record (true);
1082 ARDOUR_UI::transport_roll ()
1090 rolling = session->transport_rolling ();
1092 if (session->get_auto_loop()) {
1093 session->request_auto_loop (false);
1094 auto_loop_button.set_active (false);
1095 roll_button.set_active (true);
1096 } else if (session->get_play_range ()) {
1097 session->request_play_range (false);
1098 play_selection_button.set_active (false);
1099 } else if (rolling) {
1100 session->request_locate (session->last_transport_start(), true);
1103 session->request_transport_speed (1.0f);
1107 ARDOUR_UI::transport_loop()
1110 if (session->get_auto_loop()) {
1111 if (session->transport_rolling()) {
1112 Location * looploc = session->locations()->auto_loop_location();
1114 session->request_locate (looploc->start(), true);
1119 session->request_auto_loop (true);
1125 ARDOUR_UI::transport_play_selection ()
1131 if (!session->get_play_range()) {
1132 session->request_stop ();
1135 editor->play_selection ();
1139 ARDOUR_UI::transport_rewind (int option)
1141 float current_transport_speed;
1144 current_transport_speed = session->transport_speed();
1146 if (current_transport_speed >= 0.0f) {
1149 session->request_transport_speed (-1.0f);
1152 session->request_transport_speed (-4.0f);
1155 session->request_transport_speed (-0.5f);
1160 session->request_transport_speed (current_transport_speed * 1.5f);
1166 ARDOUR_UI::transport_forward (int option)
1168 float current_transport_speed;
1171 current_transport_speed = session->transport_speed();
1173 if (current_transport_speed <= 0.0f) {
1176 session->request_transport_speed (1.0f);
1179 session->request_transport_speed (4.0f);
1182 session->request_transport_speed (0.5f);
1187 session->request_transport_speed (current_transport_speed * 1.5f);
1193 ARDOUR_UI::toggle_monitor_enable (guint32 dstream)
1201 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1202 Port *port = ds->io()->input (0);
1203 port->request_monitor_input (!port->monitoring_input());
1208 ARDOUR_UI::toggle_record_enable (guint32 dstream)
1216 if ((ds = session->diskstream_by_id (dstream)) != 0) {
1217 ds->set_record_enabled (!ds->record_enabled(), this);
1222 ARDOUR_UI::queue_transport_change ()
1224 Gtkmm2ext::UI::instance()->call_slot (mem_fun(*this, &ARDOUR_UI::map_transport_state));
1228 ARDOUR_UI::map_transport_state ()
1230 float sp = session->transport_speed();
1233 transport_rolling ();
1234 } else if (sp < 0.0f) {
1235 transport_rewinding ();
1236 } else if (sp > 0.0f) {
1237 transport_forwarding ();
1239 transport_stopped ();
1244 ARDOUR_UI::allow_local_only ()
1250 ARDOUR_UI::allow_mmc_only ()
1256 ARDOUR_UI::allow_mmc_and_local ()
1262 ARDOUR_UI::GlobalClickBox::printer (char buf[32], Adjustment &adj, void *arg)
1264 snprintf (buf, sizeof(buf), "%s", ((GlobalClickBox *) arg)->strings[
1265 (int) adj.get_value()].c_str());
1269 ARDOUR_UI::engine_stopped ()
1271 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_stopped));
1272 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1273 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1278 ARDOUR_UI::engine_running ()
1280 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_running));
1281 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, true);
1282 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, false);
1286 ARDOUR_UI::engine_halted ()
1288 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::engine_halted));
1290 ActionManager::set_sensitive (ActionManager::jack_sensitive_actions, false);
1291 ActionManager::set_sensitive (ActionManager::jack_opposite_sensitive_actions, true);
1293 update_sample_rate (0);
1295 MessageDialog msg (*editor,
1297 JACK has either been shutdown or it\n\
1298 disconnected Ardour because Ardour\n\
1299 was not fast enough. You can save the\n\
1300 session and/or try to reconnect to JACK ."));
1305 ARDOUR_UI::do_engine_start ()
1311 catch (AudioEngine::PortRegistrationFailure& err) {
1313 error << _("Unable to create all required ports")
1321 error << _("Unable to start the session running")
1331 ARDOUR_UI::start_engine ()
1333 if (do_engine_start () == 0) {
1334 if (session && _session_is_new) {
1335 /* we need to retain initial visual
1336 settings for a new session
1338 session->save_state ("");
1341 /* there is too much going on, in too many threads, for us to
1342 end up with a clean session. So wait 1 second after loading,
1343 and fix it up. its ugly, but until i come across a better
1344 solution, its what we have.
1347 Glib::signal_timeout().connect (mem_fun(*this, &ARDOUR_UI::make_session_clean), 1000);
1354 ARDOUR_UI::update_clocks ()
1356 Clock (session->audible_frame()); /* EMIT_SIGNAL */
1360 ARDOUR_UI::start_clocking ()
1362 clock_signal_connection = RapidScreenUpdate.connect (mem_fun(*this, &ARDOUR_UI::update_clocks));
1366 ARDOUR_UI::stop_clocking ()
1368 clock_signal_connection.disconnect ();
1372 ARDOUR_UI::toggle_clocking ()
1375 if (clock_button.get_active()) {
1384 ARDOUR_UI::_blink (void *arg)
1387 ((ARDOUR_UI *) arg)->blink ();
1394 Blink (blink_on = !blink_on); /* EMIT_SIGNAL */
1398 ARDOUR_UI::start_blinking ()
1400 /* Start the blink signal. Everybody with a blinking widget
1401 uses Blink to drive the widget's state.
1404 if (blink_timeout_tag < 0) {
1406 blink_timeout_tag = gtk_timeout_add (240, _blink, this);
1411 ARDOUR_UI::stop_blinking ()
1413 if (blink_timeout_tag >= 0) {
1414 gtk_timeout_remove (blink_timeout_tag);
1415 blink_timeout_tag = -1;
1421 ARDOUR_UI::add_diskstream_to_menu (DiskStream& dstream)
1423 using namespace Gtk;
1424 using namespace Menu_Helpers;
1426 if (dstream.hidden()) {
1430 MenuList& items = diskstream_menu->items();
1431 items.push_back (MenuElem (dstream.name(), bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), (gint32) dstream.id())));
1435 ARDOUR_UI::diskstream_selected (gint32 id)
1437 selected_dstream = id;
1442 ARDOUR_UI::select_diskstream (GdkEventButton *ev)
1444 using namespace Gtk;
1445 using namespace Menu_Helpers;
1451 diskstream_menu = new Menu();
1452 diskstream_menu->set_name ("ArdourContextMenu");
1453 using namespace Gtk;
1454 using namespace Menu_Helpers;
1456 MenuList& items = diskstream_menu->items();
1457 items.push_back (MenuElem (_("No Stream"), (bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), -1))));
1459 session->foreach_diskstream (this, &ARDOUR_UI::add_diskstream_to_menu);
1462 diskstream_menu->popup (ev->button, ev->time);
1464 diskstream_menu->popup (0, 0);
1467 selected_dstream = -1;
1471 delete diskstream_menu;
1473 return selected_dstream;
1477 ARDOUR_UI::name_io_setup (AudioEngine& engine,
1483 if (io.n_inputs() == 0) {
1488 /* XXX we're not handling multiple ports yet. */
1490 const char **connections = io.input(0)->get_connections();
1492 if (connections == 0 || connections[0] == '\0') {
1495 buf = connections[0];
1502 if (io.n_outputs() == 0) {
1507 /* XXX we're not handling multiple ports yet. */
1509 const char **connections = io.output(0)->get_connections();
1511 if (connections == 0 || connections[0] == '\0') {
1514 buf = connections[0];
1522 ARDOUR_UI::snapshot_session ()
1524 ArdourPrompter prompter (true);
1531 now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")";
1533 prompter.set_name ("Prompter");
1534 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1535 prompter.set_prompt (_("Name of New Snapshot"));
1536 prompter.set_initial_text (now);
1538 switch (prompter.run()) {
1539 case RESPONSE_ACCEPT:
1540 prompter.get_result (snapname);
1541 if (snapname.length()){
1542 save_state (snapname);
1552 ARDOUR_UI::save_state (const string & name)
1554 (void) save_state_canfail (name);
1558 ARDOUR_UI::save_state_canfail (string name)
1563 if (name.length() == 0) {
1564 name = session->snap_name();
1567 if ((ret = session->save_state (name)) != 0) {
1571 save_ardour_state (); /* XXX cannot fail? yeah, right ... */
1576 ARDOUR_UI::restore_state (string name)
1579 if (name.length() == 0) {
1580 name = session->name();
1582 session->restore_state (name);
1587 ARDOUR_UI::primary_clock_value_changed ()
1590 session->request_locate (primary_clock.current_time ());
1595 ARDOUR_UI::secondary_clock_value_changed ()
1598 session->request_locate (secondary_clock.current_time ());
1603 ARDOUR_UI::rec_enable_button_blink (bool onoff, DiskStream *dstream, Widget *w)
1605 if (session && dstream && dstream->record_enabled()) {
1607 Session::RecordState rs;
1609 rs = session->record_status ();
1612 case Session::Disabled:
1613 case Session::Enabled:
1614 if (w->get_state() != STATE_SELECTED) {
1615 w->set_state (STATE_SELECTED);
1619 case Session::Recording:
1620 if (w->get_state() != STATE_ACTIVE) {
1621 w->set_state (STATE_ACTIVE);
1627 if (w->get_state() != STATE_NORMAL) {
1628 w->set_state (STATE_NORMAL);
1634 ARDOUR_UI::transport_rec_enable_blink (bool onoff)
1640 switch (session->record_status()) {
1641 case Session::Enabled:
1643 rec_button.set_state (1);
1645 rec_button.set_state (0);
1649 case Session::Recording:
1650 rec_button.set_state (2);
1654 rec_button.set_state (0);
1660 ARDOUR_UI::hide_and_quit (GdkEventAny *ev, ArdourDialog *window)
1668 ARDOUR_UI::start_keyboard_prefix ()
1670 keyboard->start_prefix();
1674 ARDOUR_UI::save_template ()
1677 ArdourPrompter prompter (true);
1680 prompter.set_name (X_("Prompter"));
1681 prompter.set_prompt (_("Name for mix template:"));
1682 prompter.set_initial_text(session->name() + _("-template"));
1683 prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
1685 switch (prompter.run()) {
1686 case RESPONSE_ACCEPT:
1687 prompter.get_result (name);
1689 if (name.length()) {
1690 session->save_template (name);
1700 ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
1702 m_new_session_dialog->show_all();
1703 m_new_session_dialog->set_transient_for(*editor);
1704 m_new_session_dialog->set_name(predetermined_path);
1706 int response = Gtk::RESPONSE_CANCEL;
1709 response = m_new_session_dialog->run ();
1711 if(response == Gtk::RESPONSE_OK) {
1713 _session_is_new = true;
1715 std::string session_name = m_new_session_dialog->session_name();
1716 std::string session_path = m_new_session_dialog->session_folder();
1719 XXX This is needed because session constructor wants a
1720 non-existant path. hopefully this will be fixed at some point.
1722 session_path = Glib::build_filename(session_path, session_name);
1724 std::string template_name = m_new_session_dialog->session_template_name();
1726 if (m_new_session_dialog->use_session_template()) {
1728 load_session (session_path, session_name, &template_name);
1734 Session::AutoConnectOption iconnect;
1735 Session::AutoConnectOption oconnect;
1737 if (m_new_session_dialog->create_control_bus()) {
1738 cchns = (uint32_t) m_new_session_dialog->control_channel_count();
1743 if (m_new_session_dialog->create_master_bus()) {
1744 mchns = (uint32_t) m_new_session_dialog->master_channel_count();
1749 if (m_new_session_dialog->connect_inputs()) {
1750 iconnect = Session::AutoConnectPhysical;
1752 iconnect = Session::AutoConnectOption (0);
1755 /// @todo some minor tweaks.
1757 if (m_new_session_dialog->connect_outs_to_master()) {
1758 oconnect = Session::AutoConnectMaster;
1759 } else if (m_new_session_dialog->connect_outs_to_physical()) {
1760 oconnect = Session::AutoConnectPhysical;
1762 oconnect = Session::AutoConnectOption (0);
1765 uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count();
1766 uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count();
1768 build_session (session_path,
1776 engine->frame_rate() * 60 * 5);
1780 } while(response == Gtk::RESPONSE_HELP);
1781 m_new_session_dialog->hide_all();
1785 ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template)
1787 Session *new_session;
1789 session_loaded = false;
1790 x = unload_session ();
1798 /* if it already exists, we must have write access */
1800 if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
1801 MessageDialog msg (*editor, _("\
1802 You do not have write access to this session.\n\
1803 This prevents the session from being loaded."));
1809 new_session = new Session (*engine, path, snap_name, mix_template);
1814 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1818 connect_to_session (new_session);
1820 //if (engine->running()) {
1821 //mixer->show_window();
1823 session_loaded = true;
1828 ARDOUR_UI::make_session_clean ()
1831 session->set_clean ();
1838 ARDOUR_UI::build_session (const string & path, const string & snap_name,
1839 uint32_t control_channels,
1840 uint32_t master_channels,
1841 Session::AutoConnectOption input_connect,
1842 Session::AutoConnectOption output_connect,
1845 jack_nframes_t initial_length)
1847 Session *new_session;
1850 session_loaded = false;
1851 x = unload_session ();
1858 _session_is_new = true;
1861 new_session = new Session (*engine, path, snap_name, input_connect, output_connect,
1862 control_channels, master_channels, nphysin, nphysout, initial_length);
1867 error << string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name) << endmsg;
1871 connect_to_session (new_session);
1873 //if (engine->running()) {
1874 //mixer->show_window();
1876 session_loaded = true;
1884 editor->show_window ();
1888 if (session && mixer) {
1889 // mixer->show_window ();
1898 ARDOUR_UI::show_splash ()
1901 about = new About();
1907 ARDOUR_UI::hide_splash ()
1915 ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
1919 removed = rep.paths.size();
1922 MessageDialog msgd (*editor,
1923 _("No audio files were ready for cleanup"),
1926 (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) );
1927 msgd.set_secondary_text (_("If this seems suprising, \n\
1928 check for any existing snapshots.\n\
1929 These may still include regions that\n\
1930 require some unused files to continue to exist."));
1936 ArdourDialog results (_("ardour: cleanup"), true, false);
1938 struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord {
1939 CleanupResultsModelColumns() {
1943 Gtk::TreeModelColumn<Glib::ustring> visible_name;
1944 Gtk::TreeModelColumn<Glib::ustring> fullpath;
1948 CleanupResultsModelColumns results_columns;
1949 Glib::RefPtr<Gtk::ListStore> results_model;
1950 Gtk::TreeView results_display;
1952 results_model = ListStore::create (results_columns);
1953 results_display.set_model (results_model);
1954 results_display.append_column (list_title, results_columns.visible_name);
1956 results_display.set_name ("CleanupResultsList");
1957 results_display.set_headers_visible (true);
1958 results_display.set_headers_clickable (false);
1959 results_display.set_reorderable (false);
1961 Gtk::ScrolledWindow list_scroller;
1964 Gtk::HBox dhbox; // the hbox for the image and text
1965 Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox
1966 Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG));
1968 dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
1970 if (rep.space < 1048576.0f) {
1972 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1974 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
1978 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1980 txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
1984 dhbox.pack_start (*dimage, true, false, 5);
1985 dhbox.pack_start (txt, true, false, 5);
1987 for (vector<string>::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) {
1988 TreeModel::Row row = *(results_model->append());
1989 row[results_columns.visible_name] = *i;
1990 row[results_columns.fullpath] = *i;
1993 list_scroller.add (results_display);
1994 list_scroller.set_size_request (-1, 150);
1995 list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
1997 dvbox.pack_start (dhbox, true, false, 5);
1998 dvbox.pack_start (list_scroller, true, false, 5);
1999 ddhbox.pack_start (dvbox, true, false, 5);
2001 results.get_vbox()->pack_start (ddhbox, true, false, 5);
2002 results.add_button (Stock::CLOSE, RESPONSE_CLOSE);
2003 results.set_default_response (RESPONSE_CLOSE);
2004 results.set_position (Gtk::WIN_POS_MOUSE);
2005 results.show_all_children ();
2006 results.set_resizable (false);
2013 ARDOUR_UI::cleanup ()
2016 /* shouldn't happen: menu item is insensitive */
2021 MessageDialog checker (_("Are you sure you want to cleanup?"),
2023 Gtk::MESSAGE_QUESTION,
2024 (Gtk::ButtonsType)(Gtk::BUTTONS_NONE));
2026 checker.set_secondary_text(_("Cleanup is a destructive operation.\n\
2027 ALL undo/redo information will be lost if you cleanup.\n\
2028 After cleanup, unused audio files will be moved to a \
2029 \"dead sounds\" location."));
2031 checker.add_button (Stock::CANCEL, RESPONSE_CANCEL);
2032 checker.add_button (_("Clean Up"), RESPONSE_ACCEPT);
2033 checker.set_default_response (RESPONSE_CANCEL);
2035 checker.set_name (_("CleanupDialog"));
2036 checker.set_wmclass (_("ardour_cleanup"), "Ardour");
2037 checker.set_position (Gtk::WIN_POS_MOUSE);
2039 switch (checker.run()) {
2040 case RESPONSE_ACCEPT:
2046 Session::cleanup_report rep;
2048 editor->prepare_for_cleanup ();
2050 if (session->cleanup_sources (rep)) {
2054 display_cleanup_results (rep,
2057 The following %1 %2 not in use and \n\
2058 have been moved to:\n\
2060 Flushing the wastebasket will \n\
2061 release an additional\n\
2062 %4 %5bytes of disk space.\n"
2067 ARDOUR_UI::flush_trash ()
2070 /* shouldn't happen: menu item is insensitive */
2074 Session::cleanup_report rep;
2076 if (session->cleanup_trash_sources (rep)) {
2080 display_cleanup_results (rep,
2082 _("The following %1 %2 deleted from\n\
2084 releasing %4 %5bytes of disk space"));
2088 ARDOUR_UI::add_route ()
2096 if (add_route_dialog == 0) {
2097 add_route_dialog = new AddRouteDialog;
2098 editor->ensure_float (*add_route_dialog);
2101 if (add_route_dialog->is_visible()) {
2102 /* we're already doing this */
2106 ResponseType r = (ResponseType) add_route_dialog->run ();
2108 add_route_dialog->hide();
2111 case RESPONSE_ACCEPT:
2118 if ((count = add_route_dialog->count()) <= 0) {
2122 uint32_t input_chan = add_route_dialog->channels ();
2123 uint32_t output_chan;
2124 string name_template = add_route_dialog->name_template ();
2125 bool track = add_route_dialog->track ();
2127 Session::AutoConnectOption oac = session->get_output_auto_connect();
2129 if (oac & Session::AutoConnectMaster) {
2130 output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan);
2132 output_chan = input_chan;
2135 /* XXX do something with name template */
2139 session_add_audio_track (input_chan, output_chan, add_route_dialog->mode());
2141 session_add_audio_bus (input_chan, output_chan);
2145 while (Main::events_pending()) {
2152 ARDOUR_UI::mixer_settings () const
2157 node = session->instant_xml(X_("Mixer"), session->path());
2159 node = Config->instant_xml(X_("Mixer"), get_user_ardour_path());
2163 node = new XMLNode (X_("Mixer"));
2170 ARDOUR_UI::editor_settings () const
2175 node = session->instant_xml(X_("Editor"), session->path());
2177 node = Config->instant_xml(X_("Editor"), get_user_ardour_path());
2181 node = new XMLNode (X_("Editor"));
2187 ARDOUR_UI::keyboard_settings () const
2191 node = Config->extra_xml(X_("Keyboard"));
2194 node = new XMLNode (X_("Keyboard"));
2200 ARDOUR_UI::halt_on_xrun_message ()
2202 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message));
2204 MessageDialog msg (*editor,
2205 _("Recording was stopped because your system could not keep up."));
2210 ARDOUR_UI::delete_sources_in_the_right_thread (list<ARDOUR::Source*>* deletion_list)
2212 ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list));
2214 for (list<Source*>::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) {
2218 delete deletion_list;
2222 ARDOUR_UI::disk_overrun_handler ()
2224 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2226 if (!have_disk_overrun_displayed) {
2227 have_disk_overrun_displayed = true;
2228 MessageDialog msg (*editor, X_("diskrate dialog"), _("\
2229 The disk system on your computer\n\
2230 was not able to keep up with Ardour.\n\
2232 Specifically, it failed to write data to disk\n\
2233 quickly enough to keep up with recording.\n"));
2235 have_disk_overrun_displayed = false;
2240 ARDOUR_UI::disk_underrun_handler ()
2242 ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler));
2244 if (!have_disk_underrun_displayed) {
2245 have_disk_underrun_displayed = true;
2246 MessageDialog msg (*editor,
2247 (_("The disk system on your computer\n\
2248 was not able to keep up with Ardour.\n\
2250 Specifically, it failed to read data from disk\n\
2251 quickly enough to keep up with playback.\n")));
2253 have_disk_underrun_displayed = false;
2258 ARDOUR_UI::disk_underrun_message_gone ()
2260 have_disk_underrun_displayed = false;
2264 ARDOUR_UI::disk_overrun_message_gone ()
2266 have_disk_underrun_displayed = false;
2270 ARDOUR_UI::pending_state_dialog ()
2272 ArdourDialog dialog ("pending state dialog");
2274 This session appears to have been in\n\
2275 middle of recording when ardour or\n\
2276 the computer was shutdown.\n\
2278 Ardour can recover any captured audio for\n\
2279 you, or it can ignore it. Please decide\n\
2280 what you would like to do.\n"));
2282 dialog.get_vbox()->pack_start (message);
2283 dialog.add_button (_("Recover from crash"), RESPONSE_ACCEPT);
2284 dialog.add_button (_("Ignore crash data"), RESPONSE_REJECT);
2286 dialog.set_position (WIN_POS_CENTER);
2289 switch (dialog.run ()) {
2290 case RESPONSE_ACCEPT:
2298 ARDOUR_UI::disconnect_from_jack ()
2301 if( engine->disconnect_from_jack ()) {
2302 MessageDialog msg (*editor, _("Could not disconnect from JACK"));
2306 update_sample_rate (0);
2311 ARDOUR_UI::reconnect_to_jack ()
2314 if (engine->reconnect_to_jack ()) {
2315 MessageDialog msg (*editor, _("Could not reconnect to JACK"));
2319 update_sample_rate (0);
2324 ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes)
2326 engine->request_buffer_size (nframes);
2327 update_sample_rate (0);
2331 ARDOUR_UI::cmdline_new_session (string path)
2333 if (path[0] != '/') {
2334 char buf[PATH_MAX+1];
2337 getcwd (buf, sizeof (buf));
2344 new_session (false, path);
2346 _will_create_new_session_automatically = false; /* done it */
2347 return FALSE; /* don't call it again */
2351 ARDOUR_UI::set_native_file_header_format (HeaderFormat hf)
2353 Glib::RefPtr<Action> act;
2357 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2360 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2363 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2366 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2369 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2374 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2375 if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) {
2376 Config->set_native_file_header_format (hf);
2378 session->reset_native_file_format ();
2385 ARDOUR_UI::set_native_file_data_format (SampleFormat sf)
2387 Glib::RefPtr<Action> act;
2391 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2394 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2399 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2401 if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) {
2402 Config->set_native_file_data_format (sf);
2404 session->reset_native_file_format ();
2411 ARDOUR_UI::use_config ()
2413 Glib::RefPtr<Action> act;
2415 switch (Config->get_native_file_data_format ()) {
2417 act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat"));
2420 act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit"));
2425 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2426 ract->set_active ();
2429 switch (Config->get_native_file_header_format ()) {
2431 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF"));
2434 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE"));
2437 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64"));
2440 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML"));
2443 act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64"));
2448 Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic(act);
2449 ract->set_active ();