From aa125d2f46dabca608422ed2a90f4b06d3b7f52a Mon Sep 17 00:00:00 2001 From: onyx-and-iris Date: Fri, 11 Jul 2025 18:41:03 +0100 Subject: [PATCH] add audio gain command --- bin/index.js | 8 +++++++- src/audio.js | 46 +++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/bin/index.js b/bin/index.js index 5ed6275..c3dd962 100755 --- a/bin/index.js +++ b/bin/index.js @@ -13,7 +13,7 @@ import WebSocket from 'ws' import cli from '../src/cli.js' import style from '../src/style.js' import { sceneHelp, sceneList, sceneSwitch, sceneCurrent } from '../src/scene.js' -import { audioHelp, audioList, audioMute, audioUnmute, audioToggle, audioStatus } from '../src/audio.js' +import { audioHelp, audioList, audioMute, audioUnmute, audioToggle, audioStatus, audioGain } from '../src/audio.js' import { streamHelp, streamStart, streamStop, streamToggle, streamStatus } from '../src/stream.js' import { recordHelp, recordStart, recordStop, recordToggle, recordStatus } from '../src/record.js' import { clipHelp, clipSave } from '../src/clip.js' @@ -138,6 +138,12 @@ socket.onopen = function () { } withChannel(socket, (channel) => audioStatus(channel, audioArguments[0])) break + case 'gain': + if (!audioArguments[0] || isNaN(audioArguments[1])) { + printError('Error: Audio name and gain value are required for the gain command.') + } + withChannel(socket, (channel) => audioGain(channel, audioArguments[0], parseFloat(audioArguments[1]))) + break default: printHelp(audioHelp) } diff --git a/src/audio.js b/src/audio.js index 50189bc..059cf76 100644 --- a/src/audio.js +++ b/src/audio.js @@ -27,6 +27,9 @@ const commands = { }, status: { desc: 'Show current audio status' + }, + gain: { + desc: 'Adjust the audio gain' } } @@ -238,11 +241,52 @@ function audioStatus (channel, audioName) { }) } +/** + * Adjust the gain of a specific audio track by name. + * @param {Object} channel - The channel object containing Meld session data. + * @param {string} audioName - The name of the audio track to adjust. + * @param {number} gainValue - The gain value to set (-60.0 to 0.0). + * @returns {Promise} Resolves with a success message or rejects with an error. + */ +function audioGain (channel, audioName, gainValue) { + if (!channel.objects || !channel.objects.meld) { + return Promise.reject(new Error('Meld object not found in channel.')) + } + const meld = channel.objects.meld + let itemId + for (const [key, value] of Object.entries(meld.session.items)) { + if (value.type === 'track' && value.name === audioName) { + itemId = key + break + } + } + if (!itemId) { + return Promise.reject(new Error(`No audio device with name ${style.errHighlight(audioName)} found.`)) + } + + if (typeof gainValue !== 'number' || gainValue < -60.0 || gainValue > 0.0) { + return Promise.reject(new Error('Gain value must be between -60.0 and 0.0.')) + } + // Convert dB (-60.0 to 0.0) to linear gain (0 to 1) + const dbDisplay = Math.pow(10, gainValue / 20) + + return new Promise((resolve, reject) => { + meld.setGain(itemId, dbDisplay) + .then(() => { + resolve(`Audio track ${style.highlight(audioName)} gain set to ${gainValue}.`) + }) + .catch((err) => { + reject(new Error(`Error setting audio gain: ${err.message}`)) + }) + }) +} + export { audioHelp, audioList, audioMute, audioUnmute, audioToggle, - audioStatus + audioStatus, + audioGain }