Publish licenses to website.
This commit is contained in:
+7
-1
@@ -17,6 +17,7 @@
|
||||
"@types/react-dom": "^17.0.8",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2",
|
||||
"react-remark": "^2.1.0",
|
||||
"react-scripts": "5.0.0",
|
||||
"react-virtualized-auto-sizer": "^1.0.6",
|
||||
"react-window": "^1.8.6",
|
||||
@@ -33,7 +34,12 @@
|
||||
"extends": [
|
||||
"react-app",
|
||||
"react-app/jest"
|
||||
]
|
||||
],
|
||||
"rules": {
|
||||
"eqeqeq": 2,
|
||||
"no-unused-expressions": 2,
|
||||
"@typescript-eslint/no-unused-vars": 2
|
||||
}
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.3 KiB |
@@ -207,7 +207,7 @@ const FilePropertyControl =
|
||||
<Typography variant="caption" display="block" noWrap style={{
|
||||
width: "100%",
|
||||
textAlign: "start"
|
||||
}}> {fileProperty.name}</Typography>
|
||||
}}> {fileProperty.label}</Typography>
|
||||
</div>
|
||||
{/* CONTROL SECTION */}
|
||||
|
||||
|
||||
@@ -153,9 +153,12 @@ export default class FilePropertyDialog extends ResizeResponsiveComponent<FilePr
|
||||
return hasSelection;
|
||||
}
|
||||
|
||||
onSelect(selectedFile: string) {
|
||||
onSelectValue(selectedFile: string) {
|
||||
this.setState({ selectedFile: selectedFile, hasSelection: this.isFileInList(this.state.files, selectedFile) })
|
||||
}
|
||||
onDoubleClickValue(selectedFile: string) {
|
||||
this.props.onOk(this.props.fileProperty,selectedFile);
|
||||
}
|
||||
|
||||
handleDelete() {
|
||||
this.setState({openConfirmDeleteDialog: true});
|
||||
@@ -216,7 +219,7 @@ export default class FilePropertyDialog extends ResizeResponsiveComponent<FilePr
|
||||
>
|
||||
<ArrowBackIcon fontSize="small" style={{ opacity: "0.6" }} />
|
||||
</IconButton>
|
||||
<Typography display="inline" >{this.props.fileProperty.name}</Typography>
|
||||
<Typography display="inline" >{this.props.fileProperty.label}</Typography>
|
||||
</div>
|
||||
</DialogTitle>
|
||||
<div style={{ flex: "0 0 auto", height: "1px", background: "rgba(0,0,0,0.2" }}> </div>
|
||||
@@ -230,7 +233,7 @@ export default class FilePropertyDialog extends ResizeResponsiveComponent<FilePr
|
||||
return (
|
||||
<ButtonBase key={this.mapKey++}
|
||||
style={{ width: "320px", flex: "0 0 48px", position: "relative" }}
|
||||
onClick={() => this.onSelect(value)}
|
||||
onClick={() => this.onSelectValue(value)} onDoubleClick={()=> {this.onDoubleClickValue(value);}}
|
||||
>
|
||||
<div style={{ position: "absolute", background: selectBg, width: "100%", height: "100%", borderRadius: 4 }} />
|
||||
<div style={{ display: "flex", flexFlow: "row nowrap", justifyContent: "start", alignItems: "center", width: "100%", height: "100%" }}>
|
||||
|
||||
@@ -432,7 +432,7 @@ export const LoadPluginDialog =
|
||||
if (!uiPlugin) {
|
||||
return (<Fragment />);
|
||||
} else {
|
||||
let stereoIndicator = this.stereo_indicator(uiPlugin)
|
||||
let stereoIndicator = "\u00A0" + this.stereo_indicator(uiPlugin)
|
||||
if (uiPlugin.author_name !== "") {
|
||||
if (uiPlugin.author_homepage !== "") {
|
||||
return (<Fragment>
|
||||
@@ -440,21 +440,24 @@ export const LoadPluginDialog =
|
||||
<Typography variant='body2' color="textSecondary" noWrap>{uiPlugin.name + ",\u00A0"}</Typography>
|
||||
</div>
|
||||
<div style={{flex: "0 1 auto"}}>
|
||||
<a href={uiPlugin.author_homepage} target="_blank" >
|
||||
<a href={uiPlugin.author_homepage} target="_blank" rel="noopener noreferrer" >
|
||||
<Typography variant='body2' color="textSecondary" noWrap>{uiPlugin.author_name}</Typography>
|
||||
</a>
|
||||
</div>
|
||||
<div style={{flex: "0 0 auto"}}>
|
||||
<Typography variant='body2' color="textSecondary" noWrap>{stereoIndicator}</Typography>
|
||||
</div>
|
||||
</Fragment>);
|
||||
|
||||
} else {
|
||||
return (<Fragment>
|
||||
<Typography variant='body2' color="textSecondary" noWrap>{uiPlugin.name + ", " + uiPlugin.author_name}</Typography>
|
||||
<Typography variant='body2' color="textSecondary" noWrap>{uiPlugin.name + ", " + uiPlugin.author_name + stereoIndicator}</Typography>
|
||||
</Fragment>);
|
||||
}
|
||||
}
|
||||
return (
|
||||
<Fragment>
|
||||
<Typography variant='body2' color="textSecondary" noWrap>{uiPlugin?.name ?? ""}</Typography>
|
||||
<Typography variant='body2' color="textSecondary" noWrap>{uiPlugin?.name ?? "" + stereoIndicator}</Typography>
|
||||
</Fragment>);
|
||||
|
||||
}
|
||||
@@ -545,7 +548,7 @@ export const LoadPluginDialog =
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (position != -1) {
|
||||
if (position !== -1) {
|
||||
element.scrollToItem({ rowIndex: Math.floor(position / this.state.grid_cell_columns) });
|
||||
}
|
||||
}
|
||||
|
||||
+24
-5
@@ -18,7 +18,7 @@
|
||||
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
import {PiPedalArgumentError} from "./PiPedalError";
|
||||
|
||||
import Units from './Units';
|
||||
|
||||
interface Deserializable<T> {
|
||||
@@ -83,6 +83,7 @@ export class Port implements Deserializable<Port> {
|
||||
|
||||
export class PortGroup {
|
||||
deserialize(input: any): PortGroup {
|
||||
this.uri = input.uri;
|
||||
this.symbol = input.symbol;
|
||||
this.name = input.name;
|
||||
this.parent_group = input.parent_group;
|
||||
@@ -99,6 +100,7 @@ export class PortGroup {
|
||||
return result;
|
||||
}
|
||||
|
||||
uri: string = "";
|
||||
symbol: string = "";
|
||||
name: string = "";
|
||||
parent_group: string = "";
|
||||
@@ -151,10 +153,12 @@ export class UiPropertyNotification {
|
||||
export class PiPedalFileProperty {
|
||||
deserialize(input: any): PiPedalFileProperty
|
||||
{
|
||||
this.name = input.name;
|
||||
this.label = input.label;
|
||||
this.fileTypes = PiPedalFileType.deserialize_array(input.fileTypes);
|
||||
this.patchProperty = input.patchProperty;
|
||||
this.directory = input.directory;
|
||||
this.index = input.index;
|
||||
this.portGroup = input.portGroup;
|
||||
return this;
|
||||
}
|
||||
static deserialize_array(input: any): PiPedalFileProperty[]
|
||||
@@ -198,10 +202,12 @@ export class PiPedalFileProperty {
|
||||
return false;
|
||||
}
|
||||
|
||||
name: string = "";
|
||||
label: string = "";
|
||||
fileTypes: PiPedalFileType[] = [];
|
||||
patchProperty: string = "";
|
||||
directory: string = "";
|
||||
index: number = -1;
|
||||
portGroup: string = "";
|
||||
|
||||
};
|
||||
export class Lv2Plugin implements Deserializable<Lv2Plugin> {
|
||||
@@ -635,9 +641,22 @@ export class UiPlugin implements Deserializable<UiPlugin> {
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
getPortGroupByUri(uri: string) :PortGroup | null
|
||||
{
|
||||
for (let i = 0; i < this.port_groups.length; ++i)
|
||||
{
|
||||
let port_group = this.port_groups[i];
|
||||
if (port_group.uri === uri)
|
||||
{
|
||||
return port_group;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
getPortGroup(symbol: string): PortGroup
|
||||
getPortGroupBySymbol(symbol: string): PortGroup | null
|
||||
{
|
||||
for (let i = 0; i < this.port_groups.length; ++i)
|
||||
{
|
||||
@@ -647,7 +666,7 @@ export class UiPlugin implements Deserializable<UiPlugin> {
|
||||
return port_group;
|
||||
}
|
||||
}
|
||||
throw new PiPedalArgumentError("Port group not found.");
|
||||
return null;
|
||||
}
|
||||
|
||||
uri: string = "";
|
||||
|
||||
@@ -45,7 +45,7 @@ import PluginInfoDialog from './PluginInfoDialog';
|
||||
import { GetControlView } from './ControlViewFactory';
|
||||
import MidiBindingsDialog from './MidiBindingsDialog';
|
||||
import PluginPresetSelector from './PluginPresetSelector';
|
||||
import SaveIconOutline from '@mui/icons-material/Save';
|
||||
|
||||
|
||||
|
||||
const SPLIT_CONTROLBAR_THRESHHOLD = 650;
|
||||
@@ -194,7 +194,7 @@ export const MainPage =
|
||||
}
|
||||
onPedalboardChanged(value: Pedalboard) {
|
||||
let selectedItem = -1;
|
||||
if (this.state.selectedPedal == Pedalboard.START_CONTROL || this.state.selectedPedal == Pedalboard.END_CONTROL) {
|
||||
if (this.state.selectedPedal === Pedalboard.START_CONTROL || this.state.selectedPedal === Pedalboard.END_CONTROL) {
|
||||
selectedItem = this.state.selectedPedal;
|
||||
} else if (value.hasItem(this.state.selectedPedal)) {
|
||||
selectedItem = this.state.selectedPedal;
|
||||
|
||||
@@ -66,6 +66,7 @@ const TERMINAL_ICON_URL = "img/fx_terminal.svg";
|
||||
|
||||
function CalculateConnection(numberOfInputs: number, numberOfOutputs: number)
|
||||
{
|
||||
|
||||
let result = Math.min(numberOfInputs, numberOfOutputs);
|
||||
if (result > 2) result = 2;
|
||||
return result;
|
||||
|
||||
@@ -38,7 +38,6 @@ import GovernorSettings from './GovernorSettings';
|
||||
import WifiChannel from './WifiChannel';
|
||||
import AlsaDeviceInfo from './AlsaDeviceInfo';
|
||||
import { AndroidHostInterface, FakeAndroidHost } from './AndroidHost';
|
||||
import Xxx from './XxxSnippet';
|
||||
|
||||
|
||||
export enum State {
|
||||
@@ -1176,7 +1175,7 @@ export class PiPedalModel //implements PiPedalModel
|
||||
let changed: boolean = false;
|
||||
|
||||
let pedalboard = this.pedalboard.get();
|
||||
if (pedalboard.input_volume_db != volume_db)
|
||||
if (pedalboard.input_volume_db !== volume_db)
|
||||
{
|
||||
let newPedalboard = pedalboard.clone();
|
||||
newPedalboard.input_volume_db = volume_db;
|
||||
@@ -1207,7 +1206,7 @@ export class PiPedalModel //implements PiPedalModel
|
||||
let changed: boolean = false;
|
||||
|
||||
let pedalboard = this.pedalboard.get();
|
||||
if (pedalboard.output_volume_db != volume_db)
|
||||
if (pedalboard.output_volume_db !== volume_db)
|
||||
{
|
||||
let newPedalboard = pedalboard.clone();
|
||||
newPedalboard.output_volume_db = volume_db;
|
||||
@@ -1234,7 +1233,7 @@ export class PiPedalModel //implements PiPedalModel
|
||||
if (pedalboard === undefined) throw new PiPedalStateError("Pedalboard not ready.");
|
||||
let newPedalboard = pedalboard.clone();
|
||||
|
||||
if (instanceId === Pedalboard.START_CONTROL && key == "volume_db")
|
||||
if (instanceId === Pedalboard.START_CONTROL && key === "volume_db")
|
||||
{
|
||||
this._setInputVolume(value,notifyServer);
|
||||
return;
|
||||
@@ -1371,7 +1370,7 @@ export class PiPedalModel //implements PiPedalModel
|
||||
// mouse is down. Don't update EVERYBODY, but we must change
|
||||
// the control on the running audio plugin.
|
||||
// TODO: respect "expensive" port attribute.
|
||||
if (instanceId === Pedalboard.START_CONTROL && key == "volume_db")
|
||||
if (instanceId === Pedalboard.START_CONTROL && key === "volume_db")
|
||||
{
|
||||
this.previewInputVolume(value);
|
||||
return;
|
||||
@@ -1391,7 +1390,7 @@ export class PiPedalModel //implements PiPedalModel
|
||||
this.updateVst3State(newPedalboard);
|
||||
|
||||
let result = newPedalboard.deleteItem(instanceId);
|
||||
if (result != null) {
|
||||
if (result !== null) {
|
||||
this.pedalboard.set(newPedalboard);
|
||||
this.updateServerPedalboard();
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ import { WithStyles } from '@mui/styles';
|
||||
import createStyles from '@mui/styles/createStyles';
|
||||
import withStyles from '@mui/styles/withStyles';
|
||||
import { PiPedalModel, PiPedalModelFactory } from './PiPedalModel';
|
||||
import { UiPlugin, UiControl, PiPedalFileProperty,ScalePoint} from './Lv2Plugin';
|
||||
import { UiPlugin, UiControl, PiPedalFileProperty, ScalePoint } from './Lv2Plugin';
|
||||
import {
|
||||
Pedalboard, PedalboardItem, ControlValue
|
||||
} from './Pedalboard';
|
||||
@@ -48,7 +48,7 @@ export const StandardItemSize = { width: 80, height: 110 };
|
||||
const LANDSCAPE_HEIGHT_BREAK = 500;
|
||||
|
||||
|
||||
function makeIoPluginInfo(name: string, uri: string) : UiPlugin {
|
||||
function makeIoPluginInfo(name: string, uri: string): UiPlugin {
|
||||
let result = new UiPlugin();
|
||||
result.name = name;
|
||||
result.uri = uri;
|
||||
@@ -58,12 +58,12 @@ function makeIoPluginInfo(name: string, uri: string) : UiPlugin {
|
||||
volumeControl.index = 0;
|
||||
volumeControl.is_input = true;
|
||||
|
||||
volumeControl.min_value = -60;
|
||||
volumeControl.min_value = -60;
|
||||
volumeControl.max_value = 30;
|
||||
volumeControl.default_value = 0;
|
||||
volumeControl.units = Units.db;
|
||||
volumeControl.scale_points = [
|
||||
new ScalePoint().deserialize({label: "-INF",value: -60})
|
||||
new ScalePoint().deserialize({ label: "-INF", value: -60 })
|
||||
];
|
||||
result.controls = [
|
||||
volumeControl
|
||||
@@ -71,11 +71,11 @@ function makeIoPluginInfo(name: string, uri: string) : UiPlugin {
|
||||
return result;
|
||||
}
|
||||
|
||||
let startPluginInfo: UiPlugin =
|
||||
makeIoPluginInfo("Input",Pedalboard.START_PEDALBOARD_ITEM_URI);
|
||||
let startPluginInfo: UiPlugin =
|
||||
makeIoPluginInfo("Input", Pedalboard.START_PEDALBOARD_ITEM_URI);
|
||||
|
||||
let endPluginInfo: UiPlugin =
|
||||
makeIoPluginInfo("Output",Pedalboard.END_PEDALBOARD_ITEM_URI);
|
||||
let endPluginInfo: UiPlugin =
|
||||
makeIoPluginInfo("Output", Pedalboard.END_PEDALBOARD_ITEM_URI);
|
||||
|
||||
|
||||
const styles = (theme: Theme) => createStyles({
|
||||
@@ -181,6 +181,7 @@ const styles = (theme: Theme) => createStyles({
|
||||
borderRadius: 8,
|
||||
elevation: 12,
|
||||
display: "flex",
|
||||
textOverflow: "ellipsis",
|
||||
flexDirection: "row", flexWrap: "nowrap",
|
||||
flex: "0 0 auto"
|
||||
},
|
||||
@@ -188,9 +189,12 @@ const styles = (theme: Theme) => createStyles({
|
||||
position: "absolute",
|
||||
top: -15,
|
||||
background: "white",
|
||||
textOverflow: "ellipsis",
|
||||
minWidth: 0,
|
||||
marginLeft: 20,
|
||||
paddingLeft: 8,
|
||||
paddingRight: 8
|
||||
paddingRight: 8,
|
||||
margin_right: 28
|
||||
},
|
||||
portGroupControls: {
|
||||
display: "flex",
|
||||
@@ -203,11 +207,13 @@ const styles = (theme: Theme) => createStyles({
|
||||
});
|
||||
|
||||
export class ControlGroup {
|
||||
constructor(name: string, controls: ReactNode[]) {
|
||||
constructor(name: string, indexes: number[], controls: ReactNode[]) {
|
||||
this.name = name;
|
||||
this.indexes = indexes;
|
||||
this.controls = controls;
|
||||
}
|
||||
name: string;
|
||||
indexes: number[];
|
||||
controls: React.ReactNode[];
|
||||
}
|
||||
|
||||
@@ -320,21 +326,20 @@ const PluginControlView =
|
||||
makeFilePropertyUI(fileProperty: PiPedalFileProperty): ReactNode {
|
||||
return ((
|
||||
|
||||
<FilePropertyControl instanceId={this.props.instanceId}
|
||||
<FilePropertyControl instanceId={this.props.instanceId}
|
||||
fileProperty={fileProperty}
|
||||
onFileClick={(fileProperty,selectedFile) => {
|
||||
this.setState({showFileDialog: true,dialogFileProperty: fileProperty,dialogFileValue: selectedFile});
|
||||
onFileClick={(fileProperty, selectedFile) => {
|
||||
this.setState({ showFileDialog: true, dialogFileProperty: fileProperty, dialogFileValue: selectedFile });
|
||||
}}
|
||||
/>
|
||||
));
|
||||
}
|
||||
makeStandardControl(uiControl: UiControl, controlValues: ControlValue[]): ReactNode {
|
||||
let symbol = uiControl.symbol;
|
||||
if (!uiControl.is_input)
|
||||
{
|
||||
if (!uiControl.is_input) {
|
||||
return (
|
||||
<PluginOutputControl instanceId={this.props.instanceId} uiControl={uiControl} />
|
||||
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
@@ -362,40 +367,82 @@ const PluginControlView =
|
||||
|
||||
getStandardControlNodes(plugin: UiPlugin, controlValues: ControlValue[]): ControlNodes {
|
||||
let result: ControlNodes = [];
|
||||
let portGroupMap: { [id: string]: ControlGroup } = {};
|
||||
|
||||
for (let i = 0; i < plugin.controls.length; ++i) {
|
||||
let pluginControl = plugin.controls[i];
|
||||
if (!pluginControl.not_on_gui) {
|
||||
if (pluginControl.port_group !== "") {
|
||||
let portGroup = pluginControl.port_group;
|
||||
if (pluginControl.port_group !== "" && plugin.getPortGroupBySymbol(pluginControl.port_group)) {
|
||||
let portGroup = nullCast(plugin.getPortGroupBySymbol(pluginControl.port_group));
|
||||
|
||||
let groupControls: ReactNode[] = [];
|
||||
let indexes: number[] = [];
|
||||
groupControls.push(
|
||||
this.makeStandardControl(pluginControl, controlValues)
|
||||
);
|
||||
while (i + 1 < plugin.controls.length && plugin.controls[i + 1].port_group === portGroup) {
|
||||
indexes.push(pluginControl.index);
|
||||
while (i + 1 < plugin.controls.length && plugin.controls[i + 1].port_group === pluginControl.port_group) {
|
||||
++i;
|
||||
pluginControl = plugin.controls[i];
|
||||
if (!pluginControl.not_on_gui) {
|
||||
groupControls.push(
|
||||
this.makeStandardControl(pluginControl,controlValues)
|
||||
this.makeStandardControl(pluginControl, controlValues)
|
||||
)
|
||||
indexes.push(pluginControl.index);
|
||||
}
|
||||
}
|
||||
let controlGroup = new ControlGroup(portGroup.name, indexes, groupControls);
|
||||
result.push(
|
||||
new ControlGroup(plugin.getPortGroup(portGroup).name, groupControls)
|
||||
controlGroup
|
||||
)
|
||||
portGroupMap[pluginControl.port_group] = controlGroup;
|
||||
} else {
|
||||
result.push(
|
||||
this.makeStandardControl(pluginControl,controlValues)
|
||||
this.makeStandardControl(pluginControl, controlValues)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (let i = 0; i < plugin.fileProperties.length; ++i) {
|
||||
let fileProperty = plugin.fileProperties[i];
|
||||
result.push(
|
||||
this.makeFilePropertyUI(fileProperty)
|
||||
);
|
||||
let filePropertyUi = this.makeFilePropertyUI(fileProperty);
|
||||
|
||||
if (fileProperty.portGroup !== "" && plugin.getPortGroupByUri(fileProperty.portGroup)) {
|
||||
let portGroup = nullCast(plugin.getPortGroupByUri(fileProperty.portGroup));
|
||||
let controlGroup = portGroupMap[portGroup.symbol];
|
||||
if (controlGroup) {
|
||||
let insertPosition = controlGroup.indexes.length;
|
||||
if (fileProperty.index !== -1) {
|
||||
for (let i = 0; i < controlGroup.controls.length; ++i) {
|
||||
if (controlGroup.indexes[i] >= fileProperty.index) {
|
||||
insertPosition = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
let index = fileProperty.index !== -1 ? fileProperty.index : 100;
|
||||
controlGroup.controls.splice(insertPosition, 0, filePropertyUi);
|
||||
controlGroup.indexes.splice(insertPosition, 0, index);
|
||||
|
||||
} else {
|
||||
let index = fileProperty.index !== -1 ? fileProperty.index : 100;
|
||||
let controlGroup = new ControlGroup(
|
||||
portGroup.name,
|
||||
[index],
|
||||
[filePropertyUi]);
|
||||
result.push(
|
||||
controlGroup
|
||||
);
|
||||
portGroupMap[portGroup.symbol] = controlGroup;
|
||||
|
||||
}
|
||||
} else if (fileProperty.index !== -1) {
|
||||
result.splice(fileProperty.index, 0, filePropertyUi);
|
||||
} else {
|
||||
result.push(
|
||||
filePropertyUi
|
||||
);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -454,7 +501,7 @@ const PluginControlView =
|
||||
result.push((
|
||||
<div className={!isLandscapeGrid ? classes.portGroup : classes.portGroupLandscape}>
|
||||
<div className={classes.portGroupTitle}>
|
||||
<Typography noWrap variant="caption">{controlGroup.name}</Typography>
|
||||
<Typography noWrap variant="caption" >{controlGroup.name}</Typography>
|
||||
</div>
|
||||
<div className={classes.portGroupControls} >
|
||||
{
|
||||
@@ -476,22 +523,20 @@ const PluginControlView =
|
||||
return result;
|
||||
}
|
||||
|
||||
static startPluginInfo: UiPlugin =
|
||||
makeIoPluginInfo("Input",Pedalboard.START_PEDALBOARD_ITEM_URI);
|
||||
static startPluginInfo: UiPlugin =
|
||||
makeIoPluginInfo("Input", Pedalboard.START_PEDALBOARD_ITEM_URI);
|
||||
|
||||
static endPluginInfo: UiPlugin =
|
||||
makeIoPluginInfo("Output",Pedalboard.END_PEDALBOARD_ITEM_URI);
|
||||
static endPluginInfo: UiPlugin =
|
||||
makeIoPluginInfo("Output", Pedalboard.END_PEDALBOARD_ITEM_URI);
|
||||
|
||||
|
||||
render(): ReactNode {
|
||||
let classes = this.props.classes;
|
||||
let pedalboardItem: PedalboardItem;
|
||||
let pedalboard = this.model.pedalboard.get();
|
||||
if (this.props.instanceId == Pedalboard.START_CONTROL)
|
||||
{
|
||||
if (this.props.instanceId === Pedalboard.START_CONTROL) {
|
||||
pedalboardItem = pedalboard.makeStartItem();
|
||||
} else if (this.props.instanceId == Pedalboard.END_CONTROL)
|
||||
{
|
||||
} else if (this.props.instanceId === Pedalboard.END_CONTROL) {
|
||||
pedalboardItem = pedalboard.makeEndItem();
|
||||
} else {
|
||||
pedalboardItem = pedalboard.getItem(this.props.instanceId);
|
||||
@@ -504,14 +549,12 @@ const PluginControlView =
|
||||
|
||||
|
||||
let plugin: UiPlugin;
|
||||
if (pedalboardItem.isStart())
|
||||
{
|
||||
if (pedalboardItem.isStart()) {
|
||||
plugin = startPluginInfo;
|
||||
controlValues = [new ControlValue("volume_db",pedalboard.input_volume_db)];
|
||||
} else if (pedalboardItem.isEnd())
|
||||
{
|
||||
controlValues = [new ControlValue("volume_db", pedalboard.input_volume_db)];
|
||||
} else if (pedalboardItem.isEnd()) {
|
||||
plugin = endPluginInfo;
|
||||
controlValues = [new ControlValue("volume_db",pedalboard.output_volume_db)];
|
||||
controlValues = [new ControlValue("volume_db", pedalboard.output_volume_db)];
|
||||
} else {
|
||||
plugin = nullCast(this.model.getUiPlugin(pedalboardItem.uri));
|
||||
}
|
||||
@@ -553,27 +596,27 @@ const PluginControlView =
|
||||
)
|
||||
}
|
||||
</div>
|
||||
<FilePropertyDialog open={this.state.showFileDialog}
|
||||
fileProperty={this.state.dialogFileProperty}
|
||||
selectedFile={this.state.dialogFileValue}
|
||||
onCancel={()=> { this.setState({ showFileDialog: false});}}
|
||||
onOk={(fileProperty,selectedFile)=> {
|
||||
<FilePropertyDialog open={this.state.showFileDialog}
|
||||
fileProperty={this.state.dialogFileProperty}
|
||||
selectedFile={this.state.dialogFileValue}
|
||||
onCancel={() => { this.setState({ showFileDialog: false }); }}
|
||||
onOk={(fileProperty, selectedFile) => {
|
||||
|
||||
this.model.setPatchProperty(
|
||||
this.props.instanceId,
|
||||
fileProperty.patchProperty,
|
||||
JsonAtom.Path(selectedFile)
|
||||
)
|
||||
.then( () => {
|
||||
.then(() => {
|
||||
|
||||
})
|
||||
.catch((error) =>
|
||||
{
|
||||
this.model.showAlert("setPatchProperty failed: " +error);
|
||||
});
|
||||
this.setState({ showFileDialog: false});}
|
||||
})
|
||||
.catch((error) => {
|
||||
this.model.showAlert("setPatchProperty failed: " + error);
|
||||
});
|
||||
this.setState({ showFileDialog: false });
|
||||
}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
<FullScreenIME uiControl={this.state.imeUiControl} value={this.state.imeValue}
|
||||
|
||||
onChange={(key, value) => this.onImeValueChange(key, value)}
|
||||
|
||||
@@ -35,10 +35,15 @@ import { PiPedalModelFactory } from "./PiPedalModel";
|
||||
import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';
|
||||
import { UiPlugin, UiControl } from './Lv2Plugin';
|
||||
import PluginIcon from './PluginIcon';
|
||||
import { Remark } from 'react-remark';
|
||||
|
||||
/* eslint-disable */
|
||||
let myTheme: Theme| undefined = undefined;
|
||||
|
||||
const styles = (theme: Theme) =>
|
||||
createStyles({
|
||||
{
|
||||
myTheme = theme;
|
||||
return createStyles({
|
||||
root: {
|
||||
margin: 0,
|
||||
padding: theme.spacing(2),
|
||||
@@ -50,7 +55,7 @@ const styles = (theme: Theme) =>
|
||||
color: theme.palette.grey[500],
|
||||
},
|
||||
});
|
||||
|
||||
};
|
||||
export interface PluginInfoDialogTitleProps extends WithStyles<typeof styles> {
|
||||
id: string;
|
||||
children: React.ReactNode;
|
||||
@@ -116,23 +121,23 @@ function ioDescription(plugin: UiPlugin): string {
|
||||
|
||||
}
|
||||
|
||||
function makeParagraphs(description: string) {
|
||||
description = description.replaceAll('\r', '');
|
||||
description = description.replaceAll('\n\n', '\r');
|
||||
description = description.replaceAll('\n', ' ');
|
||||
// function makeParagraphs(description: string) {
|
||||
// description = description.replaceAll('\r', '');
|
||||
// description = description.replaceAll('\n\n', '\r');
|
||||
// description = description.replaceAll('\n', ' ');
|
||||
|
||||
let paragraphs: string[] = description.split('\r');
|
||||
return (
|
||||
<div style={{ paddingLeft: "24px" }}>
|
||||
{paragraphs.map((para) => (
|
||||
<Typography variant="body2" paragraph >
|
||||
{para}
|
||||
</Typography>
|
||||
))}
|
||||
</div>
|
||||
// let paragraphs: string[] = description.split('\r');
|
||||
// return (
|
||||
// <div style={{ paddingLeft: "24px" }}>
|
||||
// {paragraphs.map((para) => (
|
||||
// <Typography variant="body2" paragraph >
|
||||
// {para}
|
||||
// </Typography>
|
||||
// ))}
|
||||
// </div>
|
||||
|
||||
);
|
||||
}
|
||||
// );
|
||||
// }
|
||||
function makeControls(controls: UiControl[]) {
|
||||
let hasComments = false;
|
||||
|
||||
@@ -146,7 +151,7 @@ function makeControls(controls: UiControl[]) {
|
||||
let trs: React.ReactElement[] = [];
|
||||
for (let i = 0; i < controls.length; ++i) {
|
||||
let control = controls[i];
|
||||
|
||||
if (!(control.not_on_gui) && control.is_input)
|
||||
trs.push((
|
||||
<tr>
|
||||
<td style={{ verticalAlign: "top" }}>
|
||||
@@ -246,37 +251,66 @@ const PluginInfoDialog = withStyles(styles)((props: PluginInfoProps) => {
|
||||
</div>
|
||||
</MuiDialogTitle>
|
||||
<PluginInfoDialogContent dividers style={{ width: "100%", maxHeight: "80%", overflowX: "hidden" }}>
|
||||
<div style={{ width: "100%",display: "flex", flexFlow: "row", justifyItems: "stretch", flexWrap: "nowrap" }} >
|
||||
<div style={{ flex: "1 1 100%" }}>
|
||||
<Typography gutterBottom >
|
||||
<div style={{ width: "100%", display: "flex", flexFlow: "row", justifyItems: "stretch", flexWrap: "nowrap" }} >
|
||||
<div style={{ flex: "1 1 auto", whiteSpace: "nowrap",minWidth: "auto" }}>
|
||||
<Typography gutterBottom variant="body2" >
|
||||
Author:
|
||||
{(plugin.author_homepage !== "")
|
||||
? <a href={plugin.author_homepage} target="_blank" rel="noreferrer">{plugin.author_name}</a>
|
||||
: (
|
||||
plugin.author_name
|
||||
? (<a href={plugin.author_homepage} target="_blank" rel="noopener noreferrer">
|
||||
{plugin.author_name}
|
||||
</a>
|
||||
)
|
||||
: (
|
||||
<span>{plugin.author_name}</span>
|
||||
)
|
||||
|
||||
}
|
||||
</Typography>
|
||||
</div>
|
||||
<div style={{ flex: "0 0 auto" }}>
|
||||
<Typography gutterBottom >
|
||||
<Typography gutterBottom variant="body2" >
|
||||
{ioDescription(plugin)}
|
||||
</Typography>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<Typography variant="body1" gutterBottom style={{ paddingTop: "1em" }}>
|
||||
<Typography variant="body2" gutterBottom style={{ paddingTop: "1em" }}>
|
||||
Controls:
|
||||
</Typography>
|
||||
{
|
||||
makeControls(plugin.controls)
|
||||
}
|
||||
<Typography gutterBottom style={{ paddingTop: "1em" }}>
|
||||
<Typography gutterBottom variant="body2" style={{ paddingTop: "1em" }}>
|
||||
Description:
|
||||
</Typography>
|
||||
{
|
||||
(plugin.description !== "") && makeParagraphs(plugin.description)
|
||||
}
|
||||
<div style={{ marginLeft: 24, marginTop: 16 }}>
|
||||
<Remark
|
||||
rehypeReactOptions={{
|
||||
components: {
|
||||
p: (props: any) => {
|
||||
// return (
|
||||
// <p className="MuiTypography-root MuiTypography-body2" {...props} />
|
||||
// );
|
||||
return (
|
||||
<Typography variant="body2" paragraph={true} {...props} />
|
||||
);
|
||||
|
||||
},
|
||||
code: (props: any) => {
|
||||
return (<code style={{fontSize: 14}} {...props} />);
|
||||
},
|
||||
a: (props: any) => {
|
||||
return (
|
||||
<a target="_blank" {...props} />
|
||||
);
|
||||
|
||||
}
|
||||
},
|
||||
}}
|
||||
>
|
||||
{plugin.description}
|
||||
</Remark>
|
||||
</div>
|
||||
</PluginInfoDialogContent>
|
||||
<PluginInfoDialogActions>
|
||||
<Button autoFocus onClick={handleClose} color="primary" style={{ width: "130px" }}>
|
||||
|
||||
@@ -186,7 +186,6 @@ const PresetSelector =
|
||||
let currentPresets = this.model.presets.get();
|
||||
let item = currentPresets.getItem(currentPresets.selectedInstanceId);
|
||||
if (item == null) return;
|
||||
let name = item.name;
|
||||
this.model.newPresetItem(currentPresets.selectedInstanceId)
|
||||
.then((instanceId) => {
|
||||
this.model.loadPreset(instanceId);
|
||||
|
||||
@@ -96,7 +96,7 @@ const SearchControl = withStyles(styles, { withTheme: true })(
|
||||
)
|
||||
|
||||
}
|
||||
<Input style={{
|
||||
<Input spellCheck={false} style={{
|
||||
flex: "1 1", visibility: (this.props.collapsed ?? false) ? "collapse" : "visible", marginRight: 12, height: 32,
|
||||
}}
|
||||
inputRef={this.getInputRef()}
|
||||
|
||||
+16
-9
@@ -100,18 +100,18 @@ UiFileProperty::UiFileProperty(PluginHost *pHost, const LilvNode *node, const st
|
||||
{
|
||||
auto pWorld = pHost->getWorld();
|
||||
|
||||
AutoLilvNode name = lilv_world_get(
|
||||
AutoLilvNode label = lilv_world_get(
|
||||
pWorld,
|
||||
node,
|
||||
pHost->lilvUris.lv2core__name,
|
||||
pHost->lilvUris.rdfs__label,
|
||||
nullptr);
|
||||
if (name)
|
||||
if (label)
|
||||
{
|
||||
this->name_ = name.AsString();
|
||||
this->label_ = label.AsString();
|
||||
}
|
||||
else
|
||||
{
|
||||
this->name_ = "File";
|
||||
this->label_ = "File";
|
||||
}
|
||||
AutoLilvNode index = lilv_world_get(
|
||||
pWorld,
|
||||
@@ -120,7 +120,7 @@ UiFileProperty::UiFileProperty(PluginHost *pHost, const LilvNode *node, const st
|
||||
nullptr);
|
||||
if (index)
|
||||
{
|
||||
this->index_ = name.AsInt();
|
||||
this->index_ = index.AsInt(-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -159,6 +159,12 @@ UiFileProperty::UiFileProperty(PluginHost *pHost, const LilvNode *node, const st
|
||||
throw std::logic_error("PiPedal FileProperty is missing pipedalui:patchProperty value.");
|
||||
}
|
||||
|
||||
AutoLilvNode portGroup = lilv_world_get(pWorld,node,pHost->lilvUris.portgroups__group,nullptr);
|
||||
if (portGroup)
|
||||
{
|
||||
this->portGroup_ = portGroup.AsUri();
|
||||
}
|
||||
|
||||
this->fileTypes_ = PiPedalFileType::GetArray(pHost, node, pHost->lilvUris.pipedalUI__fileTypes);
|
||||
}
|
||||
|
||||
@@ -297,7 +303,7 @@ UiPortNotification::UiPortNotification(PluginHost *pHost, const LilvNode *node)
|
||||
}
|
||||
|
||||
UiFileProperty::UiFileProperty(const std::string &name, const std::string &patchProperty, const std::string &directory)
|
||||
: name_(name),
|
||||
: label_(name),
|
||||
patchProperty_(patchProperty),
|
||||
directory_(directory)
|
||||
{
|
||||
@@ -320,9 +326,10 @@ JSON_MAP_REFERENCE(PiPedalFileType, fileExtension)
|
||||
JSON_MAP_END()
|
||||
|
||||
JSON_MAP_BEGIN(UiFileProperty)
|
||||
JSON_MAP_REFERENCE(UiFileProperty, name)
|
||||
JSON_MAP_REFERENCE(UiFileProperty, label)
|
||||
JSON_MAP_REFERENCE(UiFileProperty, index)
|
||||
JSON_MAP_REFERENCE(UiFileProperty, directory)
|
||||
JSON_MAP_REFERENCE(UiFileProperty, fileTypes)
|
||||
JSON_MAP_REFERENCE(UiFileProperty, patchProperty)
|
||||
JSON_MAP_REFERENCE(UiFileProperty, fileTypes)
|
||||
JSON_MAP_REFERENCE(UiFileProperty, portGroup)
|
||||
JSON_MAP_END()
|
||||
+4
-2
@@ -93,11 +93,12 @@ namespace pipedal {
|
||||
};
|
||||
class UiFileProperty {
|
||||
private:
|
||||
std::string name_;
|
||||
std::string label_;
|
||||
std::int64_t index_ = -1;
|
||||
std::string directory_;
|
||||
std::vector<PiPedalFileType> fileTypes_;
|
||||
std::string patchProperty_;
|
||||
std::string portGroup_;
|
||||
public:
|
||||
using ptr = std::shared_ptr<UiFileProperty>;
|
||||
UiFileProperty() { }
|
||||
@@ -105,9 +106,10 @@ namespace pipedal {
|
||||
UiFileProperty(const std::string&name, const std::string&patchProperty,const std::string &directory);
|
||||
|
||||
|
||||
const std::string &name() const { return name_; }
|
||||
const std::string &label() const { return label_; }
|
||||
int64_t index() const { return index_; }
|
||||
const std::string &directory() const { return directory_; }
|
||||
const std::string&portGroup() const { return portGroup_; }
|
||||
|
||||
const std::vector<PiPedalFileType> &fileTypes() const { return fileTypes_; }
|
||||
|
||||
|
||||
+9
-34
@@ -554,33 +554,6 @@ void PluginHost::Load(const char *lv2Path)
|
||||
#endif
|
||||
};
|
||||
|
||||
class NodesAutoFree
|
||||
{
|
||||
LilvNodes *nodes;
|
||||
|
||||
// const LilvNode* returns must not be freed, by convention.
|
||||
NodesAutoFree(const LilvNodes *nodes)
|
||||
{
|
||||
}
|
||||
|
||||
public:
|
||||
NodesAutoFree(LilvNodes *nodes)
|
||||
{
|
||||
this->nodes = nodes;
|
||||
}
|
||||
operator const LilvNodes *()
|
||||
{
|
||||
return this->nodes;
|
||||
}
|
||||
operator bool()
|
||||
{
|
||||
return this->nodes != nullptr;
|
||||
}
|
||||
~NodesAutoFree()
|
||||
{
|
||||
lilv_nodes_free(this->nodes);
|
||||
}
|
||||
};
|
||||
|
||||
static std::vector<std::string> nodeAsStringArray(const LilvNodes *nodes)
|
||||
{
|
||||
@@ -614,7 +587,7 @@ static bool ports_sort_compare(std::shared_ptr<Lv2PortInfo> &p1, const std::shar
|
||||
|
||||
bool Lv2PluginInfo::HasFactoryPresets(PluginHost *lv2Host, const LilvPlugin *plugin)
|
||||
{
|
||||
NodesAutoFree nodes = lilv_plugin_get_related(plugin, lv2Host->lilvUris.presets__preset);
|
||||
AutoLilvNodes nodes = lilv_plugin_get_related(plugin, lv2Host->lilvUris.presets__preset);
|
||||
bool result = false;
|
||||
LILV_FOREACH(nodes, iNode, nodes)
|
||||
{
|
||||
@@ -711,16 +684,16 @@ Lv2PluginInfo::Lv2PluginInfo(PluginHost *lv2Host, LilvWorld *pWorld, const LilvP
|
||||
const LilvPluginClass *pClass = lilv_plugin_get_class(pPlugin);
|
||||
this->plugin_class_ = nodeAsString(lilv_plugin_class_get_uri(pClass));
|
||||
|
||||
NodesAutoFree required_features = lilv_plugin_get_required_features(pPlugin);
|
||||
AutoLilvNodes required_features = lilv_plugin_get_required_features(pPlugin);
|
||||
this->required_features_ = nodeAsStringArray(required_features);
|
||||
|
||||
NodesAutoFree supported_features = lilv_plugin_get_supported_features(pPlugin);
|
||||
AutoLilvNodes supported_features = lilv_plugin_get_supported_features(pPlugin);
|
||||
this->supported_features_ = nodeAsStringArray(supported_features);
|
||||
|
||||
NodesAutoFree optional_features = lilv_plugin_get_optional_features(pPlugin);
|
||||
AutoLilvNodes optional_features = lilv_plugin_get_optional_features(pPlugin);
|
||||
this->optional_features_ = nodeAsStringArray(optional_features);
|
||||
|
||||
NodesAutoFree extensions = lilv_plugin_get_extension_data(pPlugin);
|
||||
AutoLilvNodes extensions = lilv_plugin_get_extension_data(pPlugin);
|
||||
this->extensions_ = nodeAsStringArray(extensions);
|
||||
|
||||
AutoLilvNode comment = lv2Host->get_comment(this->uri_);
|
||||
@@ -827,6 +800,7 @@ std::vector<std::string> supportedFeatures = {
|
||||
LV2_STATE__loadDefaultState,
|
||||
LV2_STATE__makePath,
|
||||
LV2_STATE__mapPath,
|
||||
LV2_STATE__freePath,
|
||||
LV2_CORE__inPlaceBroken,
|
||||
|
||||
// UI features that we can ignore, since we won't load their ui.
|
||||
@@ -908,7 +882,7 @@ Lv2PortInfo::Lv2PortInfo(PluginHost *host, const LilvPlugin *plugin, const LilvP
|
||||
// typo in invada plugins.
|
||||
this->is_logarithmic_ |= lilv_port_has_property(plugin, pPort, host->lilvUris.invada_portprops__logarithmic);
|
||||
|
||||
NodesAutoFree priority_nodes = lilv_port_get_value(plugin, pPort, host->lilvUris.port__display_priority);
|
||||
AutoLilvNodes priority_nodes = lilv_port_get_value(plugin, pPort, host->lilvUris.port__display_priority);
|
||||
|
||||
this->display_priority_ = -1;
|
||||
if (priority_nodes)
|
||||
@@ -920,7 +894,7 @@ Lv2PortInfo::Lv2PortInfo(PluginHost *host, const LilvPlugin *plugin, const LilvP
|
||||
}
|
||||
}
|
||||
|
||||
NodesAutoFree range_steps_nodes = lilv_port_get_value(plugin, pPort, host->lilvUris.port_range_steps);
|
||||
AutoLilvNodes range_steps_nodes = lilv_port_get_value(plugin, pPort, host->lilvUris.port_range_steps);
|
||||
this->range_steps_ = 0;
|
||||
if (range_steps_nodes)
|
||||
{
|
||||
@@ -1458,6 +1432,7 @@ json_map::storage_type<Lv2PluginClass> Lv2PluginClass::jmap{{
|
||||
}};
|
||||
|
||||
json_map::storage_type<Lv2PluginUiPortGroup> Lv2PluginUiPortGroup::jmap{{
|
||||
MAP_REF(Lv2PluginUiPortGroup, uri),
|
||||
MAP_REF(Lv2PluginUiPortGroup, symbol),
|
||||
MAP_REF(Lv2PluginUiPortGroup, name),
|
||||
MAP_REF(Lv2PluginUiPortGroup, parent_group),
|
||||
|
||||
+29
-21
@@ -340,7 +340,7 @@ namespace pipedal
|
||||
Lv2PluginInfo() {}
|
||||
|
||||
private:
|
||||
std::shared_ptr<PiPedalUI> FindWritablePathProperties(PluginHost *lv2Host,const LilvPlugin*pPlugin);
|
||||
std::shared_ptr<PiPedalUI> FindWritablePathProperties(PluginHost *lv2Host, const LilvPlugin *pPlugin);
|
||||
|
||||
bool HasFactoryPresets(PluginHost *lv2Host, const LilvPlugin *plugin);
|
||||
std::string bundle_path_;
|
||||
@@ -443,12 +443,15 @@ namespace pipedal
|
||||
class Lv2PluginUiPortGroup
|
||||
{
|
||||
private:
|
||||
std::string uri_;
|
||||
std::string symbol_;
|
||||
std::string name_;
|
||||
|
||||
std::string parent_group_;
|
||||
int32_t program_list_id_ = -1; // used by VST3.
|
||||
public:
|
||||
LV2_PROPERTY_GETSET(uri)
|
||||
|
||||
LV2_PROPERTY_GETSET(symbol)
|
||||
LV2_PROPERTY_GETSET(name)
|
||||
LV2_PROPERTY_GETSET(parent_group)
|
||||
@@ -457,7 +460,9 @@ namespace pipedal
|
||||
public:
|
||||
Lv2PluginUiPortGroup() {}
|
||||
Lv2PluginUiPortGroup(Lv2PortGroup *pPortGroup)
|
||||
: symbol_(pPortGroup->symbol()), name_(pPortGroup->name())
|
||||
: symbol_(pPortGroup->symbol())
|
||||
, name_(pPortGroup->name())
|
||||
, uri_(pPortGroup->uri())
|
||||
{
|
||||
}
|
||||
Lv2PluginUiPortGroup(
|
||||
@@ -479,30 +484,34 @@ namespace pipedal
|
||||
}
|
||||
Lv2PluginUiPort(const Lv2PluginInfo *pPlugin, const Lv2PortInfo *pPort)
|
||||
: symbol_(pPort->symbol()), index_(pPort->index()),
|
||||
is_input_(pPort->is_input()), name_(pPort->name()), min_value_(pPort->min_value()), max_value_(pPort->max_value()),
|
||||
default_value_(pPort->default_value()), range_steps_(pPort->range_steps()), display_priority_(pPort->display_priority()),
|
||||
is_logarithmic_(pPort->is_logarithmic()), integer_property_(pPort->integer_property()), enumeration_property_(pPort->enumeration_property()),
|
||||
toggled_property_(pPort->toggled_property()), not_on_gui_(pPort->not_on_gui()), scale_points_(pPort->scale_points()),
|
||||
comment_(pPort->comment()), units_(pPort->units()),
|
||||
connection_optional_(pPort->connection_optional())
|
||||
is_input_(pPort->is_input()), name_(pPort->name()), min_value_(pPort->min_value()), max_value_(pPort->max_value()),
|
||||
default_value_(pPort->default_value()), range_steps_(pPort->range_steps()), display_priority_(pPort->display_priority()),
|
||||
is_logarithmic_(pPort->is_logarithmic()), integer_property_(pPort->integer_property()), enumeration_property_(pPort->enumeration_property()),
|
||||
toggled_property_(pPort->toggled_property()), not_on_gui_(pPort->not_on_gui()), scale_points_(pPort->scale_points()),
|
||||
comment_(pPort->comment()), units_(pPort->units()),
|
||||
connection_optional_(pPort->connection_optional())
|
||||
{
|
||||
// Use symbols to index port groups, instead of uris.
|
||||
// symbols are guaranteed to be unique.
|
||||
auto &portGroup = pPort->port_group();
|
||||
for (int i = 0; i < pPlugin->port_groups().size(); ++i)
|
||||
const auto &portGroup = pPort->port_group();
|
||||
if (portGroup.length() != 0)
|
||||
{
|
||||
|
||||
auto &p = pPlugin->port_groups()[i];
|
||||
if (p->uri() == portGroup)
|
||||
for (int i = 0; i < pPlugin->port_groups().size(); ++i)
|
||||
{
|
||||
this->port_group_ = p->symbol();
|
||||
break;
|
||||
|
||||
auto &p = pPlugin->port_groups()[i];
|
||||
if (p->symbol().length() == 0)
|
||||
{
|
||||
// supposed to be mandatory; but make up a synthetic symbol.
|
||||
}
|
||||
if (p->uri() == portGroup)
|
||||
{
|
||||
this->port_group_ = p->symbol();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
is_bypass_ = name_ == "bypass"
|
||||
|| name_ == "Bypass"
|
||||
|| symbol_ == "bypass"
|
||||
|| symbol_ == "Bypass";
|
||||
is_bypass_ = name_ == "bypass" || name_ == "Bypass" || symbol_ == "bypass" || symbol_ == "Bypass";
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -645,7 +654,7 @@ namespace pipedal
|
||||
AutoLilvNode core__designation;
|
||||
AutoLilvNode portgroups__group;
|
||||
AutoLilvNode units__unit;
|
||||
AutoLilvNode invada_units__unit; // typo in invada plugins.
|
||||
AutoLilvNode invada_units__unit; // typo in invada plugins.
|
||||
AutoLilvNode invada_portprops__logarithmic; // typo in invada plugins.
|
||||
|
||||
AutoLilvNode atom__bufferType;
|
||||
@@ -687,7 +696,6 @@ namespace pipedal
|
||||
|
||||
AutoLilvNode patch__writable;
|
||||
AutoLilvNode patch__readable;
|
||||
|
||||
};
|
||||
LilvUris lilvUris;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user