change PropertyChange from a bitfield into a real object, with all the many widespread changes that causes

git-svn-id: svn://localhost/ardour2/branches/3.0@6701 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2010-02-19 18:09:08 +00:00
parent 728bedf9b9
commit fa701b8c06
78 changed files with 644 additions and 746 deletions

View file

@ -152,10 +152,19 @@ AudioRegionEditor::AudioRegionEditor (Session* s, boost::shared_ptr<AudioRegion>
show_all(); show_all();
name_changed (); name_changed ();
bounds_changed (PropertyChange (StartChanged|LengthChanged|PositionChanged|Region::SyncOffsetChanged));
PropertyChange change;
change.add (ARDOUR::Properties::start);
change.add (ARDOUR::Properties::length);
change.add (ARDOUR::Properties::position);
change.add (ARDOUR::Properties::sync_position);
bounds_changed (change);
gain_changed (); gain_changed ();
_region->StateChanged.connect (state_connection, ui_bind (&AudioRegionEditor::region_changed, this, _1), gui_context()); _region->PropertyChanged.connect (state_connection, ui_bind (&AudioRegionEditor::region_changed, this, _1), gui_context());
spin_arrow_grab = false; spin_arrow_grab = false;
@ -167,17 +176,24 @@ AudioRegionEditor::~AudioRegionEditor ()
} }
void void
AudioRegionEditor::region_changed (PBD::PropertyChange what_changed) AudioRegionEditor::region_changed (const PBD::PropertyChange& what_changed)
{ {
if (what_changed & NameChanged) { if (what_changed.contains (ARDOUR::Properties::name)) {
name_changed (); name_changed ();
} }
if (what_changed & PropertyChange (BoundsChanged|StartChanged|Region::SyncOffsetChanged)) { PropertyChange interesting_stuff;
interesting_stuff.add (ARDOUR::Properties::position);
interesting_stuff.add (ARDOUR::Properties::length);
interesting_stuff.add (ARDOUR::Properties::start);
interesting_stuff.add (ARDOUR::Properties::sync_position);
if (what_changed.contains (interesting_stuff)) {
bounds_changed (what_changed); bounds_changed (what_changed);
} }
if (what_changed & AudioRegion::ScaleAmplitudeChanged) { if (what_changed.contains (ARDOUR::Properties::scale_amplitude)) {
gain_changed (); gain_changed ();
} }
} }
@ -326,35 +342,35 @@ AudioRegionEditor::name_changed ()
} }
void void
AudioRegionEditor::bounds_changed (PropertyChange what_changed) AudioRegionEditor::bounds_changed (const PropertyChange& what_changed)
{ {
if ((what_changed & PropertyChange (PositionChanged|LengthChanged)) == PropertyChange (PositionChanged|LengthChanged)) { if (what_changed.contains (ARDOUR::Properties::position) && what_changed.contains (ARDOUR::Properties::length)) {
position_clock.set (_region->position(), true); position_clock.set (_region->position(), true);
end_clock.set (_region->position() + _region->length() - 1, true); end_clock.set (_region->position() + _region->length() - 1, true);
length_clock.set (_region->length(), true); length_clock.set (_region->length(), true);
} else if (what_changed & PropertyChange (PositionChanged)) { } else if (what_changed.contains (ARDOUR::Properties::position)) {
position_clock.set (_region->position(), true); position_clock.set (_region->position(), true);
end_clock.set (_region->position() + _region->length() - 1, true); end_clock.set (_region->position() + _region->length() - 1, true);
} else if (what_changed & PropertyChange (LengthChanged)) { } else if (what_changed.contains (ARDOUR::Properties::length)) {
end_clock.set (_region->position() + _region->length() - 1, true); end_clock.set (_region->position() + _region->length() - 1, true);
length_clock.set (_region->length(), true); length_clock.set (_region->length(), true);
} }
if ((what_changed & Region::SyncOffsetChanged) || (what_changed & PositionChanged)) { if (what_changed.contains (ARDOUR::Properties::sync_position) || what_changed.contains (ARDOUR::Properties::position)) {
int dir; int dir;
nframes_t off = _region->sync_offset (dir); nframes_t off = _region->sync_offset (dir);
if (dir == -1) { if (dir == -1) {
off = -off; off = -off;
} }
if (what_changed & Region::SyncOffsetChanged) { if (what_changed.contains (ARDOUR::Properties::sync_position)) {
sync_offset_relative_clock.set (off, true); sync_offset_relative_clock.set (off, true);
} }
sync_offset_absolute_clock.set (off + _region->position (), true); sync_offset_absolute_clock.set (off + _region->position (), true);
} }
if (what_changed & StartChanged) { if (what_changed.contains (ARDOUR::Properties::start)) {
start_clock.set (_region->start(), true); start_clock.set (_region->start(), true);
} }
} }
@ -412,6 +428,14 @@ AudioRegionEditor::sync_offset_relative_clock_changed ()
bool bool
AudioRegionEditor::on_delete_event (GdkEventAny* ev) AudioRegionEditor::on_delete_event (GdkEventAny* ev)
{ {
bounds_changed (PropertyChange (StartChanged|LengthChanged|PositionChanged|Region::SyncOffsetChanged)); PropertyChange change;
change.add (ARDOUR::Properties::start);
change.add (ARDOUR::Properties::length);
change.add (ARDOUR::Properties::position);
change.add (ARDOUR::Properties::sync_position);
bounds_changed (change);
return RegionEditor::on_delete_event (ev); return RegionEditor::on_delete_event (ev);
} }

View file

@ -98,8 +98,8 @@ class AudioRegionEditor : public RegionEditor
PBD::ScopedConnection state_connection; PBD::ScopedConnection state_connection;
PBD::ScopedConnection audition_connection; PBD::ScopedConnection audition_connection;
void region_changed (PBD::PropertyChange); void region_changed (const PBD::PropertyChange&);
void bounds_changed (PBD::PropertyChange); void bounds_changed (const PBD::PropertyChange&);
void name_changed (); void name_changed ();
void gain_changed (); void gain_changed ();

View file

@ -222,7 +222,8 @@ AudioRegionView::init (Gdk::Color const & basic_color, bool wfd)
region_muted (); region_muted ();
region_sync_changed (); region_sync_changed ();
region_resized (BoundsChanged);
region_resized (ARDOUR::bounds_change);
set_waveview_data_src(); set_waveview_data_src();
region_locked (); region_locked ();
envelope_active_changed (); envelope_active_changed ();
@ -264,29 +265,29 @@ AudioRegionView::audio_region() const
} }
void void
AudioRegionView::region_changed (PropertyChange what_changed) AudioRegionView::region_changed (const PropertyChange& what_changed)
{ {
ENSURE_GUI_THREAD (*this, &AudioRegionView::region_changed, what_changed) ENSURE_GUI_THREAD (*this, &AudioRegionView::region_changed, what_changed)
//cerr << "AudioRegionView::region_changed() called" << endl; //cerr << "AudioRegionView::region_changed() called" << endl;
RegionView::region_changed(what_changed); RegionView::region_changed (what_changed);
if (what_changed & AudioRegion::ScaleAmplitudeChanged) { if (what_changed.contains (ARDOUR::Properties::scale_amplitude)) {
region_scale_amplitude_changed (); region_scale_amplitude_changed ();
} }
if (what_changed & AudioRegion::FadeInChanged) { if (what_changed.contains (ARDOUR::Properties::fade_in)) {
fade_in_changed (); fade_in_changed ();
} }
if (what_changed & AudioRegion::FadeOutChanged) { if (what_changed.contains (ARDOUR::Properties::fade_out)) {
fade_out_changed (); fade_out_changed ();
} }
if (what_changed & AudioRegion::FadeInActiveChanged) { if (what_changed.contains (ARDOUR::Properties::fade_in_active)) {
fade_in_active_changed (); fade_in_active_changed ();
} }
if (what_changed & AudioRegion::FadeOutActiveChanged) { if (what_changed.contains (ARDOUR::Properties::fade_out_active)) {
fade_out_active_changed (); fade_out_active_changed ();
} }
if (what_changed & AudioRegion::EnvelopeActiveChanged) { if (what_changed.contains (ARDOUR::Properties::envelope_active)) {
envelope_active_changed (); envelope_active_changed ();
} }
} }
@ -372,13 +373,17 @@ AudioRegionView::region_renamed ()
} }
void void
AudioRegionView::region_resized (PropertyChange what_changed) AudioRegionView::region_resized (const PropertyChange& what_changed)
{ {
AudioGhostRegion* agr; AudioGhostRegion* agr;
RegionView::region_resized(what_changed); RegionView::region_resized(what_changed);
PropertyChange interesting_stuff;
if (what_changed & PropertyChange (StartChanged|LengthChanged)) { interesting_stuff.add (ARDOUR::Properties::start);
interesting_stuff.add (ARDOUR::Properties::length);
if (what_changed.contains (interesting_stuff)) {
for (uint32_t n = 0; n < waves.size(); ++n) { for (uint32_t n = 0; n < waves.size(); ++n) {
waves[n]->property_region_start() = _region->start(); waves[n]->property_region_start() = _region->start();

View file

@ -98,7 +98,7 @@ class AudioRegionView : public RegionView
AudioRegionGainLine* get_gain_line() const { return gain_line; } AudioRegionGainLine* get_gain_line() const { return gain_line; }
void region_changed (PBD::PropertyChange); void region_changed (const PBD::PropertyChange&);
void envelope_active_changed (); void envelope_active_changed ();
GhostRegion* add_ghost (TimeAxisView&); GhostRegion* add_ghost (TimeAxisView&);
@ -150,7 +150,7 @@ class AudioRegionView : public RegionView
void fade_in_active_changed (); void fade_in_active_changed ();
void fade_out_active_changed (); void fade_out_active_changed ();
void region_resized (PBD::PropertyChange); void region_resized (const PBD::PropertyChange&);
void region_muted (); void region_muted ();
void region_scale_amplitude_changed (); void region_scale_amplitude_changed ();
void region_renamed (); void region_renamed ();

View file

@ -61,7 +61,7 @@ AutomationRegionView::init (Gdk::Color const & basic_color, bool /*wfd*/)
set_height (trackview.current_height()); set_height (trackview.current_height());
_region->StateChanged.connect (*this, ui_bind (&RegionView::region_changed, this, _1), gui_context()); _region->PropertyChanged.connect (*this, ui_bind (&RegionView::region_changed, this, _1), gui_context());
set_colors (); set_colors ();
@ -158,7 +158,7 @@ AutomationRegionView::reset_width_dependent_items (double pixel_width)
void void
AutomationRegionView::region_resized (PBD::PropertyChange what_changed) AutomationRegionView::region_resized (const PBD::PropertyChange& what_changed)
{ {
RegionView::region_resized(what_changed); RegionView::region_resized(what_changed);

View file

@ -66,7 +66,7 @@ public:
protected: protected:
void create_line(boost::shared_ptr<ARDOUR::AutomationList> list); void create_line(boost::shared_ptr<ARDOUR::AutomationList> list);
bool set_position(nframes64_t pos, void* src, double* ignored); bool set_position(nframes64_t pos, void* src, double* ignored);
void region_resized (PBD::PropertyChange what_changed); void region_resized (const PBD::PropertyChange&);
bool canvas_event(GdkEvent* ev); bool canvas_event(GdkEvent* ev);
void add_automation_event (GdkEvent* event, nframes_t when, double y); void add_automation_event (GdkEvent* event, nframes_t when, double y);
void entered(); void entered();

View file

@ -291,7 +291,7 @@ CrossfadeEditor::CrossfadeEditor (Session* s, boost::shared_ptr<Crossfade> xf, d
curve_select_clicked (In); curve_select_clicked (In);
xfade->StateChanged.connect (state_connection, ui_bind (&CrossfadeEditor::xfade_changed, this, _1), gui_context()); xfade->PropertyChanged.connect (state_connection, ui_bind (&CrossfadeEditor::xfade_changed, this, _1), gui_context());
_session->AuditionActive.connect (_session_connections, ui_bind (&CrossfadeEditor::audition_state_changed, this, _1), gui_context()); _session->AuditionActive.connect (_session_connections, ui_bind (&CrossfadeEditor::audition_state_changed, this, _1), gui_context());
show_all_children(); show_all_children();
@ -624,7 +624,7 @@ CrossfadeEditor::canvas_allocation (Gtk::Allocation& /*alloc*/)
void void
CrossfadeEditor::xfade_changed (PropertyChange) CrossfadeEditor::xfade_changed (const PropertyChange&)
{ {
set (xfade->fade_in(), In); set (xfade->fade_in(), In);
set (xfade->fade_out(), Out); set (xfade->fade_out(), Out);

View file

@ -213,7 +213,7 @@ class CrossfadeEditor : public ArdourDialog
void audition_right_dry (); void audition_right_dry ();
void audition_right (); void audition_right ();
void xfade_changed (PBD::PropertyChange); void xfade_changed (const PBD::PropertyChange&);
void dump (); void dump ();
}; };

View file

@ -82,9 +82,12 @@ CrossfadeView::CrossfadeView (ArdourCanvas::Group *parent,
group->signal_event().connect (sigc::bind (sigc::mem_fun (tv.editor(), &PublicEditor::canvas_crossfade_view_event), group, this)); group->signal_event().connect (sigc::bind (sigc::mem_fun (tv.editor(), &PublicEditor::canvas_crossfade_view_event), group, this));
crossfade_changed (PropertyChange (~0)); PropertyChange all_crossfade_properties;
all_crossfade_properties.add (ARDOUR::Properties::active);
all_crossfade_properties.add (ARDOUR::Properties::follow_overlap);
crossfade_changed (all_crossfade_properties);
crossfade->StateChanged.connect (*this, ui_bind (&CrossfadeView::crossfade_changed, this, _1), gui_context()); crossfade->PropertyChanged.connect (*this, ui_bind (&CrossfadeView::crossfade_changed, this, _1), gui_context());
ColorsChanged.connect (sigc::mem_fun (*this, &CrossfadeView::color_handler)); ColorsChanged.connect (sigc::mem_fun (*this, &CrossfadeView::color_handler));
} }
@ -123,11 +126,11 @@ CrossfadeView::set_height (double height)
} }
void void
CrossfadeView::crossfade_changed (PropertyChange what_changed) CrossfadeView::crossfade_changed (const PropertyChange& what_changed)
{ {
bool need_redraw_curves = false; bool need_redraw_curves = false;
if (what_changed & BoundsChanged) { if (what_changed.contains (ARDOUR::bounds_change)) {
set_position (crossfade->position(), this); set_position (crossfade->position(), this);
set_duration (crossfade->length(), this); set_duration (crossfade->length(), this);
@ -136,11 +139,11 @@ CrossfadeView::crossfade_changed (PropertyChange what_changed)
need_redraw_curves = false; need_redraw_curves = false;
} }
if (what_changed & Crossfade::FollowOverlapChanged) { if (what_changed.contains (ARDOUR::Properties::follow_overlap)) {
need_redraw_curves = true; need_redraw_curves = true;
} }
if (what_changed & Crossfade::ActiveChanged) { if (what_changed.contains (ARDOUR::Properties::active)) {
/* calls redraw_curves */ /* calls redraw_curves */
active_changed (); active_changed ();
} else if (need_redraw_curves) { } else if (need_redraw_curves) {

View file

@ -75,7 +75,7 @@ struct CrossfadeView : public TimeAxisViewItem
ArdourCanvas::Line *fade_out; ArdourCanvas::Line *fade_out;
ArdourCanvas::Item *active_button; ArdourCanvas::Item *active_button;
void crossfade_changed (PBD::PropertyChange); void crossfade_changed (const PBD::PropertyChange&);
void active_changed (); void active_changed ();
void redraw_curves (); void redraw_curves ();
void color_handler (); void color_handler ();

View file

@ -1073,7 +1073,7 @@ Editor::set_session (Session *t)
_session->DurationChanged.connect (_session_connections, boost::bind (&Editor::handle_new_duration, this), gui_context()); _session->DurationChanged.connect (_session_connections, boost::bind (&Editor::handle_new_duration, this), gui_context());
_session->DirtyChanged.connect (_session_connections, boost::bind (&Editor::update_title, this), gui_context()); _session->DirtyChanged.connect (_session_connections, boost::bind (&Editor::update_title, this), gui_context());
_session->TimecodeOffsetChanged.connect (_session_connections, boost::bind (&Editor::update_just_timecode, this), gui_context()); _session->TimecodeOffsetChanged.connect (_session_connections, boost::bind (&Editor::update_just_timecode, this), gui_context());
_session->tempo_map().StateChanged.connect (_session_connections, ui_bind (&Editor::tempo_map_changed, this, _1), gui_context()); _session->tempo_map().PropertyChanged.connect (_session_connections, ui_bind (&Editor::tempo_map_changed, this, _1), gui_context());
_session->Located.connect (_session_connections, boost::bind (&Editor::located, this), gui_context()); _session->Located.connect (_session_connections, boost::bind (&Editor::located, this), gui_context());
_session->config.ParameterChanged.connect (_session_connections, ui_bind (&Editor::parameter_changed, this, _1), gui_context()); _session->config.ParameterChanged.connect (_session_connections, ui_bind (&Editor::parameter_changed, this, _1), gui_context());
_session->StateSaved.connect (_session_connections, ui_bind (&Editor::session_state_saved, this, _1), gui_context()); _session->StateSaved.connect (_session_connections, ui_bind (&Editor::session_state_saved, this, _1), gui_context());
@ -3736,7 +3736,10 @@ Editor::edit_xfade (boost::weak_ptr<Crossfade> wxfade)
} }
cew.apply (); cew.apply ();
xfade->StateChanged (PropertyChange (~0)); PropertyChange all_crossfade_properties;
all_crossfade_properties.add (ARDOUR::Properties::active);
all_crossfade_properties.add (ARDOUR::Properties::follow_overlap);
xfade->PropertyChanged (all_crossfade_properties);
} }
PlaylistSelector& PlaylistSelector&

View file

@ -520,7 +520,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void location_changed (ARDOUR::Location *); void location_changed (ARDOUR::Location *);
void location_flags_changed (ARDOUR::Location *, void *); void location_flags_changed (ARDOUR::Location *, void *);
void refresh_location_display (); void refresh_location_display ();
void refresh_location_display_s (PBD::PropertyChange); void refresh_location_display_s (const PBD::PropertyChange&);
void refresh_location_display_internal (ARDOUR::Locations::LocationList&); void refresh_location_display_internal (ARDOUR::Locations::LocationList&);
void add_new_location (ARDOUR::Location *); void add_new_location (ARDOUR::Location *);
void location_gone (ARDOUR::Location *); void location_gone (ARDOUR::Location *);
@ -1475,7 +1475,7 @@ public:
void draw_metric_marks (const ARDOUR::Metrics& metrics); void draw_metric_marks (const ARDOUR::Metrics& metrics);
void compute_current_bbt_points (nframes_t left, nframes_t right); void compute_current_bbt_points (nframes_t left, nframes_t right);
void tempo_map_changed (PBD::PropertyChange); void tempo_map_changed (const PBD::PropertyChange&);
void redisplay_tempo (bool immediate_redraw); void redisplay_tempo (bool immediate_redraw);
void snap_to (nframes64_t& first, int32_t direction = 0, bool for_mark = false); void snap_to (nframes64_t& first, int32_t direction = 0, bool for_mark = false);

View file

@ -339,7 +339,7 @@ Editor::refresh_location_display ()
} }
void void
Editor::refresh_location_display_s (PropertyChange) Editor::refresh_location_display_s (const PropertyChange&)
{ {
ENSURE_GUI_THREAD (*this, &Editor::refresh_location_display_s, ignored) ENSURE_GUI_THREAD (*this, &Editor::refresh_location_display_s, ignored)

View file

@ -2151,7 +2151,7 @@ Editor::single_contents_trim (RegionView& rv, nframes64_t frame_delta, bool left
snap_to (new_bound); snap_to (new_bound);
} }
region->trim_start ((nframes64_t) (new_bound * speed), this); region->trim_start ((nframes64_t) (new_bound * speed), this);
rv.region_changed (StartChanged); rv.region_changed (PropertyChange (ARDOUR::Properties::start));
} }
void void
@ -2206,7 +2206,7 @@ Editor::single_start_trim (RegionView& rv, nframes64_t frame_delta, bool left_di
} }
} }
rv.region_changed (PropertyChange (LengthChanged|PositionChanged|StartChanged)); rv.region_changed (ARDOUR::bounds_change);
} }
void void
@ -2260,10 +2260,10 @@ Editor::single_end_trim (RegionView& rv, nframes64_t frame_delta, bool left_dire
region_right->trim_front(region->last_frame() + 1, this); region_right->trim_front(region->last_frame() + 1, this);
} }
rv.region_changed (PropertyChange (LengthChanged|PositionChanged|StartChanged)); rv.region_changed (ARDOUR::bounds_change);
}
else { } else {
rv.region_changed (LengthChanged); rv.region_changed (PropertyChange (ARDOUR::Properties::length));
} }
} }

View file

@ -3616,7 +3616,7 @@ Editor::trim_to_region(bool forward)
} }
region->trim_end((nframes64_t) (next_region->first_frame() * speed), this); region->trim_end((nframes64_t) (next_region->first_frame() * speed), this);
arv->region_changed (PropertyChange (LengthChanged)); arv->region_changed (PropertyChange (ARDOUR::Properties::length));
} }
else { else {
@ -3627,7 +3627,8 @@ Editor::trim_to_region(bool forward)
} }
region->trim_front((nframes64_t) ((next_region->last_frame() + 1) * speed), this); region->trim_front((nframes64_t) ((next_region->last_frame() + 1) * speed), this);
arv->region_changed (PropertyChange (LengthChanged|PositionChanged|StartChanged));
arv->region_changed (ARDOUR::bounds_change);
} }
XMLNode &after = playlist->get_state(); XMLNode &after = playlist->get_state();

View file

@ -347,7 +347,7 @@ EditorRegions::add_region (boost::shared_ptr<Region> region)
void void
EditorRegions::region_changed (PropertyChange what_changed, boost::weak_ptr<Region> region) EditorRegions::region_changed (const PropertyChange& what_changed, boost::weak_ptr<Region> region)
{ {
ENSURE_GUI_THREAD (*this, &EditorRegions::region_changed, what_changed, region) ENSURE_GUI_THREAD (*this, &EditorRegions::region_changed, what_changed, region)
@ -357,7 +357,7 @@ EditorRegions::region_changed (PropertyChange what_changed, boost::weak_ptr<Regi
return; return;
} }
if (what_changed & ARDOUR::NameChanged) { if (what_changed.contains (ARDOUR::Properties::name)) {
/* find the region in our model and change its name */ /* find the region in our model and change its name */
TreeModel::Children rows = _model->children (); TreeModel::Children rows = _model->children ();
TreeModel::iterator i = rows.begin (); TreeModel::iterator i = rows.begin ();
@ -762,10 +762,10 @@ EditorRegions::populate_row (boost::shared_ptr<Region> region, TreeModel::Row co
break; break;
case AudioClock::Frames: case AudioClock::Frames:
snprintf (start_str, sizeof (start_str), "%u", region->position()); snprintf (start_str, sizeof (start_str), "%" PRId64, region->position());
snprintf (end_str, sizeof (end_str), "%u", (region->position() + region->length() - 1)); snprintf (end_str, sizeof (end_str), "%" PRId64, (region->position() + region->length() - 1));
snprintf (length_str, sizeof (length_str), "%u", region->length()); snprintf (length_str, sizeof (length_str), "%" PRId64, region->length());
snprintf (sync_str, sizeof (sync_str), "%u", region->sync_position() + region->position()); snprintf (sync_str, sizeof (sync_str), "%" PRId64, region->sync_position() + region->position());
if (audioRegion && !fades_in_seconds) { if (audioRegion && !fades_in_seconds) {
snprintf (fadein_str, sizeof (fadein_str), "%u", uint (audioRegion->fade_in()->back()->when)); snprintf (fadein_str, sizeof (fadein_str), "%u", uint (audioRegion->fade_in()->back()->when));

View file

@ -104,7 +104,7 @@ private:
Columns _columns; Columns _columns;
void region_changed (PBD::PropertyChange, boost::weak_ptr<ARDOUR::Region>); void region_changed (const PBD::PropertyChange&, boost::weak_ptr<ARDOUR::Region>);
void selection_changed (); void selection_changed ();
sigc::connection _change_connection; sigc::connection _change_connection;
bool set_selected_in_subrow (boost::shared_ptr<ARDOUR::Region>, Gtk::TreeModel::Row const &, int); bool set_selected_in_subrow (boost::shared_ptr<ARDOUR::Region>, Gtk::TreeModel::Row const &, int);

View file

@ -424,7 +424,7 @@ EditorRoutes::routes_added (list<RouteTimeAxisView*> routes)
boost::weak_ptr<Route> wr ((*x)->route()); boost::weak_ptr<Route> wr ((*x)->route());
(*x)->route()->gui_changed.connect (*this, ui_bind (&EditorRoutes::handle_gui_changes, this, _1, _2), gui_context()); (*x)->route()->gui_changed.connect (*this, ui_bind (&EditorRoutes::handle_gui_changes, this, _1, _2), gui_context());
(*x)->route()->NameChanged.connect (*this, boost::bind (&EditorRoutes::route_name_changed, this, wr), gui_context()); (*x)->route()->PropertyChanged.connect (*this, ui_bind (&EditorRoutes::route_property_changed, this, _1, wr), gui_context());
if ((*x)->is_track()) { if ((*x)->is_track()) {
boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> ((*x)->route()); boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> ((*x)->route());
@ -487,11 +487,16 @@ EditorRoutes::route_removed (TimeAxisView *tv)
} }
void void
EditorRoutes::route_name_changed (boost::weak_ptr<Route> r) EditorRoutes::route_property_changed (const PropertyChange& what_changed, boost::weak_ptr<Route> r)
{ {
if (!what_changed.contains (ARDOUR::Properties::name)) {
return;
}
ENSURE_GUI_THREAD (*this, &EditorRoutes::route_name_changed, r) ENSURE_GUI_THREAD (*this, &EditorRoutes::route_name_changed, r)
boost::shared_ptr<Route> route = r.lock (); boost::shared_ptr<Route> route = r.lock ();
if (!route) { if (!route) {
return; return;
} }

View file

@ -69,7 +69,7 @@ private:
void visible_changed (Glib::ustring const &); void visible_changed (Glib::ustring const &);
void reordered (Gtk::TreeModel::Path const &, Gtk::TreeModel::iterator const &, int *); void reordered (Gtk::TreeModel::Path const &, Gtk::TreeModel::iterator const &, int *);
bool button_press (GdkEventButton *); bool button_press (GdkEventButton *);
void route_name_changed (boost::weak_ptr<ARDOUR::Route>); void route_property_changed (const PBD::PropertyChange&, boost::weak_ptr<ARDOUR::Route>);
void handle_gui_changes (std::string const &, void *); void handle_gui_changes (std::string const &, void *);
void update_rec_display (); void update_rec_display ();
void update_mute_display (); void update_mute_display ();

View file

@ -93,13 +93,13 @@ Editor::draw_metric_marks (const Metrics& metrics)
} }
void void
Editor::tempo_map_changed (PropertyChange ignored) Editor::tempo_map_changed (const PropertyChange& ignored)
{ {
if (!_session) { if (!_session) {
return; return;
} }
ENSURE_GUI_THREAD (*this, &Editor::tempo_map_changed ignored); ENSURE_GUI_THREAD (*this, &Editor::tempo_map_changed, ignored);
if (tempo_lines) { if (tempo_lines) {
tempo_lines->tempo_map_changed(); tempo_lines->tempo_map_changed();

View file

@ -65,7 +65,7 @@ public:
*/ */
void change_line_width(double coord, double width); void change_line_width(double coord, double width);
/** PropertyChange the color of a line. /** Change the color of a line.
*/ */
void change_line_color(double coord, uint32_t color); void change_line_color(double coord, uint32_t color);

View file

@ -193,7 +193,7 @@ MidiRegionView::init (Gdk::Color const & basic_color, bool wfd)
region_muted (); region_muted ();
region_sync_changed (); region_sync_changed ();
region_resized (BoundsChanged); region_resized (ARDOUR::bounds_change);
region_locked (); region_locked ();
reset_width_dependent_items (_pixel_width); reset_width_dependent_items (_pixel_width);
@ -963,11 +963,11 @@ MidiRegionView::~MidiRegionView ()
} }
void void
MidiRegionView::region_resized (PropertyChange what_changed) MidiRegionView::region_resized (const PropertyChange& what_changed)
{ {
RegionView::region_resized(what_changed); RegionView::region_resized(what_changed);
if (what_changed & ARDOUR::PositionChanged) { if (what_changed.contains (ARDOUR::Properties::position)) {
set_duration(_region->length(), 0); set_duration(_region->length(), 0);
if (_enable_display) { if (_enable_display) {
redisplay_model(); redisplay_model();

View file

@ -136,7 +136,7 @@ class MidiRegionView : public RegionView
*/ */
void get_patch_key_at(double time, uint8_t channel, MIDI::Name::PatchPrimaryKey& key); void get_patch_key_at(double time, uint8_t channel, MIDI::Name::PatchPrimaryKey& key);
/** PropertyChange the 'automation' data of old_program to new values which correspond to new_patch. /** Change the 'automation' data of old_program to new values which correspond to new_patch.
* @param old_program the program change event which is to be altered * @param old_program the program change event which is to be altered
* @param new_patch the new lsb, msb and program number which are to be set * @param new_patch the new lsb, msb and program number which are to be set
*/ */
@ -239,7 +239,7 @@ class MidiRegionView : public RegionView
*/ */
void change_velocity(ArdourCanvas::CanvasNoteEvent* ev, int8_t velocity, bool relative=false); void change_velocity(ArdourCanvas::CanvasNoteEvent* ev, int8_t velocity, bool relative=false);
/** PropertyChange the channel of the selection. /** Change the channel of the selection.
* @param channel - the channel number of the new channel, zero-based * @param channel - the channel number of the new channel, zero-based
*/ */
void change_channel(uint8_t channel); void change_channel(uint8_t channel);
@ -305,7 +305,7 @@ class MidiRegionView : public RegionView
Gdk::Color& basic_color, Gdk::Color& basic_color,
TimeAxisViewItem::Visibility); TimeAxisViewItem::Visibility);
void region_resized (PBD::PropertyChange); void region_resized (const PBD::PropertyChange&);
void set_flags (XMLNode *); void set_flags (XMLNode *);
void store_flags (); void store_flags ();

View file

@ -1442,7 +1442,7 @@ MixerStrip::name_changed ()
{ {
switch (_width) { switch (_width) {
case Wide: case Wide:
RouteUI::name_changed (); RouteUI::property_changed (PropertyChange (ARDOUR::Properties::name));
break; break;
case Narrow: case Narrow:
name_label.set_text (PBD::short_version (_route->name(), 5)); name_label.set_text (PBD::short_version (_route->name(), 5));

View file

@ -337,7 +337,7 @@ Mixer_UI::add_strip (RouteList& routes)
route->set_order_key (N_("signal"), track_model->children().size()-1); route->set_order_key (N_("signal"), track_model->children().size()-1);
} }
route->NameChanged.connect (*this, boost::bind (&Mixer_UI::strip_name_changed, this, strip), gui_context()); route->PropertyChanged.connect (*this, ui_bind (&Mixer_UI::strip_property_changed, this, _1, strip), gui_context());
strip->WidthChanged.connect (sigc::mem_fun(*this, &Mixer_UI::strip_width_changed)); strip->WidthChanged.connect (sigc::mem_fun(*this, &Mixer_UI::strip_width_changed));
strip->signal_button_release_event().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::strip_button_release_event), strip)); strip->signal_button_release_event().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::strip_button_release_event), strip));
@ -1005,9 +1005,13 @@ Mixer_UI::build_track_menu ()
} }
void void
Mixer_UI::strip_name_changed (MixerStrip* mx) Mixer_UI::strip_property_changed (const PropertyChange& what_changed, MixerStrip* mx)
{ {
ENSURE_GUI_THREAD (*this, &Mixer_UI::strip_name_changed, mx) if (!what_changed.contains (ARDOUR::Properties::name)) {
return;
}
ENSURE_GUI_THREAD (*this, &Mixer_UI::strip_name_changed, what_changed, mx)
TreeModel::Children rows = track_model->children(); TreeModel::Children rows = track_model->children();
TreeModel::Children::iterator i; TreeModel::Children::iterator i;

View file

@ -196,7 +196,7 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
PluginSelector *_plugin_selector; PluginSelector *_plugin_selector;
void strip_name_changed (MixerStrip *); void strip_property_changed (const PBD::PropertyChange&, MixerStrip *);
void group_flags_changed (void *src, ARDOUR::RouteGroup *); void group_flags_changed (void *src, ARDOUR::RouteGroup *);

View file

@ -107,7 +107,7 @@ ProcessorEntry::ProcessorEntry (boost::shared_ptr<Processor> p, Width w)
_active.signal_toggled().connect (sigc::mem_fun (*this, &ProcessorEntry::active_toggled)); _active.signal_toggled().connect (sigc::mem_fun (*this, &ProcessorEntry::active_toggled));
_processor->ActiveChanged.connect (active_connection, boost::bind (&ProcessorEntry::processor_active_changed, this), gui_context()); _processor->ActiveChanged.connect (active_connection, boost::bind (&ProcessorEntry::processor_active_changed, this), gui_context());
_processor->NameChanged.connect (name_connection, boost::bind (&ProcessorEntry::processor_name_changed, this), gui_context()); _processor->PropertyChanged.connect (name_connection, ui_bind (&ProcessorEntry::processor_property_changed, this, _1), gui_context());
} }
EventBox& EventBox&
@ -163,9 +163,11 @@ ProcessorEntry::processor_active_changed ()
} }
void void
ProcessorEntry::processor_name_changed () ProcessorEntry::processor_property_changed (const PropertyChange& what_changed)
{ {
if (what_changed.contains (ARDOUR::Properties::name)) {
_name.set_text (name ()); _name.set_text (name ());
}
} }
string string
@ -328,7 +330,7 @@ ProcessorBox::set_route (boost::shared_ptr<Route> r)
_route->processors_changed.connect (connections, ui_bind (&ProcessorBox::route_processors_changed, this, _1), gui_context()); _route->processors_changed.connect (connections, ui_bind (&ProcessorBox::route_processors_changed, this, _1), gui_context());
_route->DropReferences.connect (connections, boost::bind (&ProcessorBox::route_going_away, this), gui_context()); _route->DropReferences.connect (connections, boost::bind (&ProcessorBox::route_going_away, this), gui_context());
_route->NameChanged.connect (connections, boost::bind (&ProcessorBox::route_name_changed, this), gui_context()); _route->PropertyChanged.connect (connections, ui_bind (&ProcessorBox::route_property_changed, this, _1), gui_context());
redisplay_processors (); redisplay_processors ();
} }
@ -1764,9 +1766,13 @@ ProcessorBox::rb_edit ()
} }
void void
ProcessorBox::route_name_changed () ProcessorBox::route_property_changed (const PropertyChange& what_changed)
{ {
ENSURE_GUI_THREAD (*this, &ProcessorBox::route_name_changed) if (!what_changed.contains (ARDOUR::Properties::name)) {
return;
}
ENSURE_GUI_THREAD (*this, &ProcessorBox::route_property_changed, what_changed);
boost::shared_ptr<Processor> processor; boost::shared_ptr<Processor> processor;
boost::shared_ptr<PluginInsert> plugin_insert; boost::shared_ptr<PluginInsert> plugin_insert;

View file

@ -91,7 +91,7 @@ private:
void active_toggled (); void active_toggled ();
void processor_active_changed (); void processor_active_changed ();
void processor_name_changed (); void processor_property_changed (const PBD::PropertyChange&);
std::string name () const; std::string name () const;
Gtk::EventBox _event_box; Gtk::EventBox _event_box;
@ -275,7 +275,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD
static void rb_ab_plugins (); static void rb_ab_plugins ();
static void rb_edit (); static void rb_edit ();
void route_name_changed (); void route_property_changed (const PBD::PropertyChange&);
std::string generate_processor_title (boost::shared_ptr<ARDOUR::PluginInsert> pi); std::string generate_processor_title (boost::shared_ptr<ARDOUR::PluginInsert> pi);
}; };

View file

@ -181,7 +181,7 @@ RegionView::init (Gdk::Color const & basic_color, bool wfd)
set_height (trackview.current_height()); set_height (trackview.current_height());
_region->StateChanged.connect (*this, ui_bind (&RegionView::region_changed, this, _1), gui_context()); _region->PropertyChanged.connect (*this, ui_bind (&RegionView::region_changed, this, _1), gui_context());
group->signal_event().connect (sigc::bind (sigc::mem_fun (PublicEditor::instance(), &PublicEditor::canvas_region_view_event), group, this)); group->signal_event().connect (sigc::bind (sigc::mem_fun (PublicEditor::instance(), &PublicEditor::canvas_region_view_event), group, this));
@ -228,27 +228,27 @@ RegionView::lock_toggle ()
} }
void void
RegionView::region_changed (PropertyChange what_changed) RegionView::region_changed (const PropertyChange& what_changed)
{ {
ENSURE_GUI_THREAD (*this, &RegionView::region_changed, what_changed) ENSURE_GUI_THREAD (*this, &RegionView::region_changed, what_changed);
if (what_changed & BoundsChanged) { if (what_changed.contains (ARDOUR::bounds_change)) {
region_resized (what_changed); region_resized (what_changed);
region_sync_changed (); region_sync_changed ();
} }
if (what_changed & Region::MuteChanged) { if (what_changed.contains (ARDOUR::Properties::muted)) {
region_muted (); region_muted ();
} }
if (what_changed & Region::OpacityChanged) { if (what_changed.contains (ARDOUR::Properties::opaque)) {
region_opacity (); region_opacity ();
} }
if (what_changed & ARDOUR::NameChanged) { if (what_changed.contains (ARDOUR::Properties::name)) {
region_renamed (); region_renamed ();
} }
if (what_changed & Region::SyncOffsetChanged) { if (what_changed.contains (ARDOUR::Properties::sync_position)) {
region_sync_changed (); region_sync_changed ();
} }
if (what_changed & Region::LockChanged) { if (what_changed.contains (ARDOUR::Properties::locked)) {
region_locked (); region_locked ();
} }
} }
@ -261,16 +261,20 @@ RegionView::region_locked ()
} }
void void
RegionView::region_resized (PropertyChange what_changed) RegionView::region_resized (const PropertyChange& what_changed)
{ {
double unit_length; double unit_length;
if (what_changed & ARDOUR::PositionChanged) { if (what_changed.contains (ARDOUR::Properties::position)) {
set_position (_region->position(), 0); set_position (_region->position(), 0);
_time_converter.set_origin(_region->position()); _time_converter.set_origin(_region->position());
} }
if (what_changed & PropertyChange (StartChanged|LengthChanged)) { PropertyChange s_and_l;
s_and_l.add (ARDOUR::Properties::start);
s_and_l.add (ARDOUR::Properties::length);
if (what_changed.contains (s_and_l)) {
set_duration (_region->length(), 0); set_duration (_region->length(), 0);

View file

@ -75,7 +75,7 @@ class RegionView : public TimeAxisViewItem
virtual void show_region_editor () {} virtual void show_region_editor () {}
virtual void hide_region_editor(); virtual void hide_region_editor();
virtual void region_changed (PBD::PropertyChange); virtual void region_changed (const PBD::PropertyChange&);
virtual GhostRegion* add_ghost (TimeAxisView&) = 0; virtual GhostRegion* add_ghost (TimeAxisView&) = 0;
void remove_ghost_in (TimeAxisView&); void remove_ghost_in (TimeAxisView&);
@ -104,7 +104,7 @@ class RegionView : public TimeAxisViewItem
bool recording, bool recording,
TimeAxisViewItem::Visibility); TimeAxisViewItem::Visibility);
virtual void region_resized (PBD::PropertyChange); virtual void region_resized (const PBD::PropertyChange&);
virtual void region_muted (); virtual void region_muted ();
void region_locked (); void region_locked ();
void region_opacity (); void region_opacity ();

View file

@ -181,15 +181,19 @@ RouteParams_UI::add_routes (RouteList& routes)
//route_select_list.rows().back().select (); //route_select_list.rows().back().select ();
route->NameChanged.connect (*this, boost::bind (&RouteParams_UI::route_name_changed, this, boost::weak_ptr<Route>(route)), gui_context()); route->PropertyChanged.connect (*this, ui_bind (&RouteParams_UI::route_property_changed, this, _1, boost::weak_ptr<Route>(route)), gui_context());
route->DropReferences.connect (*this, boost::bind (&RouteParams_UI::route_removed, this, boost::weak_ptr<Route>(route)), gui_context()); route->DropReferences.connect (*this, boost::bind (&RouteParams_UI::route_removed, this, boost::weak_ptr<Route>(route)), gui_context());
} }
} }
void void
RouteParams_UI::route_name_changed (boost::weak_ptr<Route> wr) RouteParams_UI::route_property_changed (const PropertyChange& what_changed, boost::weak_ptr<Route> wr)
{ {
if (!what_changed.contains (ARDOUR::Properties::name)) {
return;
}
boost::shared_ptr<Route> route (wr.lock()); boost::shared_ptr<Route> route (wr.lock());
if (!route) { if (!route) {

View file

@ -161,7 +161,7 @@ class RouteParams_UI : public ArdourDialog, public PBD::ScopedConnectionList
void add_routes (ARDOUR::RouteList&); void add_routes (ARDOUR::RouteList&);
void route_name_changed (boost::weak_ptr<ARDOUR::Route> route); void route_property_changed (const PBD::PropertyChange&, boost::weak_ptr<ARDOUR::Route> route);
void route_removed (boost::weak_ptr<ARDOUR::Route> route); void route_removed (boost::weak_ptr<ARDOUR::Route> route);

View file

@ -231,7 +231,7 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session* sess, boost::sh
_y_position = -1; _y_position = -1;
_route->processors_changed.connect (*this, ui_bind (&RouteTimeAxisView::processors_changed, this, _1), gui_context()); _route->processors_changed.connect (*this, ui_bind (&RouteTimeAxisView::processors_changed, this, _1), gui_context());
_route->NameChanged.connect (*this, boost::bind (&RouteTimeAxisView::route_name_changed, this), gui_context()); _route->PropertyChanged.connect (*this, ui_bind (&RouteTimeAxisView::route_property_changed, this, _1), gui_context());
if (is_track()) { if (is_track()) {
@ -347,9 +347,11 @@ RouteTimeAxisView::label_view ()
} }
void void
RouteTimeAxisView::route_name_changed () RouteTimeAxisView::route_property_changed (const PropertyChange& what_changed)
{ {
if (what_changed.contains (ARDOUR::Properties::name)) {
label_view (); label_view ();
}
} }
void void

View file

@ -218,7 +218,7 @@ protected:
void reset_processor_automation_curves (); void reset_processor_automation_curves ();
void take_name_changed (void *src); void take_name_changed (void *src);
void route_name_changed (); void route_property_changed (const PBD::PropertyChange&);
void name_entry_changed (); void name_entry_changed ();
void update_rec_display (); void update_rec_display ();

View file

@ -205,7 +205,7 @@ RouteUI::set_route (boost::shared_ptr<Route> rp)
_route->solo_changed.connect (route_connections, ui_bind (&RouteUI::solo_changed, this, _1), gui_context()); _route->solo_changed.connect (route_connections, ui_bind (&RouteUI::solo_changed, this, _1), gui_context());
_route->listen_changed.connect (route_connections, ui_bind (&RouteUI::listen_changed, this, _1), gui_context()); _route->listen_changed.connect (route_connections, ui_bind (&RouteUI::listen_changed, this, _1), gui_context());
_route->solo_isolated_changed.connect (route_connections, ui_bind (&RouteUI::solo_changed, this, _1), gui_context()); _route->solo_isolated_changed.connect (route_connections, ui_bind (&RouteUI::solo_changed, this, _1), gui_context());
_route->NameChanged.connect (route_connections, boost::bind (&RouteUI::name_changed, this), gui_context()); _route->PropertyChanged.connect (route_connections, ui_bind (&RouteUI::property_changed, this, _1), gui_context());
if (_session->writable() && is_track()) { if (_session->writable() && is_track()) {
boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_route); boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_route);
@ -1164,11 +1164,11 @@ RouteUI::route_rename ()
} }
void void
RouteUI::name_changed () RouteUI::property_changed (const PropertyChange& what_changed)
{ {
ENSURE_GUI_THREAD (*this, &RouteUI::name_changed); if (what_changed.contains (ARDOUR::Properties::name)) {
name_label.set_text (_route->name()); name_label.set_text (_route->name());
}
} }
void void

View file

@ -164,7 +164,7 @@ class RouteUI : public virtual AxisView
void route_rename(); void route_rename();
virtual void name_changed (); virtual void property_changed (const PBD::PropertyChange&);
void route_removed (); void route_removed ();
Gtk::CheckMenuItem *route_active_menu_item; Gtk::CheckMenuItem *route_active_menu_item;

View file

@ -53,6 +53,9 @@ namespace ARDOUR {
void init_post_engine (); void init_post_engine ();
int cleanup (); int cleanup ();
bool no_auto_connect (); bool no_auto_connect ();
void make_property_quarks ();
extern PBD::PropertyChange bounds_change;
std::string get_ardour_revision (); std::string get_ardour_revision ();
extern const char* const ardour_config_info; extern const char* const ardour_config_info;
@ -65,12 +68,6 @@ namespace ARDOUR {
return (microseconds_t) jack_get_time(); return (microseconds_t) jack_get_time();
} }
extern PBD::PropertyChange StartChanged;
extern PBD::PropertyChange LengthChanged;
extern PBD::PropertyChange PositionChanged;
extern PBD::PropertyChange NameChanged;
extern PBD::PropertyChange BoundsChanged;
static const double SHUTTLE_FRACT_SPEED1=0.48412291827; /* derived from A1,A2 */ static const double SHUTTLE_FRACT_SPEED1=0.48412291827; /* derived from A1,A2 */
void setup_fpu (); void setup_fpu ();

View file

@ -79,8 +79,8 @@ class AudioPlaylist : public ARDOUR::Playlist
XMLNode& state (bool full_state); XMLNode& state (bool full_state);
void dump () const; void dump () const;
bool region_changed (PBD::PropertyChange, boost::shared_ptr<Region>); bool region_changed (const PBD::PropertyChange&, boost::shared_ptr<Region>);
void crossfade_changed (PBD::PropertyChange); void crossfade_changed (const PBD::PropertyChange&);
void add_crossfade (boost::shared_ptr<Crossfade>); void add_crossfade (boost::shared_ptr<Crossfade>);
void source_offset_changed (boost::shared_ptr<AudioRegion> region); void source_offset_changed (boost::shared_ptr<AudioRegion> region);

View file

@ -44,6 +44,17 @@ namespace Properties {
extern PBD::PropertyDescriptor<bool> fade_in_active; extern PBD::PropertyDescriptor<bool> fade_in_active;
extern PBD::PropertyDescriptor<bool> fade_out_active; extern PBD::PropertyDescriptor<bool> fade_out_active;
extern PBD::PropertyDescriptor<float> scale_amplitude; extern PBD::PropertyDescriptor<float> scale_amplitude;
extern PBD::PropertyDescriptor<float> scale_amplitude;
/* the envelope and fades are not scalar items and so
currently (2010/02) are not stored using Property.
However, these descriptors enable us to notify
about changes to them via PropertyChange.
*/
extern PBD::PropertyDescriptor<bool> envelope;
extern PBD::PropertyDescriptor<bool> fade_in;
extern PBD::PropertyDescriptor<bool> fade_out;
} }
class Route; class Route;
@ -58,14 +69,6 @@ class AudioRegion : public Region
public: public:
static void make_property_quarks (); static void make_property_quarks ();
static PBD::PropertyChange FadeInChanged;
static PBD::PropertyChange FadeOutChanged;
static PBD::PropertyChange FadeInActiveChanged;
static PBD::PropertyChange FadeOutActiveChanged;
static PBD::PropertyChange EnvelopeActiveChanged;
static PBD::PropertyChange ScaleAmplitudeChanged;
static PBD::PropertyChange EnvelopeChanged;
~AudioRegion(); ~AudioRegion();
void copy_settings (boost::shared_ptr<const AudioRegion>); void copy_settings (boost::shared_ptr<const AudioRegion>);
@ -185,8 +188,7 @@ class AudioRegion : public Region
AudioRegion (const SourceList &); AudioRegion (const SourceList &);
AudioRegion (boost::shared_ptr<const AudioRegion>, frameoffset_t offset = 0, bool offset_relative = true); AudioRegion (boost::shared_ptr<const AudioRegion>, frameoffset_t offset = 0, bool offset_relative = true);
AudioRegion (boost::shared_ptr<const AudioRegion>, const SourceList&); AudioRegion (boost::shared_ptr<const AudioRegion>, const SourceList&);
AudioRegion (boost::shared_ptr<AudioSource>, const XMLNode&); AudioRegion (SourceList &);
AudioRegion (SourceList &, const XMLNode&);
private: private:
PBD::Property<bool> _envelope_active; PBD::Property<bool> _envelope_active;
@ -197,7 +199,7 @@ class AudioRegion : public Region
PBD::Property<gain_t> _scale_amplitude; PBD::Property<gain_t> _scale_amplitude;
void register_properties (); void register_properties ();
PBD::PropertyChange set_property (const PBD::PropertyBase& prop); bool set_property (const PBD::PropertyBase& prop);
void post_set (); void post_set ();
void init (); void init ();

View file

@ -34,6 +34,11 @@
#include "evoral/Curve.hpp" #include "evoral/Curve.hpp"
namespace ARDOUR { namespace ARDOUR {
namespace Properties {
/* "active" is defined elsewhere but we use it with crossfade also */
extern PBD::PropertyDescriptor<bool> active;
extern PBD::PropertyDescriptor<bool> follow_overlap;
}
class AudioRegion; class AudioRegion;
class Playlist; class Playlist;
@ -71,6 +76,8 @@ class Crossfade : public ARDOUR::AudioRegion
Crossfade (const Playlist&, XMLNode&); Crossfade (const Playlist&, XMLNode&);
virtual ~Crossfade(); virtual ~Crossfade();
static void make_property_quarks ();
bool operator== (const ARDOUR::Crossfade&); bool operator== (const ARDOUR::Crossfade&);
XMLNode& get_state (void); XMLNode& get_state (void);
@ -106,7 +113,6 @@ class Crossfade : public ARDOUR::AudioRegion
framecnt_t overlap_length() const; framecnt_t overlap_length() const;
PBD::Signal1<void,boost::shared_ptr<Region> > Invalidated; PBD::Signal1<void,boost::shared_ptr<Region> > Invalidated;
PBD::Signal1<void,PBD::PropertyChange> StateChanged;
bool covers (framecnt_t frame) const { bool covers (framecnt_t frame) const {
return _position <= frame && frame < _position + _length; return _position <= frame && frame < _position + _length;
@ -136,9 +142,6 @@ class Crossfade : public ARDOUR::AudioRegion
static framecnt_t short_xfade_length() { return _short_xfade_length; } static framecnt_t short_xfade_length() { return _short_xfade_length; }
static void set_short_xfade_length (framecnt_t n); static void set_short_xfade_length (framecnt_t n);
static PBD::PropertyChange ActiveChanged;
static PBD::PropertyChange FollowOverlapChanged;
private: private:
friend struct CrossfadeComparePtr; friend struct CrossfadeComparePtr;
friend class AudioPlaylist; friend class AudioPlaylist;
@ -147,11 +150,11 @@ class Crossfade : public ARDOUR::AudioRegion
boost::shared_ptr<ARDOUR::AudioRegion> _in; boost::shared_ptr<ARDOUR::AudioRegion> _in;
boost::shared_ptr<ARDOUR::AudioRegion> _out; boost::shared_ptr<ARDOUR::AudioRegion> _out;
bool _active; PBD::Property<bool> _active;
PBD::Property<bool> _follow_overlap;
bool _in_update; bool _in_update;
OverlapType overlap_type; OverlapType overlap_type;
AnchorPoint _anchor_point; AnchorPoint _anchor_point;
bool _follow_overlap;
bool _fixed; bool _fixed;
int32_t layer_relation; int32_t layer_relation;

View file

@ -206,7 +206,7 @@ class Diskstream : public SessionObject
/* XXX fix this redundancy ... */ /* XXX fix this redundancy ... */
virtual void playlist_changed (PBD::PropertyChange); virtual void playlist_changed (const PBD::PropertyChange&);
virtual void playlist_deleted (boost::weak_ptr<Playlist>); virtual void playlist_deleted (boost::weak_ptr<Playlist>);
virtual void playlist_ranges_moved (std::list< Evoral::RangeMove<framepos_t> > const &); virtual void playlist_ranges_moved (std::list< Evoral::RangeMove<framepos_t> > const &);

View file

@ -56,7 +56,7 @@ class InternalSend : public Send
PBD::ScopedConnection connect_c; PBD::ScopedConnection connect_c;
void send_to_going_away (); void send_to_going_away ();
void send_to_name_changed (); void send_to_property_changed (const PBD::PropertyChange&);
int connect_when_legal (); int connect_when_legal ();
int set_our_state (XMLNode const &, int); int set_our_state (XMLNode const &, int);
}; };

View file

@ -179,7 +179,7 @@ class Locations : public PBD::StatefulDestructible
PBD::Signal0<void> changed; PBD::Signal0<void> changed;
PBD::Signal1<void,Location*> added; PBD::Signal1<void,Location*> added;
PBD::Signal1<void,Location*> removed; PBD::Signal1<void,Location*> removed;
PBD::Signal1<void,PBD::PropertyChange> StateChanged; PBD::Signal1<void,const PBD::PropertyChange&> StateChanged;
template<class T> void apply (T& obj, void (T::*method)(LocationList&)) { template<class T> void apply (T& obj, void (T::*method)(LocationList&)) {
Glib::Mutex::Lock lm (lock); Glib::Mutex::Lock lm (lock);

View file

@ -90,7 +90,7 @@ public:
}; };
/** PropertyChange note properties. /** Change note properties.
* More efficient than DeltaCommand and has the important property that * More efficient than DeltaCommand and has the important property that
* it leaves the objects in the MidiModel (Notes) the same, thus * it leaves the objects in the MidiModel (Notes) the same, thus
* enabling selection and other state to persist across command * enabling selection and other state to persist across command
@ -126,7 +126,7 @@ public:
boost::shared_ptr<MidiModel> _model; boost::shared_ptr<MidiModel> _model;
const std::string _name; const std::string _name;
struct NotePropertyChange { struct NoteChange {
DiffCommand::Property property; DiffCommand::Property property;
boost::shared_ptr< Evoral::Note<TimeType> > note; boost::shared_ptr< Evoral::Note<TimeType> > note;
union { union {
@ -139,11 +139,11 @@ public:
}; };
}; };
typedef std::list<NotePropertyChange> ChangeList; typedef std::list<NoteChange> ChangeList;
ChangeList _changes; ChangeList _changes;
XMLNode &marshal_change(const NotePropertyChange&); XMLNode &marshal_change(const NoteChange&);
NotePropertyChange unmarshal_change(XMLNode *xml_note); NoteChange unmarshal_change(XMLNode *xml_note);
}; };
MidiModel::DeltaCommand* new_delta_command(const std::string name="midi edit"); MidiModel::DeltaCommand* new_delta_command(const std::string name="midi edit");

View file

@ -74,7 +74,7 @@ protected:
private: private:
void dump () const; void dump () const;
bool region_changed (PBD::PropertyChange, boost::shared_ptr<Region>); bool region_changed (const PBD::PropertyChange&, boost::shared_ptr<Region>);
NoteMode _note_mode; NoteMode _note_mode;

View file

@ -96,11 +96,8 @@ class MidiRegion : public Region
private: private:
friend class RegionFactory; friend class RegionFactory;
MidiRegion (boost::shared_ptr<MidiSource>);
MidiRegion (const SourceList&); MidiRegion (const SourceList&);
MidiRegion (boost::shared_ptr<const MidiRegion>, frameoffset_t offset = 0, bool offset_relative = true); MidiRegion (boost::shared_ptr<const MidiRegion>, frameoffset_t offset = 0, bool offset_relative = true);
MidiRegion (boost::shared_ptr<MidiSource>, const XMLNode&);
MidiRegion (const SourceList &, const XMLNode&);
private: private:
framecnt_t _read_at (const SourceList&, Evoral::EventSink<nframes_t>& dst, framecnt_t _read_at (const SourceList&, Evoral::EventSink<nframes_t>& dst,

View file

@ -249,15 +249,15 @@ class Playlist : public SessionObject
void notify_length_changed (); void notify_length_changed ();
void notify_layering_changed (); void notify_layering_changed ();
void notify_contents_changed (); void notify_contents_changed ();
void notify_state_changed (PBD::PropertyChange); void notify_state_changed (const PBD::PropertyChange&);
void notify_region_moved (boost::shared_ptr<Region>); void notify_region_moved (boost::shared_ptr<Region>);
void mark_session_dirty(); void mark_session_dirty();
void region_changed_proxy (PBD::PropertyChange, boost::weak_ptr<Region>); void region_changed_proxy (const PBD::PropertyChange&, boost::weak_ptr<Region>);
virtual bool region_changed (PBD::PropertyChange, boost::shared_ptr<Region>); virtual bool region_changed (const PBD::PropertyChange&, boost::shared_ptr<Region>);
void region_bounds_changed (PBD::PropertyChange, boost::shared_ptr<Region>); void region_bounds_changed (const PBD::PropertyChange&, boost::shared_ptr<Region>);
void region_deleted (boost::shared_ptr<Region>); void region_deleted (boost::shared_ptr<Region>);
void sort_regions (); void sort_regions ();

View file

@ -89,16 +89,7 @@ class Region
MusicTime MusicTime
}; };
static PBD::PropertyChange FadeChanged; static PBD::Signal2<void,boost::shared_ptr<ARDOUR::Region>, const PBD::PropertyChange&> RegionPropertyChanged;
static PBD::PropertyChange SyncOffsetChanged;
static PBD::PropertyChange MuteChanged;
static PBD::PropertyChange OpacityChanged;
static PBD::PropertyChange LockChanged;
static PBD::PropertyChange LayerChanged;
static PBD::PropertyChange HiddenChanged;
PBD::Signal1<void,PBD::PropertyChange> StateChanged;
static PBD::Signal1<void,boost::shared_ptr<ARDOUR::Region> > RegionPropertyChanged;
void unlock_property_changes () { _no_property_changes = false; } void unlock_property_changes () { _no_property_changes = false; }
void block_property_changes () { _no_property_changes = true; } void block_property_changes () { _no_property_changes = true; }
@ -281,8 +272,6 @@ class Region
protected: protected:
friend class RegionFactory; friend class RegionFactory;
/** Construct a region from a single source */
Region (boost::shared_ptr<Source> src);
/** Construct a region from multiple sources*/ /** Construct a region from multiple sources*/
Region (const SourceList& srcs); Region (const SourceList& srcs);
/** Construct a region from another region, at an offset within that region */ /** Construct a region from another region, at an offset within that region */
@ -292,16 +281,11 @@ class Region
/** normal Region copy constructor */ /** normal Region copy constructor */
Region (boost::shared_ptr<const Region>); Region (boost::shared_ptr<const Region>);
/** Construct a region from 1 source and XML state */
Region (boost::shared_ptr<Source> src, const XMLNode&);
/** Construct a region from multiple sources and XML state */
Region (const SourceList& srcs, const XMLNode&);
/** Constructor for derived types only */ /** Constructor for derived types only */
Region (Session& s, framepos_t start, framecnt_t length, const std::string& name, DataType); Region (Session& s, framepos_t start, framecnt_t length, const std::string& name, DataType);
protected: protected:
void send_change (PBD::PropertyChange); void send_change (const PBD::PropertyChange&);
void trim_to_internal (framepos_t position, framecnt_t length, void *src); void trim_to_internal (framepos_t position, framecnt_t length, void *src);
virtual void set_position_internal (framepos_t pos, bool allow_bbt_recompute); virtual void set_position_internal (framepos_t pos, bool allow_bbt_recompute);
@ -365,7 +349,7 @@ class Region
virtual int _set_state (const XMLNode&, int version, PBD::PropertyChange& what_changed, bool send_signal); virtual int _set_state (const XMLNode&, int version, PBD::PropertyChange& what_changed, bool send_signal);
PBD::PropertyChange set_property (const PBD::PropertyBase&); bool set_property (const PBD::PropertyBase&);
void register_properties (); void register_properties ();
private: private:

View file

@ -131,9 +131,6 @@ class RouteGroup : public SessionObject
PBD::Signal0<void> changed; PBD::Signal0<void> changed;
PBD::Signal1<void,void*> FlagsChanged; PBD::Signal1<void,void*> FlagsChanged;
static PBD::PropertyChange FlagsChange;
static PBD::PropertyChange PropertiesChange;
XMLNode& get_state (); XMLNode& get_state ();
int set_state (const XMLNode&, int version); int set_state (const XMLNode&, int version);

View file

@ -1210,7 +1210,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
void xrun_recovery (); void xrun_recovery ();
TempoMap *_tempo_map; TempoMap *_tempo_map;
void tempo_map_changed (PBD::PropertyChange); void tempo_map_changed (const PBD::PropertyChange&);
/* edit/mix groups */ /* edit/mix groups */
@ -1257,7 +1257,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
RegionList regions; RegionList regions;
void add_region (boost::shared_ptr<Region>); void add_region (boost::shared_ptr<Region>);
void region_changed (PBD::PropertyChange, boost::weak_ptr<Region>); void region_changed (const PBD::PropertyChange&, boost::weak_ptr<Region>);
void remove_region (boost::weak_ptr<Region>); void remove_region (boost::weak_ptr<Region>);
int load_regions (const XMLNode& node); int load_regions (const XMLNode& node);

View file

@ -48,7 +48,7 @@ class SessionObject : public SessionHandleRef, public PBD::StatefulDestructible
SessionObject (Session& session, const std::string& name) SessionObject (Session& session, const std::string& name)
: SessionHandleRef (session) : SessionHandleRef (session)
, _name (Properties::name, PBD::PropertyChange (0), name) , _name (Properties::name, name)
{ {
add_property (_name); add_property (_name);
} }
@ -56,18 +56,16 @@ class SessionObject : public SessionHandleRef, public PBD::StatefulDestructible
Session& session() const { return _session; } Session& session() const { return _session; }
std::string name() const { return _name; } std::string name() const { return _name; }
PBD::PropertyChange set_property (const PBD::PropertyBase& prop); bool set_property (const PBD::PropertyBase& prop);
virtual bool set_name (const std::string& str) { virtual bool set_name (const std::string& str) {
if (_name != str) { if (_name != str) {
_name = str; _name = str;
NameChanged(); PropertyChanged (PBD::PropertyChange (Properties::name));
} }
return true; return true;
} }
PBD::Signal0<void> NameChanged;
protected: protected:
PBD::Property<std::string> _name; PBD::Property<std::string> _name;
}; };

View file

@ -258,8 +258,6 @@ class TempoMap : public PBD::StatefulDestructible
nframes_t frame_rate () const { return _frame_rate; } nframes_t frame_rate () const { return _frame_rate; }
PBD::Signal1<void,PBD::PropertyChange> StateChanged;
private: private:
static Tempo _default_tempo; static Tempo _default_tempo;
static Meter _default_meter; static Meter _default_meter;

View file

@ -525,7 +525,7 @@ AudioPlaylist::add_crossfade (boost::shared_ptr<Crossfade> xfade)
_crossfades.push_back (xfade); _crossfades.push_back (xfade);
xfade->Invalidated.connect_same_thread (*this, boost::bind (&AudioPlaylist::crossfade_invalidated, this, _1)); xfade->Invalidated.connect_same_thread (*this, boost::bind (&AudioPlaylist::crossfade_invalidated, this, _1));
xfade->StateChanged.connect_same_thread (*this, boost::bind (&AudioPlaylist::crossfade_changed, this, _1)); xfade->PropertyChanged.connect_same_thread (*this, boost::bind (&AudioPlaylist::crossfade_changed, this, _1));
notify_crossfade_added (xfade); notify_crossfade_added (xfade);
} }
@ -581,7 +581,7 @@ AudioPlaylist::set_state (const XMLNode& node, int version)
boost::shared_ptr<Crossfade> xfade = boost::shared_ptr<Crossfade> (new Crossfade (*((const Playlist *)this), *child)); boost::shared_ptr<Crossfade> xfade = boost::shared_ptr<Crossfade> (new Crossfade (*((const Playlist *)this), *child));
_crossfades.push_back (xfade); _crossfades.push_back (xfade);
xfade->Invalidated.connect_same_thread (*this, boost::bind (&AudioPlaylist::crossfade_invalidated, this, _1)); xfade->Invalidated.connect_same_thread (*this, boost::bind (&AudioPlaylist::crossfade_invalidated, this, _1));
xfade->StateChanged.connect_same_thread (*this, boost::bind (&AudioPlaylist::crossfade_changed, this, _1)); xfade->PropertyChanged.connect_same_thread (*this, boost::bind (&AudioPlaylist::crossfade_changed, this, _1));
NewCrossfade(xfade); NewCrossfade(xfade);
} }
@ -726,7 +726,7 @@ AudioPlaylist::destroy_region (boost::shared_ptr<Region> region)
} }
void void
AudioPlaylist::crossfade_changed (PropertyChange) AudioPlaylist::crossfade_changed (const PropertyChange&)
{ {
if (in_flush || in_set_state) { if (in_flush || in_set_state) {
return; return;
@ -742,24 +742,27 @@ AudioPlaylist::crossfade_changed (PropertyChange)
} }
bool bool
AudioPlaylist::region_changed (PropertyChange what_changed, boost::shared_ptr<Region> region) AudioPlaylist::region_changed (const PropertyChange& what_changed, boost::shared_ptr<Region> region)
{ {
if (in_flush || in_set_state) { if (in_flush || in_set_state) {
return false; return false;
} }
PropertyChange our_interests = PropertyChange (AudioRegion::FadeInChanged| PropertyChange our_interests;
AudioRegion::FadeOutChanged|
AudioRegion::FadeInActiveChanged| our_interests.add (Properties::fade_in_active);
AudioRegion::FadeOutActiveChanged| our_interests.add (Properties::fade_out_active);
AudioRegion::EnvelopeActiveChanged| our_interests.add (Properties::scale_amplitude);
AudioRegion::ScaleAmplitudeChanged| our_interests.add (Properties::envelope_active);
AudioRegion::EnvelopeChanged); our_interests.add (Properties::envelope);
our_interests.add (Properties::fade_in);
our_interests.add (Properties::fade_out);
bool parent_wants_notify; bool parent_wants_notify;
parent_wants_notify = Playlist::region_changed (what_changed, region); parent_wants_notify = Playlist::region_changed (what_changed, region);
if ((parent_wants_notify || (what_changed & our_interests))) { if (parent_wants_notify || (what_changed.contains (our_interests))) {
notify_contents_changed (); notify_contents_changed ();
} }

View file

@ -89,12 +89,12 @@ AudioRegion::register_properties ()
} }
#define AUDIOREGION_STATE_DEFAULT \ #define AUDIOREGION_STATE_DEFAULT \
_envelope_active (Properties::envelope_active, EnvelopeActiveChanged, false) \ _envelope_active (Properties::envelope_active, false) \
, _default_fade_in (Properties::default_fade_in, FadeInChanged, true) \ , _default_fade_in (Properties::default_fade_in, true) \
, _default_fade_out (Properties::default_fade_out, FadeOutChanged, true) \ , _default_fade_out (Properties::default_fade_out, true) \
, _fade_in_active (Properties::fade_in_active, FadeInActiveChanged, true) \ , _fade_in_active (Properties::fade_in_active, true) \
, _fade_out_active (Properties::fade_out_active, FadeOutActiveChanged, true) \ , _fade_out_active (Properties::fade_out_active, true) \
, _scale_amplitude (Properties::scale_amplitude, ScaleAmplitudeChanged, 1.0) , _scale_amplitude (Properties::scale_amplitude, 0.0)
#define AUDIOREGION_COPY_STATE(other) \ #define AUDIOREGION_COPY_STATE(other) \
_envelope_active (other->_envelope_active) \ _envelope_active (other->_envelope_active) \
@ -104,14 +104,6 @@ AudioRegion::register_properties ()
, _fade_out_active (other->_fade_out_active) \ , _fade_out_active (other->_fade_out_active) \
, _scale_amplitude (other->_scale_amplitude) , _scale_amplitude (other->_scale_amplitude)
PropertyChange AudioRegion::FadeInChanged = PBD::new_change();
PropertyChange AudioRegion::FadeOutChanged = PBD::new_change();
PropertyChange AudioRegion::FadeInActiveChanged = PBD::new_change();
PropertyChange AudioRegion::FadeOutActiveChanged = PBD::new_change();
PropertyChange AudioRegion::EnvelopeActiveChanged = PBD::new_change();
PropertyChange AudioRegion::ScaleAmplitudeChanged = PBD::new_change();
PropertyChange AudioRegion::EnvelopeChanged = PBD::new_change();
/* a Session will reset these to its chosen defaults by calling AudioRegion::set_default_fade() */ /* a Session will reset these to its chosen defaults by calling AudioRegion::set_default_fade() */
void void
@ -142,26 +134,7 @@ AudioRegion::AudioRegion (Session& s, framepos_t start, framecnt_t len, std::str
assert (_sources.size() == _master_sources.size()); assert (_sources.size() == _master_sources.size());
} }
/** Basic AudioRegion constructor (one channel) */ /** Basic AudioRegion constructor */
AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src)
: Region (boost::static_pointer_cast<Source>(src))
, AUDIOREGION_STATE_DEFAULT
, _automatable(src->session())
, _fade_in (new AutomationList(Evoral::Parameter(FadeInAutomation)))
, _fade_out (new AutomationList(Evoral::Parameter(FadeOutAutomation)))
, _envelope (new AutomationList(Evoral::Parameter(EnvelopeAutomation)))
, _fade_in_suspended (0)
, _fade_out_suspended (0)
{
init ();
/* XXX why is this set here ? - set in a property list given to RegionFactory */
_external = true;
assert (_sources.size() == _master_sources.size());
}
/** Basic AudioRegion constructor (many channels) */
AudioRegion::AudioRegion (const SourceList& srcs) AudioRegion::AudioRegion (const SourceList& srcs)
: Region (srcs) : Region (srcs)
, AUDIOREGION_STATE_DEFAULT , AUDIOREGION_STATE_DEFAULT
@ -219,26 +192,8 @@ AudioRegion::AudioRegion (boost::shared_ptr<const AudioRegion> other, const Sour
assert (_sources.size() == _master_sources.size()); assert (_sources.size() == _master_sources.size());
} }
AudioRegion::AudioRegion (boost::shared_ptr<AudioSource> src, const XMLNode& node) AudioRegion::AudioRegion (SourceList& srcs)
: Region (src, node) : Region (srcs)
, AUDIOREGION_STATE_DEFAULT
, _automatable(src->session())
, _fade_in (new AutomationList(Evoral::Parameter(FadeInAutomation)))
, _fade_out (new AutomationList(Evoral::Parameter(FadeOutAutomation)))
, _envelope (new AutomationList(Evoral::Parameter(EnvelopeAutomation)))
{
init ();
if (set_state (node, Stateful::loading_state_version)) {
throw failed_constructor();
}
assert(_type == DataType::AUDIO);
assert (_sources.size() == _master_sources.size());
}
AudioRegion::AudioRegion (SourceList& srcs, const XMLNode& node)
: Region (srcs, node)
, AUDIOREGION_STATE_DEFAULT , AUDIOREGION_STATE_DEFAULT
, _automatable(srcs[0]->session()) , _automatable(srcs[0]->session())
, _fade_in (new AutomationList(Evoral::Parameter(FadeInAutomation))) , _fade_in (new AutomationList(Evoral::Parameter(FadeInAutomation)))
@ -249,12 +204,7 @@ AudioRegion::AudioRegion (SourceList& srcs, const XMLNode& node)
{ {
init (); init ();
if (set_state (node, Stateful::loading_state_version)) {
throw failed_constructor();
}
assert(_type == DataType::AUDIO); assert(_type == DataType::AUDIO);
connect_to_analysis_changed ();
assert (_sources.size() == _master_sources.size()); assert (_sources.size() == _master_sources.size());
} }
@ -327,7 +277,7 @@ AudioRegion::set_envelope_active (bool yn)
{ {
if (envelope_active() != yn) { if (envelope_active() != yn) {
_envelope_active = yn; _envelope_active = yn;
send_change (EnvelopeActiveChanged); send_change (PropertyChange (Properties::envelope_active));
} }
} }
@ -650,8 +600,7 @@ AudioRegion::_set_state (const XMLNode& node, int version, PropertyChange& what_
float a = atof (prop->value().c_str()); float a = atof (prop->value().c_str());
if (a != _scale_amplitude) { if (a != _scale_amplitude) {
_scale_amplitude = a; _scale_amplitude = a;
what_changed = PropertyChange (what_changed|ScaleAmplitudeChanged); what_changed.add (Properties::scale_amplitude);
cerr << _name << " amp changed\n";
} }
} }
@ -730,7 +679,6 @@ AudioRegion::_set_state (const XMLNode& node, int version, PropertyChange& what_
thaw (); thaw ();
if (send) { if (send) {
cerr << _name << ": audio final change: " << hex << what_changed << dec << endl;
send_change (what_changed); send_change (what_changed);
} }
@ -741,54 +689,52 @@ AudioRegion::_set_state (const XMLNode& node, int version, PropertyChange& what_
return 0; return 0;
} }
PropertyChange bool
AudioRegion::set_property (const PropertyBase& prop) AudioRegion::set_property (const PropertyBase& prop)
{ {
PropertyChange c = PropertyChange (0);
DEBUG_TRACE (DEBUG::Properties, string_compose ("audio region %1 set property %2\n", _name.val(), prop.property_name())); DEBUG_TRACE (DEBUG::Properties, string_compose ("audio region %1 set property %2\n", _name.val(), prop.property_name()));
if (prop == Properties::envelope_active.id) { if (prop == Properties::envelope_active.id) {
bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val(); bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
if (val != _envelope_active) { if (val != _envelope_active) {
_envelope_active = val; _envelope_active = val;
c = EnvelopeActiveChanged; return true;
} }
} else if (prop == Properties::default_fade_in.id) { } else if (prop == Properties::default_fade_in.id) {
bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val(); bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
if (val != _default_fade_in) { if (val != _default_fade_in) {
_default_fade_in = val; _default_fade_in = val;
c = FadeInChanged; return true;
} }
} else if (prop == Properties::default_fade_out.id) { } else if (prop == Properties::default_fade_out.id) {
bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val(); bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
if (val != _default_fade_out) { if (val != _default_fade_out) {
_default_fade_out = val; _default_fade_out = val;
c = FadeOutChanged; return true;
} }
} else if (prop == Properties::fade_in_active.id) { } else if (prop == Properties::fade_in_active.id) {
bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val(); bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
if (val != _fade_in_active) { if (val != _fade_in_active) {
_fade_in_active = val; _fade_in_active = val;
c = FadeInActiveChanged; return true;
} }
} else if (prop == Properties::fade_out_active.id) { } else if (prop == Properties::fade_out_active.id) {
bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val(); bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
if (val != _fade_out_active) { if (val != _fade_out_active) {
_fade_out_active = val; _fade_out_active = val;
c = FadeOutChanged; return true;
} }
} else if (prop == Properties::scale_amplitude.id) { } else if (prop == Properties::scale_amplitude.id) {
gain_t val = dynamic_cast<const PropertyTemplate<gain_t>*>(&prop)->val(); gain_t val = dynamic_cast<const PropertyTemplate<gain_t>*>(&prop)->val();
if (val != _scale_amplitude) { if (val != _scale_amplitude) {
_scale_amplitude = val; _scale_amplitude = val;
c = ScaleAmplitudeChanged; return true;
} }
} else { } else {
return Region::set_property (prop); return Region::set_property (prop);
} }
return c; return false;
} }
int int
@ -817,7 +763,7 @@ AudioRegion::set_fade_in (boost::shared_ptr<AutomationList> f)
*_fade_in = *f; *_fade_in = *f;
_fade_in->thaw (); _fade_in->thaw ();
send_change (FadeInChanged); send_change (PropertyChange (Properties::fade_in));
} }
void void
@ -884,7 +830,7 @@ AudioRegion::set_fade_out (boost::shared_ptr<AutomationList> f)
*_fade_out = *f; *_fade_out = *f;
_fade_out->thaw (); _fade_out->thaw ();
send_change (FadeInChanged); send_change (PropertyChange (Properties::fade_in));
} }
void void
@ -953,7 +899,7 @@ AudioRegion::set_fade_in_length (framecnt_t len)
if (changed) { if (changed) {
_default_fade_in = false; _default_fade_in = false;
send_change (FadeInChanged); send_change (PropertyChange (Properties::fade_in));
} }
} }
@ -968,7 +914,7 @@ AudioRegion::set_fade_out_length (framecnt_t len)
if (changed) { if (changed) {
_default_fade_out = false; _default_fade_out = false;
send_change (FadeOutChanged); send_change (PropertyChange (Properties::fade_out));
} }
} }
@ -980,7 +926,7 @@ AudioRegion::set_fade_in_active (bool yn)
} }
_fade_in_active = yn; _fade_in_active = yn;
send_change (FadeInActiveChanged); send_change (PropertyChange (Properties::fade_in_active));
} }
void void
@ -990,7 +936,7 @@ AudioRegion::set_fade_out_active (bool yn)
return; return;
} }
_fade_out_active = yn; _fade_out_active = yn;
send_change (FadeOutActiveChanged); send_change (PropertyChange (Properties::fade_out_active));
} }
bool bool
@ -1050,12 +996,12 @@ AudioRegion::recompute_at_end ()
if (_fade_in->back()->when > _length) { if (_fade_in->back()->when > _length) {
_fade_in->extend_to (_length); _fade_in->extend_to (_length);
send_change (FadeInChanged); send_change (PropertyChange (Properties::fade_in));
} }
if (_fade_out->back()->when > _length) { if (_fade_out->back()->when > _length) {
_fade_out->extend_to (_length); _fade_out->extend_to (_length);
send_change (FadeOutChanged); send_change (PropertyChange (Properties::fade_out));
} }
} }
@ -1068,12 +1014,12 @@ AudioRegion::recompute_at_start ()
if (_fade_in->back()->when > _length) { if (_fade_in->back()->when > _length) {
_fade_in->extend_to (_length); _fade_in->extend_to (_length);
send_change (FadeInChanged); send_change (PropertyChange (Properties::fade_in));
} }
if (_fade_out->back()->when > _length) { if (_fade_out->back()->when > _length) {
_fade_out->extend_to (_length); _fade_out->extend_to (_length);
send_change (FadeOutChanged); send_change (PropertyChange (Properties::fade_out));
} }
} }
@ -1212,7 +1158,7 @@ AudioRegion::set_scale_amplitude (gain_t g)
/* tell everybody else */ /* tell everybody else */
send_change (ScaleAmplitudeChanged); send_change (PropertyChange (Properties::scale_amplitude));
} }
void void
@ -1282,25 +1228,25 @@ AudioRegion::normalize_to (float target_dB)
/* tell everybody else */ /* tell everybody else */
send_change (ScaleAmplitudeChanged); send_change (PropertyChange (Properties::scale_amplitude));
} }
void void
AudioRegion::fade_in_changed () AudioRegion::fade_in_changed ()
{ {
send_change (FadeInChanged); send_change (PropertyChange (Properties::fade_in));
} }
void void
AudioRegion::fade_out_changed () AudioRegion::fade_out_changed ()
{ {
send_change (FadeOutChanged); send_change (PropertyChange (Properties::fade_out));
} }
void void
AudioRegion::envelope_changed () AudioRegion::envelope_changed ()
{ {
send_change (EnvelopeChanged); send_change (PropertyChange (Properties::envelope));
} }
void void

View file

@ -37,8 +37,6 @@ using namespace ARDOUR;
using namespace PBD; using namespace PBD;
framecnt_t Crossfade::_short_xfade_length = 0; framecnt_t Crossfade::_short_xfade_length = 0;
PropertyChange Crossfade::ActiveChanged = new_change();
PropertyChange Crossfade::FollowOverlapChanged = new_change();
/* XXX if and when we ever implement parallel processing of the process() /* XXX if and when we ever implement parallel processing of the process()
callback, these will need to be handled on a per-thread basis. callback, these will need to be handled on a per-thread basis.
@ -47,6 +45,24 @@ PropertyChange Crossfade::FollowOverlapChanged = new_change();
Sample* Crossfade::crossfade_buffer_out = 0; Sample* Crossfade::crossfade_buffer_out = 0;
Sample* Crossfade::crossfade_buffer_in = 0; Sample* Crossfade::crossfade_buffer_in = 0;
#define CROSSFADE_DEFAULT_PROPERTIES \
_active (Properties::active, _session.config.get_xfades_active ()) \
, _follow_overlap (Properties::follow_overlap, false)
namespace ARDOUR {
namespace Properties {
PropertyDescriptor<bool> follow_overlap;
}
}
void
Crossfade::make_property_quarks ()
{
Properties::follow_overlap.id = g_quark_from_static_string (X_("follow-overlap"));
}
void void
Crossfade::set_buffer_size (framecnt_t sz) Crossfade::set_buffer_size (framecnt_t sz)
{ {
@ -72,26 +88,25 @@ Crossfade::Crossfade (boost::shared_ptr<AudioRegion> in, boost::shared_ptr<Audio
framecnt_t length, framecnt_t length,
framepos_t position, framepos_t position,
AnchorPoint ap) AnchorPoint ap)
: AudioRegion (in->session(), position, length, in->name() + string ("<>") + out->name()), : AudioRegion (in->session(), position, length, in->name() + string ("<>") + out->name())
_fade_in (Evoral::Parameter(FadeInAutomation)), // linear (gain coefficient) => -inf..+6dB , CROSSFADE_DEFAULT_PROPERTIES
_fade_out (Evoral::Parameter(FadeOutAutomation)) // linear (gain coefficient) => -inf..+6dB , _fade_in (Evoral::Parameter(FadeInAutomation)) // linear (gain coefficient) => -inf..+6dB
, _fade_out (Evoral::Parameter(FadeOutAutomation)) // linear (gain coefficient) => -inf..+6dB
{ {
_in = in; _in = in;
_out = out; _out = out;
_anchor_point = ap; _anchor_point = ap;
_follow_overlap = false;
_active = _session.config.get_xfades_active ();
_fixed = true; _fixed = true;
initialize (); initialize ();
} }
Crossfade::Crossfade (boost::shared_ptr<AudioRegion> a, boost::shared_ptr<AudioRegion> b, CrossfadeModel model, bool act) Crossfade::Crossfade (boost::shared_ptr<AudioRegion> a, boost::shared_ptr<AudioRegion> b, CrossfadeModel model, bool act)
: AudioRegion (a->session(), 0, 0, a->name() + string ("<>") + b->name()), : AudioRegion (a->session(), 0, 0, a->name() + string ("<>") + b->name())
_fade_in (Evoral::Parameter(FadeInAutomation)), // linear (gain coefficient) => -inf..+6dB , CROSSFADE_DEFAULT_PROPERTIES
_fade_out (Evoral::Parameter(FadeOutAutomation)) // linear (gain coefficient) => -inf..+6dB , _fade_in (Evoral::Parameter(FadeInAutomation)) // linear (gain coefficient) => -inf..+6dB
, _fade_out (Evoral::Parameter(FadeOutAutomation)) // linear (gain coefficient) => -inf..+6dB
{ {
_in_update = false; _in_update = false;
_fixed = false; _fixed = false;
@ -107,9 +122,10 @@ Crossfade::Crossfade (boost::shared_ptr<AudioRegion> a, boost::shared_ptr<AudioR
} }
Crossfade::Crossfade (const Playlist& playlist, XMLNode& node) Crossfade::Crossfade (const Playlist& playlist, XMLNode& node)
: AudioRegion (playlist.session(), 0, 0, "unnamed crossfade"), : AudioRegion (playlist.session(), 0, 0, "unnamed crossfade")
_fade_in (Evoral::Parameter(FadeInAutomation)), // linear (gain coefficient) => -inf..+6dB , CROSSFADE_DEFAULT_PROPERTIES
_fade_out (Evoral::Parameter(FadeOutAutomation)) // linear (gain coefficient) => -inf..+6dB , _fade_in (Evoral::Parameter(FadeInAutomation)) // linear (gain coefficient) => -inf..+6dB
, _fade_out (Evoral::Parameter(FadeOutAutomation)) // linear (gain coefficient) => -inf..+6dB
{ {
boost::shared_ptr<Region> r; boost::shared_ptr<Region> r;
@ -163,6 +179,7 @@ Crossfade::Crossfade (const Playlist& playlist, XMLNode& node)
Crossfade::Crossfade (boost::shared_ptr<Crossfade> orig, boost::shared_ptr<AudioRegion> newin, boost::shared_ptr<AudioRegion> newout) Crossfade::Crossfade (boost::shared_ptr<Crossfade> orig, boost::shared_ptr<AudioRegion> newin, boost::shared_ptr<AudioRegion> newout)
: AudioRegion (boost::dynamic_pointer_cast<const AudioRegion> (orig), 0, true) : AudioRegion (boost::dynamic_pointer_cast<const AudioRegion> (orig), 0, true)
, CROSSFADE_DEFAULT_PROPERTIES
, _fade_in (orig->_fade_in) , _fade_in (orig->_fade_in)
, _fade_out (orig->_fade_out) , _fade_out (orig->_fade_out)
{ {
@ -377,7 +394,7 @@ Crossfade::set_active (bool yn)
{ {
if (_active != yn) { if (_active != yn) {
_active = yn; _active = yn;
StateChanged (ActiveChanged); PropertyChanged (PropertyChange (Properties::active));
} }
} }
@ -442,7 +459,11 @@ Crossfade::refresh ()
} }
if (send_signal) { if (send_signal) {
StateChanged (BoundsChanged); /* EMIT SIGNAL */ PropertyChange bounds;
bounds.add (Properties::start);
bounds.add (Properties::position);
bounds.add (Properties::length);
PropertyChanged (bounds); /* EMIT SIGNAL */
} }
_in_update = false; _in_update = false;
@ -722,14 +743,14 @@ Crossfade::set_state (const XMLNode& node, int /*version*/)
XMLNode* fo; XMLNode* fo;
const XMLProperty* prop; const XMLProperty* prop;
LocaleGuard lg (X_("POSIX")); LocaleGuard lg (X_("POSIX"));
PropertyChange what_changed = PropertyChange (0); PropertyChange what_changed;
framepos_t val; framepos_t val;
if ((prop = node.property ("position")) != 0) { if ((prop = node.property ("position")) != 0) {
sscanf (prop->value().c_str(), "%" PRId64, &val); sscanf (prop->value().c_str(), "%" PRId64, &val);
if (val != _position) { if (val != _position) {
_position = val; _position = val;
what_changed = PropertyChange (what_changed | PositionChanged); what_changed.add (Properties::position);
} }
} else { } else {
warning << _("old-style crossfade information - no position information") << endmsg; warning << _("old-style crossfade information - no position information") << endmsg;
@ -740,7 +761,7 @@ Crossfade::set_state (const XMLNode& node, int /*version*/)
bool x = string_is_affirmative (prop->value()); bool x = string_is_affirmative (prop->value());
if (x != _active) { if (x != _active) {
_active = x; _active = x;
what_changed = PropertyChange (what_changed | ActiveChanged); what_changed.add (Properties::active);
} }
} else { } else {
_active = true; _active = true;
@ -769,7 +790,7 @@ Crossfade::set_state (const XMLNode& node, int /*version*/)
sscanf (prop->value().c_str(), "%" PRId64, &val); sscanf (prop->value().c_str(), "%" PRId64, &val);
if (val != _length) { if (val != _length) {
_length = val; _length = val;
what_changed = PropertyChange (what_changed | LengthChanged); what_changed.add (Properties::length);
} }
} else { } else {
@ -840,7 +861,7 @@ Crossfade::set_state (const XMLNode& node, int /*version*/)
_fade_out.thaw (); _fade_out.thaw ();
StateChanged (what_changed); /* EMIT SIGNAL */ PropertyChanged (what_changed); /* EMIT SIGNAL */
return 0; return 0;
} }
@ -866,7 +887,7 @@ Crossfade::set_follow_overlap (bool yn)
set_xfade_length (_out->first_frame() + _out->length() - _in->first_frame()); set_xfade_length (_out->first_frame() + _out->length() - _in->first_frame());
} }
StateChanged (FollowOverlapChanged); PropertyChanged (PropertyChange (Properties::follow_overlap));
} }
framecnt_t framecnt_t
@ -900,7 +921,7 @@ Crossfade::set_xfade_length (framecnt_t len)
_length = len; _length = len;
StateChanged (LengthChanged); PropertyChanged (PropertyChange (Properties::length));
return len; return len;
} }

View file

@ -361,7 +361,7 @@ Diskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
} }
void void
Diskstream::playlist_changed (PropertyChange) Diskstream::playlist_changed (const PropertyChange&)
{ {
playlist_modified (); playlist_modified ();
} }

View file

@ -102,12 +102,6 @@ MIDI::Port *ARDOUR::default_mtc_port = 0;
MIDI::Port *ARDOUR::default_midi_port = 0; MIDI::Port *ARDOUR::default_midi_port = 0;
MIDI::Port *ARDOUR::default_midi_clock_port = 0; MIDI::Port *ARDOUR::default_midi_clock_port = 0;
PropertyChange ARDOUR::StartChanged = PBD::new_change ();
PropertyChange ARDOUR::LengthChanged = PBD::new_change ();
PropertyChange ARDOUR::PositionChanged = PBD::new_change ();
PropertyChange ARDOUR::NameChanged = PBD::new_change ();
PropertyChange ARDOUR::BoundsChanged = PropertyChange (0); // see init(), below
compute_peak_t ARDOUR::compute_peak = 0; compute_peak_t ARDOUR::compute_peak = 0;
find_peaks_t ARDOUR::find_peaks = 0; find_peaks_t ARDOUR::find_peaks = 0;
apply_gain_to_buffer_t ARDOUR::apply_gain_to_buffer = 0; apply_gain_to_buffer_t ARDOUR::apply_gain_to_buffer = 0;
@ -118,6 +112,36 @@ PBD::Signal1<void,std::string> ARDOUR::BootMessage;
void ARDOUR::setup_enum_writer (); void ARDOUR::setup_enum_writer ();
/* this is useful for quite a few things that want to check
if any bounds-related property has changed
*/
PBD::PropertyChange ARDOUR::bounds_change;
namespace ARDOUR {
namespace Properties {
/* the envelope and fades are not scalar items and so
currently (2010/02) are not stored using Property.
However, these descriptors enable us to notify
about changes to them via PropertyChange.
Declared in ardour/audioregion.h ...
*/
PBD::PropertyDescriptor<bool> fade_in;
PBD::PropertyDescriptor<bool> fade_out;
PBD::PropertyDescriptor<bool> envelope;
}
}
void
ARDOUR::make_property_quarks ()
{
Properties::fade_in.id = g_quark_from_static_string (X_("fade_in_FAKE"));
Properties::fade_out.id = g_quark_from_static_string (X_("fade_out_FAKE"));
Properties::envelope.id = g_quark_from_static_string (X_("envelope_FAKE"));
}
int int
ARDOUR::setup_midi () ARDOUR::setup_midi ()
{ {
@ -303,11 +327,22 @@ ARDOUR::init (bool use_vst, bool try_optimization)
PBD::ID::init (); PBD::ID::init ();
SessionEvent::init_event_pool (); SessionEvent::init_event_pool ();
make_property_quarks ();
SessionObject::make_property_quarks (); SessionObject::make_property_quarks ();
Region::make_property_quarks (); Region::make_property_quarks ();
AudioRegion::make_property_quarks (); AudioRegion::make_property_quarks ();
RouteGroup::make_property_quarks (); RouteGroup::make_property_quarks ();
/* this is a useful ready to use PropertyChange that many
things need to check. This avoids having to compose
it every time we want to check for any of the relevant
property changes.
*/
bounds_change.add (ARDOUR::Properties::start);
bounds_change.add (ARDOUR::Properties::position);
bounds_change.add (ARDOUR::Properties::length);
/* provide a state version for the few cases that need it and are not /* provide a state version for the few cases that need it and are not
driven by reading state from disk (e.g. undo/redo) driven by reading state from disk (e.g. undo/redo)
*/ */
@ -367,8 +402,6 @@ ARDOUR::init (bool use_vst, bool try_optimization)
/* singleton - first object is "it" */ /* singleton - first object is "it" */
new PluginManager (); new PluginManager ();
BoundsChanged = PropertyChange (StartChanged|PositionChanged|LengthChanged);
return 0; return 0;
} }

View file

@ -44,7 +44,7 @@ InternalSend::InternalSend (Session& s, boost::shared_ptr<MuteMaster> mm, boost:
set_name (sendto->name()); set_name (sendto->name());
_send_to->DropReferences.connect_same_thread (*this, boost::bind (&InternalSend::send_to_going_away, this)); _send_to->DropReferences.connect_same_thread (*this, boost::bind (&InternalSend::send_to_going_away, this));
_send_to->NameChanged.connect_same_thread (*this, boost::bind (&InternalSend::send_to_name_changed, this)); _send_to->PropertyChanged.connect_same_thread (*this, boost::bind (&InternalSend::send_to_property_changed, this, _1));;
} }
InternalSend::InternalSend (Session& s, boost::shared_ptr<MuteMaster> mm, const XMLNode& node) InternalSend::InternalSend (Session& s, boost::shared_ptr<MuteMaster> mm, const XMLNode& node)
@ -269,7 +269,9 @@ InternalSend::visible () const
} }
void void
InternalSend::send_to_name_changed () InternalSend::send_to_property_changed (const PropertyChange& what_changed)
{ {
if (what_changed.contains (Properties::name)) {
set_name (_send_to->name ()); set_name (_send_to->name ());
}
} }

View file

@ -326,7 +326,7 @@ void
MidiModel::DiffCommand::change(const boost::shared_ptr< Evoral::Note<TimeType> > note, Property prop, MidiModel::DiffCommand::change(const boost::shared_ptr< Evoral::Note<TimeType> > note, Property prop,
uint8_t new_value) uint8_t new_value)
{ {
NotePropertyChange change; NoteChange change;
change.note = note; change.note = note;
change.property = prop; change.property = prop;
@ -359,7 +359,7 @@ void
MidiModel::DiffCommand::change(const boost::shared_ptr< Evoral::Note<TimeType> > note, Property prop, MidiModel::DiffCommand::change(const boost::shared_ptr< Evoral::Note<TimeType> > note, Property prop,
TimeType new_time) TimeType new_time)
{ {
NotePropertyChange change; NoteChange change;
change.note = note; change.note = note;
change.property = prop; change.property = prop;
@ -443,7 +443,7 @@ MidiModel::DiffCommand::undo()
} }
XMLNode& XMLNode&
MidiModel::DiffCommand::marshal_change(const NotePropertyChange& change) MidiModel::DiffCommand::marshal_change(const NoteChange& change)
{ {
XMLNode* xml_change = new XMLNode("change"); XMLNode* xml_change = new XMLNode("change");
@ -516,11 +516,11 @@ MidiModel::DiffCommand::marshal_change(const NotePropertyChange& change)
return *xml_change; return *xml_change;
} }
MidiModel::DiffCommand::NotePropertyChange MidiModel::DiffCommand::NoteChange
MidiModel::DiffCommand::unmarshal_change(XMLNode *xml_change) MidiModel::DiffCommand::unmarshal_change(XMLNode *xml_change)
{ {
XMLProperty* prop; XMLProperty* prop;
NotePropertyChange change; NoteChange change;
unsigned int note; unsigned int note;
unsigned int channel; unsigned int channel;
unsigned int velocity; unsigned int velocity;

View file

@ -415,7 +415,7 @@ MidiPlaylist::contained_automation()
bool bool
MidiPlaylist::region_changed (PBD::PropertyChange what_changed, boost::shared_ptr<Region> region) MidiPlaylist::region_changed (const PBD::PropertyChange& what_changed, boost::shared_ptr<Region> region)
{ {
if (in_flush || in_set_state) { if (in_flush || in_set_state) {
return false; return false;
@ -423,18 +423,13 @@ MidiPlaylist::region_changed (PBD::PropertyChange what_changed, boost::shared_pt
// Feeling rather uninterested today, but thanks for the heads up anyway! // Feeling rather uninterested today, but thanks for the heads up anyway!
PBD::PropertyChange our_interests = PBD::PropertyChange (/*MidiRegion::FadeInChanged| PBD::PropertyChange our_interests;
MidiRegion::FadeOutChanged|
MidiRegion::FadeInActiveChanged|
MidiRegion::FadeOutActiveChanged|
MidiRegion::EnvelopeActiveChanged|
MidiRegion::ScaleAmplitudeChanged|
MidiRegion::EnvelopeChanged*/);
bool parent_wants_notify; bool parent_wants_notify;
parent_wants_notify = Playlist::region_changed (what_changed, region); parent_wants_notify = Playlist::region_changed (what_changed, region);
if ((parent_wants_notify || (what_changed & our_interests))) { if (parent_wants_notify || what_changed.contains (our_interests)) {
notify_contents_changed (); notify_contents_changed ();
} }

View file

@ -47,23 +47,15 @@ using namespace std;
using namespace ARDOUR; using namespace ARDOUR;
using namespace PBD; using namespace PBD;
/** Basic MidiRegion constructor (one channel) */
MidiRegion::MidiRegion (boost::shared_ptr<MidiSource> src)
: Region (src)
{
assert(_name.val().find("/") == string::npos);
midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1));
}
/* Basic MidiRegion constructor (many channels) */ /* Basic MidiRegion constructor (many channels) */
MidiRegion::MidiRegion (const SourceList& srcs) MidiRegion::MidiRegion (const SourceList& srcs)
: Region (srcs) : Region (srcs)
{ {
assert(_name.val().find("/") == string::npos);
midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1)); midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1));
assert(_name.val().find("/") == string::npos);
assert(_type == DataType::MIDI);
} }
/** Create a new MidiRegion, that is part of an existing one */ /** Create a new MidiRegion, that is part of an existing one */
MidiRegion::MidiRegion (boost::shared_ptr<const MidiRegion> other, frameoffset_t offset, bool offset_relative) MidiRegion::MidiRegion (boost::shared_ptr<const MidiRegion> other, frameoffset_t offset, bool offset_relative)
: Region (other, offset, offset_relative) : Region (other, offset, offset_relative)
@ -72,30 +64,6 @@ MidiRegion::MidiRegion (boost::shared_ptr<const MidiRegion> other, frameoffset_t
midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1)); midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1));
} }
MidiRegion::MidiRegion (boost::shared_ptr<MidiSource> src, const XMLNode& node)
: Region (src, node)
{
if (set_state (node, Stateful::loading_state_version)) {
throw failed_constructor();
}
midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1));
assert(_name.val().find("/") == string::npos);
assert(_type == DataType::MIDI);
}
MidiRegion::MidiRegion (const SourceList& srcs, const XMLNode& node)
: Region (srcs, node)
{
if (set_state (node, Stateful::loading_state_version)) {
throw failed_constructor();
}
midi_source(0)->Switched.connect_same_thread (*this, boost::bind (&MidiRegion::switch_source, this, _1));
assert(_name.val().find("/") == string::npos);
assert(_type == DataType::MIDI);
}
MidiRegion::~MidiRegion () MidiRegion::~MidiRegion ()
{ {
} }

View file

@ -666,7 +666,7 @@ Playlist::add_region_internal (boost::shared_ptr<Region> region, framepos_t posi
} }
} }
region->StateChanged.connect_same_thread (region_state_changed_connections, boost::bind (&Playlist::region_changed_proxy, this, _1, boost::weak_ptr<Region> (region))); region->PropertyChanged.connect_same_thread (region_state_changed_connections, boost::bind (&Playlist::region_changed_proxy, this, _1, boost::weak_ptr<Region> (region)));
return true; return true;
} }
@ -1383,13 +1383,13 @@ Playlist::core_splice (framepos_t at, framecnt_t distance, boost::shared_ptr<Reg
} }
void void
Playlist::region_bounds_changed (PropertyChange what_changed, boost::shared_ptr<Region> region) Playlist::region_bounds_changed (const PropertyChange& what_changed, boost::shared_ptr<Region> region)
{ {
if (in_set_state || _splicing || _nudging || _shuffling) { if (in_set_state || _splicing || _nudging || _shuffling) {
return; return;
} }
if (what_changed & ARDOUR::PositionChanged) { if (what_changed.contains (Properties::position)) {
/* remove it from the list then add it back in /* remove it from the list then add it back in
the right place again. the right place again.
@ -1410,15 +1410,15 @@ Playlist::region_bounds_changed (PropertyChange what_changed, boost::shared_ptr<
regions.insert (upper_bound (regions.begin(), regions.end(), region, cmp), region); regions.insert (upper_bound (regions.begin(), regions.end(), region, cmp), region);
} }
if (what_changed & PropertyChange (ARDOUR::PositionChanged|ARDOUR::LengthChanged)) { if (what_changed.contains (Properties::position) || what_changed.contains (Properties::length)) {
frameoffset_t delta = 0; frameoffset_t delta = 0;
if (what_changed & ARDOUR::PositionChanged) { if (what_changed.contains (Properties::position)) {
delta = region->position() - region->last_position(); delta = region->position() - region->last_position();
} }
if (what_changed & ARDOUR::LengthChanged) { if (what_changed.contains (Properties::length)) {
delta += region->length() - region->last_length(); delta += region->length() - region->last_length();
} }
@ -1442,7 +1442,7 @@ Playlist::region_bounds_changed (PropertyChange what_changed, boost::shared_ptr<
} }
void void
Playlist::region_changed_proxy (PropertyChange what_changed, boost::weak_ptr<Region> weak_region) Playlist::region_changed_proxy (const PropertyChange& what_changed, boost::weak_ptr<Region> weak_region)
{ {
boost::shared_ptr<Region> region (weak_region.lock()); boost::shared_ptr<Region> region (weak_region.lock());
@ -1456,26 +1456,38 @@ Playlist::region_changed_proxy (PropertyChange what_changed, boost::weak_ptr<Reg
} }
bool bool
Playlist::region_changed (PropertyChange what_changed, boost::shared_ptr<Region> region) Playlist::region_changed (const PropertyChange& what_changed, boost::shared_ptr<Region> region)
{ {
PropertyChange our_interests = PropertyChange (Region::MuteChanged|Region::LayerChanged|Region::OpacityChanged); PropertyChange our_interests;
PropertyChange bounds;
PropertyChange pos_and_length;
bool save = false; bool save = false;
if (in_set_state || in_flush) { if (in_set_state || in_flush) {
return false; return false;
} }
if (what_changed & BoundsChanged) { our_interests.add (Properties::muted);
our_interests.add (Properties::layer);
our_interests.add (Properties::opaque);
bounds.add (Properties::start);
bounds.add (Properties::position);
bounds.add (Properties::length);
pos_and_length.add (Properties::position);
pos_and_length.add (Properties::length);
if (what_changed.contains (bounds)) {
region_bounds_changed (what_changed, region); region_bounds_changed (what_changed, region);
save = !(_splicing || _nudging); save = !(_splicing || _nudging);
} }
if ((what_changed & our_interests) && if (what_changed.contains (our_interests) && !what_changed.contains (pos_and_length)) {
!(what_changed & PropertyChange (ARDOUR::PositionChanged|ARDOUR::LengthChanged))) {
check_dependents (region, false); check_dependents (region, false);
} }
if (what_changed & PropertyChange (ARDOUR::PositionChanged)) { if (what_changed.contains (Properties::position)) {
notify_region_moved (region); notify_region_moved (region);
} }
@ -1484,7 +1496,7 @@ Playlist::region_changed (PropertyChange what_changed, boost::shared_ptr<Region>
them, and we notify in ::relayer() them, and we notify in ::relayer()
*/ */
if (what_changed & our_interests) { if (what_changed.contains (our_interests)) {
save = true; save = true;
} }

View file

@ -46,14 +46,6 @@ using namespace std;
using namespace ARDOUR; using namespace ARDOUR;
using namespace PBD; using namespace PBD;
PropertyChange Region::FadeChanged = PBD::new_change ();
PropertyChange Region::SyncOffsetChanged = PBD::new_change ();
PropertyChange Region::MuteChanged = PBD::new_change ();
PropertyChange Region::OpacityChanged = PBD::new_change ();
PropertyChange Region::LockChanged = PBD::new_change ();
PropertyChange Region::LayerChanged = PBD::new_change ();
PropertyChange Region::HiddenChanged = PBD::new_change ();
namespace ARDOUR { namespace ARDOUR {
namespace Properties { namespace Properties {
PBD::PropertyDescriptor<bool> muted; PBD::PropertyDescriptor<bool> muted;
@ -80,7 +72,7 @@ namespace ARDOUR {
} }
} }
PBD::Signal1<void,boost::shared_ptr<ARDOUR::Region> > Region::RegionPropertyChanged; PBD::Signal2<void,boost::shared_ptr<ARDOUR::Region>,const PropertyChange&> Region::RegionPropertyChanged;
void void
Region::make_property_quarks () Region::make_property_quarks ()
@ -137,27 +129,27 @@ Region::register_properties ()
} }
#define REGION_DEFAULT_STATE(s,l) \ #define REGION_DEFAULT_STATE(s,l) \
_muted (Properties::muted, MuteChanged, false) \ _muted (Properties::muted, false) \
, _opaque (Properties::opaque, OpacityChanged, true) \ , _opaque (Properties::opaque, true) \
, _locked (Properties::locked, LockChanged, false) \ , _locked (Properties::locked, false) \
, _automatic (Properties::automatic, PropertyChange (0), false) \ , _automatic (Properties::automatic, false) \
, _whole_file (Properties::whole_file, PropertyChange (0), false) \ , _whole_file (Properties::whole_file, false) \
, _import (Properties::import, PropertyChange (0), false) \ , _import (Properties::import, false) \
, _external (Properties::external, PropertyChange (0), false) \ , _external (Properties::external, false) \
, _sync_marked (Properties::sync_marked, SyncOffsetChanged, false) \ , _sync_marked (Properties::sync_marked, false) \
, _left_of_split (Properties::left_of_split, PropertyChange (0), false) \ , _left_of_split (Properties::left_of_split, false) \
, _right_of_split (Properties::right_of_split, PropertyChange (0), false) \ , _right_of_split (Properties::right_of_split, false) \
, _hidden (Properties::hidden, HiddenChanged, false) \ , _hidden (Properties::hidden, false) \
, _position_locked (Properties::position_locked, PropertyChange (0), false) \ , _position_locked (Properties::position_locked, false) \
, _start (Properties::start, StartChanged, (s)) \ , _start (Properties::start, (s)) \
, _length (Properties::length, LengthChanged, (l)) \ , _length (Properties::length, (l)) \
, _position (Properties::position, PositionChanged, 0) \ , _position (Properties::position, 0) \
, _sync_position (Properties::sync_position, SyncOffsetChanged, (s)) \ , _sync_position (Properties::sync_position, (s)) \
, _layer (Properties::layer, LayerChanged, 0) \ , _layer (Properties::layer, 0) \
, _ancestral_start (Properties::ancestral_start, PropertyChange (0), (s)) \ , _ancestral_start (Properties::ancestral_start, (s)) \
, _ancestral_length (Properties::ancestral_length, PropertyChange (0), (l)) \ , _ancestral_length (Properties::ancestral_length, (l)) \
, _stretch (Properties::stretch, PropertyChange (0), 1.0) \ , _stretch (Properties::stretch, 1.0) \
, _shift (Properties::shift, PropertyChange (0), 1.0) , _shift (Properties::shift, 1.0)
#define REGION_COPY_STATE(other) \ #define REGION_COPY_STATE(other) \
_muted (other->_muted) \ _muted (other->_muted) \
@ -194,7 +186,6 @@ Region::Region (Session& s, framepos_t start, framecnt_t length, const string& n
, _first_edit (EditChangesNothing) , _first_edit (EditChangesNothing)
, _frozen(0) , _frozen(0)
, _read_data_count(0) , _read_data_count(0)
, _pending_changed(PropertyChange (0))
, _last_layer_op(0) , _last_layer_op(0)
, _pending_explicit_relayer (false) , _pending_explicit_relayer (false)
{ {
@ -203,34 +194,6 @@ Region::Region (Session& s, framepos_t start, framecnt_t length, const string& n
/* no sources at this point */ /* no sources at this point */
} }
/** Basic Region constructor (single source) */
Region::Region (boost::shared_ptr<Source> src)
: SessionObject(src->session(), "toBeRenamed")
, _type (src->type())
, _no_property_changes (true)
, REGION_DEFAULT_STATE(0,0)
, _last_length (0)
, _last_position (0)
, _positional_lock_style (_type == DataType::AUDIO ? AudioTime : MusicTime)
, _first_edit (EditChangesNothing)
, _frozen(0)
, _valid_transients(false)
, _read_data_count(0)
, _pending_changed(PropertyChange (0))
, _last_layer_op(0)
, _pending_explicit_relayer (false)
{
register_properties ();
_sources.push_back (src);
_master_sources.push_back (src);
src->DropReferences.connect_same_thread (*this, boost::bind (&Region::source_deleted, this, boost::weak_ptr<Source>(src)));
assert (_sources.size() > 0);
assert (_type == src->type());
}
/** Basic Region constructor (many sources) */ /** Basic Region constructor (many sources) */
Region::Region (const SourceList& srcs) Region::Region (const SourceList& srcs)
: SessionObject(srcs.front()->session(), "toBeRenamed") : SessionObject(srcs.front()->session(), "toBeRenamed")
@ -244,7 +207,6 @@ Region::Region (const SourceList& srcs)
, _frozen (0) , _frozen (0)
, _valid_transients(false) , _valid_transients(false)
, _read_data_count(0) , _read_data_count(0)
, _pending_changed(PropertyChange (0))
, _last_layer_op (0) , _last_layer_op (0)
, _pending_explicit_relayer (false) , _pending_explicit_relayer (false)
{ {
@ -277,7 +239,6 @@ Region::Region (boost::shared_ptr<const Region> other, frameoffset_t offset, boo
, _frozen (0) , _frozen (0)
, _valid_transients(false) , _valid_transients(false)
, _read_data_count(0) , _read_data_count(0)
, _pending_changed(PropertyChange (0))
, _last_layer_op (0) , _last_layer_op (0)
, _pending_explicit_relayer (false) , _pending_explicit_relayer (false)
@ -387,7 +348,6 @@ Region::Region (boost::shared_ptr<const Region> other, const SourceList& srcs)
, _frozen (0) , _frozen (0)
, _valid_transients (false) , _valid_transients (false)
, _read_data_count (0) , _read_data_count (0)
, _pending_changed (PropertyChange(0))
, _last_layer_op (other->_last_layer_op) , _last_layer_op (other->_last_layer_op)
, _pending_explicit_relayer (false) , _pending_explicit_relayer (false)
{ {
@ -421,7 +381,6 @@ Region::Region (boost::shared_ptr<const Region> other)
, _frozen(0) , _frozen(0)
, _valid_transients(false) , _valid_transients(false)
, _read_data_count(0) , _read_data_count(0)
, _pending_changed(PropertyChange(0))
, _last_layer_op(other->_last_layer_op) , _last_layer_op(other->_last_layer_op)
, _pending_explicit_relayer (false) , _pending_explicit_relayer (false)
{ {
@ -442,74 +401,6 @@ Region::Region (boost::shared_ptr<const Region> other)
assert(_sources.size() > 0); assert(_sources.size() > 0);
} }
Region::Region (const SourceList& srcs, const XMLNode& node)
: SessionObject(srcs.front()->session(), X_("error: XML did not reset this"))
, _type (srcs.front()->type())
, REGION_DEFAULT_STATE(0,0)
, _last_length (0)
, _last_position (0)
, _positional_lock_style (_type == DataType::AUDIO ? AudioTime : MusicTime)
, _first_edit (EditChangesNothing)
, _frozen(0)
, _valid_transients(false)
, _read_data_count(0)
, _pending_changed(PropertyChange(0))
, _last_layer_op(0)
, _pending_explicit_relayer (false)
{
const XMLProperty* prop;
register_properties ();
if ((prop = node.property (X_("id")))) {
_id = prop->value();
}
use_sources (srcs);
if (set_state (node, Stateful::loading_state_version)) {
throw failed_constructor();
}
assert(_type != DataType::NIL);
assert(_sources.size() > 0);
assert (_type == srcs.front()->type());
}
Region::Region (boost::shared_ptr<Source> src, const XMLNode& node)
: SessionObject(src->session(), X_("error: XML did not reset this"))
, _type (src->type())
, REGION_DEFAULT_STATE(0,0)
, _last_length (0)
, _last_position (0)
, _positional_lock_style (_type == DataType::AUDIO ? AudioTime : MusicTime)
, _first_edit (EditChangesNothing)
, _frozen (0)
, _read_data_count (0)
, _pending_changed (PropertyChange(0))
, _last_layer_op (0)
, _pending_explicit_relayer (false)
{
const XMLProperty *prop;
register_properties ();
_sources.push_back (src);
if ((prop = node.property (X_("id")))) {
_id = prop->value();
}
if (set_state (node, Stateful::loading_state_version)) {
throw failed_constructor();
}
assert (_type != DataType::NIL);
assert (_sources.size() > 0);
assert (_type == src->type());
}
Region::~Region () Region::~Region ()
{ {
DEBUG_TRACE (DEBUG::Destruction, string_compose ("Region %1 destructor @ %2\n", _name, this)); DEBUG_TRACE (DEBUG::Destruction, string_compose ("Region %1 destructor @ %2\n", _name, this));
@ -527,7 +418,7 @@ Region::set_name (const std::string& str)
if (_name != str) { if (_name != str) {
SessionObject::set_name(str); // EMIT SIGNAL NameChanged() SessionObject::set_name(str); // EMIT SIGNAL NameChanged()
assert(_name == str); assert(_name == str);
send_change (ARDOUR::NameChanged); send_change (Properties::name);
} }
return true; return true;
@ -567,7 +458,7 @@ Region::set_length (framecnt_t len, void */*src*/)
recompute_at_end (); recompute_at_end ();
} }
send_change (LengthChanged); send_change (Properties::length);
} }
} }
@ -587,7 +478,7 @@ Region::first_edit ()
_name = _session.new_region_name (_name); _name = _session.new_region_name (_name);
_first_edit = EditChangesNothing; _first_edit = EditChangesNothing;
send_change (ARDOUR::NameChanged); send_change (Properties::name);
RegionFactory::CheckNewRegion (shared_from_this()); RegionFactory::CheckNewRegion (shared_from_this());
} }
} }
@ -709,7 +600,7 @@ Region::set_position_internal (framepos_t pos, bool allow_bbt_recompute)
a GUI that has moved its representation already. a GUI that has moved its representation already.
*/ */
send_change (PositionChanged); send_change (Properties::position);
} }
void void
@ -734,7 +625,7 @@ Region::set_position_on_top (framepos_t pos, void* /*src*/)
a GUI that has moved its representation already. a GUI that has moved its representation already.
*/ */
send_change (PositionChanged); send_change (Properties::position);
} }
void void
@ -772,7 +663,7 @@ Region::nudge_position (frameoffset_t n, void* /*src*/)
} }
} }
send_change (PositionChanged); send_change (Properties::position);
} }
void void
@ -806,7 +697,7 @@ Region::set_start (framepos_t pos, void* /*src*/)
first_edit (); first_edit ();
invalidate_transients (); invalidate_transients ();
send_change (StartChanged); send_change (Properties::start);
} }
} }
@ -856,7 +747,7 @@ Region::trim_start (framepos_t new_position, void */*src*/)
_whole_file = false; _whole_file = false;
first_edit (); first_edit ();
send_change (StartChanged); send_change (Properties::start);
} }
void void
@ -971,34 +862,39 @@ Region::trim_to_internal (framepos_t position, framecnt_t length, void */*src*/)
return; return;
} }
PropertyChange what_changed = PropertyChange (0); PropertyChange what_changed;
if (_start != new_start) { if (_start != new_start) {
_start = new_start; _start = new_start;
what_changed = PropertyChange (what_changed|StartChanged); what_changed.add (Properties::start);
} }
if (_length != length) { if (_length != length) {
if (!_frozen) { if (!_frozen) {
_last_length = _length; _last_length = _length;
} }
_length = length; _length = length;
what_changed = PropertyChange (what_changed|LengthChanged); what_changed.add (Properties::length);
} }
if (_position != position) { if (_position != position) {
if (!_frozen) { if (!_frozen) {
_last_position = _position; _last_position = _position;
} }
_position = position; _position = position;
what_changed = PropertyChange (what_changed|PositionChanged); what_changed.add (Properties::position);
} }
_whole_file = false; _whole_file = false;
if (what_changed & (StartChanged|LengthChanged)) { PropertyChange start_and_length;
start_and_length.add (Properties::start);
start_and_length.add (Properties::length);
if (what_changed.contains (start_and_length)) {
first_edit (); first_edit ();
} }
if (what_changed) { if (!what_changed.empty()) {
send_change (what_changed); send_change (what_changed);
} }
} }
@ -1008,7 +904,7 @@ Region::set_hidden (bool yn)
{ {
if (hidden() != yn) { if (hidden() != yn) {
_hidden = yn; _hidden = yn;
send_change (HiddenChanged); send_change (Properties::hidden);
} }
} }
@ -1031,7 +927,7 @@ Region::set_muted (bool yn)
{ {
if (muted() != yn) { if (muted() != yn) {
_muted = yn; _muted = yn;
send_change (MuteChanged); send_change (Properties::muted);
} }
} }
@ -1040,7 +936,7 @@ Region::set_opaque (bool yn)
{ {
if (opaque() != yn) { if (opaque() != yn) {
_opaque = yn; _opaque = yn;
send_change (OpacityChanged); send_change (Properties::opaque);
} }
} }
@ -1049,7 +945,7 @@ Region::set_locked (bool yn)
{ {
if (locked() != yn) { if (locked() != yn) {
_locked = yn; _locked = yn;
send_change (LockChanged); send_change (Properties::locked);
} }
} }
@ -1058,7 +954,7 @@ Region::set_position_locked (bool yn)
{ {
if (position_locked() != yn) { if (position_locked() != yn) {
_position_locked = yn; _position_locked = yn;
send_change (LockChanged); send_change (Properties::locked);
} }
} }
@ -1073,7 +969,7 @@ Region::set_sync_position (framepos_t absolute_pos)
if (!_frozen) { if (!_frozen) {
maybe_uncopy (); maybe_uncopy ();
} }
send_change (SyncOffsetChanged); send_change (Properties::sync_position);
} }
} }
@ -1085,7 +981,7 @@ Region::clear_sync_position ()
if (!_frozen) { if (!_frozen) {
maybe_uncopy (); maybe_uncopy ();
} }
send_change (SyncOffsetChanged); send_change (Properties::sync_position);
} }
} }
@ -1184,7 +1080,7 @@ Region::set_layer (layer_t l)
if (_layer != l) { if (_layer != l) {
_layer = l; _layer = l;
send_change (LayerChanged); send_change (Properties::layer);
} }
} }
@ -1239,7 +1135,7 @@ Region::get_state ()
int int
Region::set_state (const XMLNode& node, int version) Region::set_state (const XMLNode& node, int version)
{ {
PropertyChange what_changed = PropertyChange (0); PropertyChange what_changed;
return _set_state (node, version, what_changed, true); return _set_state (node, version, what_changed, true);
} }
@ -1248,6 +1144,8 @@ Region::_set_state (const XMLNode& node, int version, PropertyChange& what_chang
{ {
const XMLProperty* prop; const XMLProperty* prop;
cerr << "about to call ::set_properties for an XMLNode\n";
what_changed = set_properties (node); what_changed = set_properties (node);
if ((prop = node.property (X_("id")))) { if ((prop = node.property (X_("id")))) {
@ -1300,7 +1198,11 @@ Region::_set_state (const XMLNode& node, int version, PropertyChange& what_chang
} }
if (send) { if (send) {
cerr << _name << ": final change to be sent: " << hex << what_changed << dec << endl; cerr << _name << ": final change to be sent: ";
for (PropertyChange::iterator i = what_changed.begin(); i != what_changed.end(); ++i) {
cerr << g_quark_to_string ((GQuark) *i) << ' ';
}
cerr << endl;
send_change (what_changed); send_change (what_changed);
} }
@ -1318,7 +1220,7 @@ Region::freeze ()
void void
Region::thaw () Region::thaw ()
{ {
PropertyChange what_changed = PropertyChange (0); PropertyChange what_changed;
{ {
Glib::Mutex::Lock lm (_lock); Glib::Mutex::Lock lm (_lock);
@ -1327,18 +1229,18 @@ Region::thaw ()
return; return;
} }
if (_pending_changed) { if (!_pending_changed.empty()) {
what_changed = _pending_changed; what_changed = _pending_changed;
_pending_changed = PropertyChange (0); _pending_changed.clear ();
} }
} }
if (what_changed == PropertyChange (0)) { if (what_changed.empty()) {
return; return;
} }
if (what_changed & LengthChanged) { if (what_changed.contains (Properties::length)) {
if (what_changed & PositionChanged) { if (what_changed.contains (Properties::position)) {
recompute_at_start (); recompute_at_start ();
} }
recompute_at_end (); recompute_at_end ();
@ -1348,20 +1250,21 @@ Region::thaw ()
} }
void void
Region::send_change (PropertyChange what_changed) Region::send_change (const PropertyChange& what_changed)
{ {
if (what_changed.empty()) {
return;
}
{ {
Glib::Mutex::Lock lm (_lock); Glib::Mutex::Lock lm (_lock);
if (_frozen) { if (_frozen) {
_pending_changed = PropertyChange (_pending_changed|what_changed); _pending_changed.add (what_changed);
return; return;
} }
} }
cerr << _name << " actually sends " << hex << what_changed << dec << " @" << get_microseconds() << endl; PropertyChanged (what_changed);
StateChanged (what_changed);
cerr << _name << " done with " << hex << what_changed << dec << " @" << get_microseconds() << endl;
if (!_no_property_changes) { if (!_no_property_changes) {
@ -1371,9 +1274,7 @@ Region::send_change (PropertyChange what_changed)
try { try {
boost::shared_ptr<Region> rptr = shared_from_this(); boost::shared_ptr<Region> rptr = shared_from_this();
cerr << _name << " actually sends prop change " << hex << what_changed << dec << " @ " << get_microseconds() << endl; RegionPropertyChanged (rptr, what_changed);
RegionPropertyChanged (rptr);
cerr << _name << " done with prop change @ " << get_microseconds() << endl;
} catch (...) { } catch (...) {
/* no shared_ptr available, relax; */ /* no shared_ptr available, relax; */
@ -1612,11 +1513,9 @@ Region::use_sources (SourceList const & s)
} }
PropertyChange bool
Region::set_property (const PropertyBase& prop) Region::set_property (const PropertyBase& prop)
{ {
PropertyChange c = PropertyChange (0);
DEBUG_TRACE (DEBUG::Properties, string_compose ("region %1 set property %2\n", _name.val(), prop.property_name())); DEBUG_TRACE (DEBUG::Properties, string_compose ("region %1 set property %2\n", _name.val(), prop.property_name()));
if (prop == Properties::muted.id) { if (prop == Properties::muted.id) {
@ -1625,7 +1524,7 @@ Region::set_property (const PropertyBase& prop)
DEBUG_TRACE (DEBUG::Properties, string_compose ("region %1 muted changed from %2 to %3", DEBUG_TRACE (DEBUG::Properties, string_compose ("region %1 muted changed from %2 to %3",
_name.val(), _muted.val(), val)); _name.val(), _muted.val(), val));
_muted = val; _muted = val;
c = MuteChanged; return true;
} }
} else if (prop == Properties::opaque.id) { } else if (prop == Properties::opaque.id) {
bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val(); bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
@ -1633,7 +1532,7 @@ Region::set_property (const PropertyBase& prop)
DEBUG_TRACE (DEBUG::Properties, string_compose ("region %1 opaque changed from %2 to %3", DEBUG_TRACE (DEBUG::Properties, string_compose ("region %1 opaque changed from %2 to %3",
_name.val(), _opaque.val(), val)); _name.val(), _opaque.val(), val));
_opaque = val; _opaque = val;
c = OpacityChanged; return true;
} }
} else if (prop == Properties::locked.id) { } else if (prop == Properties::locked.id) {
bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val(); bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
@ -1641,7 +1540,7 @@ Region::set_property (const PropertyBase& prop)
DEBUG_TRACE (DEBUG::Properties, string_compose ("region %1 locked changed from %2 to %3", DEBUG_TRACE (DEBUG::Properties, string_compose ("region %1 locked changed from %2 to %3",
_name.val(), _locked.val(), val)); _name.val(), _locked.val(), val));
_locked = val; _locked = val;
c = LockChanged; return true;
} }
} else if (prop == Properties::automatic.id) { } else if (prop == Properties::automatic.id) {
_automatic = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val(); _automatic = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
@ -1661,51 +1560,35 @@ Region::set_property (const PropertyBase& prop)
bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val(); bool val = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
if (val != _hidden) { if (val != _hidden) {
_hidden = val; _hidden = val;
c = HiddenChanged; return true;
} }
} else if (prop == Properties::position_locked.id) { } else if (prop == Properties::position_locked.id) {
_position_locked = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val(); _position_locked = dynamic_cast<const PropertyTemplate<bool>*>(&prop)->val();
} else if (prop == Properties::start.id) { } else if (prop == Properties::start.id) {
_start = dynamic_cast<const PropertyTemplate<framepos_t>*>(&prop)->val(); _start = dynamic_cast<const PropertyTemplate<framepos_t>*>(&prop)->val();
} else if (prop == Properties::length.id) { } else if (prop == Properties::length.id) {
const PropertyTemplate<framecnt_t>* pt1 = dynamic_cast<const PropertyTemplate<framecnt_t>* >(&prop);
const PropertyTemplate<int>* pt2 = dynamic_cast<const PropertyTemplate<int>* >(&prop);
cerr << "Cast to frmecnt = " << pt1 << " to int = " << pt2 << endl;
framecnt_t val = dynamic_cast<const PropertyTemplate<framecnt_t>* > (&prop)->val(); framecnt_t val = dynamic_cast<const PropertyTemplate<framecnt_t>* > (&prop)->val();
if (val != _length) { if (val != _length) {
DEBUG_TRACE (DEBUG::Properties, string_compose ("region %1 length changed from %2 to %3",
_name.val(), _length.val(), val));
_length = val; _length = val;
c = LengthChanged; return true;
} else {
DEBUG_TRACE (DEBUG::Properties, string_compose ("length %1 matches %2\n", _length.val(), val));
} }
} else if (prop == Properties::position.id) { } else if (prop == Properties::position.id) {
framepos_t val = dynamic_cast<const PropertyTemplate<framepos_t>*>(&prop)->val(); framepos_t val = dynamic_cast<const PropertyTemplate<framepos_t>*>(&prop)->val();
if (val != _position) { if (val != _position) {
DEBUG_TRACE (DEBUG::Properties, string_compose ("region %1 position changed from %2 to %3",
_name.val(), _position.val(), val));
_position = val; _position = val;
c = PositionChanged; return true;
} }
} else if (prop == Properties::sync_position.id) { } else if (prop == Properties::sync_position.id) {
framepos_t val = dynamic_cast<const PropertyTemplate<framepos_t>*>(&prop)->val(); framepos_t val = dynamic_cast<const PropertyTemplate<framepos_t>*>(&prop)->val();
if (val != _sync_position) { if (val != _sync_position) {
DEBUG_TRACE (DEBUG::Properties, string_compose ("region %1 syncpos changed from %2 to %3",
_name.val(), _sync_position, val));
_sync_position = val; _sync_position = val;
c = SyncOffsetChanged; return true;
} }
} else if (prop == Properties::layer.id) { } else if (prop == Properties::layer.id) {
layer_t val = dynamic_cast<const PropertyTemplate<layer_t>*>(&prop)->val(); layer_t val = dynamic_cast<const PropertyTemplate<layer_t>*>(&prop)->val();
if (val != _layer) { if (val != _layer) {
DEBUG_TRACE (DEBUG::Properties, string_compose ("region %1 syncpos changed from %2 to %3",
_name.val(), _sync_position, val));
_layer = val; _layer = val;
c = LayerChanged; return true;
} }
} else if (prop == Properties::ancestral_start.id) { } else if (prop == Properties::ancestral_start.id) {
_ancestral_start = dynamic_cast<const PropertyTemplate<framepos_t>*>(&prop)->val(); _ancestral_start = dynamic_cast<const PropertyTemplate<framepos_t>*>(&prop)->val();
@ -1719,5 +1602,5 @@ Region::set_property (const PropertyBase& prop)
return SessionObject::set_property (prop); return SessionObject::set_property (prop);
} }
return c; return false;
} }

View file

@ -209,38 +209,9 @@ RegionFactory::create (boost::shared_ptr<Region> region, const SourceList& srcs,
boost::shared_ptr<Region> boost::shared_ptr<Region>
RegionFactory::create (boost::shared_ptr<Source> src, const PropertyList& plist, bool announce) RegionFactory::create (boost::shared_ptr<Source> src, const PropertyList& plist, bool announce)
{ {
boost::shared_ptr<Region> ret; SourceList srcs;
boost::shared_ptr<AudioSource> as; srcs.push_back (src);
boost::shared_ptr<MidiSource> ms; return create (srcs, plist, announce);
if ((as = boost::dynamic_pointer_cast<AudioSource>(src)) != 0) {
AudioRegion* ar = new AudioRegion (as);
boost_debug_shared_ptr_mark_interesting (ar, "Region");
boost::shared_ptr<AudioRegion> arp (ar);
ret = boost::static_pointer_cast<Region> (arp);
} else if ((ms = boost::dynamic_pointer_cast<MidiSource>(src)) != 0) {
MidiRegion* mr = new MidiRegion (ms);
boost_debug_shared_ptr_mark_interesting (mr, "Region");
boost::shared_ptr<MidiRegion> mrp (mr);
ret = boost::static_pointer_cast<Region> (mrp);
}
if (ret) {
ret->set_properties (plist);
ret->unlock_property_changes ();
map_add (ret);
if (announce) {
CheckNewRegion (ret);
}
}
return ret;
} }
boost::shared_ptr<Region> boost::shared_ptr<Region>
@ -283,18 +254,9 @@ RegionFactory::create (const SourceList& srcs, const PropertyList& plist, bool a
boost::shared_ptr<Region> boost::shared_ptr<Region>
RegionFactory::create (Session& session, XMLNode& node, bool yn) RegionFactory::create (Session& session, XMLNode& node, bool yn)
{ {
boost::shared_ptr<Region> r = session.XMLRegionFactory (node, yn); return session.XMLRegionFactory (node, yn);
if (r) {
r->unlock_property_changes ();
map_add (r);
CheckNewRegion (r);
}
return r;
} }
boost::shared_ptr<Region> boost::shared_ptr<Region>
RegionFactory::create (SourceList& srcs, const XMLNode& node) RegionFactory::create (SourceList& srcs, const XMLNode& node)
{ {
@ -306,7 +268,7 @@ RegionFactory::create (SourceList& srcs, const XMLNode& node)
if (srcs[0]->type() == DataType::AUDIO) { if (srcs[0]->type() == DataType::AUDIO) {
AudioRegion* ar = new AudioRegion (srcs, node); AudioRegion* ar = new AudioRegion (srcs);
boost_debug_shared_ptr_mark_interesting (ar, "Region"); boost_debug_shared_ptr_mark_interesting (ar, "Region");
boost::shared_ptr<AudioRegion> arp (ar); boost::shared_ptr<AudioRegion> arp (ar);
@ -314,17 +276,22 @@ RegionFactory::create (SourceList& srcs, const XMLNode& node)
} else if (srcs[0]->type() == DataType::MIDI) { } else if (srcs[0]->type() == DataType::MIDI) {
MidiRegion* mr = new MidiRegion (srcs, node); MidiRegion* mr = new MidiRegion (srcs);
boost::shared_ptr<MidiRegion> mrp (mr); boost::shared_ptr<MidiRegion> mrp (mr);
ret = boost::static_pointer_cast<Region> (mrp); ret = boost::static_pointer_cast<Region> (mrp);
} }
if (ret) { if (ret) {
if (ret->set_state (node, Stateful::loading_state_version)) {
ret.reset ();
} else {
ret->unlock_property_changes (); ret->unlock_property_changes ();
map_add (ret); map_add (ret);
CheckNewRegion (ret); CheckNewRegion (ret);
} }
}
return ret; return ret;
} }

View file

@ -40,9 +40,6 @@ using namespace ARDOUR;
using namespace PBD; using namespace PBD;
using namespace std; using namespace std;
PropertyChange RouteGroup::FlagsChange = new_change ();
PropertyChange RouteGroup::PropertiesChange = new_change ();
namespace ARDOUR { namespace ARDOUR {
namespace Properties { namespace Properties {
PropertyDescriptor<bool> relative; PropertyDescriptor<bool> relative;
@ -70,15 +67,15 @@ RouteGroup::make_property_quarks ()
Properties::edit.id = g_quark_from_static_string (X_("edit")); Properties::edit.id = g_quark_from_static_string (X_("edit"));
} }
#define ROUTE_GROUP_DEFAULT_PROPERTIES _relative (Properties::relative, FlagsChange, false) \ #define ROUTE_GROUP_DEFAULT_PROPERTIES _relative (Properties::relative, false) \
, _active (Properties::active, FlagsChange, false) \ , _active (Properties::active, false) \
, _hidden (Properties::hidden, FlagsChange, false) \ , _hidden (Properties::hidden, false) \
, _gain (Properties::gain, PropertiesChange, false) \ , _gain (Properties::gain, false) \
, _mute (Properties::mute, PropertiesChange, false) \ , _mute (Properties::mute, false) \
, _solo (Properties::solo, PropertiesChange , false) \ , _solo (Properties::solo, false) \
, _recenable (Properties::recenable, PropertiesChange, false) \ , _recenable (Properties::recenable, false) \
, _select (Properties::select, PropertiesChange, false) \ , _select (Properties::select, false) \
, _edit (Properties::edit, PropertiesChange , false) , _edit (Properties::edit, false)
RouteGroup::RouteGroup (Session& s, const string &n) RouteGroup::RouteGroup (Session& s, const string &n)
: SessionObject (s, n) : SessionObject (s, n)

View file

@ -2810,7 +2810,7 @@ Session::add_regions (vector<boost::shared_ptr<Region> >& new_regions)
} }
} }
region->StateChanged.connect_same_thread (*this, boost::bind (&Session::region_changed, this, _1, boost::weak_ptr<Region>(region))); region->PropertyChanged.connect_same_thread (*this, boost::bind (&Session::region_changed, this, _1, boost::weak_ptr<Region>(region)));
update_region_name_map (region); update_region_name_map (region);
} }
@ -2840,7 +2840,7 @@ Session::update_region_name_map (boost::shared_ptr<Region> region)
} }
void void
Session::region_changed (PropertyChange what_changed, boost::weak_ptr<Region> weak_region) Session::region_changed (const PropertyChange& what_changed, boost::weak_ptr<Region> weak_region)
{ {
boost::shared_ptr<Region> region (weak_region.lock ()); boost::shared_ptr<Region> region (weak_region.lock ());
@ -2848,12 +2848,12 @@ Session::region_changed (PropertyChange what_changed, boost::weak_ptr<Region> we
return; return;
} }
if (what_changed & Region::HiddenChanged) { if (what_changed.contains (Properties::hidden)) {
/* relay hidden changes */ /* relay hidden changes */
RegionHiddenChange (region); RegionHiddenChange (region);
} }
if (what_changed & NameChanged) { if (what_changed.contains (Properties::name)) {
update_region_name_map (region); update_region_name_map (region);
} }
} }
@ -3675,7 +3675,7 @@ Session::bundle_by_name (string name) const
} }
void void
Session::tempo_map_changed (PropertyChange) Session::tempo_map_changed (const PropertyChange&)
{ {
clear_clicks (); clear_clicks ();

View file

@ -37,27 +37,19 @@ SessionObject::make_property_quarks ()
Properties::name.id = g_quark_from_static_string (X_("name")); Properties::name.id = g_quark_from_static_string (X_("name"));
} }
PropertyChange bool
SessionObject::set_property (const PropertyBase& prop) SessionObject::set_property (const PropertyBase& prop)
{ {
PropertyChange c = PropertyChange (0);
DEBUG_TRACE (DEBUG::Properties, string_compose ("session object %1 set property %2\n", _name.val(), prop.property_name()));
if (prop == Properties::name.id) { if (prop == Properties::name.id) {
std::string str = dynamic_cast<const PropertyTemplate<std::string>*>(&prop)->val(); std::string str = dynamic_cast<const PropertyTemplate<std::string>*>(&prop)->val();
cerr << "prop @ " << &prop << " has quark " << prop.id() << " str value = " << str << endl;
cerr << "nameprop @ " << &_name << " has quark " << _name.id() << " str value = " << _name.val() << endl;
if (_name != str) { if (_name != str) {
DEBUG_TRACE (DEBUG::Properties, string_compose ("session object named %1 renamed %2\n", DEBUG_TRACE (DEBUG::Properties, string_compose ("session object named %1 renamed %2\n",
_name.val(), str)); _name.val(), str));
_name = str; _name = str;
c = _name.change(); return true;
} else {
DEBUG_TRACE (DEBUG::Properties, string_compose ("name %1 matches %2\n", _name.val(), str));
} }
} }
return c; return false;
} }

View file

@ -165,7 +165,7 @@ Session::first_stage_init (string fullpath, string snapshot_name)
_base_frame_rate = _current_frame_rate; _base_frame_rate = _current_frame_rate;
_tempo_map = new TempoMap (_current_frame_rate); _tempo_map = new TempoMap (_current_frame_rate);
_tempo_map->StateChanged.connect_same_thread (*this, boost::bind (&Session::tempo_map_changed, this, _1)); _tempo_map->PropertyChanged.connect_same_thread (*this, boost::bind (&Session::tempo_map_changed, this, _1));
_non_soloed_outs_muted = false; _non_soloed_outs_muted = false;

View file

@ -299,7 +299,7 @@ void
TempoMap::move_tempo (TempoSection& tempo, const BBT_Time& when) TempoMap::move_tempo (TempoSection& tempo, const BBT_Time& when)
{ {
if (move_metric_section (tempo, when) == 0) { if (move_metric_section (tempo, when) == 0) {
StateChanged (PropertyChange (0)); PropertyChanged (PropertyChange ());
} }
} }
@ -307,7 +307,7 @@ void
TempoMap::move_meter (MeterSection& meter, const BBT_Time& when) TempoMap::move_meter (MeterSection& meter, const BBT_Time& when)
{ {
if (move_metric_section (meter, when) == 0) { if (move_metric_section (meter, when) == 0) {
StateChanged (PropertyChange (0)); PropertyChanged (PropertyChange ());
} }
} }
@ -334,7 +334,7 @@ TempoMap::remove_tempo (const TempoSection& tempo)
} }
if (removed) { if (removed) {
StateChanged (PropertyChange (0)); PropertyChanged (PropertyChange ());
} }
} }
@ -361,7 +361,7 @@ TempoMap::remove_meter (const MeterSection& tempo)
} }
if (removed) { if (removed) {
StateChanged (PropertyChange (0)); PropertyChanged (PropertyChange ());
} }
} }
@ -406,7 +406,7 @@ TempoMap::add_tempo (const Tempo& tempo, BBT_Time where)
do_insert (new TempoSection (where, tempo.beats_per_minute(), tempo.note_type()), true); do_insert (new TempoSection (where, tempo.beats_per_minute(), tempo.note_type()), true);
} }
StateChanged (PropertyChange (0)); PropertyChanged (PropertyChange ());
} }
void void
@ -417,7 +417,7 @@ TempoMap::add_tempo (const Tempo& tempo, nframes64_t where)
do_insert (new TempoSection (where, tempo.beats_per_minute(), tempo.note_type()), false); do_insert (new TempoSection (where, tempo.beats_per_minute(), tempo.note_type()), false);
} }
StateChanged (PropertyChange (0)); PropertyChanged (PropertyChange ());
} }
void void
@ -445,7 +445,7 @@ TempoMap::replace_tempo (TempoSection& existing, const Tempo& replacement)
} }
if (replaced) { if (replaced) {
StateChanged (PropertyChange (0)); PropertyChanged (PropertyChange ());
} }
} }
@ -474,7 +474,7 @@ TempoMap::add_meter (const Meter& meter, BBT_Time where)
do_insert (new MeterSection (where, meter.beats_per_bar(), meter.note_divisor()), true); do_insert (new MeterSection (where, meter.beats_per_bar(), meter.note_divisor()), true);
} }
StateChanged (PropertyChange (0)); PropertyChanged (PropertyChange ());
} }
void void
@ -485,7 +485,7 @@ TempoMap::add_meter (const Meter& meter, nframes64_t where)
do_insert (new MeterSection (where, meter.beats_per_bar(), meter.note_divisor()), false); do_insert (new MeterSection (where, meter.beats_per_bar(), meter.note_divisor()), false);
} }
StateChanged (PropertyChange (0)); PropertyChanged (PropertyChange ());
} }
void void
@ -511,7 +511,7 @@ TempoMap::replace_meter (MeterSection& existing, const Meter& replacement)
} }
if (replaced) { if (replaced) {
StateChanged (PropertyChange (0)); PropertyChanged (PropertyChange ());
} }
} }
@ -524,7 +524,7 @@ TempoMap::change_initial_tempo (double beats_per_minute, double note_type)
for (Metrics::iterator i = metrics->begin(); i != metrics->end(); ++i) { for (Metrics::iterator i = metrics->begin(); i != metrics->end(); ++i) {
if ((t = dynamic_cast<TempoSection*> (*i)) != 0) { if ((t = dynamic_cast<TempoSection*> (*i)) != 0) {
*((Tempo*) t) = newtempo; *((Tempo*) t) = newtempo;
StateChanged (PropertyChange (0)); PropertyChanged (PropertyChange ());
break; break;
} }
} }
@ -570,7 +570,7 @@ TempoMap::change_existing_tempo_at (nframes64_t where, double beats_per_minute,
/* reset */ /* reset */
*((Tempo*)prev) = newtempo; *((Tempo*)prev) = newtempo;
StateChanged (PropertyChange (0)); PropertyChanged (PropertyChange ());
} }
const MeterSection& const MeterSection&
@ -1609,7 +1609,7 @@ TempoMap::set_state (const XMLNode& node, int /*version*/)
} }
} }
StateChanged (PropertyChange (0)); PropertyChanged (PropertyChange ());
return 0; return 0;
} }
@ -1673,7 +1673,7 @@ TempoMap::insert_time (nframes64_t where, nframes64_t amount)
timestamp_metrics (false); timestamp_metrics (false);
StateChanged (PropertyChange (0)); PropertyChanged (PropertyChange ());
} }
BBT_Time BBT_Time

View file

@ -107,8 +107,8 @@
#define MIDI_CMD_NOTE_OFF 0x80 /**< Note Off */ #define MIDI_CMD_NOTE_OFF 0x80 /**< Note Off */
#define MIDI_CMD_NOTE_ON 0x90 /**< Note On */ #define MIDI_CMD_NOTE_ON 0x90 /**< Note On */
#define MIDI_CMD_NOTE_PRESSURE 0xA0 /**< Key Pressure */ #define MIDI_CMD_NOTE_PRESSURE 0xA0 /**< Key Pressure */
#define MIDI_CMD_CONTROL 0xB0 /**< Control PropertyChange */ #define MIDI_CMD_CONTROL 0xB0 /**< Control Change */
#define MIDI_CMD_PGM_CHANGE 0xC0 /**< Program PropertyChange */ #define MIDI_CMD_PGM_CHANGE 0xC0 /**< Program Change */
#define MIDI_CMD_CHANNEL_PRESSURE 0xD0 /**< Channel Pressure */ #define MIDI_CMD_CHANNEL_PRESSURE 0xD0 /**< Channel Pressure */
#define MIDI_CMD_BENDER 0xE0 /**< Pitch Bender */ #define MIDI_CMD_BENDER 0xE0 /**< Pitch Bender */
#define MIDI_CMD_COMMON_SYSEX 0xF0 /**< Sysex (System Exclusive) Begin */ #define MIDI_CMD_COMMON_SYSEX 0xF0 /**< Sysex (System Exclusive) Begin */

View file

@ -23,18 +23,13 @@
#include <string> #include <string>
#include <sstream> #include <sstream>
#include <list> #include <list>
#include <set>
#include <glib.h> #include <glib.h>
#include "pbd/xml++.h" #include "pbd/xml++.h"
namespace PBD { namespace PBD {
enum PropertyChange {
range_guarantee = ~0ULL
};
PropertyChange new_change ();
typedef GQuark PropertyID; typedef GQuark PropertyID;
template<typename T> template<typename T>
@ -43,14 +38,48 @@ struct PropertyDescriptor {
typedef T value_type; typedef T value_type;
}; };
class PropertyChange : public std::set<PropertyID>
{
public:
PropertyChange() { }
template<typename T> PropertyChange(PropertyDescriptor<T> p) { insert (p.id); }
PropertyChange(const PropertyChange& other) : std::set<PropertyID> (other) { }
PropertyChange operator= (const PropertyChange& other) {
clear ();
insert (other.begin(), other.end());
return *this;
}
template<typename T> PropertyChange operator= (PropertyDescriptor<T> p) {
clear ();
insert (p.id);
return *this;
}
template<typename T> bool contains (PropertyDescriptor<T> p) const { return find (p.id) != end(); }
bool contains (const PropertyChange& other) const {
for (const_iterator x = other.begin(); x != other.end(); ++x) {
if (find (*x) != end()) {
return true;
}
}
return false;
}
void add (PropertyID id) { (void) insert (id); }
void add (const PropertyChange& other) { (void) insert (other.begin(), other.end()); }
template<typename T> void add (PropertyDescriptor<T> p) { (void) insert (p.id); }
};
/** Base (non template) part of Property */ /** Base (non template) part of Property */
class PropertyBase class PropertyBase
{ {
public: public:
PropertyBase (PropertyID pid, PropertyChange c) PropertyBase (PropertyID pid)
: _have_old (false) : _have_old (false)
, _property_id (pid) , _property_id (pid)
, _change (c)
{ {
} }
@ -62,11 +91,10 @@ public:
virtual void diff (XMLNode *, XMLNode *) const = 0; virtual void diff (XMLNode *, XMLNode *) const = 0;
virtual void diff (PropertyChange&) const = 0; virtual void diff (PropertyChange&) const = 0;
virtual PropertyChange set_state (XMLNode const &) = 0; virtual bool set_state (XMLNode const &) = 0;
virtual void add_state (XMLNode &) const = 0; virtual void add_state (XMLNode &) const = 0;
const gchar* property_name() const { return g_quark_to_string (_property_id); } const gchar* property_name() const { return g_quark_to_string (_property_id); }
PropertyChange change() const { return _change; }
PropertyID id() const { return _property_id; } PropertyID id() const { return _property_id; }
bool operator== (PropertyID pid) const { bool operator== (PropertyID pid) const {
@ -76,7 +104,6 @@ public:
protected: protected:
bool _have_old; bool _have_old;
PropertyID _property_id; PropertyID _property_id;
PropertyChange _change;
}; };
/** Parent class for classes which represent a single property in a Stateful object */ /** Parent class for classes which represent a single property in a Stateful object */
@ -84,8 +111,8 @@ template <class T>
class PropertyTemplate : public PropertyBase class PropertyTemplate : public PropertyBase
{ {
public: public:
PropertyTemplate (PropertyDescriptor<T> p, PropertyChange c, T const & v) PropertyTemplate (PropertyDescriptor<T> p, T const & v)
: PropertyBase (p.id, c) : PropertyBase (p.id)
, _current (v) , _current (v)
{ {
@ -94,7 +121,6 @@ public:
/* XXX: isn't there a nicer place to do this? */ /* XXX: isn't there a nicer place to do this? */
_have_old = s._have_old; _have_old = s._have_old;
_property_id = s._property_id; _property_id = s._property_id;
_change = s._change;
_current = s._current; _current = s._current;
_old = s._old; _old = s._old;
@ -129,39 +155,38 @@ public:
void diff (XMLNode* old, XMLNode* current) const { void diff (XMLNode* old, XMLNode* current) const {
if (_have_old) { if (_have_old) {
old->add_property (g_quark_to_string (_property_id), to_string (_old)); old->add_property (property_name(), to_string (_old));
current->add_property (g_quark_to_string (_property_id), to_string (_current)); current->add_property (property_name(), to_string (_current));
} }
} }
void diff (PropertyChange& c) const { void diff (PropertyChange& c) const {
if (_have_old && _change) { if (_have_old) {
c = PropertyChange (c | _change); c.add (_property_id);
} }
} }
/** Try to set state from the property of an XML node. /** Try to set state from the property of an XML node.
* @param node XML node. * @param node XML node.
* @return PropertyChange effected, or 0. * @return true if the value of the property is changed
*/ */
PropertyChange set_state (XMLNode const & node) { bool set_state (XMLNode const & node) {
XMLProperty const * p = node.property (g_quark_to_string (_property_id)); XMLProperty const * p = node.property (property_name());
PropertyChange c = PropertyChange (0);
if (p) { if (p) {
T const v = from_string (p->value ()); T const v = from_string (p->value ());
if (v != _current) { if (v != _current) {
set (v); set (v);
c = _change; return true;
} }
} }
return c; return false;
} }
void add_state (XMLNode & node) const { void add_state (XMLNode & node) const {
node.add_property (g_quark_to_string (_property_id), to_string (_current)); node.add_property (property_name(), to_string (_current));
} }
protected: protected:
@ -191,14 +216,8 @@ template <class T>
class Property : public PropertyTemplate<T> class Property : public PropertyTemplate<T>
{ {
public: public:
Property (PropertyDescriptor<T> q, PropertyChange c, T const & v)
: PropertyTemplate<T> (q, c, v)
{
}
Property (PropertyDescriptor<T> q, T const & v) Property (PropertyDescriptor<T> q, T const & v)
: PropertyTemplate<T> (q, PropertyChange (0), v) : PropertyTemplate<T> (q, v)
{ {
} }
@ -231,6 +250,35 @@ private:
} }
}; };
/** Specialization, for std::string which is common and special (see to_string() and from_string()
Using stringstream to read from a std::string is easy to get wrong because of whitespace
delineation, etc.
*/
template <>
class Property<std::string> : public PropertyTemplate<std::string>
{
public:
Property (PropertyDescriptor<std::string> q, std::string const & v)
: PropertyTemplate<std::string> (q, v)
{
}
std::string & operator= (std::string const & v) {
this->set (v);
return this->_current;
}
private:
std::string to_string (std::string const & v) const {
return _current;
}
std::string from_string (std::string const & s) const {
return s;
}
};
class PropertyList : public std::map<PropertyID,PropertyBase*> class PropertyList : public std::map<PropertyID,PropertyBase*>
{ {
public: public:

View file

@ -23,10 +23,11 @@
#include <string> #include <string>
#include <list> #include <list>
#include <cassert> #include <cassert>
#include "pbd/id.h" #include "pbd/id.h"
#include "pbd/xml++.h" #include "pbd/xml++.h"
#include "pbd/enumwriter.h"
#include "pbd/properties.h" #include "pbd/properties.h"
#include "pbd/signals.h"
class XMLNode; class XMLNode;
@ -47,7 +48,7 @@ class Stateful {
/* derived types do not have to implement this, but probably should /* derived types do not have to implement this, but probably should
give it serious attention. give it serious attention.
*/ */
virtual PropertyChange set_property (const PropertyBase&) { return PropertyChange (0); } virtual bool set_property (const PropertyBase&) { return false; }
PropertyChange set_properties (const PropertyList&); PropertyChange set_properties (const PropertyList&);
@ -68,6 +69,10 @@ class Stateful {
std::pair<XMLNode *, XMLNode*> diff () const; std::pair<XMLNode *, XMLNode*> diff () const;
void changed (PropertyChange&) const; void changed (PropertyChange&) const;
/* How stateful's notify of changes to their properties
*/
PBD::Signal1<void,const PropertyChange&> PropertyChanged;
static int current_state_version; static int current_state_version;
static int loading_state_version; static int loading_state_version;

View file

@ -26,22 +26,3 @@
using namespace PBD; using namespace PBD;
PropertyChange
PBD::new_change ()
{
static uint64_t change_bit = 1;
/* catch out-of-range */
if (!change_bit) {
fatal << _("programming error: ")
<< "change_bit out of range in ARDOUR::new_change()"
<< endmsg;
/*NOTREACHED*/
}
PropertyChange c = PropertyChange (change_bit);
change_bit <<= 1; // if it shifts too far, change_bit == 0
return c;
}

View file

@ -196,10 +196,12 @@ Stateful::changed (PropertyChange& c) const
PropertyChange PropertyChange
Stateful::set_properties (XMLNode const & node) Stateful::set_properties (XMLNode const & node)
{ {
PropertyChange c = PropertyChange (0); PropertyChange c;
for (OwnedPropertyList::iterator i = _properties.begin(); i != _properties.end(); ++i) { for (OwnedPropertyList::iterator i = _properties.begin(); i != _properties.end(); ++i) {
c = PropertyChange (c | i->second->set_state (node)); if (i->second->set_state (node)) {
c.add (i->first);
}
} }
post_set (); post_set ();
@ -210,12 +212,14 @@ Stateful::set_properties (XMLNode const & node)
PropertyChange PropertyChange
Stateful::set_properties (const PropertyList& property_list) Stateful::set_properties (const PropertyList& property_list)
{ {
PropertyChange c = PropertyChange (0); PropertyChange c;
PropertyList::const_iterator p; PropertyList::const_iterator p;
for (OwnedPropertyList::iterator i = _properties.begin(); i != _properties.end(); ++i) { for (OwnedPropertyList::iterator i = _properties.begin(); i != _properties.end(); ++i) {
if ((p = property_list.find (i->first)) != property_list.end()) { if ((p = property_list.find (i->first)) != property_list.end()) {
c = PropertyChange (c|set_property (*(p->second))); if (set_property (*p->second)) {
c.add (i->first);
}
} }
} }

View file

@ -74,7 +74,6 @@ def build(bld):
mountpoint.cc mountpoint.cc
pathscanner.cc pathscanner.cc
pool.cc pool.cc
property.cc
pthread_utils.cc pthread_utils.cc
receiver.cc receiver.cc
search_path.cc search_path.cc

View file

@ -946,8 +946,12 @@ MackieControlProtocol::notify_gain_changed (RouteSignal * route_signal, bool for
} }
void void
MackieControlProtocol::notify_name_changed (RouteSignal * route_signal) MackieControlProtocol::notify_property_changed (const PropertyChange& what_changed, RouteSignal * route_signal)
{ {
if (!what_changed.contains (Properties::name)) {
return;
}
try try
{ {
Strip & strip = route_signal->strip(); Strip & strip = route_signal->strip();

View file

@ -99,7 +99,7 @@ class MackieControlProtocol
/// Signal handler for Route::gain_changed (from IO) /// Signal handler for Route::gain_changed (from IO)
void notify_gain_changed(Mackie::RouteSignal *, bool force_update = true); void notify_gain_changed(Mackie::RouteSignal *, bool force_update = true);
/// Signal handler for Route::name_change /// Signal handler for Route::name_change
void notify_name_changed(Mackie::RouteSignal *); void notify_property_changed(const PBD::PropertyChange&, Mackie::RouteSignal *);
/// Signal handler from Panner::Change /// Signal handler from Panner::Change
void notify_panner_changed(Mackie::RouteSignal *, bool force_update = true); void notify_panner_changed(Mackie::RouteSignal *, bool force_update = true);
/// Signal handler for new routes added /// Signal handler for new routes added

View file

@ -21,6 +21,7 @@
#include "ardour/track.h" #include "ardour/track.h"
#include "ardour/midi_ui.h" #include "ardour/midi_ui.h"
#include "ardour/panner.h" #include "ardour/panner.h"
#include "ardour/session_object.h" // for Properties::name
#include "mackie_control_protocol.h" #include "mackie_control_protocol.h"
@ -47,7 +48,7 @@ void RouteSignal::connect()
_route->gain_control()->Changed.connect(connections, ui_bind (&MackieControlProtocol::notify_gain_changed, &_mcp, this, false), midi_ui_context()); _route->gain_control()->Changed.connect(connections, ui_bind (&MackieControlProtocol::notify_gain_changed, &_mcp, this, false), midi_ui_context());
} }
_route->NameChanged.connect (connections, ui_bind (&MackieControlProtocol::notify_name_changed, &_mcp, this), midi_ui_context()); _route->PropertyChanged.connect (connections, ui_bind (&MackieControlProtocol::notify_property_changed, &_mcp, _1, this), midi_ui_context());
if (_route->panner()) { if (_route->panner()) {
_route->panner()->Changed.connect(connections, ui_bind (&MackieControlProtocol::notify_panner_changed, &_mcp, this, false), midi_ui_context()); _route->panner()->Changed.connect(connections, ui_bind (&MackieControlProtocol::notify_panner_changed, &_mcp, this, false), midi_ui_context());
@ -90,7 +91,7 @@ void RouteSignal::notify_all()
if ( _strip.has_gain() ) if ( _strip.has_gain() )
_mcp.notify_gain_changed( this ); _mcp.notify_gain_changed( this );
_mcp.notify_name_changed( this ); _mcp.notify_property_changed (PBD::PropertyChange (ARDOUR::Properties::name), this );
if ( _strip.has_vpot() ) if ( _strip.has_vpot() )
_mcp.notify_panner_changed( this ); _mcp.notify_panner_changed( this );