ableton-mcp-server-rag
Version:
Ableton Live MCP depend on Ableton JS
92 lines • 3.51 kB
JavaScript
import { Result } from './common.js';
import { Mutex } from 'async-mutex';
import { logger } from '../main.js';
const removeListenerFuncs = [];
const mutex = new Mutex();
/**
* Sets up a listener for the record mode of the song.
* When the record mode is set to false, all listeners are removed to prevent bugs when recording is stopped by user.
*/
export async function setupRecordModeListener(song) {
song.addListener('record_mode', async (mode) => {
if (!mode) {
// remove all listeners
const release = await mutex.acquire();
try {
for (const removeFunc of removeListenerFuncs) {
await removeFunc();
}
logger.info(`remove ${removeListenerFuncs.length} listeners in record mode listener`);
// clear the array
removeListenerFuncs.length = 0;
}
catch (err) {
logger.error(err);
}
finally {
release();
}
}
});
}
export async function recordByTimeRange(song, start_time, end_time) {
await song.set('start_time', start_time);
await song.set('record_mode', 1);
return new Promise((resolve, reject) => {
let removeFunc;
song.addListener('current_song_time', async (time) => {
try {
if (time >= end_time) {
// remove this listener
if (removeFunc) {
const release = await mutex.acquire();
try {
if (removeListenerFuncs.includes(removeFunc)) {
await removeFunc();
// remove from array
removeListenerFuncs.splice(removeListenerFuncs.indexOf(removeFunc), 1);
logger.info('remove listener in record_by_time_range');
}
}
finally {
release();
}
}
await song.set('record_mode', 0);
await song.stopPlaying();
resolve(Result.ok());
}
}
catch (err) {
if (removeFunc) {
const release = await mutex.acquire();
try {
if (removeListenerFuncs.includes(removeFunc)) {
await removeFunc();
// remove from array
removeListenerFuncs.splice(removeListenerFuncs.indexOf(removeFunc), 1);
logger.info('remove listener in record_by_time_range');
}
}
finally {
release();
}
}
reject(`record_by_time_range failed: ${err}`);
}
}).then(async (listenerRemoveFunc) => {
removeFunc = listenerRemoveFunc;
const release = await mutex.acquire();
try {
removeListenerFuncs.push(listenerRemoveFunc);
}
finally {
release();
}
}).catch(err => {
logger.error(err);
resolve('record_by_time_range failed');
});
});
}
//# sourceMappingURL=record-utils.js.map