From 1dda42c1558ec1f27944e04b1087289b4dd8e161 Mon Sep 17 00:00:00 2001 From: Thomas Kercheval Date: Wed, 16 Dec 2020 14:00:51 -0800 Subject: [PATCH 1/2] Add AudioConfig.fromReadableStream --- src/sdk/Audio/AudioConfig.ts | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/sdk/Audio/AudioConfig.ts b/src/sdk/Audio/AudioConfig.ts index 92896326..f3140431 100644 --- a/src/sdk/Audio/AudioConfig.ts +++ b/src/sdk/Audio/AudioConfig.ts @@ -2,6 +2,7 @@ // Licensed under the MIT license. import { PathLike } from "fs"; +import { Readable } from "stream"; import { FileAudioSource, MicAudioSource, @@ -105,6 +106,28 @@ export abstract class AudioConfig { throw new Error("Not Supported Type"); } + /** + * Creates an AudioConfig object from a standard Readable stream. + * Useful when streaming audio from external network sources (e.g., ffmpeg UDP stream into a Docker container). + * @member AudioConfig.fromReadableStream + * @function + * @public + * @param {Readable} audioStream - Custom audio input from a Readable stream. Currently, only WAV / PCM is supported. + * @param {AudioStreamFormat} format - The audio data format in which audio + * will be returned from the stream's read() method. + * @returns {AudioConfig} The audio output configuration being created. + */ + public static fromReadableStream(audioStream: Readable, format?: AudioStreamFormat): AudioConfig { + const pushStream = AudioInputStream.createPushStream(format); + + audioStream.on('readable', () => { + const buffer = audioStream.read(); + pushStream.write(buffer); + }); + + return AudioConfig.fromStreamInput(pushStream); + } + /** * Creates an AudioConfig object representing the default speaker. * @member AudioConfig.fromDefaultSpeakerOutput From 2064ddebfe9f72f3e7ed234c84c545e329d9f45a Mon Sep 17 00:00:00 2001 From: Thomas Kercheval Date: Fri, 18 Dec 2020 15:17:51 -0800 Subject: [PATCH 2/2] Close push stream when Readable runs out of data --- src/sdk/Audio/AudioConfig.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/sdk/Audio/AudioConfig.ts b/src/sdk/Audio/AudioConfig.ts index f3140431..a3f7c3cb 100644 --- a/src/sdk/Audio/AudioConfig.ts +++ b/src/sdk/Audio/AudioConfig.ts @@ -122,7 +122,11 @@ export abstract class AudioConfig { audioStream.on('readable', () => { const buffer = audioStream.read(); - pushStream.write(buffer); + if (buffer === null) { + pushStream.close(); + } else { + pushStream.write(buffer); + } }); return AudioConfig.fromStreamInput(pushStream);