Replace connection cerr dumping with DEBUG_TRACE.
[ardour.git] / libs / ardour / region_factory.cc
index 65649ad8f745d15ba5a853bce0011c97396eb61f..eba237d0d208942bbe5aa70c17d7c0ca37f23f69 100644 (file)
@@ -17,7 +17,6 @@
 
 */
 
-#define __STDC_FORMAT_MACROS
 #include <inttypes.h>
 
 #include "pbd/error.h"
@@ -39,14 +38,14 @@ using namespace ARDOUR;
 using namespace PBD;
 
 PBD::Signal1<void,boost::shared_ptr<Region> > RegionFactory::CheckNewRegion;
-Glib::StaticMutex RegionFactory::region_map_lock;
-RegionFactory::RegionMap RegionFactory::region_map;
-PBD::ScopedConnectionList RegionFactory::region_list_connections;
-Glib::StaticMutex RegionFactory::region_name_map_lock;
-std::map<std::string, uint32_t> RegionFactory::region_name_map;
+Glib::StaticMutex                             RegionFactory::region_map_lock;
+RegionFactory::RegionMap                      RegionFactory::region_map;
+PBD::ScopedConnectionList                     RegionFactory::region_list_connections;
+Glib::StaticMutex                             RegionFactory::region_name_map_lock;
+std::map<std::string, uint32_t>               RegionFactory::region_name_map;
 
 boost::shared_ptr<Region>
-RegionFactory::create (boost::shared_ptr<const Region> region)
+RegionFactory::create (boost::shared_ptr<const Region> region, bool announce)
 {
        boost::shared_ptr<Region> ret;
        boost::shared_ptr<const AudioRegion> ar;
@@ -54,17 +53,11 @@ RegionFactory::create (boost::shared_ptr<const Region> region)
 
        if ((ar = boost::dynamic_pointer_cast<const AudioRegion>(region)) != 0) {
 
-               AudioRegion* arn = new AudioRegion (ar, 0, true);
-               boost_debug_shared_ptr_mark_interesting (arn, "Region");
-
-               boost::shared_ptr<AudioRegion> arp (arn);
-               ret = boost::static_pointer_cast<Region> (arp);
+               ret = boost::shared_ptr<Region> (new AudioRegion (ar, 0));
 
        } else if ((mr = boost::dynamic_pointer_cast<const MidiRegion>(region)) != 0) {
 
-               MidiRegion* mrn = new MidiRegion (mr, 0, true);
-               boost::shared_ptr<MidiRegion> mrp (mrn);
-               ret = boost::static_pointer_cast<Region> (mrp);
+               ret = boost::shared_ptr<Region> (new MidiRegion (mr, 0));
 
        } else {
                fatal << _("programming error: RegionFactory::create() called with unknown Region type")
@@ -73,30 +66,60 @@ RegionFactory::create (boost::shared_ptr<const Region> region)
        }
 
        if (ret) {
-                cerr << "Pure copy constructor region " << ret << " named " << ret->name() << endl;
+               ret->set_name (new_region_name(ret->name()));
                map_add (ret);
 
                /* pure copy constructor - no property list */
-               /* pure copy constructor - no CheckNewRegion emitted */
+               if (announce) {
+                       CheckNewRegion (ret);
+               }
        }
 
+#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
+       boost_debug_shared_ptr_mark_interesting (ret.get(), "Region");
+#endif
        return ret;
 }
 
-boost::shared_ptr<Region>
-RegionFactory::create (boost::shared_ptr<Region> region, frameoffset_t offset, const PropertyList& plist, bool announce)
-{
-       return create (region, offset, true, plist, announce);
-}
-
 boost::shared_ptr<Region>
 RegionFactory::create (boost::shared_ptr<Region> region, const PropertyList& plist, bool announce)
 {
-       return create (region, 0, false, plist, announce);
+       boost::shared_ptr<Region> ret;
+       boost::shared_ptr<const AudioRegion> other_a;
+       boost::shared_ptr<const MidiRegion> other_m;
+
+       if ((other_a = boost::dynamic_pointer_cast<AudioRegion>(region)) != 0) {
+
+               ret = boost::shared_ptr<Region> (new AudioRegion (other_a));
+
+       } else if ((other_m = boost::dynamic_pointer_cast<MidiRegion>(region)) != 0) {
+
+               ret = boost::shared_ptr<Region> (new MidiRegion (other_m));
+
+       } else {
+               fatal << _("programming error: RegionFactory::create() called with unknown Region type")
+                     << endmsg;
+               /*NOTREACHED*/
+               return boost::shared_ptr<Region>();
+       }
+
+       if (ret) {
+               ret->apply_changes (plist);
+               map_add (ret);
+
+               if (announce) {
+                       CheckNewRegion (ret);
+               }
+       }
+
+#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS     
+        boost_debug_shared_ptr_mark_interesting (ret.get(), "Region");
+#endif
+       return ret;
 }
 
 boost::shared_ptr<Region>
-RegionFactory::create (boost::shared_ptr<Region> region, frameoffset_t offset, bool offset_relative, const PropertyList& plist, bool announce)
+RegionFactory::create (boost::shared_ptr<Region> region, frameoffset_t offset, const PropertyList& plist, bool announce)
 {
        boost::shared_ptr<Region> ret;
        boost::shared_ptr<const AudioRegion> other_a;
@@ -104,17 +127,11 @@ RegionFactory::create (boost::shared_ptr<Region> region, frameoffset_t offset, b
 
        if ((other_a = boost::dynamic_pointer_cast<AudioRegion>(region)) != 0) {
 
-               AudioRegion* ar = new AudioRegion (other_a, offset, offset_relative);
-               boost_debug_shared_ptr_mark_interesting (ar, "Region");
-
-               boost::shared_ptr<AudioRegion> arp (ar);
-               ret = boost::static_pointer_cast<Region> (arp);
-
+               ret = boost::shared_ptr<Region> (new AudioRegion (other_a, offset));
+               
        } else if ((other_m = boost::dynamic_pointer_cast<MidiRegion>(region)) != 0) {
 
-               MidiRegion* mr = new MidiRegion (other_m, offset, offset_relative);
-               boost::shared_ptr<MidiRegion> mrp (mr);
-               ret = boost::static_pointer_cast<Region> (mrp);
+               ret = boost::shared_ptr<Region> (new MidiRegion (other_m, offset));
 
        } else {
                fatal << _("programming error: RegionFactory::create() called with unknown Region type")
@@ -124,8 +141,7 @@ RegionFactory::create (boost::shared_ptr<Region> region, frameoffset_t offset, b
        }
 
        if (ret) {
-               ret->set_properties (plist);
-                cerr << "Partial copy constructor region\n";
+               ret->apply_changes (plist);
                map_add (ret);
 
                if (announce) {
@@ -133,6 +149,9 @@ RegionFactory::create (boost::shared_ptr<Region> region, frameoffset_t offset, b
                }
        }
 
+#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
+       boost_debug_shared_ptr_mark_interesting (ret.get(), "Region");
+#endif
        return ret;
 }
 
@@ -150,11 +169,7 @@ RegionFactory::create (boost::shared_ptr<Region> region, const SourceList& srcs,
 
                // XXX use me in caller where plist is setup, this is start i think srcs.front()->length (srcs.front()->timeline_position())
                
-               AudioRegion* ar = new AudioRegion (other, srcs);
-               boost_debug_shared_ptr_mark_interesting (ar, "Region");
-
-               boost::shared_ptr<AudioRegion> arp (ar);
-               ret = boost::static_pointer_cast<Region> (arp);
+               ret = boost::shared_ptr<Region> (new AudioRegion (other, srcs));
 
        } else {
                fatal << _("programming error: RegionFactory::create() called with unknown Region type")
@@ -163,9 +178,7 @@ RegionFactory::create (boost::shared_ptr<Region> region, const SourceList& srcs,
        }
 
        if (ret) {
-
-               ret->set_properties (plist);
-                cerr << "New sources copy constructor region\n";
+               ret->apply_changes (plist);
                map_add (ret);
 
                if (announce) {
@@ -173,8 +186,10 @@ RegionFactory::create (boost::shared_ptr<Region> region, const SourceList& srcs,
                }
        }
 
+#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS     
+        boost_debug_shared_ptr_mark_interesting (ret.get(), "Region");
+#endif
        return ret;
-
 }
 
 boost::shared_ptr<Region>
@@ -194,24 +209,16 @@ RegionFactory::create (const SourceList& srcs, const PropertyList& plist, bool a
 
        if ((as = boost::dynamic_pointer_cast<AudioSource>(srcs[0])) != 0) {
 
-               AudioRegion* ar = new AudioRegion (srcs);
-               boost_debug_shared_ptr_mark_interesting (ar, "Region");
-
-               boost::shared_ptr<AudioRegion> arp (ar);
-               ret = boost::static_pointer_cast<Region> (arp);
+               ret = boost::shared_ptr<Region> (new AudioRegion (srcs));
 
        } else if ((ms = boost::dynamic_pointer_cast<MidiSource>(srcs[0])) != 0) {
-               MidiRegion* mr = new MidiRegion (srcs);
-               boost_debug_shared_ptr_mark_interesting (mr, "Region");
 
-               boost::shared_ptr<MidiRegion> mrp (mr);
-               ret = boost::static_pointer_cast<Region> (mrp);
+               ret = boost::shared_ptr<Region> (new MidiRegion (srcs));
+
        }
 
        if (ret) {
-
-               ret->set_properties (plist);
-                cerr << "de-novo constructor region " << ret << " named " << ret->name() << endl;
+               ret->apply_changes (plist);
                map_add (ret);
 
                if (announce) {
@@ -219,6 +226,9 @@ RegionFactory::create (const SourceList& srcs, const PropertyList& plist, bool a
                }
        }
 
+#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
+       boost_debug_shared_ptr_mark_interesting (ret.get(), "Region");
+#endif
        return ret;
 }
 
@@ -239,22 +249,15 @@ RegionFactory::create (SourceList& srcs, const XMLNode& node)
 
        if (srcs[0]->type() == DataType::AUDIO) {
 
-               AudioRegion* ar = new AudioRegion (srcs);
-               boost_debug_shared_ptr_mark_interesting (ar, "Region");
-
-               boost::shared_ptr<AudioRegion> arp (ar);
-               ret = boost::static_pointer_cast<Region> (arp);
+               ret = boost::shared_ptr<Region> (new AudioRegion (srcs));
 
        } else if (srcs[0]->type() == DataType::MIDI) {
                
-               MidiRegion* mr = new MidiRegion (srcs);
+               ret = boost::shared_ptr<Region> (new MidiRegion (srcs));
 
-               boost::shared_ptr<MidiRegion> mrp (mr);
-               ret = boost::static_pointer_cast<Region> (mrp);
        }
 
        if (ret) {
-
                if (ret->set_state (node, Stateful::loading_state_version)) {
                        ret.reset ();
                } else {
@@ -263,6 +266,9 @@ RegionFactory::create (SourceList& srcs, const XMLNode& node)
                }
        }
 
+#ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
+       boost_debug_shared_ptr_mark_interesting (ret.get(), "Region");
+#endif
        return ret;
 }
 
@@ -273,57 +279,49 @@ RegionFactory::map_add (boost::shared_ptr<Region> r)
        p.first = r->id();
        p.second = r;
 
-        
-                Glib::Mutex::Lock lm (region_map_lock);
-                region_map.insert (p);
-        }
+       { 
+               Glib::Mutex::Lock lm (region_map_lock);
+               region_map.insert (p);
+       }
 
-        r->DropReferences.connect_same_thread (region_list_connections, boost::bind (&RegionFactory::map_remove, r));
+       r->DropReferences.connect_same_thread (region_list_connections, boost::bind (&RegionFactory::map_remove, r));
 
        r->PropertyChanged.connect_same_thread (
                region_list_connections,
                boost::bind (&RegionFactory::region_changed, _1, boost::weak_ptr<Region> (r))
                );
 
-        cerr << "Added region with ID = " << r->id() << " named " << r->name() << endl;
-
        update_region_name_map (r);
 }
 
 void
 RegionFactory::map_remove (boost::shared_ptr<Region> r)
 {
-        Glib::Mutex::Lock lm (region_map_lock);
-        RegionMap::iterator i = region_map.find (r->id());
-
-        if (i != region_map.end()) {
-                region_map.erase (i);
-                cerr << "Removed region with ID = " << r->id() << " named " << r->name() << endl;;
-        }
+       Glib::Mutex::Lock lm (region_map_lock);
+       RegionMap::iterator i = region_map.find (r->id());
 
+       if (i != region_map.end()) {
+               region_map.erase (i);
+       }
 }
 
 void
 RegionFactory::map_remove_with_equivalents (boost::shared_ptr<Region> r)
 {
-        Glib::Mutex::Lock lm (region_map_lock);
-
-        for (RegionMap::iterator i = region_map.begin(); i != region_map.end(); ) {
-                RegionMap::iterator tmp = i;
-                ++tmp;
+       Glib::Mutex::Lock lm (region_map_lock);
 
-                if (r->region_list_equivalent (i->second)) {
-                        cerr << "Removed equivalent region " << i->second->name() << '/' << i->first << endl;
-                        region_map.erase (i);
-                } else if (r == i->second) {
-                        cerr << "Removed actual region " << i->second->name() << '/' << i->first << endl;
-                        region_map.erase (i);
-                } 
-
-                i = tmp;
-        }
+       for (RegionMap::iterator i = region_map.begin(); i != region_map.end(); ) {
+               RegionMap::iterator tmp = i;
+               ++tmp;
 
+               if (r->region_list_equivalent (i->second)) {
+                       region_map.erase (i);
+               } else if (r == i->second) {
+                       region_map.erase (i);
+               } 
 
+               i = tmp;
+       }
 }
 
 boost::shared_ptr<Region>
@@ -332,54 +330,75 @@ RegionFactory::region_by_id (const PBD::ID& id)
        RegionMap::iterator i = region_map.find (id);
 
        if (i == region_map.end()) {
-                cerr << "ID " << id << " not found in region map\n";
                return boost::shared_ptr<Region>();
        }
 
        return i->second;
 }
-       
+
+boost::shared_ptr<Region>
+RegionFactory::wholefile_region_by_name (const std::string& name)
+{
+       for (RegionMap::iterator i = region_map.begin(); i != region_map.end(); ++i) {
+               if (i->second->whole_file() && i->second->name() == name) {
+                       return i->second;
+               }
+       }
+       return boost::shared_ptr<Region>();
+}      
+
+boost::shared_ptr<Region>
+RegionFactory::region_by_name (const std::string& name)
+{
+       for (RegionMap::iterator i = region_map.begin(); i != region_map.end(); ++i) {
+               if (i->second->name() == name) {
+                       return i->second;
+               }
+       }
+       return boost::shared_ptr<Region>();
+}      
+
 void
 RegionFactory::clear_map ()
 {
-        region_list_connections.drop_connections ();
+       region_list_connections.drop_connections ();
 
-        {
-                Glib::Mutex::Lock lm (region_map_lock);
-                region_map.clear ();
-        }
+       {
+               Glib::Mutex::Lock lm (region_map_lock);
+               region_map.clear ();
+       }
 
 }
 
 void
 RegionFactory::delete_all_regions ()
 {
-        RegionMap copy;
+       RegionMap copy;
 
-        /* copy region list */
-        {
-                Glib::Mutex::Lock lm (region_map_lock);
-                copy = region_map;
-        }
+       /* copy region list */
+       {
+               Glib::Mutex::Lock lm (region_map_lock);
+               copy = region_map;
+       }
 
-        /* clear existing map */
-        clear_map ();
+       /* clear existing map */
+       clear_map ();
 
-        /* tell everyone to drop references */
-        for (RegionMap::iterator i = copy.begin(); i != copy.end(); ++i) {
-                i->second->drop_references ();
-        }
+       /* tell everyone to drop references */
+       for (RegionMap::iterator i = copy.begin(); i != copy.end(); ++i) {
+               i->second->drop_references ();
+       }
 
-        /* the copy should now hold the only references, which will
-           vanish as we leave this scope, thus calling all destructors.
-        */
+       /* the copy should now hold the only references, which will
+          vanish as we leave this scope, thus calling all destructors.
+       */
 }
         
 uint32_t
 RegionFactory::nregions ()
 {
-        Glib::Mutex::Lock lm (region_map_lock);
-        return region_map.size ();
+       Glib::Mutex::Lock lm (region_map_lock);
+       return region_map.size ();
 }
 
 void
@@ -522,11 +541,23 @@ RegionFactory::new_region_name (string old)
 void 
 RegionFactory::get_regions_using_source (boost::shared_ptr<Source> s, std::set<boost::shared_ptr<Region> >& r)
 {
-        Glib::Mutex::Lock lm (region_map_lock);
+       Glib::Mutex::Lock lm (region_map_lock);
+
+       for (RegionMap::iterator i = region_map.begin(); i != region_map.end(); ++i) {
+               if (i->second->uses_source (s)) {
+                       r.insert (i->second);
+               }
+       }
+}
 
-        for (RegionMap::iterator i = region_map.begin(); i != region_map.end(); ++i) {
-                if (i->second->uses_source (s)) {
-                        r.insert (i->second);
+void 
+RegionFactory::remove_regions_using_source (boost::shared_ptr<Source> src)
+{
+       Glib::Mutex::Lock lm (region_map_lock);
+
+       for (RegionMap::iterator i = region_map.begin(); i != region_map.end(); ++i) {
+               if (i->second->uses_source (src)) {
+                       region_map.erase (i);
                 }
-        }
+       }
 }