13
0

LADSPA logarithmic handling patches from nickm and robsch

git-svn-id: svn://localhost/ardour2/branches/3.0@5705 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2009-10-01 16:42:02 +00:00
parent 57ac4cb223
commit c279da57ff
3 changed files with 99 additions and 19 deletions

View File

@ -178,34 +178,44 @@ LadspaPlugin::default_value (uint32_t port)
ret = prh[port].LowerBound;
bounds_given = true;
sr_scaling = true;
earlier_hint = true;
}
/* FIXME: add support for logarithmic defaults */
else if (LADSPA_IS_HINT_DEFAULT_LOW(prh[port].HintDescriptor)) {
ret = prh[port].LowerBound * 0.75f + prh[port].UpperBound * 0.25f;
if (LADSPA_IS_HINT_LOGARITHMIC(prh[port].HintDescriptor)) {
ret = exp(log(prh[port].LowerBound) * 0.75f + log(prh[port].UpperBound) * 0.25f);
}
else {
ret = prh[port].LowerBound * 0.75f + prh[port].UpperBound * 0.25f;
}
bounds_given = true;
sr_scaling = true;
earlier_hint = true;
}
else if (LADSPA_IS_HINT_DEFAULT_MIDDLE(prh[port].HintDescriptor)) {
ret = prh[port].LowerBound * 0.50f + prh[port].UpperBound * 0.50f;
if (LADSPA_IS_HINT_LOGARITHMIC(prh[port].HintDescriptor)) {
ret = exp(log(prh[port].LowerBound) * 0.5f + log(prh[port].UpperBound) * 0.5f);
}
else {
ret = prh[port].LowerBound * 0.5f + prh[port].UpperBound * 0.5f;
}
bounds_given = true;
sr_scaling = true;
earlier_hint = true;
}
else if (LADSPA_IS_HINT_DEFAULT_HIGH(prh[port].HintDescriptor)) {
ret = prh[port].LowerBound * 0.25f + prh[port].UpperBound * 0.75f;
if (LADSPA_IS_HINT_LOGARITHMIC(prh[port].HintDescriptor)) {
ret = exp(log(prh[port].LowerBound) * 0.25f + log(prh[port].UpperBound) * 0.75f);
}
else {
ret = prh[port].LowerBound * 0.25f + prh[port].UpperBound * 0.75f;
}
bounds_given = true;
sr_scaling = true;
earlier_hint = true;
}
else if (LADSPA_IS_HINT_DEFAULT_MAXIMUM(prh[port].HintDescriptor)) {
ret = prh[port].UpperBound;
bounds_given = true;
sr_scaling = true;
earlier_hint = true;
}
else if (LADSPA_IS_HINT_DEFAULT_0(prh[port].HintDescriptor)) {
ret = 0.0f;

View File

@ -18,6 +18,7 @@
*/
#include <string>
#include <sstream>
#include <climits>
#include <cstdio>
#include <cmath>
@ -48,6 +49,7 @@ BarController::BarController (Gtk::Adjustment& adj,
switching = false;
switch_on_release = false;
use_parent = false;
logarithmic = false;
layout = darea.create_pango_layout("");
@ -76,6 +78,7 @@ BarController::BarController (Gtk::Adjustment& adj,
spinner.signal_input().connect (mem_fun (*this, &BarController::entry_input));
spinner.signal_output().connect (mem_fun (*this, &BarController::entry_output));
spinner.set_digits (3);
spinner.set_numeric (true);
add (darea);
show_all ();
@ -422,13 +425,6 @@ BarController::switch_to_spinner ()
void
BarController::entry_activated ()
{
string text = spinner.get_text ();
float val;
if (sscanf (text.c_str(), "%f", &val) == 1) {
adjustment.set_value (val);
}
switch_to_bar ();
}
@ -453,16 +449,84 @@ BarController::set_sensitive (bool yn)
darea.set_sensitive (yn);
}
bool
BarController::entry_input (double* /*v*/)
/*
This is called when we need to update the adjustment with the value
from the spinner's text entry.
We need to use Gtk::Entry::get_text to avoid recursive nastiness :)
If we're not in logarithmic mode we can return false to use the
default conversion.
In theory we should check for conversion errors but set numeric
mode to true on the spinner prevents invalid input.
*/
int
BarController::entry_input (double* new_value)
{
return false;
if (!logarithmic) {
return false;
}
// extract a double from the string and take its log
Entry *entry = dynamic_cast<Entry *>(&spinner);
stringstream stream(entry->get_text());
stream.imbue(std::locale(""));
double value;
stream >> value;
*new_value = log(value);
return true;
}
/*
This is called when we need to update the spinner's text entry
with the value of the adjustment.
We need to use Gtk::Entry::set_text to avoid recursive nastiness :)
If we're not in logarithmic mode we can return false to use the
default conversion.
*/
bool
BarController::entry_output ()
{
return false;
if (!logarithmic) {
return false;
}
// generate the exponential and turn it into a string
// convert to correct locale.
stringstream stream;
string str;
size_t found;
// Gtk.Entry does not like the thousands separator, so we have to
// remove it after conversion from float to string.
stream.imbue(std::locale(""));
stream.precision(spinner.get_digits());
stream << fixed << exp(spinner.get_adjustment()->get_value());
str=stream.str();
// find thousands separators, remove them
found = str.find(use_facet<numpunct<char> >(std::locale("")).thousands_sep());
while(found != str.npos) {
str.erase(found,1);
//find next
found = str.find(use_facet<numpunct<char> >(std::locale("")).thousands_sep());
}
Entry *entry = dynamic_cast<Entry *>(&spinner);
entry->set_text(str);
return true;
}

View File

@ -48,6 +48,8 @@ class BarController : public Gtk::Frame
void set_use_parent (bool yn);
void set_sensitive (bool yn);
void set_logarithmic (bool yn) { logarithmic = yn; }
sigc::signal<void> StartGesture;
sigc::signal<void> StopGesture;
@ -73,6 +75,7 @@ class BarController : public Gtk::Frame
GdkWindow* grab_window;
Gtk::SpinButton spinner;
bool use_parent;
bool logarithmic;
virtual std::string get_label (int& /*x*/) {
return "";
@ -94,6 +97,9 @@ class BarController : public Gtk::Frame
void entry_activated ();
void drop_grab ();
int entry_input (double* new_value);
bool entry_output ();
};