#include <cmath>
#include <cerrno>
-#include <fstream>
#include <cstdlib>
#include <string>
#include <cstdio>
#include <locale.h>
#include <unistd.h>
#include <float.h>
-#include <iomanip>
#include <glibmm.h>
#include "ardour/buffer_set.h"
#include "ardour/audio_buffer.h"
#include "ardour/pannable.h"
+#include "ardour/profile.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
#include "panner_1in2out.h"
#include "pbd/mathfix.h"
static PanPluginDescriptor _descriptor = {
"Mono to Stereo Panner",
- 1, 2,
+ "http://ardour.org/plugin/panner_1in2out",
+ "http://ardour.org/plugin/panner_1in2out#ui",
+ 1, 2,
+ 10000,
Panner1in2out::factory
};
-extern "C" { PanPluginDescriptor* panner_descriptor () { return &_descriptor; } }
+extern "C" ARDOURPANNER_API PanPluginDescriptor* panner_descriptor () { return &_descriptor; }
Panner1in2out::Panner1in2out (boost::shared_ptr<Pannable> p)
: Panner (p)
{
- if (!_pannable->has_state()) {
- _pannable->pan_azimuth_control->set_value (0.5);
+ if (!Profile->get_trx () ) {
+ if (!_pannable->has_state ()) {
+ _pannable->pan_azimuth_control->set_value (0.5, Controllable::NoGroup);
+ }
}
-
+
update ();
left = desired_left;
Panner1in2out::set_position (double p)
{
if (clamp_position (p)) {
- _pannable->pan_azimuth_control->set_value (p);
+ _pannable->pan_azimuth_control->set_value (p, Controllable::NoGroup);
}
}
return true;
}
-double
+pair<double, double>
+Panner1in2out::position_range () const
+{
+ return make_pair (0, 1);
+}
+
+double
Panner1in2out::position () const
{
return _pannable->pan_azimuth_control->get_value ();
pan_t pan;
Sample* const src = srcbuf.data();
-
+
/* LEFT OUTPUT */
dst = obufs.get_audio(0).data();
if (fabsf ((delta = (left - desired_left))) > 0.002) { // about 1 degree of arc
/* we've moving the pan by an appreciable amount, so we must
- interpolate over 64 frames or nframes, whichever is smaller */
+ interpolate over 64 samples or nframes, whichever is smaller */
pframes_t const limit = min ((pframes_t) 64, nframes);
pframes_t n;
/* pan is 1 so we can just copy the input samples straight in */
mix_buffers_no_gain(dst,src,nframes);
-
+
/* XXX it would be nice to mark that we wrote into the buffer */
}
}
if (fabsf ((delta = (right - desired_right))) > 0.002) { // about 1 degree of arc
/* we're moving the pan by an appreciable amount, so we must
- interpolate over 64 frames or nframes, whichever is smaller */
+ interpolate over 64 samples or nframes, whichever is smaller */
pframes_t const limit = min ((pframes_t) 64, nframes);
pframes_t n;
if (pan != 0.0f) {
/* pan is not 1 but also not 0, so we must do it "properly" */
-
+
mix_buffers_with_gain(dst,src,nframes,pan);
/* XXX it would be nice to mark the buffer as written to */
} else {
/* pan is 1 so we can just copy the input samples straight in */
-
+
mix_buffers_no_gain(dst,src,nframes);
/* XXX it would be nice to mark the buffer as written to */
void
Panner1in2out::distribute_one_automated (AudioBuffer& srcbuf, BufferSet& obufs,
- framepos_t start, framepos_t end, pframes_t nframes,
+ samplepos_t start, samplepos_t end, pframes_t nframes,
pan_t** buffers, uint32_t which)
{
assert (obufs.count().n_audio() == 2);
/* note that are overwriting buffers, but its OK
because we're finished with their old contents
(position automation data) and are
- replacing it with panning/gain coefficients
+ replacing it with panning/gain coefficients
that we need to actually process the data.
*/
-
+
buffers[0][n] = panL * (scale * panL + 1.0f - scale);
buffers[1][n] = panR * (scale * panR + 1.0f - scale);
}
}
XMLNode&
-Panner1in2out::get_state (void)
-{
- return state (true);
-}
-
-XMLNode&
-Panner1in2out::state (bool /*full_state*/)
+Panner1in2out::get_state ()
{
XMLNode& root (Panner::get_state ());
- root.add_property (X_("type"), _descriptor.name);
+ root.set_property (X_("uri"), _descriptor.panner_uri);
+ /* this is needed to allow new sessions to load with old Ardour: */
+ root.set_property (X_("type"), _descriptor.name);
return root;
}
-int
-Panner1in2out::set_state (const XMLNode& node, int version)
-{
- LocaleGuard lg (X_("POSIX"));
- Panner::set_state (node, version);
- return 0;
-}
-std::set<Evoral::Parameter>
+std::set<Evoral::Parameter>
Panner1in2out::what_can_be_automated() const
{
set<Evoral::Parameter> s;
}
}
-string
-Panner1in2out::value_as_string (boost::shared_ptr<AutomationControl> ac) const
+string
+Panner1in2out::value_as_string (boost::shared_ptr<const 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)
+ 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.
+
+ This is designed to be as narrow as possible. Dedicated
+ panner GUIs can do their own version of this if they need
+ something less compact.
*/
-
- return string_compose (_("L:%1 R:%2"), (int) rint (100.0 * (1.0 - val)),
+
+ return string_compose (_("L%1R%2"), (int) rint (100.0 * (1.0 - val)),
(int) rint (100.0 * val));
-
+
default:
- return _pannable->value_as_string (ac);
+ return _("unused");
}
}
+
+void
+Panner1in2out::reset ()
+{
+ set_position (0.5);
+ update ();
+}