mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-06 14:54:56 +01:00
Move panner bypass state up to the PannerShell so that it is preserved even when new Panners are dropped in (refixes #4185).
git-svn-id: svn://localhost/ardour2/branches/3.0@9877 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
a5efa9a500
commit
48de21b120
16 changed files with 85 additions and 164 deletions
|
|
@ -29,6 +29,7 @@
|
||||||
#include "pbd/error.h"
|
#include "pbd/error.h"
|
||||||
#include "pbd/cartesian.h"
|
#include "pbd/cartesian.h"
|
||||||
#include "ardour/panner.h"
|
#include "ardour/panner.h"
|
||||||
|
#include "ardour/panner_shell.h"
|
||||||
#include "ardour/pannable.h"
|
#include "ardour/pannable.h"
|
||||||
#include "ardour/speakers.h"
|
#include "ardour/speakers.h"
|
||||||
|
|
||||||
|
|
@ -67,17 +68,17 @@ Panner2d::Target::set_text (const char* txt)
|
||||||
text = txt;
|
text = txt;
|
||||||
}
|
}
|
||||||
|
|
||||||
Panner2d::Panner2d (boost::shared_ptr<Panner> p, int32_t h)
|
Panner2d::Panner2d (boost::shared_ptr<PannerShell> p, int32_t h)
|
||||||
: panner (p)
|
: panner_shell (p)
|
||||||
, position (AngularVector (0.0, 0.0), "")
|
, position (AngularVector (0.0, 0.0), "")
|
||||||
, width (0)
|
, width (0)
|
||||||
, height (h)
|
, height (h)
|
||||||
, last_width (0)
|
, last_width (0)
|
||||||
{
|
{
|
||||||
panner->StateChanged.connect (connections, invalidator (*this), boost::bind (&Panner2d::handle_state_change, this), gui_context());
|
panner_shell->Changed.connect (connections, invalidator (*this), boost::bind (&Panner2d::handle_state_change, this), gui_context());
|
||||||
|
|
||||||
panner->pannable()->pan_azimuth_control->Changed.connect (connections, invalidator(*this), boost::bind (&Panner2d::handle_position_change, this), gui_context());
|
panner_shell->pannable()->pan_azimuth_control->Changed.connect (connections, invalidator(*this), boost::bind (&Panner2d::handle_position_change, this), gui_context());
|
||||||
panner->pannable()->pan_width_control->Changed.connect (connections, invalidator(*this), boost::bind (&Panner2d::handle_position_change, this), gui_context());
|
panner_shell->pannable()->pan_width_control->Changed.connect (connections, invalidator(*this), boost::bind (&Panner2d::handle_position_change, this), gui_context());
|
||||||
|
|
||||||
drag_target = 0;
|
drag_target = 0;
|
||||||
set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
|
set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK);
|
||||||
|
|
@ -95,7 +96,7 @@ Panner2d::~Panner2d()
|
||||||
void
|
void
|
||||||
Panner2d::reset (uint32_t n_inputs)
|
Panner2d::reset (uint32_t n_inputs)
|
||||||
{
|
{
|
||||||
uint32_t nouts = panner->out().n_audio();
|
uint32_t nouts = panner_shell->panner()->out().n_audio();
|
||||||
|
|
||||||
/* signals */
|
/* signals */
|
||||||
|
|
||||||
|
|
@ -114,7 +115,7 @@ Panner2d::reset (uint32_t n_inputs)
|
||||||
label_signals ();
|
label_signals ();
|
||||||
|
|
||||||
for (uint32_t i = 0; i < n_inputs; ++i) {
|
for (uint32_t i = 0; i < n_inputs; ++i) {
|
||||||
signals[i]->position = panner->signal_position (i);
|
signals[i]->position = panner_shell->panner()->signal_position (i);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add all outputs */
|
/* add all outputs */
|
||||||
|
|
@ -135,7 +136,7 @@ Panner2d::reset (uint32_t n_inputs)
|
||||||
(*x)->visible = false;
|
(*x)->visible = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<Speaker>& the_speakers (panner->get_speakers()->speakers());
|
vector<Speaker>& the_speakers (panner_shell->panner()->get_speakers()->speakers());
|
||||||
|
|
||||||
for (uint32_t n = 0; n < nouts; ++n) {
|
for (uint32_t n = 0; n < nouts; ++n) {
|
||||||
char buf[16];
|
char buf[16];
|
||||||
|
|
@ -204,7 +205,7 @@ Panner2d::handle_state_change ()
|
||||||
void
|
void
|
||||||
Panner2d::label_signals ()
|
Panner2d::label_signals ()
|
||||||
{
|
{
|
||||||
double w = panner->pannable()->pan_width_control->get_value();
|
double w = panner_shell->pannable()->pan_width_control->get_value();
|
||||||
uint32_t sz = signals.size();
|
uint32_t sz = signals.size();
|
||||||
|
|
||||||
switch (sz) {
|
switch (sz) {
|
||||||
|
|
@ -243,12 +244,12 @@ void
|
||||||
Panner2d::handle_position_change ()
|
Panner2d::handle_position_change ()
|
||||||
{
|
{
|
||||||
uint32_t n;
|
uint32_t n;
|
||||||
double w = panner->pannable()->pan_width_control->get_value();
|
double w = panner_shell->pannable()->pan_width_control->get_value();
|
||||||
|
|
||||||
position.position = AngularVector (panner->pannable()->pan_azimuth_control->get_value() * 360.0, 0.0);
|
position.position = AngularVector (panner_shell->pannable()->pan_azimuth_control->get_value() * 360.0, 0.0);
|
||||||
|
|
||||||
for (uint32_t i = 0; i < signals.size(); ++i) {
|
for (uint32_t i = 0; i < signals.size(); ++i) {
|
||||||
signals[i]->position = panner->signal_position (i);
|
signals[i]->position = panner_shell->panner()->signal_position (i);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (w * last_width <= 0) {
|
if (w * last_width <= 0) {
|
||||||
|
|
@ -258,7 +259,7 @@ Panner2d::handle_position_change ()
|
||||||
|
|
||||||
last_width = w;
|
last_width = w;
|
||||||
|
|
||||||
vector<Speaker>& the_speakers (panner->get_speakers()->speakers());
|
vector<Speaker>& the_speakers (panner_shell->panner()->get_speakers()->speakers());
|
||||||
|
|
||||||
for (n = 0; n < speakers.size(); ++n) {
|
for (n = 0; n < speakers.size(); ++n) {
|
||||||
speakers[n]->position = the_speakers[n].angles();
|
speakers[n]->position = the_speakers[n].angles();
|
||||||
|
|
@ -397,7 +398,7 @@ Panner2d::on_expose_event (GdkEventExpose *event)
|
||||||
/* background */
|
/* background */
|
||||||
|
|
||||||
cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height);
|
cairo_rectangle (cr, event->area.x, event->area.y, event->area.width, event->area.height);
|
||||||
if (!panner->bypassed()) {
|
if (!panner_shell->bypassed()) {
|
||||||
cairo_set_source_rgba (cr, 0.1, 0.1, 0.1, 1.0);
|
cairo_set_source_rgba (cr, 0.1, 0.1, 0.1, 1.0);
|
||||||
} else {
|
} else {
|
||||||
cairo_set_source_rgba (cr, 0.1, 0.1, 0.1, 0.2);
|
cairo_set_source_rgba (cr, 0.1, 0.1, 0.1, 0.2);
|
||||||
|
|
@ -446,8 +447,8 @@ Panner2d::on_expose_event (GdkEventExpose *event)
|
||||||
if (signals.size() > 1) {
|
if (signals.size() > 1) {
|
||||||
/* arc to show "diffusion" */
|
/* arc to show "diffusion" */
|
||||||
|
|
||||||
double width_angle = fabs (panner->pannable()->pan_width_control->get_value()) * 2 * M_PI;
|
double width_angle = fabs (panner_shell->pannable()->pan_width_control->get_value()) * 2 * M_PI;
|
||||||
double position_angle = (2 * M_PI) - panner->pannable()->pan_azimuth_control->get_value() * 2 * M_PI;
|
double position_angle = (2 * M_PI) - panner_shell->pannable()->pan_azimuth_control->get_value() * 2 * M_PI;
|
||||||
|
|
||||||
cairo_save (cr);
|
cairo_save (cr);
|
||||||
cairo_translate (cr, radius, radius);
|
cairo_translate (cr, radius, radius);
|
||||||
|
|
@ -455,7 +456,7 @@ Panner2d::on_expose_event (GdkEventExpose *event)
|
||||||
cairo_move_to (cr, 0, 0);
|
cairo_move_to (cr, 0, 0);
|
||||||
cairo_arc_negative (cr, 0, 0, radius, width_angle, 0.0);
|
cairo_arc_negative (cr, 0, 0, radius, width_angle, 0.0);
|
||||||
cairo_close_path (cr);
|
cairo_close_path (cr);
|
||||||
if (panner->pannable()->pan_width_control->get_value() >= 0.0) {
|
if (panner_shell->pannable()->pan_width_control->get_value() >= 0.0) {
|
||||||
/* normal width */
|
/* normal width */
|
||||||
cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 0.45);
|
cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 0.45);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -466,7 +467,7 @@ Panner2d::on_expose_event (GdkEventExpose *event)
|
||||||
cairo_restore (cr);
|
cairo_restore (cr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!panner->bypassed()) {
|
if (!panner_shell->bypassed()) {
|
||||||
|
|
||||||
double arc_radius;
|
double arc_radius;
|
||||||
|
|
||||||
|
|
@ -607,7 +608,7 @@ Panner2d::on_button_press_event (GdkEventButton *ev)
|
||||||
|
|
||||||
if ((drag_target = find_closest_object (x, y, is_signal)) != 0) {
|
if ((drag_target = find_closest_object (x, y, is_signal)) != 0) {
|
||||||
if (!is_signal) {
|
if (!is_signal) {
|
||||||
panner->set_position (drag_target->position.azi/360.0);
|
panner_shell->panner()->set_position (drag_target->position.azi/360.0);
|
||||||
drag_target = 0;
|
drag_target = 0;
|
||||||
} else {
|
} else {
|
||||||
drag_target->set_selected (true);
|
drag_target->set_selected (true);
|
||||||
|
|
@ -705,7 +706,7 @@ Panner2d::handle_motion (gint evx, gint evy, GdkModifierType state)
|
||||||
|
|
||||||
if (drag_target == &position) {
|
if (drag_target == &position) {
|
||||||
double degree_fract = av.azi / 360.0;
|
double degree_fract = av.azi / 360.0;
|
||||||
panner->set_position (degree_fract);
|
panner_shell->panner()->set_position (degree_fract);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -719,12 +720,12 @@ Panner2d::on_scroll_event (GdkEventScroll* ev)
|
||||||
switch (ev->direction) {
|
switch (ev->direction) {
|
||||||
case GDK_SCROLL_UP:
|
case GDK_SCROLL_UP:
|
||||||
case GDK_SCROLL_RIGHT:
|
case GDK_SCROLL_RIGHT:
|
||||||
panner->set_position (panner->pannable()->pan_azimuth_control->get_value() - 1.0/360.0);
|
panner_shell->panner()->set_position (panner_shell->pannable()->pan_azimuth_control->get_value() - 1.0/360.0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GDK_SCROLL_DOWN:
|
case GDK_SCROLL_DOWN:
|
||||||
case GDK_SCROLL_LEFT:
|
case GDK_SCROLL_LEFT:
|
||||||
panner->set_position (panner->pannable()->pan_azimuth_control->get_value() + 1.0/360.0);
|
panner_shell->panner()->set_position (panner_shell->pannable()->pan_azimuth_control->get_value() + 1.0/360.0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -773,10 +774,10 @@ Panner2d::clamp_to_circle (double& x, double& y)
|
||||||
void
|
void
|
||||||
Panner2d::toggle_bypass ()
|
Panner2d::toggle_bypass ()
|
||||||
{
|
{
|
||||||
panner->set_bypassed (!panner->bypassed());
|
panner_shell->set_bypassed (!panner_shell->bypassed());
|
||||||
}
|
}
|
||||||
|
|
||||||
Panner2dWindow::Panner2dWindow (boost::shared_ptr<Panner> p, int32_t h, uint32_t inputs)
|
Panner2dWindow::Panner2dWindow (boost::shared_ptr<PannerShell> p, int32_t h, uint32_t inputs)
|
||||||
: ArdourDialog (_("Panner (2D)"))
|
: ArdourDialog (_("Panner (2D)"))
|
||||||
, widget (p, h)
|
, widget (p, h)
|
||||||
, bypass_button (_("Bypass"))
|
, bypass_button (_("Bypass"))
|
||||||
|
|
@ -838,10 +839,10 @@ void
|
||||||
Panner2dWindow::bypass_toggled ()
|
Panner2dWindow::bypass_toggled ()
|
||||||
{
|
{
|
||||||
bool view = bypass_button.get_active ();
|
bool view = bypass_button.get_active ();
|
||||||
bool model = widget.get_panner()->bypassed ();
|
bool model = widget.get_panner_shell()->bypassed ();
|
||||||
|
|
||||||
if (model != view) {
|
if (model != view) {
|
||||||
widget.get_panner()->set_bypassed (view);
|
widget.get_panner_shell()->set_bypassed (view);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@
|
||||||
#include "ardour_dialog.h"
|
#include "ardour_dialog.h"
|
||||||
|
|
||||||
namespace ARDOUR {
|
namespace ARDOUR {
|
||||||
class Panner;
|
class PannerShell;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Gtk {
|
namespace Gtk {
|
||||||
|
|
@ -54,7 +54,7 @@ class Panner2dWindow;
|
||||||
class Panner2d : public Gtk::DrawingArea
|
class Panner2d : public Gtk::DrawingArea
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Panner2d (boost::shared_ptr<ARDOUR::Panner>, int32_t height);
|
Panner2d (boost::shared_ptr<ARDOUR::PannerShell>, int32_t height);
|
||||||
~Panner2d ();
|
~Panner2d ();
|
||||||
|
|
||||||
void allow_target_motion (bool);
|
void allow_target_motion (bool);
|
||||||
|
|
@ -64,7 +64,7 @@ class Panner2d : public Gtk::DrawingArea
|
||||||
void move_signal (int which, const PBD::AngularVector&);
|
void move_signal (int which, const PBD::AngularVector&);
|
||||||
void reset (uint32_t n_inputs);
|
void reset (uint32_t n_inputs);
|
||||||
|
|
||||||
boost::shared_ptr<ARDOUR::Panner> get_panner() const { return panner; }
|
boost::shared_ptr<ARDOUR::PannerShell> get_panner_shell() const { return panner_shell; }
|
||||||
|
|
||||||
sigc::signal<void,int> PuckMoved;
|
sigc::signal<void,int> PuckMoved;
|
||||||
sigc::signal<void,int> TargetMoved;
|
sigc::signal<void,int> TargetMoved;
|
||||||
|
|
@ -102,7 +102,7 @@ class Panner2d : public Gtk::DrawingArea
|
||||||
bool _selected;
|
bool _selected;
|
||||||
};
|
};
|
||||||
|
|
||||||
boost::shared_ptr<ARDOUR::Panner> panner;
|
boost::shared_ptr<ARDOUR::PannerShell> panner_shell;
|
||||||
Glib::RefPtr<Pango::Layout> layout;
|
Glib::RefPtr<Pango::Layout> layout;
|
||||||
|
|
||||||
typedef std::vector<Target*> Targets;
|
typedef std::vector<Target*> Targets;
|
||||||
|
|
@ -146,7 +146,7 @@ class Panner2d : public Gtk::DrawingArea
|
||||||
class Panner2dWindow : public ArdourDialog
|
class Panner2dWindow : public ArdourDialog
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Panner2dWindow (boost::shared_ptr<ARDOUR::Panner>, int32_t height, uint32_t inputs);
|
Panner2dWindow (boost::shared_ptr<ARDOUR::PannerShell>, int32_t height, uint32_t inputs);
|
||||||
|
|
||||||
void reset (uint32_t n_inputs);
|
void reset (uint32_t n_inputs);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -119,7 +119,6 @@ PannerUI::set_panner (boost::shared_ptr<PannerShell> ps, boost::shared_ptr<Panne
|
||||||
}
|
}
|
||||||
|
|
||||||
_panshell->Changed.connect (connections, invalidator (*this), boost::bind (&PannerUI::panshell_changed, this), gui_context());
|
_panshell->Changed.connect (connections, invalidator (*this), boost::bind (&PannerUI::panshell_changed, this), gui_context());
|
||||||
_panner->StateChanged.connect (connections, invalidator (*this), boost::bind (&PannerUI::update_pan_state, this), gui_context());
|
|
||||||
|
|
||||||
/* new panner object, force complete reset of panner GUI
|
/* new panner object, force complete reset of panner GUI
|
||||||
*/
|
*/
|
||||||
|
|
@ -216,12 +215,6 @@ PannerUI::panshell_changed ()
|
||||||
setup_pan ();
|
setup_pan ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
PannerUI::update_pan_state ()
|
|
||||||
{
|
|
||||||
/* currently nothing to do */
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
PannerUI::setup_pan ()
|
PannerUI::setup_pan ()
|
||||||
{
|
{
|
||||||
|
|
@ -313,7 +306,7 @@ PannerUI::setup_pan ()
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (!twod_panner) {
|
if (!twod_panner) {
|
||||||
twod_panner = new Panner2d (_panner, 61);
|
twod_panner = new Panner2d (_panshell, 61);
|
||||||
twod_panner->set_name ("MixerPanZone");
|
twod_panner->set_name ("MixerPanZone");
|
||||||
twod_panner->show ();
|
twod_panner->show ();
|
||||||
twod_panner->signal_button_press_event().connect (sigc::mem_fun(*this, &PannerUI::pan_button_event), false);
|
twod_panner->signal_button_press_event().connect (sigc::mem_fun(*this, &PannerUI::pan_button_event), false);
|
||||||
|
|
@ -361,7 +354,7 @@ PannerUI::pan_button_event (GdkEventButton* ev)
|
||||||
case 1:
|
case 1:
|
||||||
if (twod_panner && ev->type == GDK_2BUTTON_PRESS) {
|
if (twod_panner && ev->type == GDK_2BUTTON_PRESS) {
|
||||||
if (!big_window) {
|
if (!big_window) {
|
||||||
big_window = new Panner2dWindow (_panner, 400, _panner->in().n_audio());
|
big_window = new Panner2dWindow (_panshell, 400, _panner->in().n_audio());
|
||||||
}
|
}
|
||||||
big_window->show ();
|
big_window->show ();
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -397,7 +390,7 @@ PannerUI::build_pan_menu ()
|
||||||
|
|
||||||
/* set state first, connect second */
|
/* set state first, connect second */
|
||||||
|
|
||||||
bypass_menu_item->set_active (_panner->bypassed());
|
bypass_menu_item->set_active (_panshell->bypassed());
|
||||||
bypass_menu_item->signal_toggled().connect (sigc::mem_fun(*this, &PannerUI::pan_bypass_toggle));
|
bypass_menu_item->signal_toggled().connect (sigc::mem_fun(*this, &PannerUI::pan_bypass_toggle));
|
||||||
|
|
||||||
items.push_back (MenuElem (_("Reset"), sigc::mem_fun (*this, &PannerUI::pan_reset)));
|
items.push_back (MenuElem (_("Reset"), sigc::mem_fun (*this, &PannerUI::pan_reset)));
|
||||||
|
|
@ -406,8 +399,8 @@ PannerUI::build_pan_menu ()
|
||||||
void
|
void
|
||||||
PannerUI::pan_bypass_toggle ()
|
PannerUI::pan_bypass_toggle ()
|
||||||
{
|
{
|
||||||
if (bypass_menu_item && (_panner->bypassed() != bypass_menu_item->get_active())) {
|
if (bypass_menu_item && (_panshell->bypassed() != bypass_menu_item->get_active())) {
|
||||||
_panner->set_bypassed (!_panner->bypassed());
|
_panshell->set_bypassed (!_panshell->bypassed());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -123,7 +123,6 @@ class PannerUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr
|
||||||
std::vector<MonoPanner*> pan_bars;
|
std::vector<MonoPanner*> pan_bars;
|
||||||
|
|
||||||
void pan_value_changed (uint32_t which);
|
void pan_value_changed (uint32_t which);
|
||||||
void update_pan_state ();
|
|
||||||
void build_astate_menu ();
|
void build_astate_menu ();
|
||||||
void build_astyle_menu ();
|
void build_astyle_menu ();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -83,9 +83,6 @@ public:
|
||||||
|
|
||||||
virtual void reset() {}
|
virtual void reset() {}
|
||||||
|
|
||||||
virtual bool bypassed() const { return _bypassed; }
|
|
||||||
virtual void set_bypassed (bool yn);
|
|
||||||
|
|
||||||
void set_automation_state (AutoState);
|
void set_automation_state (AutoState);
|
||||||
AutoState automation_state() const;
|
AutoState automation_state() const;
|
||||||
void set_automation_style (AutoStyle);
|
void set_automation_style (AutoStyle);
|
||||||
|
|
@ -140,11 +137,9 @@ public:
|
||||||
framepos_t start, framepos_t end, pframes_t nframes,
|
framepos_t start, framepos_t end, pframes_t nframes,
|
||||||
pan_t** buffers);
|
pan_t** buffers);
|
||||||
|
|
||||||
PBD::Signal0<void> StateChanged;
|
|
||||||
|
|
||||||
int set_state (const XMLNode&, int version);
|
int set_state (const XMLNode&, int version);
|
||||||
virtual XMLNode& state (bool full_state) = 0;
|
XMLNode& get_state ();
|
||||||
|
|
||||||
boost::shared_ptr<Pannable> pannable() const { return _pannable; }
|
boost::shared_ptr<Pannable> pannable() const { return _pannable; }
|
||||||
|
|
||||||
//virtual std::string describe_parameter (Evoral::Parameter);
|
//virtual std::string describe_parameter (Evoral::Parameter);
|
||||||
|
|
@ -161,9 +156,6 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
boost::shared_ptr<Pannable> _pannable;
|
boost::shared_ptr<Pannable> _pannable;
|
||||||
bool _bypassed;
|
|
||||||
|
|
||||||
XMLNode& get_state ();
|
|
||||||
|
|
||||||
virtual void distribute_one (AudioBuffer&, BufferSet& obufs, gain_t gain_coeff, pframes_t nframes, uint32_t which) = 0;
|
virtual void distribute_one (AudioBuffer&, BufferSet& obufs, gain_t gain_coeff, pframes_t nframes, uint32_t which) = 0;
|
||||||
virtual void distribute_one_automated (AudioBuffer&, BufferSet& obufs,
|
virtual void distribute_one_automated (AudioBuffer&, BufferSet& obufs,
|
||||||
|
|
|
||||||
|
|
@ -60,20 +60,22 @@ public:
|
||||||
/// The fundamental Panner function
|
/// The fundamental Panner function
|
||||||
void run (BufferSet& src, BufferSet& dest, framepos_t start_frame, framepos_t end_frames, pframes_t nframes);
|
void run (BufferSet& src, BufferSet& dest, framepos_t start_frame, framepos_t end_frames, pframes_t nframes);
|
||||||
|
|
||||||
|
XMLNode& get_state ();
|
||||||
XMLNode& get_state (void);
|
|
||||||
XMLNode& state (bool full);
|
|
||||||
int set_state (const XMLNode&, int version);
|
int set_state (const XMLNode&, int version);
|
||||||
|
|
||||||
PBD::Signal0<void> Changed; /* panner and/or outputs count changed */
|
PBD::Signal0<void> Changed; /* panner and/or outputs count and/or bypass state changed */
|
||||||
|
|
||||||
boost::shared_ptr<Panner> panner() const { return _panner; }
|
boost::shared_ptr<Panner> panner() const { return _panner; }
|
||||||
boost::shared_ptr<Pannable> pannable() const { return _pannable; }
|
boost::shared_ptr<Pannable> pannable() const { return _pannable; }
|
||||||
|
|
||||||
|
bool bypassed () const;
|
||||||
|
void set_bypassed (bool);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void distribute_no_automation (BufferSet& src, BufferSet& dest, pframes_t nframes, gain_t gain_coeff);
|
void distribute_no_automation (BufferSet& src, BufferSet& dest, pframes_t nframes, gain_t gain_coeff);
|
||||||
boost::shared_ptr<Panner> _panner;
|
boost::shared_ptr<Panner> _panner;
|
||||||
boost::shared_ptr<Pannable> _pannable;
|
boost::shared_ptr<Pannable> _pannable;
|
||||||
|
bool _bypassed;
|
||||||
|
|
||||||
static float current_automation_version_number;
|
static float current_automation_version_number;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -233,8 +233,6 @@ Delivery::configure_io (ChanCount in, ChanCount out)
|
||||||
void
|
void
|
||||||
Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool result_required)
|
Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool result_required)
|
||||||
{
|
{
|
||||||
boost::shared_ptr<Panner> panner;
|
|
||||||
|
|
||||||
assert (_output);
|
assert (_output);
|
||||||
|
|
||||||
PortSet& ports (_output->ports());
|
PortSet& ports (_output->ports());
|
||||||
|
|
@ -287,10 +285,6 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf
|
||||||
Amp::apply_simple_gain (bufs, nframes, tgain);
|
Amp::apply_simple_gain (bufs, nframes, tgain);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_panshell) {
|
|
||||||
panner = _panshell->panner();
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
if (_session.transport_rolling()) {
|
if (_session.transport_rolling()) {
|
||||||
cerr << name() << " first value written : " << scnt << endl;
|
cerr << name() << " first value written : " << scnt << endl;
|
||||||
|
|
@ -306,7 +300,7 @@ Delivery::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pf
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (panner && !panner->bypassed()) {
|
if (_panshell && !_panshell->bypassed()) {
|
||||||
|
|
||||||
// Use the panner to distribute audio to output port buffers
|
// Use the panner to distribute audio to output port buffers
|
||||||
|
|
||||||
|
|
@ -350,7 +344,7 @@ Delivery::state (bool full_state)
|
||||||
node.add_property("role", enum_2_string(_role));
|
node.add_property("role", enum_2_string(_role));
|
||||||
|
|
||||||
if (_panshell) {
|
if (_panshell) {
|
||||||
node.add_child_nocopy (_panshell->state (full_state));
|
node.add_child_nocopy (_panshell->get_state ());
|
||||||
}
|
}
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
|
|
|
||||||
|
|
@ -109,13 +109,7 @@ InternalSend::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame
|
||||||
|
|
||||||
assert(mixbufs.available() >= bufs.count());
|
assert(mixbufs.available() >= bufs.count());
|
||||||
|
|
||||||
boost::shared_ptr<Panner> panner;
|
if (_panshell && !_panshell->bypassed()) {
|
||||||
|
|
||||||
if (_panshell) {
|
|
||||||
panner = _panshell->panner();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (panner && !panner->bypassed()) {
|
|
||||||
mixbufs.set_count (_send_to->n_outputs ());
|
mixbufs.set_count (_send_to->n_outputs ());
|
||||||
_panshell->run (bufs, mixbufs, start_frame, end_frame, nframes);
|
_panshell->run (bufs, mixbufs, start_frame, end_frame, nframes);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -320,14 +314,8 @@ InternalSend::send_to_property_changed (const PropertyChange& what_changed)
|
||||||
void
|
void
|
||||||
InternalSend::set_can_pan (bool yn)
|
InternalSend::set_can_pan (bool yn)
|
||||||
{
|
{
|
||||||
boost::shared_ptr<Panner> panner;
|
|
||||||
|
|
||||||
if (_panshell) {
|
if (_panshell) {
|
||||||
panner = _panshell->panner ();
|
_panshell->set_bypassed (!yn);
|
||||||
}
|
|
||||||
|
|
||||||
if (panner) {
|
|
||||||
panner->set_bypassed (!yn);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,6 @@ using namespace ARDOUR;
|
||||||
|
|
||||||
Panner::Panner (boost::shared_ptr<Pannable> p)
|
Panner::Panner (boost::shared_ptr<Pannable> p)
|
||||||
: _pannable (p)
|
: _pannable (p)
|
||||||
, _bypassed (false)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -41,35 +40,10 @@ Panner::~Panner ()
|
||||||
DEBUG_TRACE(PBD::DEBUG::Destruction, string_compose ("panner @ %1 destructor, pannable is %2\n", this, _pannable));
|
DEBUG_TRACE(PBD::DEBUG::Destruction, string_compose ("panner @ %1 destructor, pannable is %2\n", this, _pannable));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
Panner::set_bypassed (bool yn)
|
|
||||||
{
|
|
||||||
if (yn != _bypassed) {
|
|
||||||
_bypassed = yn;
|
|
||||||
StateChanged ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
Panner::set_state (const XMLNode& node, int version)
|
|
||||||
{
|
|
||||||
const XMLProperty* prop;
|
|
||||||
|
|
||||||
if ((prop = node.property (X_("bypassed"))) != 0) {
|
|
||||||
set_bypassed (string_is_affirmative (prop->value()));
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
XMLNode&
|
XMLNode&
|
||||||
Panner::get_state ()
|
Panner::get_state ()
|
||||||
{
|
{
|
||||||
XMLNode* node = new XMLNode (X_("Panner"));
|
return *(new XMLNode (X_("Panner")));
|
||||||
|
|
||||||
node->add_property (X_("bypassed"), (bypassed() ? "yes" : "no"));
|
|
||||||
|
|
||||||
return *node;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -140,3 +114,9 @@ Panner::value_as_string (boost::shared_ptr<AutomationControl> ac) const
|
||||||
{
|
{
|
||||||
return _pannable->value_as_string (ac);
|
return _pannable->value_as_string (ac);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Panner::set_state (XMLNode const &, int)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -66,6 +66,7 @@ using namespace PBD;
|
||||||
PannerShell::PannerShell (string name, Session& s, boost::shared_ptr<Pannable> p)
|
PannerShell::PannerShell (string name, Session& s, boost::shared_ptr<Pannable> p)
|
||||||
: SessionObject (s, name)
|
: SessionObject (s, name)
|
||||||
, _pannable (p)
|
, _pannable (p)
|
||||||
|
, _bypassed (false)
|
||||||
{
|
{
|
||||||
set_name (name);
|
set_name (name);
|
||||||
}
|
}
|
||||||
|
|
@ -124,18 +125,14 @@ PannerShell::configure_io (ChanCount in, ChanCount out)
|
||||||
}
|
}
|
||||||
|
|
||||||
XMLNode&
|
XMLNode&
|
||||||
PannerShell::get_state (void)
|
PannerShell::get_state ()
|
||||||
{
|
|
||||||
return state (true);
|
|
||||||
}
|
|
||||||
|
|
||||||
XMLNode&
|
|
||||||
PannerShell::state (bool full)
|
|
||||||
{
|
{
|
||||||
XMLNode* node = new XMLNode ("PannerShell");
|
XMLNode* node = new XMLNode ("PannerShell");
|
||||||
|
|
||||||
|
node->add_property (X_("bypassed"), _bypassed ? X_("yes") : X_("no"));
|
||||||
|
|
||||||
if (_panner) {
|
if (_panner) {
|
||||||
node->add_child_nocopy (_panner->state (full));
|
node->add_child_nocopy (_panner->get_state ());
|
||||||
}
|
}
|
||||||
|
|
||||||
return *node;
|
return *node;
|
||||||
|
|
@ -149,6 +146,10 @@ PannerShell::set_state (const XMLNode& node, int version)
|
||||||
const XMLProperty *prop;
|
const XMLProperty *prop;
|
||||||
LocaleGuard lg (X_("POSIX"));
|
LocaleGuard lg (X_("POSIX"));
|
||||||
|
|
||||||
|
if ((prop = node.property (X_("bypassed"))) != 0) {
|
||||||
|
set_bypassed (string_is_affirmative (prop->value ()));
|
||||||
|
}
|
||||||
|
|
||||||
_panner.reset ();
|
_panner.reset ();
|
||||||
|
|
||||||
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
|
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
|
||||||
|
|
@ -326,3 +327,19 @@ PannerShell::run (BufferSet& inbufs, BufferSet& outbufs, framepos_t start_frame,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PannerShell::set_bypassed (bool yn)
|
||||||
|
{
|
||||||
|
if (yn == _bypassed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_bypassed = yn;
|
||||||
|
Changed (); /* EMIT SIGNAL */
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
PannerShell::bypassed () const
|
||||||
|
{
|
||||||
|
return _bypassed;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -323,26 +323,13 @@ Panner1in2out::factory (boost::shared_ptr<Pannable> p, boost::shared_ptr<Speaker
|
||||||
}
|
}
|
||||||
|
|
||||||
XMLNode&
|
XMLNode&
|
||||||
Panner1in2out::get_state (void)
|
Panner1in2out::get_state ()
|
||||||
{
|
|
||||||
return state (true);
|
|
||||||
}
|
|
||||||
|
|
||||||
XMLNode&
|
|
||||||
Panner1in2out::state (bool /*full_state*/)
|
|
||||||
{
|
{
|
||||||
XMLNode& root (Panner::get_state ());
|
XMLNode& root (Panner::get_state ());
|
||||||
root.add_property (X_("type"), _descriptor.name);
|
root.add_property (X_("type"), _descriptor.name);
|
||||||
return root;
|
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
|
Panner1in2out::what_can_be_automated() const
|
||||||
|
|
|
||||||
|
|
@ -56,9 +56,7 @@ class Panner1in2out : public Panner
|
||||||
std::string describe_parameter (Evoral::Parameter);
|
std::string describe_parameter (Evoral::Parameter);
|
||||||
std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
|
std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
|
||||||
|
|
||||||
XMLNode& state (bool full_state);
|
XMLNode& get_state ();
|
||||||
XMLNode& get_state (void);
|
|
||||||
int set_state (const XMLNode&, int version);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
float left;
|
float left;
|
||||||
|
|
|
||||||
|
|
@ -435,27 +435,13 @@ Panner2in2out::factory (boost::shared_ptr<Pannable> p, boost::shared_ptr<Speaker
|
||||||
}
|
}
|
||||||
|
|
||||||
XMLNode&
|
XMLNode&
|
||||||
Panner2in2out::get_state (void)
|
Panner2in2out::get_state ()
|
||||||
{
|
|
||||||
return state (true);
|
|
||||||
}
|
|
||||||
|
|
||||||
XMLNode&
|
|
||||||
Panner2in2out::state (bool /*full_state*/)
|
|
||||||
{
|
{
|
||||||
XMLNode& root (Panner::get_state ());
|
XMLNode& root (Panner::get_state ());
|
||||||
root.add_property (X_("type"), _descriptor.name);
|
root.add_property (X_("type"), _descriptor.name);
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
Panner2in2out::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>
|
||||||
Panner2in2out::what_can_be_automated() const
|
Panner2in2out::what_can_be_automated() const
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -62,9 +62,7 @@ class Panner2in2out : public Panner
|
||||||
std::string describe_parameter (Evoral::Parameter);
|
std::string describe_parameter (Evoral::Parameter);
|
||||||
std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
|
std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
|
||||||
|
|
||||||
XMLNode& state (bool full_state);
|
XMLNode& get_state ();
|
||||||
XMLNode& get_state (void);
|
|
||||||
int set_state (const XMLNode&, int version);
|
|
||||||
|
|
||||||
void update ();
|
void update ();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -370,24 +370,12 @@ VBAPanner::distribute_one_automated (AudioBuffer& src, BufferSet& obufs,
|
||||||
|
|
||||||
XMLNode&
|
XMLNode&
|
||||||
VBAPanner::get_state ()
|
VBAPanner::get_state ()
|
||||||
{
|
|
||||||
return state (true);
|
|
||||||
}
|
|
||||||
|
|
||||||
XMLNode&
|
|
||||||
VBAPanner::state (bool full_state)
|
|
||||||
{
|
{
|
||||||
XMLNode& node (Panner::get_state());
|
XMLNode& node (Panner::get_state());
|
||||||
node.add_property (X_("type"), _descriptor.name);
|
node.add_property (X_("type"), _descriptor.name);
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
VBAPanner::set_state (const XMLNode& node, int /*version*/)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Panner*
|
Panner*
|
||||||
VBAPanner::factory (boost::shared_ptr<Pannable> p, boost::shared_ptr<Speakers> s)
|
VBAPanner::factory (boost::shared_ptr<Pannable> p, boost::shared_ptr<Speakers> s)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -58,9 +58,7 @@ public:
|
||||||
std::string describe_parameter (Evoral::Parameter);
|
std::string describe_parameter (Evoral::Parameter);
|
||||||
std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
|
std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
|
||||||
|
|
||||||
XMLNode& state (bool full_state);
|
|
||||||
XMLNode& get_state ();
|
XMLNode& get_state ();
|
||||||
int set_state (const XMLNode&, int version);
|
|
||||||
|
|
||||||
PBD::AngularVector signal_position (uint32_t n) const;
|
PBD::AngularVector signal_position (uint32_t n) const;
|
||||||
boost::shared_ptr<Speakers> get_speakers() const;
|
boost::shared_ptr<Speakers> get_speakers() const;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue