/* Copyright (C) 2000-2007 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 the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __ardour_region_factory_h__ #define __ardour_region_factory_h__ #include #include #include #include "pbd/id.h" #include "pbd/signals.h" #include "ardour/types.h" class XMLNode; namespace ARDOUR { class Session; class AudioRegion; class RegionFactory { public: typedef std::map > RegionMap; static boost::shared_ptr wholefile_region_by_name (const std::string& name); static boost::shared_ptr region_by_id (const PBD::ID&); static boost::shared_ptr region_by_name (const std::string& name); static const RegionMap all_regions() { return region_map; } static void clear_map (); /** This is emitted only when a new id is assigned. Therefore, in a pure Region copy, it will not be emitted. It must be emitted using a derived instance of Region, not Region itself, to permit dynamic_cast<> to be used to infer the type of Region. */ static PBD::Signal1 > CheckNewRegion; /** create a "pure copy" of Region @param other */ static boost::shared_ptr create (boost::shared_ptr other, bool announce = false); /** create a region from a single Source */ static boost::shared_ptr create (boost::shared_ptr, const PBD::PropertyList&, bool announce = true); /** create a region from a multiple sources */ static boost::shared_ptr create (const SourceList &, const PBD::PropertyList&, bool announce = true); /** create a copy of @other starting at zero within @param other's sources */ static boost::shared_ptr create (boost::shared_ptr other, const PBD::PropertyList&, bool announce = true); /** create a copy of @param other starting at @param offset within @param other */ static boost::shared_ptr create (boost::shared_ptr other, frameoffset_t offset, const PBD::PropertyList&, bool announce = true); /** create a "copy" of @param other but using a different set of sources @param srcs */ static boost::shared_ptr create (boost::shared_ptr other, const SourceList& srcs, const PBD::PropertyList&, bool announce = true); /** create a region with no sources, using XML state */ static boost::shared_ptr create (Session&, XMLNode&, bool); /** create a region with specified sources @param srcs and XML state */ static boost::shared_ptr create (SourceList& srcs, const XMLNode&); static void get_regions_using_source (boost::shared_ptr, std::set >& ); static void remove_regions_using_source (boost::shared_ptr); static void map_remove (boost::shared_ptr); static void map_remove_with_equivalents (boost::shared_ptr); static void delete_all_regions (); static const RegionMap& regions() { return region_map; } static uint32_t nregions (); static int region_name (std::string &, std::string, bool new_level = false); static std::string new_region_name (std::string); private: static void region_changed (PBD::PropertyChange const &, boost::weak_ptr); static Glib::StaticMutex region_map_lock; static RegionMap region_map; static void map_add (boost::shared_ptr); static Glib::StaticMutex region_name_map_lock; static std::map region_name_map; static void update_region_name_map (boost::shared_ptr); static PBD::ScopedConnectionList region_list_connections; }; } #endif /* __ardour_region_factory_h__ */