Fixes to bundle manager to make it vaguely usable.
[ardour.git] / libs / ardour / ardour / tempo.h
index 7cdbe56cf2839ab7b93a2372199dd26c5c353143..c4915072c57ba7349b6e00fcb10adcc57404b932 100644 (file)
@@ -15,7 +15,6 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
 #ifndef __ardour_tempo_h__
@@ -34,7 +33,6 @@
 #include <sigc++/signal.h>
 
 #include <ardour/ardour.h>
-#include <ardour/state_manager.h>
 
 class XMLNode;
 
@@ -42,27 +40,29 @@ using std::list;
 using std::vector;
 
 namespace ARDOUR {
-
+class Meter;
 class Tempo {
   public:
-       Tempo (double bpm)
-               : _beats_per_minute (bpm) {}
+       Tempo (double bpm, double type=4.0) // defaulting to quarter note
+               : _beats_per_minute (bpm), _note_type(type) {} 
        Tempo (const Tempo& other) {
                _beats_per_minute = other._beats_per_minute;
+               _note_type = other._note_type;
        }
        void operator= (const Tempo& other) {
                if (&other != this) {
                        _beats_per_minute = other._beats_per_minute;
+                       _note_type = other._note_type;
                }
        }
 
-       double beats_per_minute () const { return _beats_per_minute; }
-       double frames_per_beat (nframes_t sr) const {
-               return  ((60.0 * sr) / _beats_per_minute);
-       }
+       double beats_per_minute () const { return _beats_per_minute;}
+       double note_type () const { return _note_type;}
+       double frames_per_beat (nframes_t sr, const Meter& meter) const;
 
   protected:
        double _beats_per_minute;
+       double _note_type;
 };
 
 class Meter {
@@ -109,6 +109,9 @@ class MetricSection {
   public:
        MetricSection (const BBT_Time& start)
                : _start (start), _frame (0), _movable (true) {}
+       MetricSection (nframes_t start)
+               : _frame (start), _movable (true) {}
+
        virtual ~MetricSection() {}
 
        const BBT_Time& start() const { return _start; }
@@ -142,6 +145,8 @@ class MeterSection : public MetricSection, public Meter {
   public:
        MeterSection (const BBT_Time& start, double bpb, double note_type)
                : MetricSection (start), Meter (bpb, note_type) {}
+       MeterSection (nframes_t start, double bpb, double note_type)
+               : MetricSection (start), Meter (bpb, note_type) {}
        MeterSection (const XMLNode&);
 
        static const string xml_state_node_name;
@@ -151,8 +156,10 @@ class MeterSection : public MetricSection, public Meter {
 
 class TempoSection : public MetricSection, public Tempo {
   public:
-       TempoSection (const BBT_Time& start, double qpm)
-               : MetricSection (start), Tempo (qpm) {}
+       TempoSection (const BBT_Time& start, double qpm, double note_type)
+               : MetricSection (start), Tempo (qpm, note_type) {}
+       TempoSection (nframes_t start, double qpm, double note_type)
+               : MetricSection (start), Tempo (qpm, note_type) {}
        TempoSection (const XMLNode&);
 
        static const string xml_state_node_name;
@@ -162,20 +169,9 @@ class TempoSection : public MetricSection, public Tempo {
 
 typedef list<MetricSection*> Metrics;
 
-class TempoMapState : public StateManager::State {
-  public:
-       TempoMapState (std::string why) 
-               : StateManager::State (why) {
-               metrics = new Metrics;
-       }
-
-       Metrics *metrics;
-};
-
-class TempoMap : public StateManager, public PBD::StatefulDestructible
+class TempoMap : public PBD::StatefulDestructible
 {
   public:
-
        TempoMap (nframes_t frame_rate);
        ~TempoMap();
 
@@ -207,7 +203,7 @@ class TempoMap : public StateManager, public PBD::StatefulDestructible
 
        BBTPointList *get_points (nframes_t start, nframes_t end) const;
 
-       void           bbt_time (nframes_t when, BBT_Time&) const;
+       void      bbt_time (nframes_t when, BBT_Time&) const;
        nframes_t frame_time (const BBT_Time&) const;
        nframes_t bbt_duration_at (nframes_t, const BBT_Time&, int dir) const;
 
@@ -217,9 +213,14 @@ class TempoMap : public StateManager, public PBD::StatefulDestructible
        const Tempo& tempo_at (nframes_t);
        const Meter& meter_at (nframes_t);
 
+       const TempoSection& tempo_section_at (nframes_t);
+
        void add_tempo(const Tempo&, BBT_Time where);
        void add_meter(const Meter&, BBT_Time where);
 
+       void add_tempo(const Tempo&, nframes_t where);
+       void add_meter(const Meter&, nframes_t where);
+
        void move_tempo (TempoSection&, const BBT_Time& to);
        void move_meter (MeterSection&, const BBT_Time& to);
        
@@ -246,8 +247,6 @@ class TempoMap : public StateManager, public PBD::StatefulDestructible
        void dump (std::ostream&) const;
        void clear ();
 
-       UndoAction get_memento() const;
-
        /* this is a helper class that we use to be able to keep
           track of which meter *AND* tempo are in effect at
           a given point in time.
@@ -279,19 +278,26 @@ class TempoMap : public StateManager, public PBD::StatefulDestructible
        Metric metric_at (nframes_t) const;
         void bbt_time_with_metric (nframes_t, BBT_Time&, const Metric&) const;
 
+       void change_existing_tempo_at (nframes_t, double bpm, double note_type);
+       void change_initial_tempo (double bpm, double note_type);
+
+       int n_tempos () const;
+       int n_meters () const;
+
+       sigc::signal<void,ARDOUR::Change> StateChanged;
+
   private:
        static Tempo    _default_tempo;
        static Meter    _default_meter;
 
-       Metrics            *metrics;
-       nframes_t     _frame_rate;
-       nframes_t      last_bbt_when;
-       bool                last_bbt_valid;
-       BBT_Time            last_bbt;
-       mutable Glib::RWLock    lock;
+       Metrics*             metrics;
+       nframes_t           _frame_rate;
+       nframes_t            last_bbt_when;
+       bool                 last_bbt_valid;
+       BBT_Time             last_bbt;
+       mutable Glib::RWLock lock;
        
-       void timestamp_metrics ();
-
+       void timestamp_metrics (bool use_bbt);
 
        nframes_t round_to_type (nframes_t fr, int dir, BBTPointType);
 
@@ -308,17 +314,7 @@ class TempoMap : public StateManager, public PBD::StatefulDestructible
        nframes_t count_frames_between_metrics (const Meter&, const Tempo&, const BBT_Time&, const BBT_Time&) const;
 
        int move_metric_section (MetricSection&, const BBT_Time& to);
-       void do_insert (MetricSection* section);
-
-       Change  restore_state (StateManager::State&);
-       StateManager::State* state_factory (std::string why) const;
-
-       bool        in_set_state;
-
-       /* override state_manager::save_state so we can check in_set_state */
-
-       void save_state (std::string why);
-
+       void do_insert (MetricSection* section, bool with_bbt);
 };
 
 }; /* namespace ARDOUR */