Expose overall monitor-processor state

This commit is contained in:
Robin Gareus
2016-01-08 14:20:58 +01:00
parent 559649c338
commit 24344d5d11
3 changed files with 67 additions and 26 deletions

View File

@@ -154,6 +154,8 @@ public:
bool dim_all () const;
bool mono () const;
bool monitor_active () const { return _monitor_active; }
PBD::Signal0<void> Changed;
boost::shared_ptr<PBD::Controllable> channel_cut_control (uint32_t) const;
@@ -198,6 +200,8 @@ private:
std::vector<ChannelRecord*> _channels;
uint32_t solo_cnt;
bool _monitor_active;
/* pointers - created first, but managed by boost::shared_ptr<> */
@@ -224,6 +228,7 @@ private:
MPControl<volatile gain_t>& _solo_boost_level;
void allocate_channels (uint32_t);
void update_monitor_state ();
};
} /* namespace */

View File

@@ -57,11 +57,13 @@
#include "ardour/chan_count.h"
#include "ardour/delivery.h"
#include "ardour/interthread_info.h"
#include "ardour/location.h"
#include "ardour/monitor_processor.h"
#include "ardour/rc_configuration.h"
#include "ardour/session_configuration.h"
#include "ardour/session_event.h"
#include "ardour/location.h"
#include "ardour/interpolation.h"
#include "ardour/route.h"
#include "ardour/route_graph.h"
@@ -749,6 +751,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
PBD::Signal1<void,bool> SoloActive;
PBD::Signal0<void> SoloChanged;
PBD::Signal0<void> IsolatedChanged;
PBD::Signal0<void> MonitorChanged;
PBD::Signal0<void> session_routes_reconnected;
@@ -757,6 +760,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
void add_monitor_section ();
void reset_monitor_section ();
void remove_monitor_section ();
bool monitor_active() const { return (_monitor_out && _monitor_out->monitor_control () && _monitor_out->monitor_control ()->monitor_active()); }
boost::shared_ptr<Route> monitor_out() const { return _monitor_out; }
boost::shared_ptr<Route> master_out() const { return _master_out; }

View File

@@ -49,6 +49,7 @@ namespace ARDOUR {
MonitorProcessor::MonitorProcessor (Session& s)
: Processor (s, X_("MonitorOut"))
, solo_cnt (0)
, _monitor_active (false)
, _dim_all_ptr (new MPControl<bool> (false, _("monitor dim"), Controllable::Toggle))
, _cut_all_ptr (new MPControl<bool> (false, _("monitor cut"), Controllable::Toggle))
@@ -218,7 +219,8 @@ MonitorProcessor::set_state (const XMLNode& node, int version)
}
}
return 0;
update_monitor_state ();
return 0;
}
XMLNode&
@@ -363,61 +365,68 @@ MonitorProcessor::can_support_io_configuration (const ChanCount& in, ChanCount&
void
MonitorProcessor::set_polarity (uint32_t chn, bool invert)
{
if (invert) {
_channels[chn]->polarity = -1.0f;
} else {
_channels[chn]->polarity = 1.0f;
}
if (invert) {
_channels[chn]->polarity = -1.0f;
} else {
_channels[chn]->polarity = 1.0f;
}
update_monitor_state ();
}
void
MonitorProcessor::set_dim (uint32_t chn, bool yn)
{
_channels[chn]->dim = yn;
_channels[chn]->dim = yn;
update_monitor_state ();
}
void
MonitorProcessor::set_cut (uint32_t chn, bool yn)
{
if (yn) {
_channels[chn]->cut = GAIN_COEFF_ZERO;
} else {
_channels[chn]->cut = GAIN_COEFF_UNITY;
}
if (yn) {
_channels[chn]->cut = GAIN_COEFF_ZERO;
} else {
_channels[chn]->cut = GAIN_COEFF_UNITY;
}
update_monitor_state ();
}
void
MonitorProcessor::set_solo (uint32_t chn, bool solo)
{
if (solo != _channels[chn]->soloed) {
_channels[chn]->soloed = solo;
if (solo != _channels[chn]->soloed) {
_channels[chn]->soloed = solo;
if (solo) {
solo_cnt++;
} else {
if (solo_cnt > 0) {
solo_cnt--;
}
}
}
if (solo) {
solo_cnt++;
} else {
if (solo_cnt > 0) {
solo_cnt--;
}
}
}
update_monitor_state ();
}
void
MonitorProcessor::set_mono (bool yn)
{
_mono = yn;
_mono = yn;
update_monitor_state ();
}
void
MonitorProcessor::set_cut_all (bool yn)
{
_cut_all = yn;
_cut_all = yn;
update_monitor_state ();
}
void
MonitorProcessor::set_dim_all (bool yn)
{
_dim_all = yn;
_dim_all = yn;
update_monitor_state ();
}
bool
@@ -470,6 +479,29 @@ MonitorProcessor::cut_all () const
return _cut_all;
}
void
MonitorProcessor::update_monitor_state ()
{
bool en = false;
if (_cut_all || _dim_all || _mono) {
en = true;
}
const uint32_t nchans = _channels.size();
for (uint32_t i = 0; i < nchans && !en; ++i) {
if (cut (i) || dimmed (i) || soloed (i) || inverted (i)) {
en = true;
break;
}
}
if (_monitor_active != en) {
_monitor_active = en;
_session.MonitorChanged();
}
}
boost::shared_ptr<Controllable>
MonitorProcessor::channel_cut_control (uint32_t chn) const
{