retroload
Version:
Command line utility for converting tape archive files of historical computers into sound for loading them on real devices
60 lines • 2.67 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
import { Logger } from 'retroload-lib';
import stream from 'stream';
export class SpeakerWrapper {
// eslint-disable-next-line consistent-return
static create(sampleRate, bitDepth, channels) {
return __awaiter(this, void 0, void 0, function* () {
try {
// Dynamically try to load speaker module.
// This way it doesn't need to be an actual dependency.
// @ts-expect-error Ignore missing module because it's just a loose dependency
const DynamicSpeakerImport = (yield import('speaker')).default;
return new SpeakerWrapper(new DynamicSpeakerImport({ channels, bitDepth, sampleRate }));
// eslint-disable-next-line @typescript-eslint/no-explicit-any
}
catch (e) {
if (e.code === 'ERR_MODULE_NOT_FOUND') {
return undefined;
}
// eslint-disable-next-line no-console
console.error(e);
process.exit(1);
}
});
}
constructor(speaker) {
Object.defineProperty(this, "speaker", {
enumerable: true,
configurable: true,
writable: true,
value: speaker
});
}
play(buffer) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve) => {
Logger.info('Playing via speaker library...');
const s = new stream.PassThrough();
s.push(buffer);
s.push(null);
this.speaker.on('finish', () => {
resolve(null);
});
s.pipe(this.speaker);
});
});
}
}
//# sourceMappingURL=SpeakerWrapper.js.map