X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_ui.cc;h=7548f94c5b7ee6c9e3ba66099500d858490eae61;hb=2592a320d42dd4a157ee16101c042d875d3142be;hp=d18756fb7fdacd716a6050e637c34afaeab31408;hpb=c26215c1e59b6341da86f94f5b2b3ca950dd3889;p=ardour.git diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index d18756fb7f..7548f94c5b 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -86,7 +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; +sigc::signal ARDOUR_UI::Clock; ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) @@ -136,8 +136,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) theArdourUI = this; } - ActionManager::init (); - /* load colors */ color_manager = new ColorManager(); @@ -146,7 +144,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) color_manager->load (color_file); - m_new_session_dialog = new NewSessionDialog(); editor = 0; mixer = 0; session = 0; @@ -175,16 +172,12 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) shuttle_fract = 0.0; shuttle_max_speed = 8.0f; - set_shuttle_units (Percentage); - set_shuttle_behaviour (Sprung); - shuttle_style_menu = 0; shuttle_unit_menu = 0; gettimeofday (&last_peak_grab, 0); gettimeofday (&last_shuttle_request, 0); - ARDOUR::AudioDiskstream::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)); @@ -205,6 +198,9 @@ 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; @@ -491,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]; @@ -503,7 +499,7 @@ 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), _("%.1f kHz / %4.1f msecs"), @@ -545,7 +541,7 @@ void ARDOUR_UI::count_recenabled_diskstreams (Route& route) { Track* track = dynamic_cast(&route); - if (track && track->diskstream().record_enabled()) { + if (track && track->diskstream()->record_enabled()) { rec_enabled_diskstreams++; } } @@ -557,7 +553,7 @@ 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) { @@ -566,23 +562,13 @@ ARDOUR_UI::update_disk_space() 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_route (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); @@ -874,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::TrackMode mode) +ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many) { - boost::shared_ptr 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, mode)) == 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; + } } } @@ -918,17 +919,13 @@ restart JACK with more ports.")); } void -ARDOUR_UI::diskstream_added (Diskstream* ds) -{ -} - -void -ARDOUR_UI::do_transport_locate (jack_nframes_t new_position) +ARDOUR_UI::do_transport_locate (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; @@ -978,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 @@ -1003,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 (); @@ -1033,8 +1030,7 @@ 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."); - MessageDialog msg (*editor, txt); + MessageDialog msg (*editor, _("Please create 1 or more track\nbefore trying to record.\nCheck the Session menu.")); msg.run (); return; } @@ -1058,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 ()) { @@ -1076,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) { @@ -1085,7 +1081,7 @@ ARDOUR_UI::transport_loop() } } else { - session->request_auto_loop (true); + session->request_play_loop (true); } } } @@ -1172,7 +1168,7 @@ ARDOUR_UI::toggle_record_enable (uint32_t dstream) Track* t; if ((t = dynamic_cast(r.get())) != 0) { - t->diskstream().set_record_enabled (!t->diskstream().record_enabled()); + t->diskstream()->set_record_enabled (!t->diskstream()->record_enabled()); } } if (session == 0) { @@ -1298,7 +1294,6 @@ ARDOUR_UI::start_engine () settings for a new session */ session->save_state (""); - session->save_history (); } /* there is too much going on, in too many threads, for us to @@ -1366,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); } } @@ -1374,7 +1369,7 @@ 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; } } @@ -1472,7 +1467,6 @@ ARDOUR_UI::save_state_canfail (string name) } if ((ret = session->save_state (name)) != 0) { - session->save_history(); return ret; } } @@ -1608,123 +1602,169 @@ ARDOUR_UI::save_template () void ARDOUR_UI::new_session (bool startup, std::string predetermined_path) { - m_new_session_dialog->show(); - m_new_session_dialog->set_modal(true); - m_new_session_dialog->set_name(predetermined_path); - m_new_session_dialog->reset_recent(); + string session_name; + string session_path; - int response = Gtk::RESPONSE_CANCEL; + int response = Gtk::RESPONSE_NONE; + + 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 (); + response = new_session_dialog->run (); + if(response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) { - quit(); - return; + quit(); + return; } else if (response == Gtk::RESPONSE_NONE) { - /* Clear was pressed */ - m_new_session_dialog->reset(); + /* Clear was pressed */ + new_session_dialog->reset(); } else if (response == Gtk::RESPONSE_YES) { - /* YES == OPEN, but there's no enum for that */ - std::string session_name = m_new_session_dialog->session_name(); - std::string session_path = m_new_session_dialog->session_folder(); - load_session (session_path, session_name); - - } else if (response == Gtk::RESPONSE_OK) { - if (m_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.. - */ - std::string session_name = m_new_session_dialog->session_name(); - std::string session_path = m_new_session_dialog->session_folder(); - load_session (session_path, session_name); + /* YES == OPEN, but there's no enum for that */ - } else { - - _session_is_new = true; + session_name = new_session_dialog->session_name(); - std::string session_name = m_new_session_dialog->session_name(); - std::string session_path = m_new_session_dialog->session_folder(); + 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); + } + } else if (response == Gtk::RESPONSE_OK) { - //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); + session_name = new_session_dialog->session_name(); - std::string template_name = m_new_session_dialog->session_template_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); - m_new_session_dialog->hide(); - show(); + show(); + new_session_dialog->get_window()->set_cursor(); + new_session_dialog->hide(); } void ARDOUR_UI::close_session() { - unload_session(); - new_session (); + unload_session(); + new_session (); } int @@ -1763,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; } @@ -1786,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; @@ -1818,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; } @@ -1830,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) { @@ -1855,7 +1892,8 @@ void ARDOUR_UI::hide_splash () { if (about) { - // about->hide(); + about->get_window()->set_cursor (); + about->hide(); } } @@ -2072,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; @@ -2082,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, add_route_dialog->mode()); - } 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); } } @@ -2154,18 +2185,6 @@ ARDOUR_UI::halt_on_xrun_message () msg.run (); } -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; -} - void ARDOUR_UI::disk_overrun_handler () { @@ -2269,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); @@ -2295,72 +2314,6 @@ ARDOUR_UI::cmdline_new_session (string path) return FALSE; /* don't call it again */ } -void -ARDOUR_UI::set_native_file_header_format (HeaderFormat hf) -{ - Glib::RefPtr act; - - switch (hf) { - 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); - if (ract && ract->get_active() && Config->get_native_file_header_format() != hf) { - Config->set_native_file_header_format (hf); - if (session) { - session->reset_native_file_format (); - } - } - } -} - -void -ARDOUR_UI::set_native_file_data_format (SampleFormat sf) -{ - Glib::RefPtr act; - - switch (sf) { - 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); - - if (ract && ract->get_active() && Config->get_native_file_data_format() != sf) { - Config->set_native_file_data_format (sf); - if (session) { - session->reset_native_file_format (); - } - } - } -} - void ARDOUR_UI::use_config () {