X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fregion_factory.cc;h=70ea326230ca0f203d9d564581412dc6b850b740;hb=706d6e8ff06b32f2b7cefcb09fd81051c3f80735;hp=a0aa3be75994da26d4f5d79b2591e1d1364b6ad1;hpb=52a8242a1158426caeed4757bbc3f7f71091e351;p=ardour.git diff --git a/libs/ardour/region_factory.cc b/libs/ardour/region_factory.cc index a0aa3be759..70ea326230 100644 --- a/libs/ardour/region_factory.cc +++ b/libs/ardour/region_factory.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2000-2006 Paul Davis + Copyright (C) 2000-2006 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,36 +17,39 @@ */ -#include +#include "pbd/error.h" +#include "pbd/boost_debug.h" -#include +#include "ardour/session.h" -#include -#include -#include -#include -#include -#include +#include "ardour/region_factory.h" +#include "ardour/region.h" +#include "ardour/audioregion.h" +#include "ardour/audiosource.h" +#include "ardour/midi_source.h" +#include "ardour/midi_region.h" #include "i18n.h" using namespace ARDOUR; using namespace PBD; -sigc::signal > RegionFactory::CheckNewRegion; +PBD::Signal1 > RegionFactory::CheckNewRegion; boost::shared_ptr -RegionFactory::create (boost::shared_ptr region, nframes_t start, - nframes_t length, std::string name, - layer_t layer, Region::Flag flags, bool announce) +RegionFactory::create (boost::shared_ptr region, nframes_t start, + nframes_t length, const std::string& name, + layer_t layer, Region::Flag flags, bool announce) { boost::shared_ptr other_a; boost::shared_ptr other_m; if ((other_a = boost::dynamic_pointer_cast(region)) != 0) { AudioRegion* ar = new AudioRegion (other_a, start, length, name, layer, flags); + boost_debug_shared_ptr_mark_interesting (ar, "Region"); boost::shared_ptr arp (ar); boost::shared_ptr ret (boost::static_pointer_cast (arp)); + ret->unlock_property_changes (); if (announce) { CheckNewRegion (ret); } @@ -55,6 +58,7 @@ RegionFactory::create (boost::shared_ptr region, nframes_t start, MidiRegion* ar = new MidiRegion (other_m, start, length, name, layer, flags); boost::shared_ptr arp (ar); boost::shared_ptr ret (boost::static_pointer_cast (arp)); + ret->unlock_property_changes (); if (announce) { CheckNewRegion (ret); } @@ -68,17 +72,21 @@ RegionFactory::create (boost::shared_ptr region, nframes_t start, } boost::shared_ptr -RegionFactory::create (boost::shared_ptr region) +RegionFactory::create (boost::shared_ptr region) { - boost::shared_ptr ar; - boost::shared_ptr mr; - - if ((ar = boost::dynamic_pointer_cast(region)) != 0) { - boost::shared_ptr ret (new AudioRegion (ar)); + boost::shared_ptr ar; + boost::shared_ptr mr; + + if ((ar = boost::dynamic_pointer_cast(region)) != 0) { + AudioRegion* arn = new AudioRegion (ar); + boost_debug_shared_ptr_mark_interesting (arn, "Region"); + boost::shared_ptr ret (arn); + ret->unlock_property_changes (); /* pure copy constructor - no CheckNewRegion emitted */ return ret; - } else if ((mr = boost::dynamic_pointer_cast(region)) != 0) { + } else if ((mr = boost::dynamic_pointer_cast(region)) != 0) { boost::shared_ptr ret (new MidiRegion (mr)); + ret->unlock_property_changes (); /* pure copy constructor - no CheckNewRegion emitted */ return ret; } else { @@ -90,43 +98,80 @@ RegionFactory::create (boost::shared_ptr region) } boost::shared_ptr -RegionFactory::create (boost::shared_ptr region, nframes_t start, - nframes_t length, std::string name, - layer_t layer, Region::Flag flags, bool announce) +RegionFactory::create (boost::shared_ptr region, nframes_t start, + nframes_t length, const std::string& name, + layer_t layer, Region::Flag flags, bool announce) { return create (boost::static_pointer_cast (region), start, length, name, layer, flags, announce); } +boost::shared_ptr +RegionFactory::create (boost::shared_ptr region, const SourceList& srcs, + const std::string& name, layer_t layer, Region::Flag flags, bool announce) + +{ + boost::shared_ptr other; + + /* used by AudioFilter when constructing a new region that is intended to have nearly + identical settings to an original, but using different sources. + */ + + if ((other = boost::dynamic_pointer_cast(region)) != 0) { + AudioRegion* ar = new AudioRegion (other, srcs, srcs.front()->length(srcs.front()->timeline_position()), name, layer, flags); + boost_debug_shared_ptr_mark_interesting (ar, "Region"); + boost::shared_ptr arp (ar); + boost::shared_ptr ret (boost::static_pointer_cast (arp)); + ret->unlock_property_changes (); + if (announce) { + CheckNewRegion (ret); + } + return ret; + } else { + fatal << _("programming error: RegionFactory::create() called with unknown Region type") + << endmsg; + /*NOTREACHED*/ + return boost::shared_ptr(); + } +} + boost::shared_ptr RegionFactory::create (Session& session, XMLNode& node, bool yn) { boost::shared_ptr r = session.XMLRegionFactory (node, yn); - CheckNewRegion (r); + + if (r) { + r->unlock_property_changes (); + CheckNewRegion (r); + } + return r; } - -boost::shared_ptr -RegionFactory::create (SourceList& srcs, nframes_t start, nframes_t length, const string& name, layer_t layer, Region::Flag flags, bool announce) + +boost::shared_ptr +RegionFactory::create (const SourceList& srcs, nframes_t start, nframes_t length, const string& name, layer_t layer, Region::Flag flags, bool announce) { if (srcs.empty()) { return boost::shared_ptr(); } if (srcs[0]->type() == DataType::AUDIO) { - + AudioRegion* ar = new AudioRegion (srcs, start, length, name, layer, flags); + boost_debug_shared_ptr_mark_interesting (ar, "Region"); boost::shared_ptr arp (ar); boost::shared_ptr ret (boost::static_pointer_cast (arp)); + ret->unlock_property_changes (); if (announce) { CheckNewRegion (ret); } return ret; } else if (srcs[0]->type() == DataType::MIDI) { - + MidiRegion* ar = new MidiRegion (srcs, start, length, name, layer, flags); boost::shared_ptr mrp (ar); boost::shared_ptr ret (boost::static_pointer_cast (mrp)); + ret->unlock_property_changes (); if (announce) { CheckNewRegion (ret); } @@ -135,9 +180,9 @@ RegionFactory::create (SourceList& srcs, nframes_t start, nframes_t length, cons } return boost::shared_ptr (); -} +} -boost::shared_ptr +boost::shared_ptr RegionFactory::create (SourceList& srcs, const XMLNode& node) { if (srcs.empty()) { @@ -145,11 +190,15 @@ RegionFactory::create (SourceList& srcs, const XMLNode& node) } if (srcs[0]->type() == DataType::AUDIO) { - boost::shared_ptr ret (new AudioRegion (srcs, node)); + AudioRegion* ar = new AudioRegion (srcs, node); + boost_debug_shared_ptr_mark_interesting (ar, "Region"); + boost::shared_ptr ret (ar); + ret->unlock_property_changes (); CheckNewRegion (ret); return ret; } else if (srcs[0]->type() == DataType::MIDI) { boost::shared_ptr ret (new MidiRegion (srcs, node)); + ret->unlock_property_changes (); CheckNewRegion (ret); return ret; } @@ -157,20 +206,24 @@ RegionFactory::create (SourceList& srcs, const XMLNode& node) return boost::shared_ptr (); } -boost::shared_ptr +boost::shared_ptr RegionFactory::create (boost::shared_ptr src, nframes_t start, nframes_t length, const string& name, layer_t layer, Region::Flag flags, bool announce) { boost::shared_ptr as; boost::shared_ptr ms; if ((as = boost::dynamic_pointer_cast(src)) != 0) { - boost::shared_ptr ret (new AudioRegion (as, start, length, name, layer, flags)); + AudioRegion* ar = new AudioRegion (as, start, length, name, layer, flags); + boost_debug_shared_ptr_mark_interesting (ar, "Region"); + boost::shared_ptr ret (ar); + ret->unlock_property_changes (); if (announce) { CheckNewRegion (ret); } return ret; } else if ((ms = boost::dynamic_pointer_cast(src)) != 0) { boost::shared_ptr ret (new MidiRegion (ms, start, length, name, layer, flags)); + ret->unlock_property_changes (); if (announce) { CheckNewRegion (ret); }