From b8c778dcc7ca9d68bff4063711000260bd867eb0 Mon Sep 17 00:00:00 2001 From: Maksym Date: Sat, 19 Oct 2024 18:52:56 +0200 Subject: [PATCH] modified: src/app.controller.ts modified: src/app.service.ts modified: src/strip/strip.controller.ts --- src/app.controller.ts | 4 ++++ src/app.service.ts | 35 +++++++++++++++++++++++++++++++++++ src/strip/strip.controller.ts | 27 +++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) diff --git a/src/app.controller.ts b/src/app.controller.ts index 7bcce18..fa6dd5a 100644 --- a/src/app.controller.ts +++ b/src/app.controller.ts @@ -20,4 +20,8 @@ export class AppController { getIO() { return this.appService.getAvailableIOs(); } + @Get('/values') + getValues() { + return this.appService.getValues(); + } } diff --git a/src/app.service.ts b/src/app.service.ts index 81eeb51..2b23677 100644 --- a/src/app.service.ts +++ b/src/app.service.ts @@ -8,6 +8,7 @@ import { import * as config from '../config.js'; import { Bus, Control, Strip } from 'voicemeeter-remote-library/dist'; import { VoicemeeterType } from 'voicemeeter-remote-library/dist/VMR/Control'; +import { OutputBuses } from 'voicemeeter-remote-library/dist/VMR/Strip.js'; export enum IOType { STRIP, @@ -43,6 +44,20 @@ export class AppService implements OnModuleInit { }; } + getValues() { + return { + strips: this.strips.map((v) => ({ + gain: v.Gain, + muteState: v.Mute, + outputBuses: [ + ...Object.values(v.outputBuses.A), + ...Object.values(v.outputBuses.B), + ], + })), + buses: this.buses.map((v) => ({ gain: v.Gain, muteState: v.Mute })), + }; + } + getGain(ioType: IOType, id: number) { if (ioType === IOType.BUS) { return this.buses[id].Gain; @@ -74,4 +89,24 @@ export class AppService implements OnModuleInit { return (this.strips[id].Mute = state); } } + + getStripOutputBuses(stripId: number) { + return this.strips[stripId].outputBuses; + } + + setStripOutputBuses(stripId: number, outputs: boolean[]) { + const buses = { + A: Object.fromEntries( + outputs + .slice(0, this.control.availableBuses.physical) + .map((e, i) => [i + 1, e]), + ), + B: Object.fromEntries( + outputs + .slice(this.control.availableBuses.virtual * -1) + .map((e, i) => [i + 1, e]), + ), + } as OutputBuses; + return (this.strips[stripId].outputBuses = buses); + } } diff --git a/src/strip/strip.controller.ts b/src/strip/strip.controller.ts index 1b49a4d..a6b04d7 100644 --- a/src/strip/strip.controller.ts +++ b/src/strip/strip.controller.ts @@ -66,4 +66,31 @@ export class StripController { ), }; } + + @Get('/outputs') + getOutputs(@Param('stripId') stripId: string) { + return this.appService.getStripOutputBuses(+stripId); + } + @Patch('/outputs') + setOutputs( + @Param('stripId') stripId: string, + @Body() { outputs }: { outputs: boolean[] }, + ) { + if (outputs === undefined) + throw new HttpException( + '"outputs" parameter not specified', + HttpStatus.BAD_REQUEST, + ); + const busesAmount = this.appService.getAvailableIOs().buses.total; + if ( + !Array.isArray(outputs) || + outputs.some((e) => typeof e !== 'boolean') || + outputs.length < busesAmount + ) + throw new HttpException( + `Invalid "outputs" parameter. Must be array with ${busesAmount} boolean(s)`, + HttpStatus.BAD_REQUEST, + ); + return this.appService.setStripOutputBuses(+stripId, outputs); + } }