Skip to content

Commit 6895a7d

Browse files
committed
Ensure Channel Map settings persist when input changes
1 parent fc47d48 commit 6895a7d

3 files changed

Lines changed: 112 additions & 6 deletions

File tree

Plugins/ChannelMappingNode/ChannelMappingEditor.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,10 @@ void ChannelMappingEditor::mouseDown(const MouseEvent& e)
251251

252252
displayString += String(button->getChannelNum());
253253

254+
menu.addItem(2, // index
255+
"Reset stream settings", // message
256+
true); // isSelectable
257+
254258
menu.addItem(1, // index
255259
displayString, // message
256260
true); // isSelectable
@@ -259,11 +263,25 @@ void ChannelMappingEditor::mouseDown(const MouseEvent& e)
259263

260264
PopupMenu::dismissAllActiveMenus();
261265

262-
if (result > 0)
266+
if (result == 1)
263267
{
264268
processor->setChannelEnabled(getCurrentStream(), buttonIndex, !isActive);
265269
CoreServices::updateSignalChain(this);
266270
}
271+
else if (result == 2)
272+
{
273+
bool response = AlertWindow::showOkCancelBox(AlertWindow::NoIcon,
274+
"Reset Channel Map",
275+
"Are you sure you want to reset the channel map for the current stream?",
276+
"OK", "Cancel", 0, 0);
277+
278+
if (response)
279+
{
280+
processor->resetStream(getCurrentStream());
281+
CoreServices::updateSignalChain(this);
282+
}
283+
284+
}
267285

268286
}
269287

Plugins/ChannelMappingNode/ChannelMappingNode.cpp

Lines changed: 72 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ void ChannelMapSettings::updateNumChannels(int newChannelCount)
5959
isEnabled.add(true);
6060
}
6161

62+
numChannels = newChannelCount;
63+
6264
}
6365

6466
void ChannelMapSettings::toXml(XmlElement* xml)
@@ -108,6 +110,27 @@ void ChannelMapSettings::fromJson(File filename)
108110
PrbFormat::read(filename, this);
109111
}
110112

113+
void ChannelMapSettings::setStream(const DataStream* stream)
114+
{
115+
numChannels = stream->getChannelCount();
116+
sampleRate = stream->getSampleRate();
117+
streamName = stream->getName();
118+
streamId = stream->getStreamId();
119+
sourceNodeId = stream->getSourceNodeId();
120+
}
121+
122+
void ChannelMapSettings::reset()
123+
{
124+
channelOrder.clear();
125+
isEnabled.clear();
126+
127+
for (int i = 0; i < numChannels; i++)
128+
{
129+
channelOrder.add(i);
130+
isEnabled.add(true);
131+
}
132+
}
133+
111134
// =====================================================
112135

113136
ChannelMappingNode::ChannelMappingNode()
@@ -124,14 +147,54 @@ AudioProcessorEditor* ChannelMappingNode::createEditor()
124147
}
125148

126149

150+
ChannelMapSettings* ChannelMappingNode::findMatchingStreamSettings(ChannelMapSettings* s)
151+
{
152+
for (auto streamId : previousStreamIds)
153+
{
154+
if ((s->sourceNodeId == settings[streamId]->sourceNodeId) &&
155+
(s->streamName == settings[streamId]->streamName))
156+
{
157+
// perfect match
158+
return settings[streamId];
159+
}
160+
161+
if ((s->streamName == settings[streamId]->streamName))
162+
{
163+
// matching name
164+
return settings[streamId];
165+
}
166+
}
167+
168+
return nullptr;
169+
}
170+
127171
void ChannelMappingNode::updateSettings()
128172
{
129173

130174
settings.update(getDataStreams());
131175

132176
for (auto stream : getDataStreams())
133177
{
134-
settings[stream->getStreamId()]->updateNumChannels(stream->getChannelCount());
178+
179+
const uint16 streamId = stream->getStreamId();
180+
181+
if ( settings[streamId]->sourceNodeId == -1) // no stream applied yet
182+
{
183+
settings[streamId]->setStream(stream);
184+
185+
ChannelMapSettings* s = findMatchingStreamSettings(settings[streamId]);
186+
187+
if (s != nullptr)
188+
{
189+
settings[streamId]->channelOrder = s->channelOrder;
190+
settings[streamId]->isEnabled = s->isEnabled;
191+
}
192+
193+
previousStreamIds.add(streamId);
194+
195+
}
196+
197+
settings[streamId]->updateNumChannels(stream->getChannelCount());
135198

136199
if ((*stream)["enable_stream"])
137200
{
@@ -140,19 +203,19 @@ void ChannelMappingNode::updateSettings()
140203
for (int ch = 0; ch < stream->getChannelCount(); ch++)
141204
{
142205

143-
int localIndex = settings[stream->getStreamId()]->channelOrder[ch];
206+
int localIndex = settings[streamId]->channelOrder[ch];
144207
Array<ContinuousChannel*> channelsForStream = stream->getContinuousChannels();
145208

146209
int globalIndex = channelsForStream[localIndex]->getGlobalIndex();
147210

148-
if (settings[stream->getStreamId()]->isEnabled[ch])
211+
if (settings[streamId]->isEnabled[ch])
149212
{
150213
newChannelOrder.add(channelsForStream[localIndex]);
151214
}
152215

153216
}
154217

155-
DataStream* currentStream = getDataStream(stream->getStreamId());
218+
DataStream* currentStream = getDataStream(streamId);
156219

157220
currentStream->clearContinuousChannels();
158221

@@ -164,7 +227,6 @@ void ChannelMappingNode::updateSettings()
164227

165228
}
166229

167-
168230
void ChannelMappingNode::setChannelEnabled(uint16 streamId, int channelNum, int isEnabled)
169231
{
170232
settings[streamId]->isEnabled.set(channelNum, isEnabled);
@@ -175,6 +237,11 @@ void ChannelMappingNode::setChannelOrder(uint16 streamId, Array<int> order)
175237
settings[streamId]->channelOrder = order;
176238
}
177239

240+
void ChannelMappingNode::resetStream(uint16 streamId)
241+
{
242+
settings[streamId]->reset();
243+
}
244+
178245
Array<int> ChannelMappingNode::getChannelOrder(uint16 streamId)
179246
{
180247
return settings[streamId]->channelOrder;

Plugins/ChannelMappingNode/ChannelMappingNode.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,18 @@ class ChannelMapSettings
5757
/** Reads settings from JSON (.prb format)*/
5858
void fromJson(File file);
5959

60+
/** Sets the stream info */
61+
void setStream(const DataStream* stream);
62+
63+
/** Reset to defaults */
64+
void reset();
65+
66+
int sourceNodeId = -1;
67+
String streamName = "";
68+
int numChannels = 0;
69+
float sampleRate = 0.0f;
70+
uint16 streamId = 0;
71+
6072
};
6173

6274
/**
@@ -92,6 +104,9 @@ class ChannelMappingNode : public GenericProcessor
92104
/** Sets the channel order*/
93105
void setChannelOrder(uint16 streamId, Array<int> order);
94106

107+
/** Resets to default settings*/
108+
void resetStream(uint16 streamId);
109+
95110
/** Gets the channel order */
96111
Array<int> getChannelOrder(uint16 streamId);
97112

@@ -112,9 +127,15 @@ class ChannelMappingNode : public GenericProcessor
112127

113128
private:
114129

130+
/** Find previously saved settings from similar streams */
131+
ChannelMapSettings* findMatchingStreamSettings(ChannelMapSettings* s);
132+
115133
/** Holds settings for individual streams*/
116134
StreamSettings<ChannelMapSettings> settings;
117135

136+
/** Previous stream IDs*/
137+
Array<uint16> previousStreamIds;
138+
118139
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChannelMappingNode);
119140
};
120141

0 commit comments

Comments
 (0)