debug flag for MTC; make ardour/timecode.h simply include the "authoritative" one...
[ardour.git] / libs / ardour / ardour / route_group.h
index 910500ccf8ebc92a8f456d84119efcc181ca3f4d..0f7109337798932d43c4ea1975e5b94cf616f2f1 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2000 Paul Davis 
+    Copyright (C) 2000 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
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
 #ifndef __ardour_route_group_h__
 #define __ardour_route_group_h__
 
 #include <list>
+#include <set>
 #include <string>
 #include <stdint.h>
 #include <sigc++/signal.h>
-#include <ardour/stateful.h>
-#include <ardour/types.h>
-
-using std::string;
-using std::list;
+#include "pbd/stateful.h"
+#include "ardour/types.h"
 
 namespace ARDOUR {
 
 class Route;
+class Track;
 class AudioTrack;
+class Session;
+
+class RouteGroup : public PBD::Stateful, public sigc::trackable {
+public:
+       enum Flag {
+               Relative = 0x1,
+               Active = 0x2,
+               Hidden = 0x4
+       };
+
+       enum Property {
+               Gain = 0x1,
+               Mute = 0x2,
+               Solo = 0x4,
+               RecEnable = 0x8,
+               Select = 0x10,
+               Edit = 0x20
+       };
+
+       RouteGroup (Session& s, const std::string &n, Flag f = Flag(0), Property p = Property(0));
+
+       const std::string& name() { return _name; }
+       void set_name (std::string str);
+
+       bool is_active () const { return _flags & Active; }
+       bool is_relative () const { return _flags & Relative; }
+       bool is_hidden () const { return _flags & Hidden; }
+       bool empty() const {return routes.empty();}
+
+       gain_t get_max_factor(gain_t factor);
+       gain_t get_min_factor(gain_t factor);
 
-class RouteGroup : public Stateful, public sigc::trackable {
-  public:
-    enum Flag {
-           Relative = 0x1,
-           Active = 0x2,
-           Hidden = 0x4,
-    };
+       int size() { return routes.size();}
 
-    RouteGroup(const string &n, Flag f = Flag(0)) : _name (n), _flags (f) {}
+       void set_active (bool yn, void *src);
+       void set_relative (bool yn, void *src);
+       void set_hidden (bool yn, void *src);
 
-    const string& name() { return _name; }
+       bool property (Property p) const {
+               return ((_properties & p) == p);
+       }
 
-    bool is_active () const { return _flags & Active; }
-    bool is_relative () const { return _flags & Relative; }
-    bool is_hidden () const { return _flags & Hidden; }
-    bool empty() const {return routes.empty();}
+       bool active_property (Property p) const {
+               return is_active() && property (p);
+       }
 
-       gain_t get_max_factor(gain_t factor);
-       gain_t get_min_factor(gain_t factor);
+       void set_property (Property p, bool v) {
+               _properties = (Property) (_properties & ~p);
+               if (v) {
+                       _properties = (Property) (_properties | p);
+               }
+       }
 
-    int size() { return routes.size();}
-    ARDOUR::Route * first () const { return *routes.begin();}
+       int add (Route *);
 
-    void set_active (bool yn, void *src);
-    void set_relative (bool yn, void *src);
-    void set_hidden (bool yn, void *src);
+       int remove (Route *);
 
+       void apply (void (Route::*func)(void *), void *src) {
+               for (std::list<Route *>::iterator i = routes.begin(); i != routes.end(); i++) {
+                       ((*i)->*func)(src);
+               }
+       }
 
-    int add (Route *);
+       template<class T> void apply (void (Route::*func)(T, void *), T val, void *src) {
+               for (std::list<Route *>::iterator i = routes.begin(); i != routes.end(); i++) {
+                       ((*i)->*func)(val, src);
+               }
+       }
 
-    int remove (Route *);
+       template<class T> void foreach_route (T *obj, void (T::*func)(Route&)) {
+               for (std::list<Route *>::iterator i = routes.begin(); i != routes.end(); i++) {
+                       (obj->*func)(**i);
+               }
+       }
 
-    template<class T> void apply (void (Route::*func)(T, void *), T val, void *src) {
-           for (list<Route *>::iterator i = routes.begin(); i != routes.end(); i++) {
-                   ((*i)->*func)(val, this);
-           }
-    }
+       /* to use these, #include "ardour/route_group_specialized.h" */
 
-    template<class T> void foreach_route (T *obj, void (T::*func)(Route&)) {
-           for (list<Route *>::iterator i = routes.begin(); i != routes.end(); i++) {
-                   (obj->*func)(**i);
-           }
-    }
+       template<class T> void apply (void (Track::*func)(T, void *), T val, void *src);
 
-    /* to use these, #include <ardour/route_group_specialized.h> */
+       /* fills at_set with all members of the group that are AudioTracks */
 
-    template<class T> void apply (void (AudioTrack::*func)(T, void *), T val, void *src);
+       void audio_track_group (std::set<AudioTrack*>& at_set);
 
-    void clear () {
-           routes.clear ();
-           changed();
-    }
+       void clear () {
+               routes.clear ();
+               changed();
+       }
 
-    const list<Route*>& route_list() { return routes; }
-    
-    sigc::signal<void> changed;
-    sigc::signal<void,void*> FlagsChanged;
+       void make_subgroup ();
+       void destroy_subgroup ();
 
-    XMLNode& get_state (void);
+       const std::list<Route*>& route_list() { return routes; }
 
-    int set_state (const XMLNode&);
+       sigc::signal<void> changed;
+       sigc::signal<void,void*> FlagsChanged;
 
- private:
-    list<Route *> routes;
-    string _name;
-    uint32_t _flags;
+       XMLNode& get_state ();
+       
+       int set_state (const XMLNode&, int version);
+       
+private:
+       Session& _session;
+       std::list<Route *> routes;
+       boost::shared_ptr<Route> subgroup_bus;
+       std::string _name;
+       Flag _flags;
+       Property _properties;
 
-    void remove_when_going_away (Route*);
+       void remove_when_going_away (Route*);
+       int set_state_2X (const XMLNode&, int);
 };
 
 } /* namespace */