add a bit of state to VCAManager
[ardour.git] / libs / ardour / vca_manager.cc
1 /*
2   Copyright (C) 2016 Paul Davis
3
4   This program is free software; you can redistribute it and/or modify
5   it under the terms of the GNU General Public License as published by
6   the Free Software Foundation; either version 2 of the License, or
7   (at your option) any later version.
8
9   This program is distributed in the hope that it will be useful,
10   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   GNU General Public License for more details.
13
14   You should have received a copy of the GNU General Public License
15   along with this program; if not, write to the Free Software
16   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #include "pbd/convert.h"
21 #include "pbd/replace_all.h"
22
23 #include "ardour/vca.h"
24 #include "ardour/vca_manager.h"
25
26 #include "i18n.h"
27
28 using namespace ARDOUR;
29 using namespace Glib::Threads;
30 using std::string;
31
32 string VCAManager::xml_node_name (X_("VCAManager"));
33
34 VCAManager::VCAManager (Session& s)
35         : SessionHandleRef (s)
36 {
37 }
38
39 VCAManager::~VCAManager ()
40 {
41         Mutex::Lock lm (lock);
42         _vcas.clear ();
43 }
44
45 VCAManager::VCAS
46 VCAManager::vcas () const
47 {
48         Mutex::Lock lm (lock);
49         return _vcas;
50 }
51
52 int
53 VCAManager::create_vca (uint32_t howmany, std::string const & name_template)
54 {
55         VCAList vcal;
56
57         {
58                 Mutex::Lock lm (lock);
59
60                 for (uint32_t n = 0; n < howmany; ++n) {
61
62                         int num = VCA::next_vca_number ();
63                         string name = name_template;
64
65                         if (name.find ("%n")) {
66                                 string sn = PBD::to_string (n, std::dec);
67                                 replace_all (name, "%n", sn);
68                         }
69
70                         boost::shared_ptr<VCA> vca = boost::shared_ptr<VCA> (new VCA (_session, name, num));
71
72                         _vcas.push_back (vca);
73                         vcal.push_back (vca);
74                 }
75         }
76
77         VCAAdded (vcal); /* EMIT SIGNAL */
78
79         return 0;
80 }
81
82
83 void
84 VCAManager::remove_vca (boost::shared_ptr<VCA> vca)
85 {
86         {
87                 Mutex::Lock lm (lock);
88                 _vcas.remove (vca);
89         }
90
91         VCAList vcal;
92         vcal.push_back (vca);
93
94         VCARemoved (vcal); /* EMIT SIGNAL */
95 }
96
97 boost::shared_ptr<VCA>
98 VCAManager::vca_by_number (uint32_t n) const
99 {
100         Mutex::Lock lm (lock);
101
102         for (VCAS::const_iterator i = _vcas.begin(); i != _vcas.end(); ++i) {
103                 if ((*i)->number() == n) {
104                         return *i;
105                 }
106         }
107
108         return boost::shared_ptr<VCA>();
109 }
110
111 XMLNode&
112 VCAManager::get_state ()
113 {
114         XMLNode* node = new XMLNode (xml_node_name);
115         return *node;
116 }
117
118 int
119 VCAManager::set_state (XMLNode const& node, int /*version*/)
120 {
121         return 0;
122 }