merged with 1697 revision of trunk (which is post-rc1 but pre-rc2
[ardour.git] / libs / ardour / ardour / slave.h
1 /*
2     Copyright (C) 2002 Paul Davis 
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #ifndef __ardour_slave_h__
21 #define __ardour_slave_h__
22
23 #include <vector>
24
25 #include <jack/jack.h>
26
27 #include <sigc++/signal.h>
28 #include <ardour/ardour.h>
29 #include <midi++/parser.h>
30 #include <midi++/types.h>
31
32 namespace MIDI {
33         class Port;
34 }
35
36 namespace ARDOUR {
37 class Session;
38
39 class Slave {
40   public:
41         Slave() { }
42         virtual ~Slave() {}
43
44         virtual bool speed_and_position (float&, nframes_t&) = 0;
45         virtual bool locked() const = 0;
46         virtual bool ok() const = 0;
47         virtual bool starting() const { return false; }
48         virtual nframes_t resolution() const = 0;
49         virtual bool requires_seekahead () const = 0;
50 };
51
52
53 class MTC_Slave : public Slave, public sigc::trackable {
54   public:
55         MTC_Slave (Session&, MIDI::Port&);
56         ~MTC_Slave ();
57
58         void rebind (MIDI::Port&);
59         bool speed_and_position (float&, nframes_t&);
60
61         bool      locked() const;
62         bool      ok() const;
63         void      handle_locate (const MIDI::byte*);
64
65         nframes_t resolution() const;
66         bool requires_seekahead () const { return true; }
67
68   private:
69         Session&    session;
70         MIDI::Port* port;
71         std::vector<sigc::connection> connections;
72         bool        can_notify_on_unknown_rate;
73
74         struct SafeTime {
75
76
77             int guard1;
78             //SMPTE_Time  mtc;
79             nframes_t   position;
80             nframes_t   timestamp;
81             int guard2;
82
83             SafeTime() {
84                     guard1 = 0;
85                     guard2 = 0;
86                     timestamp = 0;
87             }
88         };
89
90         SafeTime         current;
91         nframes_t   mtc_frame;               /* current time */
92         nframes_t   last_inbound_frame;      /* when we got it; audio clocked */
93
94         float            mtc_speed;
95         nframes_t   first_mtc_frame;
96         nframes_t   first_mtc_time;
97
98         static const int32_t accumulator_size = 128;
99         float   accumulator[accumulator_size];
100         int32_t accumulator_index;
101         bool    have_first_accumulated_speed;
102
103         void reset ();
104         void update_mtc_qtr (MIDI::Parser&);
105         void update_mtc_time (const MIDI::byte *, bool);
106         void update_mtc_status (MIDI::Parser::MTC_Status);
107         void read_current (SafeTime *) const;
108 };
109
110 class ADAT_Slave : public Slave 
111 {
112   public:
113         ADAT_Slave () {}
114         ~ADAT_Slave () {}
115         
116         bool speed_and_position (float& speed, nframes_t& pos) {
117                 speed = 0;
118                 pos = 0;
119                 return false;
120         }
121
122         bool locked() const { return false; }
123         bool ok() const { return false; }
124         nframes_t resolution() const { return 1; }
125         bool requires_seekahead () const { return true; }
126 };
127
128 class JACK_Slave : public Slave 
129 {
130   public:
131         JACK_Slave (jack_client_t*);
132         ~JACK_Slave ();
133         
134         bool speed_and_position (float& speed, nframes_t& pos);
135
136         bool starting() const { return _starting; }
137         bool locked() const;
138         bool ok() const;
139         nframes_t resolution() const { return 1; }
140         bool requires_seekahead () const { return false; }
141
142   private:
143         jack_client_t* jack;
144         float speed;
145         bool _starting;
146 };
147
148 } /* namespace */
149
150 #endif /* __ardour_slave_h__ */