24 #include <glibmm/miscutils.h>
46 const string Automatable::xml_node_name =
X_(
"Automation");
48 Automatable::Automatable(
Session& session)
55 , _a_session (other._a_session)
59 for (Controls::const_iterator i = other.
_controls.begin(); i != other.
_controls.end(); ++i) {
81 if ((prop = node.
property (
"path")) != 0) {
95 if (Glib::path_is_absolute (path)) {
101 ifstream in (fullpath.c_str());
105 , fullpath, strerror (errno)) <<
endmsg;
110 set<Evoral::Parameter> tosave;
118 in >> port;
if (!in)
break;
119 in >> when;
if (!in)
goto bad;
120 in >> value;
if (!in)
goto bad;
125 c->
list()->add (when, value);
126 tosave.insert (param);
151 ControlSet::add_control (ac);
207 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
214 if ((*niter)->name() ==
"AutomationList") {
216 const XMLProperty* id_prop = (*niter)->property(
"automation-id");
223 warning <<
"Automation has null type" << endl;
228 warning <<
"AutomationList node without automation-id property, "
244 error <<
"Expected AutomationList node, got '" << (*niter)->name() <<
"'" <<
endmsg;
261 for (Controls::iterator li =
controls().begin(); li !=
controls().end(); ++li) {
263 if (l && !l->
empty()) {
330 typedef set<Evoral::Parameter> ParameterSet;
333 for (ParameterSet::const_iterator i = automated_params.begin(); i != automated_params.end(); ++i) {
354 for (Controls::iterator li =
controls().begin(); li !=
controls().end(); ++li) {
372 for (Controls::iterator li =
controls().begin(); li !=
controls().end(); ++li) {
408 bool make_list =
true;
420 pi->
plugin(0)->get_parameter_descriptor(param.
id(), desc);
423 warning <<
"PluginAutomation for non-Plugin" << endl;
428 desc = pi->
plugin(0)->get_property_descriptor(param.
id());
438 warning <<
"PluginPropertyAutomation for non-Plugin" << endl;
441 Amp* amp =
dynamic_cast<Amp*
>(
this);
445 warning <<
"GainAutomation for non-Amp" << endl;
448 Amp* amp =
dynamic_cast<Amp*
>(
this);
452 warning <<
"TrimAutomation for non-Amp" << endl;
459 warning <<
"PanAutomation for non-Pannable" << endl;
463 if (make_list && !list) {
490 ControlSet::clear_controls ();
void set_automation_state(AutoState)
virtual void transport_located(framepos_t now)
AutoState automation_state() const
std::set< Evoral::Parameter > _can_automate_list
XMLNodeList::iterator XMLNodeIterator
std::string automation_dir() const
Automation data.
void set_parameter_automation_style(Evoral::Parameter param, AutoStyle)
void set_list(boost::shared_ptr< ControlList >)
void write_pass_finished(double when, double thinning_factor=0.0)
boost::shared_ptr< Evoral::Control > control_factory(const Evoral::Parameter &id)
const std::string & value() const
AutoStyle get_parameter_automation_style(Evoral::Parameter param)
virtual void transport_stopped(framepos_t now)
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r)
int set_state(const XMLNode &, int version)
std::string value_as_string(const ARDOUR::ParameterDescriptor &desc, double v)
boost::shared_ptr< Control > control(const Parameter &id, bool create_if_missing=false)
LIBPBD_API Transmitter error
LIBPBD_API Transmitter warning
const XMLNodeList & children(const std::string &str=std::string()) const
void start_write_pass(double time)
std::ostream & endmsg(std::ostream &ostr)
boost::shared_ptr< Plugin > plugin(uint32_t num=0) const
static URIMap & instance()
virtual void set_parameter_automation_state(Evoral::Parameter param, AutoState)
virtual void add_control(boost::shared_ptr< Evoral::Control >)
AutoStyle automation_style() const
AutoStyle automation_style() const
std::list< XMLNode * > XMLNodeList
Glib::Threads::Mutex _control_lock
XMLProperty * property(const char *)
LIBARDOUR_API RCConfiguration * Config
Glib::Threads::Mutex & control_lock() const
virtual void automation_list_automation_state_changed(Evoral::Parameter, AutoState)
virtual std::string value_as_string(boost::shared_ptr< AutomationControl >) const
void stop_touch(bool mark, double when)
const ParameterDescriptor & desc() const
virtual std::string describe_parameter(Evoral::Parameter param)
AutoState automation_state() const
void can_automate(Evoral::Parameter)
const std::set< Evoral::Parameter > & what_can_be_automated() const
bool automation_playback() const
PBD::ScopedConnectionList _control_connections
connections to our controls' signals
void protect_automation()
int old_set_automation_state(const XMLNode &)
PBD::Signal0< void > AutomationStateChanged
static EventTypeMap & instance()
Evoral::Parameter from_symbol(const std::string &str) const
int set_automation_xml_state(const XMLNode &, Evoral::Parameter default_param)
const Parameter & parameter() const
std::string to_symbol(const Evoral::Parameter ¶m) const
void add_child_nocopy(XMLNode &)
int load_automation(const std::string &path)
boost::shared_ptr< ControlList > list()
boost::shared_ptr< AutomationControl > automation_control(const Evoral::Parameter &id, bool create_if_missing=false)
void set_automation_state(AutoState as)
XMLNode & get_automation_xml_state()
boost::shared_ptr< AutomationList > alist() const
AutoState get_parameter_automation_state(Evoral::Parameter param)
void set_automation_style(AutoStyle as)
Variant::Type datatype
for properties
PBD::ScopedConnectionList _list_connections
static bool type_is_numeric(Type type)
static const std::string xml_node_name
std::string string_compose(const std::string &fmt, const T1 &o1)
PBD::Signal1< void, AutoState > automation_state_changed