summaryrefslogtreecommitdiff
path: root/libs/ardour/ardour/monitor_processor.h
blob: eb7ab87aa1019e80de1803cd5605b286f4e51737 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*
    Copyright (C) 2010 Paul Davis

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

*/

#ifndef __ardour_monitor_processor_h__
#define __ardour_monitor_processor_h__

#include <vector>

#include "pbd/signals.h"

#include "ardour/types.h"
#include "ardour/processor.h"

class XMLNode;

namespace ARDOUR {

class Session;

class MonitorProcessor : public Processor
{
  public:
        MonitorProcessor (Session&);
        MonitorProcessor (Session&, const XMLNode& name);

        bool display_to_user() const;

	void run (BufferSet& /*bufs*/, sframes_t /*start_frame*/, sframes_t /*end_frame*/, nframes_t /*nframes*/, bool /*result_required*/);

        XMLNode& state (bool full);
        int set_state (const XMLNode&, int /* version */);

        bool configure_io (ChanCount in, ChanCount out);
	bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const;

        void set_cut_all (bool);
        void set_dim_all (bool);
        void set_polarity (uint32_t, bool invert);
        void set_cut (uint32_t, bool cut);
        void set_dim (uint32_t, bool dim);
        void set_solo (uint32_t, bool);
        void set_mono (bool);

        void set_dim_level (gain_t);
        void set_solo_boost_level (gain_t);

        gain_t dim_level() const { return _dim_level; }
        gain_t solo_boost_level() const { return _solo_boost_level; }

        bool dimmed (uint32_t chn) const;
        bool soloed (uint32_t chn) const;
        bool inverted (uint32_t chn) const;
        bool cut (uint32_t chn) const;
        bool cut_all () const;
        bool dim_all () const;
        bool mono () const;

        PBD::Signal0<void> Changed;
        
  private:
        std::vector<gain_t>  current_gain;
        std::vector<gain_t> _cut;
        std::vector<bool>   _dim;
        std::vector<gain_t> _polarity;
        std::vector<bool>   _soloed;
        uint32_t             solo_cnt;
        bool                _dim_all;
        bool                _cut_all;
        bool                _mono;
        volatile gain_t     _dim_level;
        volatile gain_t     _solo_boost_level;
};

} /* namespace */

#endif /* __ardour_monitor_processor_h__ */