X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_ui.cc;h=fafaf8e6e0be243ed64df7fc3b35b4ab60c33006;hb=60454cc8dc1ca5e1819b853b55916d52497d495c;hp=cb0881c620db888d1f8477cba8a139616e943cf2;hpb=3732decd72d387d7005644621205b872ff7fd8d6;p=ardour.git diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index cb0881c620..fafaf8e6e0 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -33,7 +33,6 @@ #include #include -#include #include #include #include @@ -51,12 +50,13 @@ #include #include #include -#include -#include +#include +#include #include -#include +#include #include #include +#include #include "actions.h" #include "ardour_ui.h" @@ -77,6 +77,7 @@ #include "i18n.h" using namespace ARDOUR; +using namespace PBD; using namespace Gtkmm2ext; using namespace Gtk; using namespace sigc; @@ -116,13 +117,13 @@ 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) @@ -147,9 +148,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) color_manager->load (color_file); - 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); + m_new_session_dialog = new NewSessionDialog(); editor = 0; mixer = 0; session = 0; @@ -187,10 +186,9 @@ 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::AudioDiskstream::DeleteSources.connect (mem_fun(*this, &ARDOUR_UI::delete_sources_in_the_right_thread)); + ARDOUR::AudioDiskstream::DiskOverrun.connect (mem_fun(*this, &ARDOUR_UI::disk_overrun_handler)); + ARDOUR::AudioDiskstream::DiskUnderrun.connect (mem_fun(*this, &ARDOUR_UI::disk_underrun_handler)); /* handle pending state with a dialog */ @@ -199,22 +197,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) /* 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()); - - MessageDialog message (*editor, msg); - message.run (); -} - void ARDOUR_UI::set_engine (AudioEngine& e) { @@ -229,22 +211,6 @@ ARDOUR_UI::set_engine (AudioEngine& e) keyboard = new Keyboard; - string meter_path; - - meter_path = ARDOUR::find_data_file("v_meter_strip.xpm", "pixmaps"); - if (meter_path.empty()) { - error << _("no vertical meter strip image found") << endmsg; - exit (1); - } - FastMeter::set_vertical_xpm (meter_path); - - meter_path = ARDOUR::find_data_file("h_meter_strip.xpm", "pixmaps"); - if (meter_path.empty()) { - error << _("no horizontal meter strip image found") << endmsg; - exit (1); - } - FastMeter::set_horizontal_xpm (meter_path); - if (setup_windows ()) { throw failed_constructor (); } @@ -277,10 +243,10 @@ ARDOUR_UI::set_engine (AudioEngine& e) /* 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(); } @@ -317,7 +283,7 @@ ARDOUR_UI::~ARDOUR_UI () delete add_route_dialog; } - Source::stop_peak_thread (); + AudioSource::stop_peak_thread (); } gint @@ -428,7 +394,7 @@ If you still wish to quit, please use the\n\n\ break; } } - + Config->save_state(); quit (); } @@ -542,11 +508,11 @@ ARDOUR_UI::update_sample_rate (jack_nframes_t ignored) jack_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); } @@ -559,7 +525,7 @@ 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); } @@ -578,9 +544,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++; } } @@ -596,7 +563,7 @@ ARDOUR_UI::update_disk_space() char buf[64]; if (frames == max_frames) { - strcpy (buf, _("space: 24hrs+")); + strcpy (buf, _("Disk: 24hrs+")); } else { int hrs; int mins; @@ -606,7 +573,7 @@ ARDOUR_UI::update_disk_space() if (session->actively_recording()){ rec_enabled_diskstreams = 0; - session->foreach_diskstream (this, &ARDOUR_UI::count_recenabled_diskstreams); + session->foreach_route (this, &ARDOUR_UI::count_recenabled_diskstreams); if (rec_enabled_diskstreams) { frames /= rec_enabled_diskstreams; @@ -626,7 +593,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); @@ -736,7 +703,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) { @@ -843,9 +810,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) { @@ -901,11 +870,51 @@ ARDOUR_UI::open_session () void -ARDOUR_UI::session_add_midi_track () +ARDOUR_UI::session_add_midi_route (bool disk) { - cerr << _("Patience is a virtue.\n"); + Route* route; + + if (session == 0) { + warning << _("You cannot add a track without a session already loaded.") << endmsg; + return; + } + + try { + if (disk) { + if ((route = session->new_midi_track ()) == 0) { + error << _("could not create new MIDI track") << endmsg; + } + } else { + if ((route = session->new_midi_route ()) == 0) { + error << _("could not create new MIDI bus") << endmsg; + } + } +#if 0 +#if CONTROLOUTS + if (need_control_room_outs) { + pan_t pans[2]; + + pans[0] = 0.5; + pans[1] = 0.5; + + route->set_stereo_control_outs (control_lr_channels); + route->control_outs()->set_stereo_pan (pans, this); + } +#endif /* CONTROLOUTS */ +#endif + } + + catch (...) { + 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::session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode) { @@ -951,7 +960,7 @@ restart JACK with more ports.")); } void -ARDOUR_UI::diskstream_added (DiskStream* ds) +ARDOUR_UI::diskstream_added (Diskstream* ds) { } @@ -1192,32 +1201,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; + Route* 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)) != 0) { + t->diskstream().set_record_enabled (!t->diskstream().record_enabled(), this); + } + } if (session == 0) { return; } - - DiskStream *ds; - - if ((ds = session->diskstream_by_id (dstream)) != 0) { - ds->set_record_enabled (!ds->record_enabled(), this); - } } void @@ -1418,63 +1420,6 @@ ARDOUR_UI::stop_blinking () } } - -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, @@ -1603,7 +1548,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()) { @@ -1703,7 +1648,7 @@ 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->show(); m_new_session_dialog->set_modal(true); m_new_session_dialog->set_name(predetermined_path); m_new_session_dialog->reset_recent(); @@ -1716,7 +1661,7 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path) quit(); return; - } else if (response == 0) { + } else if (response == Gtk::RESPONSE_NONE) { /* Clear was pressed */ m_new_session_dialog->reset(); @@ -1746,10 +1691,10 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path) std::string session_name = m_new_session_dialog->session_name(); std::string session_path = m_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. - */ + + //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); std::string template_name = m_new_session_dialog->session_template_name(); @@ -1809,8 +1754,8 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path) } } - } while (response == 0); - m_new_session_dialog->hide_all(); + } while (response == Gtk::RESPONSE_NONE); + m_new_session_dialog->hide(); show(); } @@ -2178,7 +2123,11 @@ ARDOUR_UI::add_route () /* XXX do something with name template */ while (count) { - if (track) { + if (track && add_route_dialog->midi()) { + session_add_midi_track(); + } else if (add_route_dialog->midi()) { + session_add_midi_bus(); + } else if (track) { session_add_audio_track (input_chan, output_chan, add_route_dialog->mode()); } else { session_add_audio_bus (input_chan, output_chan); @@ -2250,11 +2199,11 @@ ARDOUR_UI::halt_on_xrun_message () } void -ARDOUR_UI::delete_sources_in_the_right_thread (list* deletion_list) +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) { + for (list::iterator i = deletion_list->begin(); i != deletion_list->end(); ++i) { delete *i; } @@ -2411,6 +2360,12 @@ ARDOUR_UI::set_native_file_header_format (HeaderFormat hf) 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) { @@ -2485,6 +2440,12 @@ ARDOUR_UI::use_config () 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) {