X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_ui.cc;h=7548f94c5b7ee6c9e3ba66099500d858490eae61;hb=2592a320d42dd4a157ee16101c042d875d3142be;hp=67323ac07b55ea7abce2170e720fed1611658a85;hpb=ed1684dce503c9732a94f8e743f4090c14878522;p=ardour.git diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 67323ac07b..7548f94c5b 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -28,13 +28,14 @@ #include +#include +#include + #include #include -#include #include #include #include -#include #include #include #include @@ -45,20 +46,19 @@ #include #include +#include #include #include #include #include -#include -#include +#include +#include #include -#include #include #include #include "actions.h" #include "ardour_ui.h" -#include "ardour_message.h" #include "public_editor.h" #include "audio_clock.h" #include "keyboard.h" @@ -71,11 +71,12 @@ #include "about.h" #include "utils.h" #include "gui_thread.h" -#include "meter_xpms.h" +#include "color_manager.h" #include "i18n.h" using namespace ARDOUR; +using namespace PBD; using namespace Gtkmm2ext; using namespace Gtk; using namespace sigc; @@ -85,20 +86,7 @@ ARDOUR_UI *ARDOUR_UI::theArdourUI = 0; sigc::signal ARDOUR_UI::Blink; sigc::signal ARDOUR_UI::RapidScreenUpdate; sigc::signal ARDOUR_UI::SuperRapidScreenUpdate; -sigc::signal ARDOUR_UI::Clock; - -static const char* channel_setup_names[] = { - "mono", - "stereo", - "3 channels", - "4 channels", - "5 channels", - "8 channels", - "manual setup", - 0 -}; - -vector channel_combo_strings; +sigc::signal ARDOUR_UI::Clock; ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) @@ -128,36 +116,34 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) shuttle_units_button (_("% ")), - punch_in_button (_("punch\nin")), - punch_out_button (_("punch\nout")), - auto_return_button (_("auto\nreturn")), - auto_play_button (_("auto\nplay")), - auto_input_button (_("auto\ninput")), - click_button (_("click")), - auditioning_alert_button (_("AUDITIONING")), + punch_in_button (_("Punch In")), + punch_out_button (_("Punch Out")), + auto_return_button (_("Auto Return")), + auto_play_button (_("Autuo Play")), + auto_input_button (_("Auto Input")), + click_button (_("Click")), + auditioning_alert_button (_("AUDITION")), solo_alert_button (_("SOLO")), shown_flag (false) - { using namespace Gtk::Menu_Helpers; Gtkmm2ext::init(); - - /* actually, its already loaded, but ... */ - - cerr << "Loading UI configuration file " << rcfile << endl; - + about = 0; if (theArdourUI == 0) { theArdourUI = this; } - ActionManager::init (); + /* load colors */ + + color_manager = new ColorManager(); + + std::string color_file = ARDOUR::find_config_file("ardour.colors"); - m_new_session_dialog = 0; - m_new_session_dialog_ref = NewSessionDialogFactory::create(); - m_new_session_dialog_ref->get_widget_derived (NewSessionDialogFactory::top_level_widget_name(), m_new_session_dialog); + color_manager->load (color_file); + editor = 0; mixer = 0; session = 0; @@ -184,9 +170,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) shuttle_grabbed = false; shuttle_fract = 0.0; - - set_shuttle_units (Percentage); - set_shuttle_behaviour (Sprung); + shuttle_max_speed = 8.0f; shuttle_style_menu = 0; shuttle_unit_menu = 0; @@ -194,35 +178,16 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) gettimeofday (&last_peak_grab, 0); gettimeofday (&last_shuttle_request, 0); - ARDOUR::DiskStream::CannotRecordNoInput.connect (mem_fun(*this, &ARDOUR_UI::cannot_record_no_input)); - ARDOUR::DiskStream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread)); - ARDOUR::DiskStream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler)); - ARDOUR::DiskStream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler)); + ARDOUR::Diskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler)); + ARDOUR::Diskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler)); /* handle pending state with a dialog */ ARDOUR::Session::AskAboutPendingState.connect (mem_fun(*this, &ARDOUR_UI::pending_state_dialog)); - channel_combo_strings = internationalize (channel_setup_names); - /* have to wait for AudioEngine and Configuration before proceeding */ } -void -ARDOUR_UI::cannot_record_no_input (DiskStream* ds) -{ - ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::cannot_record_no_input), ds)); - - string msg = string_compose (_("\ -You cannot record-enable\n\ -track %1\n\ -because it has no input connections.\n\ -You would be wasting space recording silence."), - ds->name()); - - ArdourMessage message (editor, X_("cannotrecord"), msg); -} - void ARDOUR_UI::set_engine (AudioEngine& e) { @@ -233,13 +198,12 @@ ARDOUR_UI::set_engine (AudioEngine& e) engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted)); engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate)); + ActionManager::init (); + new_session_dialog = new NewSessionDialog(); + _tooltips.enable(); keyboard = new Keyboard; - install_keybindings (); - - FastMeter::set_vertical_xpm (v_meter_strip_xpm); - FastMeter::set_horizontal_xpm (h_meter_strip_xpm); if (setup_windows ()) { throw failed_constructor (); @@ -267,12 +231,16 @@ ARDOUR_UI::set_engine (AudioEngine& e) blink_timeout_tag = -1; + /* the global configuration object is now valid */ + + use_config (); + /* this being a GUI and all, we want peakfiles */ - FileSource::set_build_peakfiles (true); - FileSource::set_build_missing_peakfiles (true); + AudioFileSource::set_build_peakfiles (true); + AudioFileSource::set_build_missing_peakfiles (true); - if (Source::start_peak_thread ()) { + if (AudioSource::start_peak_thread ()) { throw failed_constructor(); } @@ -309,7 +277,7 @@ ARDOUR_UI::~ARDOUR_UI () delete add_route_dialog; } - Source::stop_peak_thread (); + AudioSource::stop_peak_thread (); } gint @@ -366,16 +334,20 @@ ARDOUR_UI::save_ardour_state () Config->add_extra_xml (*node); Config->save_state(); - XMLNode& enode (static_cast(editor)->get_state()); - XMLNode& mnode (mixer->get_state()); + XMLNode enode(static_cast(editor)->get_state()); + XMLNode mnode(mixer->get_state()); if (session) { - session->add_instant_xml(enode, session->path()); - session->add_instant_xml(mnode, session->path()); + session->add_instant_xml (enode, session->path()); + session->add_instant_xml (mnode, session->path()); } else { - Config->add_instant_xml(enode, Config->get_user_ardour_path()); - Config->add_instant_xml(mnode, Config->get_user_ardour_path()); + Config->add_instant_xml (enode, get_user_ardour_path()); + Config->add_instant_xml (mnode, get_user_ardour_path()); } + + /* keybindings */ + + AccelMap::save ("ardour.saved_bindings"); } void @@ -403,11 +375,12 @@ ARDOUR_UI::finish() /* use the default name */ if (save_state_canfail ("")) { /* failed - don't quit */ - ArdourMessage (editor, X_("badsave dialog"), + MessageDialog msg (*editor, _("\ Ardour was unable to save your session.\n\n\ If you still wish to quit, please use the\n\n\ \"Just quit\" option.")); + msg.run (); return; } break; @@ -415,7 +388,7 @@ If you still wish to quit, please use the\n\n\ break; } } - + Config->save_state(); quit (); } @@ -423,15 +396,20 @@ int ARDOUR_UI::ask_about_saving_session (const string & what) { ArdourDialog window (_("ardour: save session?")); + Gtk::HBox dhbox; // the hbox for the image and text Gtk::Label prompt_label; + Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_WARNING, Gtk::ICON_SIZE_DIALOG)); + string msg; - msg = string_compose(_("Save and %1"), what); - window.add_button (msg, RESPONSE_ACCEPT); - msg = string_compose(_("Just %1"), what); - window.add_button (msg, RESPONSE_APPLY); msg = string_compose(_("Don't %1"), what); window.add_button (msg, RESPONSE_REJECT); + msg = string_compose(_("Just %1"), what); + window.add_button (msg, RESPONSE_APPLY); + msg = string_compose(_("Save and %1"), what); + window.add_button (msg, RESPONSE_ACCEPT); + + window.set_default_response (RESPONSE_ACCEPT); Gtk::Button noquit_button (msg); noquit_button.set_name ("EditorGTKButton"); @@ -444,18 +422,24 @@ ARDOUR_UI::ask_about_saving_session (const string & what) } else { type = _("snapshot"); } - 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?"), + prompt = string_compose(_("The %1\"%2\"\nhas not been saved.\n\nAny changes made this time\nwill be lost unless you save it.\n\nWhat do you want to do?"), type, session->snap_name()); prompt_label.set_text (prompt); - prompt_label.set_alignment (0.5, 0.5); prompt_label.set_name (X_("PrompterLabel")); - - window.get_vbox()->pack_start (prompt_label); + prompt_label.set_alignment(ALIGN_LEFT, ALIGN_TOP); + + dimage->set_alignment(ALIGN_CENTER, ALIGN_TOP) +; + dhbox.set_homogeneous (false); + dhbox.pack_start (*dimage, false, false, 5); + dhbox.pack_start (prompt_label, true, false, 5); + window.get_vbox()->pack_start (dhbox); window.set_name (_("Prompter")); window.set_position (Gtk::WIN_POS_MOUSE); window.set_modal (true); + window.set_resizable (false); window.show_all (); save_the_session = 0; @@ -484,27 +468,12 @@ ARDOUR_UI::every_second () update_cpu_load (); update_buffer_load (); update_disk_space (); - // update_disk_rate (); return TRUE; } gint ARDOUR_UI::every_point_one_seconds () { - struct timeval now; - struct timeval diff; - - /* do not attempt to grab peak power more than once per cycle. - */ - - gettimeofday (&now, 0); - timersub (&now, &last_peak_grab, &diff); - - if ((diff.tv_usec + (diff.tv_sec * 1000000)) >= engine->usecs_per_cycle()) { - IO::GrabPeakPower(); /* EMIT_SIGNAL */ - last_peak_grab = now; - } - update_speed_display (); RapidScreenUpdate(); /* EMIT_SIGNAL */ return TRUE; @@ -518,7 +487,7 @@ ARDOUR_UI::every_point_zero_one_seconds () } void -ARDOUR_UI::update_sample_rate (jack_nframes_t ignored) +ARDOUR_UI::update_sample_rate (nframes_t ignored) { char buf[32]; @@ -530,14 +499,14 @@ ARDOUR_UI::update_sample_rate (jack_nframes_t ignored) } else { - jack_nframes_t rate = engine->frame_rate(); + nframes_t rate = engine->frame_rate(); if (fmod (rate, 1000.0) != 0.0) { - snprintf (buf, sizeof (buf), _("SR: %.1f kHz / %4.1f msecs"), + snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"), (float) rate/1000.0f, (engine->frames_per_cycle() / (float) rate) * 1000.0f); } else { - snprintf (buf, sizeof (buf), _("SR: %u kHz / %4.1f msecs"), + snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"), rate/1000, (engine->frames_per_cycle() / (float) rate) * 1000.0f); } @@ -550,24 +519,10 @@ void ARDOUR_UI::update_cpu_load () { char buf[32]; - snprintf (buf, sizeof (buf), _("DSP Load: %.1f%%"), engine->get_cpu_load()); + snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load()); cpu_load_label.set_text (buf); } -void -ARDOUR_UI::update_disk_rate () -{ - char buf[64]; - - if (session) { - snprintf (buf, sizeof (buf), _("Disk r:%5.1f w:%5.1f MB/s"), - session->read_data_rate()/1048576.0f, session->write_data_rate()/1048576.0f); - disk_rate_label.set_text (buf); - } else { - disk_rate_label.set_text (""); - } -} - void ARDOUR_UI::update_buffer_load () { @@ -583,9 +538,10 @@ ARDOUR_UI::update_buffer_load () } void -ARDOUR_UI::count_recenabled_diskstreams (DiskStream& ds) +ARDOUR_UI::count_recenabled_diskstreams (Route& route) { - if (ds.record_enabled()) { + Track* track = dynamic_cast(&route); + if (track && track->diskstream()->record_enabled()) { rec_enabled_diskstreams++; } } @@ -597,32 +553,22 @@ ARDOUR_UI::update_disk_space() return; } - jack_nframes_t frames = session->available_capture_duration(); + nframes_t frames = session->available_capture_duration(); char buf[64]; if (frames == max_frames) { - strcpy (buf, _("space: 24hrs+")); + strcpy (buf, _("Disk: 24hrs+")); } else { int hrs; int mins; int secs; - jack_nframes_t fr = session->frame_rate(); + nframes_t fr = session->frame_rate(); - if (session->actively_recording()){ - - rec_enabled_diskstreams = 0; - session->foreach_diskstream (this, &ARDOUR_UI::count_recenabled_diskstreams); - - if (rec_enabled_diskstreams) { - frames /= rec_enabled_diskstreams; - } - - } else { - - /* hmmm. shall we divide by the route count? or the diskstream count? - or what? for now, do nothing ... - */ - + rec_enabled_diskstreams = 0; + session->foreach_route (this, &ARDOUR_UI::count_recenabled_diskstreams); + + if (rec_enabled_diskstreams) { + frames /= rec_enabled_diskstreams; } hrs = frames / (fr * 3600); @@ -631,7 +577,7 @@ ARDOUR_UI::update_disk_space() frames -= mins * fr * 60; secs = frames / fr; - snprintf (buf, sizeof(buf), _("space: %02dh:%02dm:%02ds"), hrs, mins, secs); + snprintf (buf, sizeof(buf), _("Disk: %02dh:%02dm:%02ds"), hrs, mins, secs); } disk_space_label.set_text (buf); @@ -652,190 +598,6 @@ ARDOUR_UI::update_wall_clock () return TRUE; } - -void -ARDOUR_UI::toggle_recording_plugins () -{ - /* XXX use toggle_some_session_state */ - - if (session == 0) { - return; - } - - session->set_recording_plugins (!session->get_recording_plugins()); -} - -void -ARDOUR_UI::toggle_auto_play () - -{ - toggle_some_session_state (auto_play_button, - &Session::get_auto_play, - &Session::set_auto_play); -} - -void -ARDOUR_UI::toggle_auto_return () - -{ - toggle_some_session_state (auto_return_button, - &Session::get_auto_return, - &Session::set_auto_return); -} - -void -ARDOUR_UI::toggle_click () -{ - toggle_some_session_state (click_button, - &Session::get_clicking, - &Session::set_clicking); -} - -void -ARDOUR_UI::toggle_session_auto_loop () -{ - if (session) { - if (session->get_auto_loop()) { - if (session->transport_rolling()) { - transport_roll(); - } - else { - session->request_auto_loop (false); - } - } - else { - session->request_auto_loop (true); - } - } -} - -void -ARDOUR_UI::toggle_session_punch_in () -{ - if (session) { - session->set_punch_in (!session->get_punch_in()); - } -} - -void -ARDOUR_UI::toggle_punch_out () -{ - toggle_some_session_state (punch_out_button, - &Session::get_punch_out, - &Session::set_punch_out); -} - -void -ARDOUR_UI::toggle_punch_in () -{ - toggle_some_session_state (punch_in_button, - &Session::get_punch_in, - &Session::set_punch_in); -} - -void -ARDOUR_UI::map_button_state () - -{ - map_some_session_state (auto_return_button, - &Session::get_auto_return); - map_some_session_state (auto_play_button, - &Session::get_auto_play); - map_some_session_state (auto_input_button, - &Session::get_auto_input); - map_some_session_state (punch_in_button, - &Session::get_punch_in); - map_some_session_state (punch_out_button, - &Session::get_punch_out); - map_some_session_state (click_button, - &Session::get_clicking); -} - -void -ARDOUR_UI::queue_map_control_change (Session::ControlType t) -{ - ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::map_control_change), t)); -} - -void -ARDOUR_UI::map_control_change (Session::ControlType t) -{ - switch (t) { - case Session::AutoPlay: - map_some_session_state (auto_play_button, &Session::get_auto_play); - break; - - case Session::AutoLoop: - break; - - case Session::AutoReturn: - map_some_session_state (auto_return_button, &Session::get_auto_return); - break; - - case Session::AutoInput: - map_some_session_state (auto_input_button, &Session::get_auto_input); - break; - - case Session::PunchOut: - map_some_session_state (punch_in_button, &Session::get_punch_out); - break; - - case Session::PunchIn: - map_some_session_state (punch_in_button, &Session::get_punch_in); - break; - - case Session::Clicking: - map_some_session_state (click_button, &Session::get_clicking); - break; - - case Session::SlaveType: -// map_some_session_state (mtc_slave_button, &Session::get_mtc_slave); - break; - - case Session::SendMTC: -// map_some_session_state (send_mtc_button, &Session::get_send_mtc); - break; - - case Session::SendMMC: -// map_some_session_state (send_mmc_button, &Session::get_send_mmc); - break; - - case Session::MMCControl: -// map_some_session_state (mmc_control_button, &Session::get_mmc_control); - break; - - case Session::MidiFeedback: -// map_some_session_state (mmc_control_button, &Session::get_mmc_control); - break; - case Session::MidiControl: -// map_some_session_state (mmc_control_button, &Session::get_mmc_control); - break; - - case Session::Live: - break; - - case Session::RecordingPlugins: - break; - - case Session::CrossFadesActive: - break; - - case Session::EditingMode: - break; - - case Session::PlayRange: - break; - - case Session::AlignChoice: - /* don't care, this is handled by the options editor */ - break; - case Session::SeamlessLoop: - /* don't care, this is handled by the options editor */ - break; - - } -} - void ARDOUR_UI::control_methods_adjusted () @@ -871,54 +633,6 @@ ARDOUR_UI::mmc_device_id_adjusted () #endif } -void -ARDOUR_UI::map_some_session_state (ToggleButton& button, - bool (Session::*get)() const) - -{ - bool x; - - if (session == 0) { - return; - } - - if (button.get_active() != (x = (session->*get)())) { - button.set_active (x); - } -} - -void -ARDOUR_UI::toggle_some_session_state (ToggleButton& button, - bool (Session::*get)() const, - void (Session::*set)(bool)) - -{ - bool button_state; - bool session_state; - - if (session == 0) { - return; - } - - button_state = button.get_active (); - session_state = (session->*get)(); - - if (button_state != session_state) { - (session->*set) (button_state); -#if 0 - - /* check that it worked, and reverse - the button state if it didn't - */ - - if ((session->*get)() != button_state) { - button->set_active (!button_state); - } -#endif - - } -} - gint ARDOUR_UI::session_menu (GdkEventButton *ev) { @@ -973,7 +687,7 @@ ARDOUR_UI::redisplay_recent_sessions () TreeModel::Row row = *(recent_session_model->append()); - row[recent_session_columns.visible_name] = PBD::basename (fullpath); + row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath); row[recent_session_columns.fullpath] = fullpath; if (states->size() > 1) { @@ -1006,12 +720,15 @@ ARDOUR_UI::build_session_selector () Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow); session_selector_window->add_button (Stock::CANCEL, RESPONSE_CANCEL); - session_selector_window->add_button (Stock::OK, RESPONSE_ACCEPT); - + session_selector_window->add_button (Stock::OPEN, RESPONSE_ACCEPT); + session_selector_window->set_default_response (RESPONSE_ACCEPT); recent_session_model = TreeStore::create (recent_session_columns); recent_session_display.set_model (recent_session_model); recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name); recent_session_display.set_headers_visible (false); + recent_session_display.get_selection()->set_mode (SELECTION_SINGLE); + + recent_session_display.signal_row_activated().connect (mem_fun (*this, &ARDOUR_UI::recent_session_row_activated)); scroller->add (recent_session_display); scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); @@ -1022,6 +739,12 @@ ARDOUR_UI::build_session_selector () session_selector_window->show_all_children(); } +void +ARDOUR_UI::recent_session_row_activated (const TreePath& path, TreeViewColumn* col) +{ + session_selector_window->response (RESPONSE_ACCEPT); +} + void ARDOUR_UI::open_recent_session () { @@ -1071,9 +794,11 @@ ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info) return false; } + // XXX Portability + string session_file = info.filename; session_file += '/'; - session_file += PBD::basename (info.filename); + session_file += Glib::path_get_basename (info.filename); session_file += ".ardour"; if (stat (session_file.c_str(), &statbuf) != 0) { @@ -1135,23 +860,38 @@ ARDOUR_UI::session_add_midi_track () } void -ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels) +ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many) { - Route* route; + list > tracks; + Session::RouteList routes; if (session == 0) { - warning << _("You cannot add a track without a session already loaded.") << endmsg; + warning << _("You cannot add a track or bus without a session already loaded.") << endmsg; return; } try { - if (disk) { - if ((route = session->new_audio_track (input_channels, output_channels)) == 0) { - error << _("could not create new audio track") << endmsg; + if (track) { + tracks = session->new_audio_track (input_channels, output_channels, mode, how_many); + + if (tracks.size() != how_many) { + if (how_many == 1) { + error << _("could not create a new audio track") << endmsg; + } else { + error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg; + } } + } else { - if ((route = session->new_audio_route (input_channels, output_channels)) == 0) { - error << _("could not create new audio bus") << endmsg; + + routes = session->new_audio_route (input_channels, output_channels, how_many); + + if (routes.size() != how_many) { + if (how_many == 1) { + error << _("could not create a new audio track") << endmsg; + } else { + error << string_compose (_("could not create %1 new audio tracks"), how_many) << endmsg; + } } } @@ -1169,26 +909,23 @@ ARDOUR_UI::session_add_audio_route (bool disk, int32_t input_channels, int32_t o } catch (...) { - ArdourMessage msg (editor, X_("noport dialog"), + MessageDialog msg (*editor, _("There are insufficient JACK ports available\n\ to create a new track or bus.\n\ You should save Ardour, exit and\n\ restart JACK with more ports.")); + msg.run (); } } void -ARDOUR_UI::diskstream_added (DiskStream* ds) +ARDOUR_UI::do_transport_locate (nframes_t new_position) { -} - -void -ARDOUR_UI::do_transport_locate (jack_nframes_t new_position) -{ - jack_nframes_t _preroll; + nframes_t _preroll = 0; if (session) { - _preroll = session->convert_to_frames_at (new_position, session->preroll); + // XXX CONFIG_CHANGE FIX - requires AnyTime handling + // _preroll = session->convert_to_frames_at (new_position, Config->get_preroll()); if (new_position > _preroll) { new_position -= _preroll; @@ -1202,6 +939,23 @@ ARDOUR_UI::do_transport_locate (jack_nframes_t new_position) void ARDOUR_UI::transport_goto_start () +{ + if (session) { + session->goto_start(); + + + /* force displayed area in editor to start no matter + what "follow playhead" setting is. + */ + + if (editor) { + editor->reposition_x_origin (session->current_start_frame()); + } + } +} + +void +ARDOUR_UI::transport_goto_zero () { if (session) { session->request_locate (0); @@ -1221,7 +975,7 @@ void ARDOUR_UI::transport_goto_end () { if (session) { - jack_nframes_t frame = session->current_end_frame(); + nframes_t frame = session->current_end_frame(); session->request_locate (frame); /* force displayed area in editor to start no matter @@ -1246,8 +1000,8 @@ ARDOUR_UI::transport_stop () return; } - if (session->get_auto_loop()) { - session->request_auto_loop (false); + if (Config->get_auto_loop()) { + session->request_play_loop (false); } session->request_stop (); @@ -1276,15 +1030,15 @@ ARDOUR_UI::transport_record () switch (session->record_status()) { case Session::Disabled: if (session->ntracks() == 0) { - string txt = _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu."); - ArdourMessage msg (editor, X_("cannotrecenable"), txt); + MessageDialog msg (*editor, _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.")); + msg.run (); return; } session->maybe_enable_record (); break; case Session::Recording: case Session::Enabled: - session->disable_record (); + session->disable_record (true); } } } @@ -1300,8 +1054,8 @@ ARDOUR_UI::transport_roll () rolling = session->transport_rolling (); - if (session->get_auto_loop()) { - session->request_auto_loop (false); + if (Config->get_auto_loop()) { + session->request_play_loop (false); auto_loop_button.set_active (false); roll_button.set_active (true); } else if (session->get_play_range ()) { @@ -1318,7 +1072,7 @@ void ARDOUR_UI::transport_loop() { if (session) { - if (session->get_auto_loop()) { + if (Config->get_auto_loop()) { if (session->transport_rolling()) { Location * looploc = session->locations()->auto_loop_location(); if (looploc) { @@ -1327,7 +1081,7 @@ ARDOUR_UI::transport_loop() } } else { - session->request_auto_loop (true); + session->request_play_loop (true); } } } @@ -1401,32 +1155,25 @@ ARDOUR_UI::transport_forward (int option) } void -ARDOUR_UI::toggle_monitor_enable (guint32 dstream) +ARDOUR_UI::toggle_record_enable (uint32_t dstream) { if (session == 0) { return; } - DiskStream *ds; + boost::shared_ptr r; + + if ((r = session->route_by_remote_id (dstream)) != 0) { - if ((ds = session->diskstream_by_id (dstream)) != 0) { - Port *port = ds->io()->input (0); - port->request_monitor_input (!port->monitoring_input()); - } -} + Track* t; -void -ARDOUR_UI::toggle_record_enable (guint32 dstream) -{ + if ((t = dynamic_cast(r.get())) != 0) { + t->diskstream()->set_record_enabled (!t->diskstream()->record_enabled()); + } + } if (session == 0) { return; } - - DiskStream *ds; - - if ((ds = session->diskstream_by_id (dstream)) != 0) { - ds->set_record_enabled (!ds->record_enabled(), this); - } } void @@ -1451,14 +1198,6 @@ ARDOUR_UI::map_transport_state () } } -void -ARDOUR_UI::send_all_midi_feedback () -{ - if (session) { - session->send_all_midi_feedback(); - } -} - void ARDOUR_UI::allow_local_only () { @@ -1511,12 +1250,13 @@ ARDOUR_UI::engine_halted () update_sample_rate (0); - ArdourMessage msg (editor, X_("halted"), + MessageDialog msg (*editor, _("\ JACK has either been shutdown or it\n\ disconnected Ardour because Ardour\n\ was not fast enough. You can save the\n\ session and/or try to reconnect to JACK .")); + msg.run (); } int32_t @@ -1621,7 +1361,7 @@ ARDOUR_UI::start_blinking () if (blink_timeout_tag < 0) { blink_on = false; - blink_timeout_tag = gtk_timeout_add (240, _blink, this); + blink_timeout_tag = g_timeout_add (240, _blink, this); } } @@ -1629,68 +1369,11 @@ void ARDOUR_UI::stop_blinking () { if (blink_timeout_tag >= 0) { - gtk_timeout_remove (blink_timeout_tag); + g_source_remove (blink_timeout_tag); blink_timeout_tag = -1; } } - -void -ARDOUR_UI::add_diskstream_to_menu (DiskStream& dstream) -{ - using namespace Gtk; - using namespace Menu_Helpers; - - if (dstream.hidden()) { - return; - } - - MenuList& items = diskstream_menu->items(); - items.push_back (MenuElem (dstream.name(), bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), (gint32) dstream.id()))); -} - -void -ARDOUR_UI::diskstream_selected (gint32 id) -{ - selected_dstream = id; - Main::quit (); -} - -gint32 -ARDOUR_UI::select_diskstream (GdkEventButton *ev) -{ - using namespace Gtk; - using namespace Menu_Helpers; - - if (session == 0) { - return -1; - } - - diskstream_menu = new Menu(); - diskstream_menu->set_name ("ArdourContextMenu"); - using namespace Gtk; - using namespace Menu_Helpers; - - MenuList& items = diskstream_menu->items(); - items.push_back (MenuElem (_("No Stream"), (bind (mem_fun(*this, &ARDOUR_UI::diskstream_selected), -1)))); - - session->foreach_diskstream (this, &ARDOUR_UI::add_diskstream_to_menu); - - if (ev) { - diskstream_menu->popup (ev->button, ev->time); - } else { - diskstream_menu->popup (0, 0); - } - - selected_dstream = -1; - - Main::run (); - - delete diskstream_menu; - - return selected_dstream; -} - void ARDOUR_UI::name_io_setup (AudioEngine& engine, string& buf, @@ -1746,10 +1429,12 @@ ARDOUR_UI::snapshot_session () time (&n); now = ctime (&n); - now = now.substr (0, now.length() - 1); + now = now.substr (20, 4) + now.substr (3, 16) + " (" + now.substr (0, 3) + ")"; prompter.set_name ("Prompter"); - prompter.set_prompt (_("Name for snapshot")); + prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT); + prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); + prompter.set_prompt (_("Name of New Snapshot")); prompter.set_initial_text (now); switch (prompter.run()) { @@ -1817,7 +1502,7 @@ ARDOUR_UI::secondary_clock_value_changed () } void -ARDOUR_UI::rec_enable_button_blink (bool onoff, DiskStream *dstream, Widget *w) +ARDOUR_UI::rec_enable_button_blink (bool onoff, AudioDiskstream *dstream, Widget *w) { if (session && dstream && dstream->record_enabled()) { @@ -1897,7 +1582,9 @@ ARDOUR_UI::save_template () prompter.set_name (X_("Prompter")); prompter.set_prompt (_("Name for mix template:")); prompter.set_initial_text(session->name() + _("-template")); - + prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT); + prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false); + switch (prompter.run()) { case RESPONSE_ACCEPT: prompter.get_result (name); @@ -1915,86 +1602,169 @@ ARDOUR_UI::save_template () void ARDOUR_UI::new_session (bool startup, std::string predetermined_path) { - m_new_session_dialog->show_all(); - m_new_session_dialog->set_transient_for(*editor); - m_new_session_dialog->set_name(predetermined_path); + string session_name; + string session_path; + + int response = Gtk::RESPONSE_NONE; - int response = Gtk::RESPONSE_CANCEL; + new_session_dialog->set_modal(true); + new_session_dialog->set_name(predetermined_path); + new_session_dialog->reset_recent(); + new_session_dialog->show(); do { - response = m_new_session_dialog->run (); - - if(response == Gtk::RESPONSE_OK) { + response = new_session_dialog->run (); - _session_is_new = true; - - std::string session_name = m_new_session_dialog->session_name(); - std::string session_path = m_new_session_dialog->session_folder(); + if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) { + quit(); + return; + + } else if (response == Gtk::RESPONSE_NONE) { + /* Clear was pressed */ + new_session_dialog->reset(); + + } else if (response == Gtk::RESPONSE_YES) { + + /* YES == OPEN, but there's no enum for that */ + + session_name = new_session_dialog->session_name(); - /* - XXX This is needed because session constructor wants a - non-existant path. hopefully this will be fixed at some point. - */ - session_path = Glib::build_filename(session_path, session_name); + if (session_name.empty()) { + response = Gtk::RESPONSE_NONE; + continue; + } + + if (session_name[0] == '/' || + (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') || + (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) { + load_session (Glib::path_get_dirname (session_name), session_name); + } else { + session_path = new_session_dialog->session_folder(); + load_session (session_path, session_name); + } - std::string template_name = m_new_session_dialog->session_template_name(); + } else if (response == Gtk::RESPONSE_OK) { + + session_name = new_session_dialog->session_name(); - if (m_new_session_dialog->use_session_template()) { - - load_session (session_path, session_name, &template_name); + if (new_session_dialog->get_current_page() == 1) { + + /* XXX this is a bit of a hack.. + i really want the new sesion dialog to return RESPONSE_YES + if we're on page 1 (the load page) + Unfortunately i can't see how atm.. + */ - } else { - - uint32_t cchns; - uint32_t mchns; - Session::AutoConnectOption iconnect; - Session::AutoConnectOption oconnect; + if (session_name.empty()) { + response = Gtk::RESPONSE_NONE; + continue; + } - if (m_new_session_dialog->create_control_bus()) { - cchns = (uint32_t) m_new_session_dialog->control_channel_count(); + if (session_name[0] == '/' || + (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') || + (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) { + load_session (Glib::path_get_dirname (session_name), session_name); } else { - cchns = 0; + session_path = new_session_dialog->session_folder(); + load_session (session_path, session_name); } - - if (m_new_session_dialog->create_master_bus()) { - mchns = (uint32_t) m_new_session_dialog->master_channel_count(); + + } else { + + _session_is_new = true; + + if (session_name.empty()) { + response = Gtk::RESPONSE_NONE; + continue; + } + + if (session_name[0] == '/' || + (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') || + (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) { + + session_path = Glib::path_get_dirname (session_name); + session_name = Glib::path_get_basename (session_name); + } else { - mchns = 0; + + session_path = new_session_dialog->session_folder(); + } + + //XXX This is needed because session constructor wants a + //non-existant path. hopefully this will be fixed at some point. - if (m_new_session_dialog->connect_inputs()) { - iconnect = Session::AutoConnectPhysical; + session_path = Glib::build_filename (session_path, session_name); + + std::string template_name = new_session_dialog->session_template_name(); + + if (new_session_dialog->use_session_template()) { + + load_session (session_path, session_name, &template_name); + } else { - iconnect = Session::AutoConnectOption (0); + + uint32_t cchns; + uint32_t mchns; + AutoConnectOption iconnect; + AutoConnectOption oconnect; + + if (new_session_dialog->create_control_bus()) { + cchns = (uint32_t) new_session_dialog->control_channel_count(); + } else { + cchns = 0; + } + + if (new_session_dialog->create_master_bus()) { + mchns = (uint32_t) new_session_dialog->master_channel_count(); + } else { + mchns = 0; + } + + if (new_session_dialog->connect_inputs()) { + iconnect = AutoConnectPhysical; + } else { + iconnect = AutoConnectOption (0); + } + + /// @todo some minor tweaks. + + if (new_session_dialog->connect_outs_to_master()) { + oconnect = AutoConnectMaster; + } else if (new_session_dialog->connect_outs_to_physical()) { + oconnect = AutoConnectPhysical; + } else { + oconnect = AutoConnectOption (0); + } + + uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count(); + uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count(); + + build_session (session_path, + session_name, + cchns, + mchns, + iconnect, + oconnect, + nphysin, + nphysout, + engine->frame_rate() * 60 * 5); } - - /// @todo some minor tweaks. - - if (m_new_session_dialog->connect_outs_to_master()) { - oconnect = Session::AutoConnectMaster; - } else if (m_new_session_dialog->connect_outs_to_physical()) { - oconnect = Session::AutoConnectPhysical; - } else { - oconnect = Session::AutoConnectOption (0); - } - - uint32_t nphysin = (uint32_t) m_new_session_dialog->input_limit_count(); - uint32_t nphysout = (uint32_t) m_new_session_dialog->output_limit_count(); - - build_session (session_path, - session_name, - cchns, - mchns, - iconnect, - oconnect, - nphysin, - nphysout, - engine->frame_rate() * 60 * 5); - } + } } + + } while (response == Gtk::RESPONSE_NONE); - } while(response == Gtk::RESPONSE_HELP); - m_new_session_dialog->hide_all(); + show(); + new_session_dialog->get_window()->set_cursor(); + new_session_dialog->hide(); +} + +void +ARDOUR_UI::close_session() +{ + unload_session(); + new_session (); } int @@ -2014,9 +1784,10 @@ ARDOUR_UI::load_session (const string & path, const string & snap_name, string* /* if it already exists, we must have write access */ if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) { - ArdourMessage msg (editor, X_("noaccess dialog"), _("\ + MessageDialog msg (*editor, _("\ You do not have write access to this session.\n\ This prevents the session from being loaded.")); + msg.run (); return -1; } @@ -2032,9 +1803,8 @@ This prevents the session from being loaded.")); connect_to_session (new_session); - //if (engine->running()) { - //mixer->show_window(); - //} + Config->set_current_owner (ConfigVariableBase::Interface); + session_loaded = true; return 0; } @@ -2046,6 +1816,8 @@ ARDOUR_UI::make_session_clean () session->set_clean (); } + show (); + return FALSE; } @@ -2053,11 +1825,11 @@ int ARDOUR_UI::build_session (const string & path, const string & snap_name, uint32_t control_channels, uint32_t master_channels, - Session::AutoConnectOption input_connect, - Session::AutoConnectOption output_connect, + AutoConnectOption input_connect, + AutoConnectOption output_connect, uint32_t nphysin, uint32_t nphysout, - jack_nframes_t initial_length) + nframes_t initial_length) { Session *new_session; int x; @@ -2085,9 +1857,6 @@ ARDOUR_UI::build_session (const string & path, const string & snap_name, connect_to_session (new_session); - //if (engine->running()) { - //mixer->show_window(); - //} session_loaded = true; return 0; } @@ -2097,11 +1866,12 @@ ARDOUR_UI::show () { if (editor) { editor->show_window (); - shown_flag = true; - } + + if (!shown_flag) { + editor->present (); + } - if (session && mixer) { - // mixer->show_window (); + shown_flag = true; } if (about) { @@ -2122,7 +1892,8 @@ void ARDOUR_UI::hide_splash () { if (about) { - // about->hide(); + about->get_window()->set_cursor (); + about->hide(); } } @@ -2134,16 +1905,21 @@ ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* l removed = rep.paths.size(); if (removed == 0) { - ArdourMessage msg (editor, X_("cleanupresults"), - _("\ -No audio files were ready for cleanup\n\n\ -If this seems suprising, check for any existing\n\ -snapshots. These may still include regions that\n\ + MessageDialog msgd (*editor, + _("No audio files were ready for cleanup"), + true, + Gtk::MESSAGE_INFO, + (Gtk::ButtonsType)(Gtk::BUTTONS_CLOSE) ); + msgd.set_secondary_text (_("If this seems suprising, \n\ +check for any existing snapshots.\n\ +These may still include regions that\n\ require some unused files to continue to exist.")); + + msgd.run (); return; } - ArdourDialog results (_("ardour: cleanup"), true); + ArdourDialog results (_("ardour: cleanup"), true, false); struct CleanupResultsModelColumns : public Gtk::TreeModel::ColumnRecord { CleanupResultsModelColumns() { @@ -2155,34 +1931,45 @@ require some unused files to continue to exist.")); }; - Glib::RefPtr results_model; CleanupResultsModelColumns results_columns; + Glib::RefPtr results_model; Gtk::TreeView results_display; results_model = ListStore::create (results_columns); results_display.set_model (results_model); results_display.append_column (list_title, results_columns.visible_name); + + results_display.set_name ("CleanupResultsList"); results_display.set_headers_visible (true); + results_display.set_headers_clickable (false); + results_display.set_reorderable (false); Gtk::ScrolledWindow list_scroller; Gtk::Label txt; + Gtk::VBox dvbox; + Gtk::HBox dhbox; // the hbox for the image and text + Gtk::HBox ddhbox; // the hbox we eventually pack into the dialog's vbox + Gtk::Image* dimage = manage (new Gtk::Image(Stock::DIALOG_INFO, Gtk::ICON_SIZE_DIALOG)); + + dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP); if (rep.space < 1048576.0f) { if (removed > 1) { - txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1024.0f, "kilo")); + txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo")); } else { - txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1024.0f, "kilo")); + txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo")); } } else { if (removed > 1) { - txt.set_text (string_compose (msg, removed, _("files"), (float) rep.space / 1048576.0f, "mega")); + txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega")); } else { - txt.set_text (string_compose (msg, removed, _("file"), (float) rep.space / 1048576.0f, "mega")); + txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega")); } } - results.get_vbox()->pack_start (txt, false, false); - + dhbox.pack_start (*dimage, true, false, 5); + dhbox.pack_start (txt, true, false, 5); + for (vector::iterator i = rep.paths.begin(); i != rep.paths.end(); ++i) { TreeModel::Row row = *(results_model->append()); row[results_columns.visible_name] = *i; @@ -2190,14 +1977,22 @@ require some unused files to continue to exist.")); } list_scroller.add (results_display); - list_scroller.set_size_request (-1, 250); + list_scroller.set_size_request (-1, 150); list_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); - - results.get_vbox()->pack_start (list_scroller, true, true); - results.add_button (Stock::OK, RESPONSE_ACCEPT); + + dvbox.pack_start (dhbox, true, false, 5); + dvbox.pack_start (list_scroller, true, false, 5); + ddhbox.pack_start (dvbox, true, false, 5); + + results.get_vbox()->pack_start (ddhbox, true, false, 5); + results.add_button (Stock::CLOSE, RESPONSE_CLOSE); + results.set_default_response (RESPONSE_CLOSE); results.set_position (Gtk::WIN_POS_MOUSE); + results.show_all_children (); + results.set_resizable (false); results.run (); + } void @@ -2208,15 +2003,20 @@ ARDOUR_UI::cleanup () return; } - ArdourDialog checker (_("ardour cleanup")); - Gtk::Label label (_("\ -Cleanup is a destructive operation.\n\ + + MessageDialog checker (_("Are you sure you want to cleanup?"), + true, + Gtk::MESSAGE_QUESTION, + (Gtk::ButtonsType)(Gtk::BUTTONS_NONE)); + + checker.set_secondary_text(_("Cleanup is a destructive operation.\n\ ALL undo/redo information will be lost if you cleanup.\n\ -Unused audio files will be moved to a \"dead sounds\" location.")); +After cleanup, unused audio files will be moved to a \ +\"dead sounds\" location.")); - checker.get_vbox()->pack_start (label, false, false); - checker.add_button (Stock::OK, RESPONSE_ACCEPT); checker.add_button (Stock::CANCEL, RESPONSE_CANCEL); + checker.add_button (_("Clean Up"), RESPONSE_ACCEPT); + checker.set_default_response (RESPONSE_CANCEL); checker.set_name (_("CleanupDialog")); checker.set_wmclass (_("ardour_cleanup"), "Ardour"); @@ -2236,14 +2036,16 @@ Unused audio files will be moved to a \"dead sounds\" location.")); if (session->cleanup_sources (rep)) { return; } - + checker.hide(); display_cleanup_results (rep, _("cleaned files"), _("\ -The following %1 %2 were not in use.\n\ -The next time you flush the wastebasket\n\ -it will release an additional %3 %4bytes\n\ -of disk space" +The following %1 %2 not in use and \n\ +have been moved to:\n\ +%3. \n\n\ +Flushing the wastebasket will \n\ +release an additional\n\ +%4 %5bytes of disk space.\n" )); } @@ -2263,7 +2065,9 @@ ARDOUR_UI::flush_trash () display_cleanup_results (rep, _("deleted file"), - _("The following %1 file%2 were deleted, releasing %3 %4bytes of disk space")); + _("The following %1 %2 deleted from\n\ +%3,\n\ +releasing %4 %5bytes of disk space")); } void @@ -2306,9 +2110,9 @@ ARDOUR_UI::add_route () string name_template = add_route_dialog->name_template (); bool track = add_route_dialog->track (); - Session::AutoConnectOption oac = session->get_output_auto_connect(); + AutoConnectOption oac = Config->get_output_auto_connect(); - if (oac & Session::AutoConnectMaster) { + if (oac & AutoConnectMaster) { output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan); } else { output_chan = input_chan; @@ -2316,17 +2120,10 @@ ARDOUR_UI::add_route () /* XXX do something with name template */ - while (count) { - if (track) { - session_add_audio_track (input_chan, output_chan); - } else { - session_add_audio_bus (input_chan, output_chan); - } - --count; - - while (Main::events_pending()) { - Main::iteration (); - } + if (track) { + session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count); + } else { + session_add_audio_bus (input_chan, output_chan, count); } } @@ -2338,7 +2135,7 @@ ARDOUR_UI::mixer_settings () const if (session) { node = session->instant_xml(X_("Mixer"), session->path()); } else { - node = Config->instant_xml(X_("Mixer"), Config->get_user_ardour_path()); + node = Config->instant_xml(X_("Mixer"), get_user_ardour_path()); } if (!node) { @@ -2356,7 +2153,7 @@ ARDOUR_UI::editor_settings () const if (session) { node = session->instant_xml(X_("Editor"), session->path()); } else { - node = Config->instant_xml(X_("Editor"), Config->get_user_ardour_path()); + node = Config->instant_xml(X_("Editor"), get_user_ardour_path()); } if (!node) { @@ -2383,20 +2180,9 @@ ARDOUR_UI::halt_on_xrun_message () { ENSURE_GUI_THREAD (mem_fun(*this, &ARDOUR_UI::halt_on_xrun_message)); - ArdourMessage msg (editor, X_("haltonxrun"), + MessageDialog msg (*editor, _("Recording was stopped because your system could not keep up.")); -} - -void -ARDOUR_UI::delete_sources_in_the_right_thread (list* deletion_list) -{ - ENSURE_GUI_THREAD (bind (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread), deletion_list)); - - for (list::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) { - delete *i; - } - - delete deletion_list; + msg.run (); } void @@ -2406,12 +2192,13 @@ ARDOUR_UI::disk_overrun_handler () if (!have_disk_overrun_displayed) { have_disk_overrun_displayed = true; - ArdourMessage msg (editor, X_("diskrate dialog"), _("\ + MessageDialog msg (*editor, X_("diskrate dialog"), _("\ The disk system on your computer\n\ was not able to keep up with Ardour.\n\ \n\ Specifically, it failed to write data to disk\n\ quickly enough to keep up with recording.\n")); + msg.run (); have_disk_overrun_displayed = false; } } @@ -2423,12 +2210,13 @@ ARDOUR_UI::disk_underrun_handler () if (!have_disk_underrun_displayed) { have_disk_underrun_displayed = true; - ArdourMessage msg (editor, X_("diskrate2 dialog"), + MessageDialog msg (*editor, (_("The disk system on your computer\n\ was not able to keep up with Ardour.\n\ \n\ Specifically, it failed to read data from disk\n\ quickly enough to keep up with playback.\n"))); + msg.run (); have_disk_underrun_displayed = false; } } @@ -2467,22 +2255,19 @@ what you would like to do.\n")); switch (dialog.run ()) { case RESPONSE_ACCEPT: - break; - default: return 1; + default: + return 0; } - - return 0; } - void ARDOUR_UI::disconnect_from_jack () { if (engine) { if( engine->disconnect_from_jack ()) { - ArdourMessage msg (editor, X_("nojack dialog"), - _("Could not disconnect from JACK")); + MessageDialog msg (*editor, _("Could not disconnect from JACK")); + msg.run (); } update_sample_rate (0); @@ -2494,8 +2279,8 @@ ARDOUR_UI::reconnect_to_jack () { if (engine) { if (engine->reconnect_to_jack ()) { - ArdourMessage msg (editor, X_("nojack dialog"), - _("Could not reconnect to JACK")); + MessageDialog msg (*editor, _("Could not reconnect to JACK")); + msg.run (); } update_sample_rate (0); @@ -2503,7 +2288,7 @@ ARDOUR_UI::reconnect_to_jack () } void -ARDOUR_UI::set_jack_buffer_size (jack_nframes_t nframes) +ARDOUR_UI::set_jack_buffer_size (nframes_t nframes) { engine->request_buffer_size (nframes); update_sample_rate (0); @@ -2528,3 +2313,52 @@ ARDOUR_UI::cmdline_new_session (string path) _will_create_new_session_automatically = false; /* done it */ return FALSE; /* don't call it again */ } + +void +ARDOUR_UI::use_config () +{ + Glib::RefPtr act; + + switch (Config->get_native_file_data_format ()) { + case FormatFloat: + act = ActionManager::get_action (X_("options"), X_("FileDataFormatFloat")); + break; + case FormatInt24: + act = ActionManager::get_action (X_("options"), X_("FileDataFormat24bit")); + break; + } + + if (act) { + Glib::RefPtr ract = Glib::RefPtr::cast_dynamic(act); + ract->set_active (); + } + + switch (Config->get_native_file_header_format ()) { + case BWF: + act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatBWF")); + break; + case WAVE: + act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE")); + break; + case WAVE64: + act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatWAVE64")); + break; + case iXML: + act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatiXML")); + break; + case RF64: + act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatRF64")); + break; + case CAF: + act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatCAF")); + break; + case AIFF: + act = ActionManager::get_action (X_("options"), X_("FileHeaderFormatAIFF")); + break; + } + + if (act) { + Glib::RefPtr ract = Glib::RefPtr::cast_dynamic(act); + ract->set_active (); + } +}