ardour
automation_control.cc
Go to the documentation of this file.
1 /*
2  Copyright (C) 2007 Paul Davis
3  Author: David Robillard
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 2 of the License, or
8  (at your option) any later version.
9 
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with this program; if not, write to the Free Software
17  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 
19 */
20 
21 #include <iostream>
22 
25 #include "ardour/event_type_map.h"
26 #include "ardour/session.h"
27 
28 using namespace std;
29 using namespace ARDOUR;
30 using namespace PBD;
31 
32 AutomationControl::AutomationControl(ARDOUR::Session& session,
33  const Evoral::Parameter& parameter,
34  const ParameterDescriptor& desc,
36  const string& name)
37  : Controllable (name.empty() ? EventTypeMap::instance().to_symbol(parameter) : name)
38  , Evoral::Control(parameter, desc, list)
39  , _session(session)
40  , _desc(desc)
41 {
42 }
43 
45 {
46 }
47 
49 double
51 {
52  bool from_list = _list && ((AutomationList*)_list.get())->automation_playback();
53  return Control::get_double (from_list, _session.transport_frame());
54 }
55 
60 void
62 {
63  bool to_list = _list && ((AutomationList*)_list.get())->automation_write();
64 
65  Control::set_double (value, _session.transport_frame(), to_list);
66 
67  Changed(); /* EMIT SIGNAL */
68 }
69 
70 void
72 {
73  Control::set_list (list);
74  Changed(); /* EMIT SIGNAL */
75 }
76 
77 void
79 {
80  if (_list && as != alist()->automation_state()) {
81 
83  if (_desc.toggled) {
84  return; // No watch for boolean automation
85  }
86 
87  if (as == Write) {
88  AutomationWatch::instance().add_automation_watch (shared_from_this());
89  } else if (as == Touch) {
90  if (!touching()) {
92  } else {
93  /* this seems unlikely, but the combination of
94  * a control surface and the mouse could make
95  * it possible to put the control into Touch
96  * mode *while* touching it.
97  */
98  AutomationWatch::instance().add_automation_watch (shared_from_this());
99  }
100  } else {
101  AutomationWatch::instance().remove_automation_watch (shared_from_this());
102  }
103  }
104 }
105 
106 void
108 {
109  if (!_list) return;
110  alist()->set_automation_style (as);
111 }
112 
113 void
115 {
116  if (!_list) return;
117  if (!touching()) {
118  if (alist()->automation_state() == Touch) {
119  alist()->start_touch (when);
120  if (!_desc.toggled) {
121  AutomationWatch::instance().add_automation_watch (shared_from_this());
122  }
123  }
124  set_touching (true);
125  }
126 }
127 
128 void
129 AutomationControl::stop_touch(bool mark, double when)
130 {
131  if (!_list) return;
132  if (touching()) {
133  set_touching (false);
134  if (alist()->automation_state() == Touch) {
135  alist()->stop_touch (mark, when);
136  if (!_desc.toggled) {
137  AutomationWatch::instance().remove_automation_watch (shared_from_this());
138  }
139  }
140  }
141 }
void set_automation_state(AutoState)
AutoState automation_state() const
static AutomationWatch & instance()
bool touching() const
Definition: controllable.h:101
void add_automation_watch(boost::shared_ptr< ARDOUR::AutomationControl >)
void set_touching(bool yn)
Definition: controllable.h:102
const ParameterDescriptor _desc
Definition: Beats.hpp:239
AutoStyle
Definition: types.h:155
void stop_touch(bool mark, double when)
framepos_t transport_frame() const
Definition: session.h:551
Definition: amp.h:29
void set_automation_style(AutoStyle m)
void remove_automation_watch(boost::shared_ptr< ARDOUR::AutomationControl >)
void start_touch(double when)
void set_list(boost::shared_ptr< Evoral::ControlList >)
const char * name
bool toggled
True iff parameter is boolean.
PBD::Signal0< void > Changed
Definition: controllable.h:94
Definition: debug.h:30
void set_automation_state(AutoState as)
boost::shared_ptr< ControlList > _list
Definition: Control.hpp:76
boost::shared_ptr< AutomationList > alist() const
void set_automation_style(AutoStyle as)
void stop_touch(bool mark, double when)
AutoState
Definition: types.h:145