summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2010-05-17 23:28:13 +0000
committerCarl Hetherington <carl@carlh.net>2010-05-17 23:28:13 +0000
commitf35dc8b35da3dc11cbb1076193657f8335722041 (patch)
treec816fe23d59070e08821dc5e577b6e750af07bb1 /libs/ardour
parent6d9c1201cc6c9adf866fb7769037c79decf2e5b0 (diff)
Remove muting behaviour from the Amp processor. Fix some small
bugs with delivery muting. The upshot being that muting now definitely happens in a channel's deliveries, and not really in the channel strip at all. When the channel is muted, those deliveries described by the MuteMaster settings are muted. Should fix #3141. git-svn-id: svn://localhost/ardour2/branches/3.0@7115 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/amp.cc65
-rw-r--r--libs/ardour/ardour/amp.h4
-rw-r--r--libs/ardour/ardour/mute_master.h9
-rw-r--r--libs/ardour/ardour/processor.h5
-rw-r--r--libs/ardour/ardour/route.h5
-rw-r--r--libs/ardour/delivery.cc8
-rw-r--r--libs/ardour/processor.cc6
-rw-r--r--libs/ardour/return.cc3
-rw-r--r--libs/ardour/route.cc32
-rw-r--r--libs/ardour/send.cc2
10 files changed, 63 insertions, 76 deletions
diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc
index 14a3324a18..ceb593f4c3 100644
--- a/libs/ardour/amp.cc
+++ b/libs/ardour/amp.cc
@@ -29,19 +29,17 @@
#include "ardour/configuration.h"
#include "ardour/io.h"
#include "ardour/midi_buffer.h"
-#include "ardour/mute_master.h"
#include "ardour/session.h"
#include "i18n.h"
using namespace ARDOUR;
-Amp::Amp(Session& s, boost::shared_ptr<MuteMaster> mm)
+Amp::Amp (Session& s)
: Processor(s, "Amp")
, _apply_gain(true)
, _apply_gain_automation(false)
, _current_gain(1.0)
- , _mute_master (mm)
{
boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(GainAutomation)));
_gain_control = boost::shared_ptr<GainControl>( new GainControl(X_("gaincontrol"), s, this, Evoral::Parameter(GainAutomation), gl ));
@@ -74,75 +72,28 @@ Amp::configure_io (ChanCount in, ChanCount out)
void
Amp::run (BufferSet& bufs, sframes_t /*start_frame*/, sframes_t /*end_frame*/, nframes_t nframes, bool)
{
- gain_t mute_gain;
-
if (!_active && !_pending_active) {
return;
}
- if (_mute_master) {
- mute_gain = _mute_master->mute_gain_at (MuteMaster::PreFader);
- } else {
- mute_gain = 1.0;
- }
-
if (_apply_gain) {
if (_apply_gain_automation) {
gain_t* gab = _session.gain_automation_buffer ();
- if (mute_gain == 0.0) {
-
- /* absolute mute */
-
- if (_current_gain == 0.0) {
-
- /* already silent */
-
- for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
- i->clear ();
- }
- } else {
-
- /* cut to silence */
-
- Amp::apply_gain (bufs, nframes, _current_gain, 0.0);
- _current_gain = 0.0;
+ for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
+ Sample* const sp = i->data();
+ for (nframes_t nx = 0; nx < nframes; ++nx) {
+ sp[nx] *= gab[nx];
}
-
-
- } else if (mute_gain != 1.0) {
-
- /* mute dimming */
-
- for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
- Sample* const sp = i->data();
- for (nframes_t nx = 0; nx < nframes; ++nx) {
- sp[nx] *= gab[nx] * mute_gain;
- }
- }
-
- _current_gain = gab[nframes-1] * mute_gain;
-
- } else {
-
- /* no mute */
-
- for (BufferSet::audio_iterator i = bufs.audio_begin(); i != bufs.audio_end(); ++i) {
- Sample* const sp = i->data();
- for (nframes_t nx = 0; nx < nframes; ++nx) {
- sp[nx] *= gab[nx];
- }
- }
-
- _current_gain = gab[nframes-1];
}
-
+
+ _current_gain = gab[nframes-1];
} else { /* manual (scalar) gain */
- gain_t dg = _gain_control->user_float() * mute_gain;
+ gain_t const dg = _gain_control->user_float();
if (_current_gain != dg) {
diff --git a/libs/ardour/ardour/amp.h b/libs/ardour/ardour/amp.h
index 4db2292653..c1f6172de1 100644
--- a/libs/ardour/ardour/amp.h
+++ b/libs/ardour/ardour/amp.h
@@ -28,14 +28,13 @@ namespace ARDOUR {
class BufferSet;
class IO;
-class MuteMaster;
/** Applies a declick operation to all audio inputs, passing the same number of
* audio outputs, and passing through any other types unchanged.
*/
class Amp : public Processor {
public:
- Amp(Session& s, boost::shared_ptr<MuteMaster> m);
+ Amp(Session& s);
std::string display_name() const;
@@ -101,7 +100,6 @@ private:
float _current_gain;
boost::shared_ptr<GainControl> _gain_control;
- boost::shared_ptr<MuteMaster> _mute_master;
};
diff --git a/libs/ardour/ardour/mute_master.h b/libs/ardour/ardour/mute_master.h
index 2a90a0284e..c219ce3ec3 100644
--- a/libs/ardour/ardour/mute_master.h
+++ b/libs/ardour/ardour/mute_master.h
@@ -34,11 +34,12 @@ class Session;
class MuteMaster : public SessionHandleRef, public PBD::Stateful
{
public:
+ /** deliveries to mute when the channel is "muted" */
enum MutePoint {
- PreFader = 0x1,
- PostFader = 0x2,
- Listen = 0x4,
- Main = 0x8
+ PreFader = 0x1, ///< mute all pre-fader sends
+ PostFader = 0x2, ///< mute all post-fader sends
+ Listen = 0x4, ///< mute listen out
+ Main = 0x8 ///< mute main out
};
static const MutePoint AllPoints;
diff --git a/libs/ardour/ardour/processor.h b/libs/ardour/ardour/processor.h
index 4e13338ac1..ea468f92be 100644
--- a/libs/ardour/ardour/processor.h
+++ b/libs/ardour/ardour/processor.h
@@ -97,6 +97,8 @@ class Processor : public SessionObject, public AutomatableControls, public Laten
void *get_gui () const { return _gui; }
void set_gui (void *p) { _gui = p; }
+ void set_pre_fader (bool);
+
PBD::Signal0<void> ActiveChanged;
PBD::Signal2<void,ChanCount,ChanCount> ConfigurationChanged;
@@ -108,7 +110,8 @@ protected:
ChanCount _configured_input;
ChanCount _configured_output;
void* _gui; /* generic, we don't know or care what this is */
- bool _display_to_user;
+ bool _display_to_user;
+ bool _pre_fader;
private:
int set_state_2X (const XMLNode&, int version);
diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h
index e371059a74..44ee04781a 100644
--- a/libs/ardour/ardour/route.h
+++ b/libs/ardour/ardour/route.h
@@ -123,7 +123,7 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou
void inc_gain (gain_t delta, void *src);
void set_mute_points (MuteMaster::MutePoint);
- MuteMaster::MutePoint mute_points() const { return _mute_points; }
+ MuteMaster::MutePoint mute_points () const;
bool muted () const;
void set_mute (bool yn, void* src);
@@ -423,7 +423,6 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou
boost::shared_ptr<SoloControllable> _solo_control;
boost::shared_ptr<MuteControllable> _mute_control;
boost::shared_ptr<MuteMaster> _mute_master;
- MuteMaster::MutePoint _mute_points;
std::string _comment;
bool _have_internal_generator;
@@ -477,6 +476,8 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou
void set_self_solo (bool yn);
void set_mute_master_solo ();
+
+ void set_processor_positions ();
};
} // namespace ARDOUR
diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc
index 5861e5ea2c..7fa6138ab5 100644
--- a/libs/ardour/delivery.cc
+++ b/libs/ardour/delivery.cc
@@ -495,12 +495,14 @@ Delivery::target_gain ()
case Send:
case Insert:
case Aux:
- /* XXX FIX ME this is wrong, we need per-delivery muting */
- mp = MuteMaster::PreFader;
+ if (_pre_fader) {
+ mp = MuteMaster::PreFader;
+ } else {
+ mp = MuteMaster::PostFader;
+ }
break;
}
- // cerr << name() << ' ';
desired_gain = _mute_master->mute_gain_at (mp);
if (_role == Listen && _session.monitor_out() && !_session.listening()) {
diff --git a/libs/ardour/processor.cc b/libs/ardour/processor.cc
index 2b12414eec..47211567bf 100644
--- a/libs/ardour/processor.cc
+++ b/libs/ardour/processor.cc
@@ -68,6 +68,7 @@ Processor::Processor(Session& session, const string& name)
, _configured(false)
, _gui(0)
, _display_to_user (true)
+ , _pre_fader (false)
{
}
@@ -263,3 +264,8 @@ Processor::set_display_to_user (bool yn)
_display_to_user = yn;
}
+void
+Processor::set_pre_fader (bool p)
+{
+ _pre_fader = p;
+}
diff --git a/libs/ardour/return.cc b/libs/ardour/return.cc
index f61dda5dd1..10879d7722 100644
--- a/libs/ardour/return.cc
+++ b/libs/ardour/return.cc
@@ -30,6 +30,7 @@
#include "ardour/port.h"
#include "ardour/return.h"
#include "ardour/session.h"
+#include "ardour/mute_master.h"
#include "i18n.h"
@@ -43,7 +44,7 @@ Return::Return (Session& s, bool internal)
{
/* never muted */
- _amp.reset (new Amp (_session, boost::shared_ptr<MuteMaster>()));
+ _amp.reset (new Amp (_session));
_meter.reset (new PeakMeter (_session));
}
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc
index bf0b4db5b5..c0edb1a996 100644
--- a/libs/ardour/route.cc
+++ b/libs/ardour/route.cc
@@ -90,7 +90,6 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type)
, _solo_control (new SoloControllable (X_("solo"), *this))
, _mute_control (new MuteControllable (X_("mute"), *this))
, _mute_master (new MuteMaster (sess, name))
- , _mute_points (MuteMaster::AllPoints)
, _have_internal_generator (false)
, _solo_safe (false)
, _default_type (default_type)
@@ -122,7 +121,7 @@ Route::init ()
/* add amp processor */
- _amp.reset (new Amp (_session, _mute_master));
+ _amp.reset (new Amp (_session));
add_processor (_amp, PostFader);
/* add standard processors: meter, main outs, monitor out */
@@ -746,8 +745,7 @@ Route::solo_isolated () const
void
Route::set_mute_points (MuteMaster::MutePoint mp)
{
- _mute_points = mp;
- _mute_master->set_mute_points (MuteMaster::AllPoints);
+ _mute_master->set_mute_points (mp);
mute_points_changed (); /* EMIT SIGNAL */
if (_mute_master->muted()) {
@@ -891,6 +889,7 @@ Route::add_processor (boost::shared_ptr<Processor> processor, ProcessorList::ite
}
processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+ set_processor_positions ();
return 0;
}
@@ -1035,6 +1034,7 @@ Route::add_processors (const ProcessorList& others, ProcessorList::iterator iter
}
processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+ set_processor_positions ();
return 0;
}
@@ -1235,6 +1235,7 @@ Route::clear_processors (Placement p)
processor_max_streams.reset();
_have_internal_generator = false;
processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+ set_processor_positions ();
if (!already_deleting) {
_session.clear_deletion_in_progress();
@@ -1326,6 +1327,7 @@ Route::remove_processor (boost::shared_ptr<Processor> processor, ProcessorStream
processor->drop_references ();
processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+ set_processor_positions ();
return 0;
}
@@ -1417,6 +1419,7 @@ Route::remove_processors (const ProcessorList& to_be_deleted, ProcessorStreams*
}
processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+ set_processor_positions ();
return 0;
}
@@ -1662,6 +1665,7 @@ Route::reorder_processors (const ProcessorList& new_order, ProcessorStreams* err
if (true) {
processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
+ set_processor_positions ();
}
return 0;
@@ -2309,6 +2313,7 @@ Route::set_processor_state (const XMLNode& node)
}
processors_changed (RouteProcessorChange ());
+ set_processor_positions ();
}
void
@@ -3353,3 +3358,22 @@ Route::has_io_processor_named (const string& name)
return false;
}
+MuteMaster::MutePoint
+Route::mute_points () const
+{
+ return _mute_master->mute_points ();
+}
+
+void
+Route::set_processor_positions ()
+{
+ Glib::RWLock::ReaderLock lm (_processor_lock);
+
+ bool had_amp = false;
+ for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
+ (*i)->set_pre_fader (!had_amp);
+ if (boost::dynamic_pointer_cast<Amp> (*i)) {
+ had_amp = true;
+ }
+ }
+}
diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc
index 41dd3e8f86..4624006ca9 100644
--- a/libs/ardour/send.cc
+++ b/libs/ardour/send.cc
@@ -42,7 +42,7 @@ Send::Send (Session& s, boost::shared_ptr<MuteMaster> mm, Role r)
: Delivery (s, mm, string_compose (_("send %1"), (_bitslot = s.next_send_id()) + 1), r)
, _metering (false)
{
- _amp.reset (new Amp (_session, _mute_master));
+ _amp.reset (new Amp (_session));
_meter.reset (new PeakMeter (_session));
}