diff --git a/SConstruct b/SConstruct index 1349355187..64aad2737f 100644 --- a/SConstruct +++ b/SConstruct @@ -451,7 +451,7 @@ libraries['usb'] = conf.Finish () libraries['flac'] = LibraryInfo () conf = Configure (libraries['flac']) -conf.CheckLib ('FLAC', 'FLAC__stream_decoder_new') +conf.CheckLib ('FLAC', 'FLAC__stream_decoder_new', language='CXX') libraries['flac'] = conf.Finish () # diff --git a/gtk2_ardour/SConscript b/gtk2_ardour/SConscript index 827fd1ac56..33f2d3471b 100644 --- a/gtk2_ardour/SConscript +++ b/gtk2_ardour/SConscript @@ -57,6 +57,9 @@ if gtkardour['FFT_ANALYSIS']: gtkardour.Merge ([libraries['fftw3f']]) gtkardour.Append(CCFLAGS='-DFFT_ANALYSIS') +if gtkardour['COREAUDIO']: + gtkardour.Append(CCFLAGS='-DHAVE_COREAUDIO') + skipped_files=Split(""" connection_editor.cc """) diff --git a/gtk2_ardour/analysis_window.cc b/gtk2_ardour/analysis_window.cc index 551e0b7d6d..f742afd727 100644 --- a/gtk2_ardour/analysis_window.cc +++ b/gtk2_ardour/analysis_window.cc @@ -241,7 +241,7 @@ AnalysisWindow::analyze_data (Gtk::Button *button) if (!pl || !rui) continue; - FFTResult *res = fft_graph.prepareResult(rui->color(), rui->route().name()); + FFTResult *res = fft_graph.prepareResult(rui->color(), rui->route()->name()); // if timeSelection if (source_selection_ranges_rb.get_active()) { @@ -322,7 +322,7 @@ AnalysisWindow::analyze_data (Gtk::Button *button) Gtk::TreeModel::Row newrow = *(tlmodel)->append(); - newrow[tlcols.trackname] = rui->route().name(); + newrow[tlcols.trackname] = rui->route()->name(); newrow[tlcols.visible] = true; newrow[tlcols.color] = rui->color(); newrow[tlcols.graph] = res; diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 58b48d3d15..0855317c33 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -187,8 +187,8 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) gettimeofday (&last_shuttle_request, 0); 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)); + 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 */ diff --git a/gtk2_ardour/audio_region_view.cc b/gtk2_ardour/audio_region_view.cc index 1aa214f52c..b6eb90eaf8 100644 --- a/gtk2_ardour/audio_region_view.cc +++ b/gtk2_ardour/audio_region_view.cc @@ -57,12 +57,32 @@ static const int32_t sync_mark_width = 9; AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &tv, AudioRegion& r, double spu, Gdk::Color& basic_color) : RegionView (parent, tv, r, spu, basic_color) + , sync_mark(0) + , zero_line(0) + , fade_in_shape(0) + , fade_out_shape(0) + , fade_in_handle(0) + , fade_out_handle(0) + , gain_line(0) + , _amplitude_above_axis(1.0) + , _flags(0) + , fade_color(0) { } AudioRegionView::AudioRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &tv, AudioRegion& r, double spu, Gdk::Color& basic_color, TimeAxisViewItem::Visibility visibility) : RegionView (parent, tv, r, spu, basic_color, visibility) + , sync_mark(0) + , zero_line(0) + , fade_in_shape(0) + , fade_out_shape(0) + , fade_in_handle(0) + , fade_out_handle(0) + , gain_line(0) + , _amplitude_above_axis(1.0) + , _flags(0) + , fade_color(0) { } diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 97c72c7bd2..05a134157e 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1115,7 +1115,7 @@ class Editor : public PublicEditor bool canvas_fade_out_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*); bool canvas_region_view_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*); bool canvas_region_view_name_highlight_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*); - bool canvas_region_view_name_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*); + bool canvas_region_view_name_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*); bool canvas_stream_view_event (GdkEvent* event,ArdourCanvas::Item*, RouteTimeAxisView*); bool canvas_marker_event (GdkEvent* event,ArdourCanvas::Item*, Marker*); bool canvas_zoom_rect_event (GdkEvent* event,ArdourCanvas::Item*); diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc index d52c71442f..8e635bbe13 100644 --- a/gtk2_ardour/editor_canvas_events.cc +++ b/gtk2_ardour/editor_canvas_events.cc @@ -735,7 +735,7 @@ Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas:: } bool -Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView* rv) +Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView* rv) { bool ret = false; diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 8258eb3c00..a866a9780a 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2000-2002 Paul Davis + Copyright (C) 2000-2006 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -14,8 +14,6 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - $Id$ */ #include diff --git a/gtk2_ardour/mixer_strip.h b/gtk2_ardour/mixer_strip.h index 2819917568..21db0d14ca 100644 --- a/gtk2_ardour/mixer_strip.h +++ b/gtk2_ardour/mixer_strip.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2000 Paul Davis + Copyright (C) 2000-2006 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -14,8 +14,6 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - $Id$ */ #ifndef __ardour_mixer_strip__ diff --git a/gtk2_ardour/panner_ui.cc b/gtk2_ardour/panner_ui.cc index ea41781a36..ccce2ec9f1 100644 --- a/gtk2_ardour/panner_ui.cc +++ b/gtk2_ardour/panner_ui.cc @@ -14,8 +14,6 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - $Id$ */ #include diff --git a/gtk2_ardour/plugin_selector.cc b/gtk2_ardour/plugin_selector.cc index a762a0b186..3a576d443e 100644 --- a/gtk2_ardour/plugin_selector.cc +++ b/gtk2_ardour/plugin_selector.cc @@ -50,6 +50,8 @@ PluginSelector::PluginSelector (PluginManager *mgr) session = 0; o_selected_plug = -1; i_selected_plug = 0; + + current_selection = ARDOUR::PluginInfo::LADSPA; lmodel = Gtk::ListStore::create(lcols); ladspa_display.set_model (lmodel); @@ -91,6 +93,25 @@ PluginSelector::PluginSelector (PluginManager *mgr) column->set_sort_column(i); } #endif + +#ifdef HAVE_COREAUDIO + aumodel = ListStore::create(aucols); + au_display.set_model (aumodel); + au_display.append_column (_("Available plugins"), aucols.name); + au_display.append_column (_("# Inputs"), aucols.ins); + au_display.append_column (_("# Outputs"), aucols.outs); + au_display.set_headers_visible (true); + au_display.set_reorderable (false); + auscroller.set_border_width(10); + auscroller.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + auscroller.add(au_display); + + for (int i = 0; i <=2; i++) { + Gtk::TreeView::Column* column = au_display.get_column(i); + column->set_sort_column(i); + } +#endif + ascroller.set_border_width(10); ascroller.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); ascroller.add(added_list); @@ -124,35 +145,51 @@ PluginSelector::PluginSelector (PluginManager *mgr) using namespace Gtk::Notebook_Helpers; notebook.pages().push_back (TabElem (lscroller, _("LADSPA"))); + #ifdef VST_SUPPORT if (Config->get_use_vst()) { notebook.pages().push_back (TabElem (vscroller, _("VST"))); } #endif +#ifdef HAVE_COREAUDIO + notebook.pages().push_back (TabElem (auscroller, _("AudioUnit"))); +#endif + table->set_name("PluginSelectorTable"); ladspa_display.set_name("PluginSelectorDisplay"); //ladspa_display.set_name("PluginSelectorList"); added_list.set_name("PluginSelectorList"); ladspa_display.signal_button_press_event().connect_notify (mem_fun(*this, &PluginSelector::row_clicked)); + ladspa_display.get_selection()->signal_changed().connect (mem_fun(*this, &PluginSelector::ladspa_display_selection_changed)); + #ifdef VST_SUPPORT if (Config->get_use_vst()) { vst_display.signal_button_press_event().connect_notify (mem_fun(*this, &PluginSelector::row_clicked)); vst_display.get_selection()->signal_changed().connect (mem_fun(*this, &PluginSelector::vst_display_selection_changed)); } #endif - + +#ifdef HAVE_COREAUDIO + au_display.signal_button_press_event().connect_notify (mem_fun(*this, &PluginSelector::row_clicked)); + au_display.get_selection()->signal_changed().connect (mem_fun(*this, &PluginSelector::au_display_selection_changed)); +#endif + btn_update->signal_clicked().connect (mem_fun(*this, &PluginSelector::btn_update_clicked)); btn_add->signal_clicked().connect(mem_fun(*this, &PluginSelector::btn_add_clicked)); btn_remove->signal_clicked().connect(mem_fun(*this, &PluginSelector::btn_remove_clicked)); - ladspa_display.get_selection()->signal_changed().connect (mem_fun(*this, &PluginSelector::ladspa_display_selection_changed)); added_list.get_selection()->signal_changed().connect (mem_fun(*this, &PluginSelector::added_list_selection_changed)); input_refiller (); + #ifdef VST_SUPPORT vst_refiller (); #endif + +#ifdef HAVE_COREAUDIO + au_refiller (); +#endif } void @@ -193,9 +230,7 @@ PluginSelector::input_refiller () list::iterator i; char ibuf[16], obuf[16]; lmodel->clear(); -#ifdef VST_SUPPORT - vmodel->clear(); -#endif + // Insert into GTK list for (row = 0, i=plugs.begin(); i != plugs.end(); ++i, ++row) { snprintf (ibuf, sizeof(ibuf)-1, "%d", (*i)->n_inputs); @@ -227,6 +262,7 @@ PluginSelector::vst_refiller () list &plugs = manager->vst_plugin_info (); list::iterator i; char ibuf[16], obuf[16]; + vmodel->clear(); // Insert into GTK list for (row = 0, i=plugs.begin(); i != plugs.end(); ++i, ++row) { @@ -242,7 +278,66 @@ PluginSelector::vst_refiller () } vmodel->set_sort_column (0, Gtk::SORT_ASCENDING); } -#endif + +void +PluginSelector::vst_display_selection_changed() +{ + if (vst_display.get_selection()->count_selected_rows() != 0) { + btn_add->set_sensitive (true); + } else { + btn_add->set_sensitive (false); + } + + current_selection = ARDOUR::PluginInfo::VST; +} + +#endif //VST_SUPPORT + +#ifdef HAVE_COREAUDIO + +void +PluginSelector::_au_refiller (void *arg) +{ + ((PluginSelector *) arg)->au_refiller (); +} + +void +PluginSelector::au_refiller () +{ + guint row; + list &plugs = manager->au_plugin_info (); + list::iterator i; + char ibuf[16], obuf[16]; + aumodel->clear(); + + // Insert into GTK list + for (row = 0, i=plugs.begin(); i != plugs.end(); ++i, ++row) { + + snprintf (ibuf, sizeof(ibuf)-1, "%d", (*i)->n_inputs); + snprintf (obuf, sizeof(obuf)-1, "%d", (*i)->n_outputs); + + Gtk::TreeModel::Row newrow = *(aumodel->append()); + newrow[aucols.name] = (*i)->name.c_str(); + newrow[aucols.ins] = ibuf; + newrow[aucols.outs] = obuf; + newrow[aucols.plugin] = *i; + } + aumodel->set_sort_column (0, Gtk::SORT_ASCENDING); +} + +void +PluginSelector::au_display_selection_changed() +{ + if (au_display.get_selection()->count_selected_rows() != 0) { + btn_add->set_sensitive (true); + } else { + btn_add->set_sensitive (false); + } + + current_selection = ARDOUR::PluginInfo::AudioUnit; +} + +#endif //HAVE_COREAUDIO void PluginSelector::use_plugin (PluginInfo* pi) @@ -263,29 +358,45 @@ PluginSelector::use_plugin (PluginInfo* pi) void PluginSelector::btn_add_clicked() { - bool vst = notebook.get_current_page(); // 0 = LADSPA, 1 = VST std::string name; ARDOUR::PluginInfo *pi; Gtk::TreeModel::Row newrow = *(amodel->append()); - if (vst) { + Gtk::TreeModel::Row row; + + switch (current_selection) { + case ARDOUR::PluginInfo::LADSPA: + row = *(ladspa_display.get_selection()->get_selected()); + name = row[lcols.name]; + pi = row[lcols.plugin]; + added_plugins.push_back (row[lcols.plugin]); + break; + case ARDOUR::PluginInfo::VST: #ifdef VST_SUPPORT - Gtk::TreeModel::Row row = *(vst_display.get_selection()->get_selected()); - name = row[vcols.name]; - pi = row[vcols.plugin]; - added_plugins.push_back (row[vcols.plugin]); + row = *(vst_display.get_selection()->get_selected()); + name = row[vcols.name]; + pi = row[vcols.plugin]; + added_plugins.push_back (row[vcols.plugin]); #endif - } else { - Gtk::TreeModel::Row row = *(ladspa_display.get_selection()->get_selected()); - name = row[lcols.name]; - pi = row[lcols.plugin]; - added_plugins.push_back (row[lcols.plugin]); + break; + case ARDOUR::PluginInfo::AudioUnit: +#ifdef HAVE_COREAUDIO + row = *(au_display.get_selection()->get_selected()); + name = row[aucols.name]; + pi = row[aucols.plugin]; + added_plugins.push_back (row[aucols.plugin]); +#endif + break; + default: + error << "Programming error. Unknown plugin selected." << endmsg; + return; } + newrow[acols.text] = name; newrow[acols.plugin] = pi; if (!amodel->children().empty()) { - set_response_sensitive (RESPONSE_APPLY, true); + set_response_sensitive (RESPONSE_APPLY, true); } } @@ -313,28 +424,21 @@ PluginSelector::btn_update_clicked() #ifdef VST_SUPPORT vst_refiller (); #endif -} - -#ifdef VST_SUPPORT -void -PluginSelector::vst_display_selection_changed() -{ - if (vst_display.get_selection()->count_selected_rows() != 0) { - btn_add->set_sensitive (true); - } else { - btn_add->set_sensitive (false); - } -} +#ifdef HAVE_COREAUDIO + au_refiller (); #endif +} void PluginSelector::ladspa_display_selection_changed() { - if (ladspa_display.get_selection()->count_selected_rows() != 0) { - btn_add->set_sensitive (true); - } else { - btn_add->set_sensitive (false); - } + if (ladspa_display.get_selection()->count_selected_rows() != 0) { + btn_add->set_sensitive (true); + } else { + btn_add->set_sensitive (false); + } + + current_selection = ARDOUR::PluginInfo::LADSPA; } void @@ -378,4 +482,3 @@ PluginSelector::cleanup () added_plugins.clear(); amodel->clear(); } - diff --git a/gtk2_ardour/plugin_selector.h b/gtk2_ardour/plugin_selector.h index bbaf359aa4..5afe7469ab 100644 --- a/gtk2_ardour/plugin_selector.h +++ b/gtk2_ardour/plugin_selector.h @@ -25,10 +25,11 @@ #include #include +#include + namespace ARDOUR { class Session; class PluginManager; - class Plugin; class PluginInfo; } @@ -45,9 +46,12 @@ class PluginSelector : public ArdourDialog private: ARDOUR::Session* session; Gtk::Notebook notebook; - Gtk::ScrolledWindow lscroller; - Gtk::ScrolledWindow vscroller; - Gtk::ScrolledWindow ascroller; + Gtk::ScrolledWindow lscroller; // ladspa + Gtk::ScrolledWindow vscroller; // vst + Gtk::ScrolledWindow auscroller; // AudioUnit + Gtk::ScrolledWindow ascroller; // Added plugins + + ARDOUR::PluginInfo::Type current_selection; // page 1 struct LadspaColumns : public Gtk::TreeModel::ColumnRecord { @@ -105,7 +109,30 @@ class PluginSelector : public ArdourDialog static void _vst_refiller (void *); void vst_refiller (); void vst_display_selection_changed(); -#endif +#endif // VST_SUPPORT + +#ifdef HAVE_COREAUDIO + // page 3 + struct AUColumns : public Gtk::TreeModel::ColumnRecord { + AUColumns () { + add (name); + add (ins); + add (outs); + add (plugin); + } + Gtk::TreeModelColumn name; + Gtk::TreeModelColumn ins; + Gtk::TreeModelColumn outs; + Gtk::TreeModelColumn plugin; + }; + AUColumns aucols; + Glib::RefPtr aumodel; + Glib::RefPtr auselection; + Gtk::TreeView au_display; + static void _au_refiller (void *); + void au_refiller (); + void au_display_selection_changed(); +#endif //HAVE_COREAUDIO ARDOUR::PluginInfo* i_selected_plug; @@ -131,3 +158,4 @@ class PluginSelector : public ArdourDialog }; #endif // __ardour_plugin_selector_h__ + diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h index 42e313cf60..aa30a828a8 100644 --- a/gtk2_ardour/public_editor.h +++ b/gtk2_ardour/public_editor.h @@ -40,7 +40,6 @@ class ControlPoint; class SelectionRect; class CrossfadeView; class RouteTimeAxisView; -class AudioTimeAxisView; class RegionView; class AudioRegionView; class TempoMarker; @@ -149,7 +148,7 @@ class PublicEditor : public Gtk::Window, public Stateful { virtual bool canvas_fade_out_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*) = 0; virtual bool canvas_region_view_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*) = 0; virtual bool canvas_region_view_name_highlight_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*) = 0; - virtual bool canvas_region_view_name_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*) = 0; + virtual bool canvas_region_view_name_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*) = 0; virtual bool canvas_stream_view_event (GdkEvent* event,ArdourCanvas::Item*, RouteTimeAxisView*) = 0; virtual bool canvas_marker_event (GdkEvent* event,ArdourCanvas::Item*, Marker*) = 0; virtual bool canvas_zoom_rect_event (GdkEvent* event,ArdourCanvas::Item*) = 0; diff --git a/gtk2_ardour/region_view.cc b/gtk2_ardour/region_view.cc index 80d38a3cac..0fff2e5d7b 100644 --- a/gtk2_ardour/region_view.cc +++ b/gtk2_ardour/region_view.cc @@ -67,6 +67,15 @@ RegionView::RegionView (ArdourCanvas::Group* parent, TimeAxisViewItem::ShowNameHighlight| TimeAxisViewItem::ShowFrame)) , _region (r) + , sync_mark(0) + , no_wave_msg(0) + , editor(0) + , current_visible_sync_position(0.0) + , valid(false) + , _pixel_width(1.0) + , _height(1.0) + , in_destructor(false) + , wait_for_data(false) { } @@ -78,6 +87,15 @@ RegionView::RegionView (ArdourCanvas::Group* parent, TimeAxisViewItem::Visibility visibility) : TimeAxisViewItem (r.name(), *parent, tv, spu, basic_color, r.position(), r.length(), visibility) , _region (r) + , sync_mark(0) + , no_wave_msg(0) + , editor(0) + , current_visible_sync_position(0.0) + , valid(false) + , _pixel_width(1.0) + , _height(1.0) + , in_destructor(false) + , wait_for_data(false) { } diff --git a/gtk2_ardour/route_time_axis.h b/gtk2_ardour/route_time_axis.h index d673f646a4..d305fd390c 100644 --- a/gtk2_ardour/route_time_axis.h +++ b/gtk2_ardour/route_time_axis.h @@ -56,6 +56,7 @@ class PublicEditor; class RegionView; class StreamView; class Selection; +class RegionSelection; class Selectable; class AutomationTimeAxisView; class AutomationLine; diff --git a/gtk2_ardour/selection_templates.h b/gtk2_ardour/selection_templates.h index 5ff2c625bc..9511db7d61 100644 --- a/gtk2_ardour/selection_templates.h +++ b/gtk2_ardour/selection_templates.h @@ -27,9 +27,9 @@ */ #include -#include #include "selection.h" +#include "region_view.h" inline void Selection::foreach_region (void (ARDOUR::Region::*method)(void)) { diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc index 4948525b15..d9ded04d2b 100644 --- a/gtk2_ardour/sfdb_ui.cc +++ b/gtk2_ardour/sfdb_ui.cc @@ -98,7 +98,7 @@ SoundFileBox::SoundFileBox () remove_field_btn.signal_clicked().connect (mem_fun (*this, &SoundFileBox::remove_field_clicked)); - Gtk::CellRendererText* cell(static_cast(field_view.get_column_cell_renderer(1))); + Gtk::CellRendererText* cell(dynamic_cast(field_view.get_column_cell_renderer(1))); cell->signal_edited().connect (mem_fun (*this, &SoundFileBox::field_edited)); field_view.get_selection()->signal_changed().connect (mem_fun (*this, &SoundFileBox::field_selected)); diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index 91cb7ad58b..ef90c34755 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -215,7 +215,7 @@ get_font_for_style (string widgetname) { Gtk::Window window (WINDOW_TOPLEVEL); Gtk::Label foobar; - Glib::RefPtr