|  | @@ -193,15 +193,26 @@ struct Streams : Module { | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | void toggleLink() { |  |  |  | 
														
													
														
															
																|  |  |  |  |  | void setLinked(bool linked) { | 
														
													
														
															
																|  |  | streams::UiSettings settings = engines[0].ui_settings(); |  |  | streams::UiSettings settings = engines[0].ui_settings(); | 
														
													
														
															
																|  |  | settings.linked ^= 1; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | settings.linked = linked; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | for (int c = 0; c < PORT_MAX_CHANNELS; c++) { |  |  | for (int c = 0; c < PORT_MAX_CHANNELS; c++) { | 
														
													
														
															
																|  |  | engines[c].ApplySettings(settings); |  |  | engines[c].ApplySettings(settings); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | int getChannelMode(int channel) { | 
														
													
														
															
																|  |  |  |  |  | streams::UiSettings settings = engines[0].ui_settings(); | 
														
													
														
															
																|  |  |  |  |  | // Search channel mode index in table | 
														
													
														
															
																|  |  |  |  |  | for (int i = 0; i < streams::kNumChannelModes; i++) { | 
														
													
														
															
																|  |  |  |  |  | if (settings.function[channel] == streams::kChannelModeTable[i].function | 
														
													
														
															
																|  |  |  |  |  | && settings.alternate[channel] == streams::kChannelModeTable[i].alternate) | 
														
													
														
															
																|  |  |  |  |  | return i; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | return -1; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  | void setChannelMode(int channel, int mode_id) { |  |  | void setChannelMode(int channel, int mode_id) { | 
														
													
														
															
																|  |  | streams::UiSettings settings = engines[0].ui_settings(); |  |  | streams::UiSettings settings = engines[0].ui_settings(); | 
														
													
														
															
																|  |  | settings.function[channel] = streams::kChannelModeTable[mode_id].function; |  |  | settings.function[channel] = streams::kChannelModeTable[mode_id].function; | 
														
													
												
													
														
															
																|  | @@ -326,6 +337,7 @@ struct Streams : Module { | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | }; |  |  | }; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  | struct StreamsWidget : ModuleWidget { |  |  | struct StreamsWidget : ModuleWidget { | 
														
													
														
															
																|  |  | StreamsWidget(Streams* module) { |  |  | StreamsWidget(Streams* module) { | 
														
													
														
															
																|  |  | setModule(module); |  |  | setModule(module); | 
														
													
												
													
														
															
																|  | @@ -373,72 +385,32 @@ struct StreamsWidget : ModuleWidget { | 
														
													
														
															
																|  |  | void appendContextMenu(Menu* menu) override { |  |  | void appendContextMenu(Menu* menu) override { | 
														
													
														
															
																|  |  | Streams* module = dynamic_cast<Streams*>(this->module); |  |  | Streams* module = dynamic_cast<Streams*>(this->module); | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | struct LinkItem : MenuItem { |  |  |  | 
														
													
														
															
																|  |  | Streams* module; |  |  |  | 
														
													
														
															
																|  |  | void onAction(const event::Action& e) override { |  |  |  | 
														
													
														
															
																|  |  | module->toggleLink(); |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  | }; |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  | struct ChannelModeItem : MenuItem { |  |  |  | 
														
													
														
															
																|  |  | Streams* module; |  |  |  | 
														
													
														
															
																|  |  | int channel; |  |  |  | 
														
													
														
															
																|  |  | int mode; |  |  |  | 
														
													
														
															
																|  |  | void onAction(const event::Action& e) override { |  |  |  | 
														
													
														
															
																|  |  | module->setChannelMode(channel, mode); |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  | }; |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  | struct MonitorModeItem : MenuItem { |  |  |  | 
														
													
														
															
																|  |  | Streams* module; |  |  |  | 
														
													
														
															
																|  |  | int mode; |  |  |  | 
														
													
														
															
																|  |  | void onAction(const event::Action& e) override { |  |  |  | 
														
													
														
															
																|  |  | module->setMonitorMode(mode); |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  | }; |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  | menu->addChild(new MenuSeparator); |  |  | menu->addChild(new MenuSeparator); | 
														
													
														
															
																|  |  | LinkItem* linkItem = createMenuItem<LinkItem>( |  |  |  | 
														
													
														
															
																|  |  | "Link channels", CHECKMARK(module->linked())); |  |  |  | 
														
													
														
															
																|  |  | linkItem->module = module; |  |  |  | 
														
													
														
															
																|  |  | menu->addChild(linkItem); |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | menu->addChild(new MenuSeparator); |  |  |  | 
														
													
														
															
																|  |  | menu->addChild(createMenuLabel("Channel 1")); |  |  |  | 
														
													
														
															
																|  |  | for (int i = 0; i < streams::kNumChannelModes; i++) { |  |  |  | 
														
													
														
															
																|  |  | auto modeItem = createMenuItem<ChannelModeItem>( |  |  |  | 
														
													
														
															
																|  |  | streams::kChannelModeTable[i].label, CHECKMARK( |  |  |  | 
														
													
														
															
																|  |  | module->function(0) == streams::kChannelModeTable[i].function && |  |  |  | 
														
													
														
															
																|  |  | module->alternate(0) == streams::kChannelModeTable[i].alternate)); |  |  |  | 
														
													
														
															
																|  |  | modeItem->module = module; |  |  |  | 
														
													
														
															
																|  |  | modeItem->channel = 0; |  |  |  | 
														
													
														
															
																|  |  | modeItem->mode = i; |  |  |  | 
														
													
														
															
																|  |  | menu->addChild(modeItem); |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  |  |  |  | menu->addChild(createBoolMenuItem("Link channels", | 
														
													
														
															
																|  |  |  |  |  | [=]() {return module->linked();}, | 
														
													
														
															
																|  |  |  |  |  | [=](bool val) {module->setLinked(val);} | 
														
													
														
															
																|  |  |  |  |  | )); | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | menu->addChild(new MenuSeparator); |  |  |  | 
														
													
														
															
																|  |  | menu->addChild(createMenuLabel("Channel 2")); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | std::vector<std::string> modeLabels; | 
														
													
														
															
																|  |  | for (int i = 0; i < streams::kNumChannelModes; i++) { |  |  | for (int i = 0; i < streams::kNumChannelModes; i++) { | 
														
													
														
															
																|  |  | auto modeItem = createMenuItem<ChannelModeItem>( |  |  |  | 
														
													
														
															
																|  |  | streams::kChannelModeTable[i].label, CHECKMARK( |  |  |  | 
														
													
														
															
																|  |  | module->function(1) == streams::kChannelModeTable[i].function && |  |  |  | 
														
													
														
															
																|  |  | module->alternate(1) == streams::kChannelModeTable[i].alternate)); |  |  |  | 
														
													
														
															
																|  |  | modeItem->module = module; |  |  |  | 
														
													
														
															
																|  |  | modeItem->channel = 1; |  |  |  | 
														
													
														
															
																|  |  | modeItem->mode = i; |  |  |  | 
														
													
														
															
																|  |  | menu->addChild(modeItem); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | modeLabels.push_back(streams::kChannelModeTable[i].label); | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | for (int c = 0; c < 2; c++) { | 
														
													
														
															
																|  |  |  |  |  | menu->addChild(createIndexSubmenuItem(string::f("Channel %d mode", c + 1), modeLabels, | 
														
													
														
															
																|  |  |  |  |  | [=]() {return module->getChannelMode(c);}, | 
														
													
														
															
																|  |  |  |  |  | [=](int index) {module->setChannelMode(c, index);} | 
														
													
														
															
																|  |  |  |  |  | )); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | menu->addChild(new MenuSeparator); |  |  |  | 
														
													
														
															
																|  |  | menu->addChild(createMenuLabel("Meter")); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | std::vector<std::string> meterLabels; | 
														
													
														
															
																|  |  | for (int i = 0; i < streams::kNumMonitorModes; i++) { |  |  | for (int i = 0; i < streams::kNumMonitorModes; i++) { | 
														
													
														
															
																|  |  | auto modeItem = createMenuItem<MonitorModeItem>( |  |  |  | 
														
													
														
															
																|  |  | streams::kMonitorModeTable[i].label, CHECKMARK( |  |  |  | 
														
													
														
															
																|  |  | module->monitorMode() == streams::kMonitorModeTable[i].mode)); |  |  |  | 
														
													
														
															
																|  |  | modeItem->module = module; |  |  |  | 
														
													
														
															
																|  |  | modeItem->mode = i; |  |  |  | 
														
													
														
															
																|  |  | menu->addChild(modeItem); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | meterLabels.push_back(streams::kMonitorModeTable[i].label); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  |  |  |  | menu->addChild(createIndexSubmenuItem("Meter", meterLabels, | 
														
													
														
															
																|  |  |  |  |  | [=]() {return module->monitorMode();}, | 
														
													
														
															
																|  |  |  |  |  | [=](int index) {module->setMonitorMode(index);} | 
														
													
														
															
																|  |  |  |  |  | )); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | }; |  |  | }; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | 
 |