180 lines
5.9 KiB
TypeScript
180 lines
5.9 KiB
TypeScript
|
|
import { Pedalboard, ControlValue } from "./Pedalboard.tsx";
|
|
import JackConfiguration from "./Jack.tsx";
|
|
|
|
|
|
function isActiveChannel(channels: number[]): boolean {
|
|
if (channels.length < 2) return false;
|
|
return channels[1] >= 0 || channels[0] >= 0;
|
|
}
|
|
|
|
function chName(ch: number): string {
|
|
if (ch === -1) {
|
|
return "None";
|
|
}
|
|
return "Ch " + (ch + 1);
|
|
}
|
|
function channelPairName(channels: number[], maxChannels: number): string {
|
|
if (channels.length !== 2) {
|
|
return "Invalid";
|
|
}
|
|
if (channels[0] === -1 && channels[1] === -1) {
|
|
return "None";
|
|
}
|
|
|
|
if (maxChannels === 2) {
|
|
if (channels[0] === 0 && channels[1] === 1) {
|
|
return "Stereo";
|
|
}
|
|
if (channels[0] === 0 && (channels[0] === channels[1] || channels[1] === -1)) {
|
|
return "Left";
|
|
}
|
|
if (channels[1] === 1 && (channels[0] === channels[1])) {
|
|
return "Right";
|
|
}
|
|
if (channels[0] === 1 && channels[1] === 0) {
|
|
return "Right,Left";
|
|
}
|
|
}
|
|
return chName(channels[0]) + "," + chName(channels[1]);
|
|
}
|
|
|
|
|
|
|
|
export default class ChannelRouterSettings {
|
|
configured: boolean = false;
|
|
channelRouterPresetId: number = -1;
|
|
|
|
mainInputChannels: number[] = [1, 1];
|
|
mainOutputChannels: number[] = [0, 1];
|
|
mainInserts: Pedalboard = new Pedalboard();
|
|
|
|
auxInputChannels: number[] = [0, 0];
|
|
auxOutputChannels: number[] = [-1, -1];
|
|
auxInserts: Pedalboard = new Pedalboard();
|
|
|
|
sendInputChannels: number[] = [-1, -1];
|
|
sendOutputChannels: number[] = [-1, -1];
|
|
|
|
controlValues: ControlValue[] = [];
|
|
// Inserts...
|
|
|
|
deserialize(obj: any): ChannelRouterSettings {
|
|
this.configured = obj.configured;
|
|
this.channelRouterPresetId = obj.channelRouterPresetId ? obj.channelRouterPresetId : -1;
|
|
this.mainInputChannels = obj.mainInputChannels.slice();
|
|
this.mainOutputChannels = obj.mainOutputChannels.slice();
|
|
this.mainInserts = new Pedalboard().deserialize(obj.mainInserts);
|
|
this.auxInputChannels = obj.auxInputChannels.slice();
|
|
this.auxOutputChannels = obj.auxOutputChannels.slice();
|
|
this.auxInserts = new Pedalboard().deserialize(obj.auxInserts);
|
|
this.sendInputChannels = obj.sendInputChannels.slice();
|
|
this.sendOutputChannels = obj.sendOutputChannels.slice();
|
|
this.controlValues = ControlValue.deserializeArray(obj.controlValues);
|
|
return this;
|
|
}
|
|
getControlValue(symbol: string): number | null {
|
|
for (let control of this.controlValues) {
|
|
if (control.key === symbol) {
|
|
return control.value;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
setControlValue(symbol: string, value: number): boolean {
|
|
for (let control of this.controlValues) {
|
|
if (control.key === symbol) {
|
|
if (control.value === value) {
|
|
return false;
|
|
}
|
|
control.value = value;
|
|
this.controlValues = this.controlValues.slice(); // trigger observers.
|
|
return true;
|
|
}
|
|
}
|
|
let newValue = new ControlValue(symbol, value);
|
|
this.controlValues.push(newValue);
|
|
this.controlValues = this.controlValues.slice(); // trigger observers.
|
|
return true;
|
|
}
|
|
|
|
getDescription(jackConfiguration: JackConfiguration): string {
|
|
if (!this.configured) {
|
|
return "Not configured";
|
|
}
|
|
if (!jackConfiguration.isValid)
|
|
{
|
|
return "Not configured"
|
|
}
|
|
if (!this.isValid(jackConfiguration)) {
|
|
return "Invalid configuration";
|
|
}
|
|
let nInputs = jackConfiguration.inputAudioPorts.length;
|
|
let nOutputs = jackConfiguration.outputAudioPorts.length;
|
|
let description = channelPairName(this.mainInputChannels, nInputs) + " -> " +
|
|
channelPairName(this.mainOutputChannels, nOutputs);
|
|
if (isActiveChannel(this.auxInputChannels) && isActiveChannel(this.auxOutputChannels))
|
|
{
|
|
description += " " + "+ re-amp: " + channelPairName(this.auxInputChannels, nInputs) + " -> " +
|
|
channelPairName(this.auxOutputChannels, nOutputs);
|
|
}
|
|
if (isActiveChannel(this.sendInputChannels) && isActiveChannel(this.sendOutputChannels)) {
|
|
description += " " + "+ send: " +channelPairName(this.sendOutputChannels, nOutputs)
|
|
+ " -> " + channelPairName(this.sendInputChannels, nInputs);
|
|
}
|
|
return description;
|
|
}
|
|
canEdit(jackConfiguration: JackConfiguration): boolean {
|
|
return jackConfiguration.isValid;
|
|
}
|
|
|
|
isValid(jackConfiguration: JackConfiguration): boolean {
|
|
if (!this.configured) {
|
|
return false;
|
|
}
|
|
let maxInputChannels = jackConfiguration.inputAudioPorts.length;
|
|
let maxOutputChannels = jackConfiguration.outputAudioPorts.length;
|
|
|
|
let hasInput = false;
|
|
let hasOutput = false;
|
|
for (let ch of this.mainInputChannels) {
|
|
if (ch >= 0) {
|
|
hasInput = true;
|
|
if (ch >= maxInputChannels) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
if (!hasInput) {
|
|
return false;
|
|
}
|
|
for (let ch of this.mainOutputChannels) {
|
|
if (ch >= 0) {
|
|
hasOutput = true;
|
|
if (ch >= maxOutputChannels) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
if (!hasOutput) {
|
|
return false;
|
|
}
|
|
for (let ch of this.auxInputChannels) {
|
|
if (ch >= maxInputChannels) {
|
|
return false;
|
|
}
|
|
}
|
|
for (let ch of this.auxOutputChannels) {
|
|
if (ch >= maxOutputChannels) {
|
|
return false;
|
|
}
|
|
}
|
|
for (let ch of this.sendInputChannels) {
|
|
if (ch >= maxInputChannels) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
} |