*/
#include <iomanip>
+#include <cmath>
#include "pbd/error.h"
using namespace ARDOUR;
using namespace Gtk;
-
-AutomationController::AutomationController(boost::shared_ptr<AutomationControl> ac, Adjustment* adj)
+AutomationController::AutomationController(boost::shared_ptr<Automatable> owner, boost::shared_ptr<AutomationControl> ac, Adjustment* adj)
: BarController (*adj, ac)
, _ignore_change(false)
+ , _owner (owner)
, _controllable(ac)
, _adjustment(adj)
{
} else {
assert(ac->parameter() == param);
}
- return boost::shared_ptr<AutomationController>(new AutomationController(ac, adjustment));
+ return boost::shared_ptr<AutomationController>(new AutomationController(parent, ac, adjustment));
}
std::string
AutomationController::get_label (int&)
{
- std::stringstream s;
-
- // Hack to display CC rounded to int
- if (_controllable->parameter().type() == MidiCCAutomation) {
- s << (int)_controllable->get_value();
- } else {
- s << std::fixed << std::setprecision(3) << _controllable->get_value();
- }
-
- return s.str ();
+ return _owner->value_as_string (_controllable);
}
void
AutomationController::display_effective_value()
{
- //if ( ! _controllable->list()->automation_playback())
- // return;
-
float value = _controllable->get_value();
if (_adjustment->get_value() != value) {
void stop_updating ();
private:
- AutomationController (boost::shared_ptr<ARDOUR::AutomationControl> ac, Gtk::Adjustment* adj);
+ AutomationController (boost::shared_ptr<ARDOUR::Automatable> parent, boost::shared_ptr<ARDOUR::AutomationControl> ac, Gtk::Adjustment* adj);
std::string get_label (int&);
void start_touch();
void automation_state_changed();
bool _ignore_change;
+ boost::shared_ptr<ARDOUR::Automatable> _owner;
boost::shared_ptr<ARDOUR::AutomationControl> _controllable;
Gtk::Adjustment* _adjustment;
sigc::connection _screen_update_connection;
name_label.set_text (shortpname);
name_label.set_alignment (Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER);
+ name_label.set_name (X_("TrackParameterName"));
if (nomparent.length()) {
plugname = new Label (pname);
plugname->set_name (X_("TrackPlugName"));
plugname->show();
- name_label.set_name (X_("TrackParameterName"));
controls_table.remove (name_hbox);
controls_table.attach (*plugname, 1, 5, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
plugname_packed = true;
virtual void transport_stopped (framepos_t now);
virtual std::string describe_parameter(Evoral::Parameter param);
+ virtual std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
AutoState get_parameter_automation_state (Evoral::Parameter param);
virtual void set_parameter_automation_state (Evoral::Parameter param, AutoState);
return ((_auto_state & Write) || ((_auto_state & Touch) && touching()));
}
+ std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
+
void start_touch (double when);
void stop_touch (bool mark, double when);
bool touching() const { return g_atomic_int_get (&_touching); }
virtual std::set<Evoral::Parameter> what_can_be_automated() const;
virtual std::string describe_parameter (Evoral::Parameter);
+ virtual std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
bool touching() const;
_control_connections.drop_connections ();
ControlSet::clear_controls ();
}
+
+string
+Automatable::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+{
+ std::stringstream s;
+
+ /* this is a the default fallback for this virtual method. Derived Automatables
+ are free to override this to display the values of their parameters/controls
+ in different ways.
+ */
+
+ // Hack to display CC as integer value, rather than double
+ if (ac->parameter().type() == MidiCCAutomation) {
+ s << lrint (ac->get_value());
+ } else {
+ s << std::fixed << std::setprecision(3) << ac->get_value();
+ }
+
+ return s.str ();
+}
#include "ardour/automation_control.h"
#include "ardour/automation_list.h"
#include "ardour/pannable.h"
+#include "ardour/panner.h"
#include "ardour/pan_controllable.h"
#include "ardour/session.h"
+using namespace std;
using namespace PBD;
using namespace ARDOUR;
return 0;
}
+string
+Pannable::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+{
+ if (_panner) {
+ return _panner->value_as_string (ac);
+ }
-
-
+ return Automatable::value_as_string (ac);
+}
{
return _pannable->describe_parameter (p);
}
+
+string
+Panner::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+{
+ return _pannable->value_as_string (ac);
+}
Gtk::SpinButton spinner;
bool use_parent;
bool logarithmic;
+ sigc::slot<std::string> _label_slot;
+ bool _use_slot;
virtual std::string get_label (int& /*x*/) {
return "";
return _pannable->describe_parameter (p);
}
}
+
+string
+Panner1in2out::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+{
+ /* DO NOT USE LocaleGuard HERE */
+ double val = ac->get_value();
+
+ switch (ac->parameter().type()) {
+ case PanAzimuthAutomation:
+ /* We show the position of the center of the image relative to the left & right.
+ This is expressed as a pair of percentage values that ranges from (100,0)
+ (hard left) through (50,50) (hard center) to (0,100) (hard right).
+
+ This is pretty wierd, but its the way audio engineers expect it. Just remember that
+ the center of the USA isn't Kansas, its (50LA, 50NY) and it will all make sense.
+ */
+
+ return string_compose (_("L:%1 R:%2"), (int) rint (100.0 * (1.0 - val)),
+ (int) rint (100.0 * val));
+
+ default:
+ return _pannable->value_as_string (ac);
+ }
+}
static Panner* factory (boost::shared_ptr<Pannable>, Speakers&);
std::string describe_parameter (Evoral::Parameter);
+ std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
XMLNode& state (bool full_state);
XMLNode& get_state (void);
return _pannable->describe_parameter (p);
}
}
+
+string
+Panner2in2out::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+{
+ /* DO NOT USE LocaleGuard HERE */
+ double val = ac->get_value();
+
+ switch (ac->parameter().type()) {
+ case PanAzimuthAutomation:
+ /* We show the position of the center of the image relative to the left & right.
+ This is expressed as a pair of percentage values that ranges from (100,0)
+ (hard left) through (50,50) (hard center) to (0,100) (hard right).
+
+ This is pretty wierd, but its the way audio engineers expect it. Just remember that
+ the center of the USA isn't Kansas, its (50LA, 50NY) and it will all make sense.
+ */
+
+ return string_compose (_("L:%1 R:%2"), (int) rint (100.0 * (1.0 - val)),
+ (int) rint (100.0 * val));
+
+ case PanWidthAutomation:
+ return string_compose (_("Width: %1%%"), (int) floor (100.0 * val));
+
+ default:
+ return _pannable->value_as_string (ac);
+ }
+}
static Panner* factory (boost::shared_ptr<Pannable>, Speakers&);
std::string describe_parameter (Evoral::Parameter);
+ std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
XMLNode& state (bool full_state);
XMLNode& get_state (void);
return _pannable->describe_parameter (p);
}
}
+
+string
+VBAPanner::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+{
+ /* DO NOT USE LocaleGuard HERE */
+ double val = ac->get_value();
+
+ switch (ac->parameter().type()) {
+ case PanAzimuthAutomation: /* direction */
+ return string_compose (_("%1"), val * 360.0);
+
+ case PanWidthAutomation: /* diffusion */
+ return string_compose (_("%1%%"), (int) floor (100.0 * fabs(val)));
+
+ default:
+ return _pannable->value_as_string (ac);
+ }
+}
void set_azimuth_elevation (double azimuth, double elevation);
std::string describe_parameter (Evoral::Parameter);
+ std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
XMLNode& state (bool full_state);
XMLNode& get_state ();