UNPKG

@euirim/microsoft-cognitiveservices-speech-sdk

Version:
121 lines (119 loc) 4.97 kB
"use strict"; // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. Object.defineProperty(exports, "__esModule", { value: true }); var Error_1 = require("../../common/Error"); /** * Base audio player class * TODO: Plays only PCM for now. * @class */ var BaseAudioPlayer = /** @class */ (function () { /** * Creates and initializes an instance of this class. * @constructor */ function BaseAudioPlayer(audioFormat) { this.audioContext = null; this.gainNode = null; this.autoUpdateBufferTimer = 0; this.init(audioFormat); } /** * play Audio sample * @param newAudioData audio data to be played. */ BaseAudioPlayer.prototype.playAudioSample = function (newAudioData) { this.ensureInitializedContext(); var audioData = this.formatAudioData(newAudioData); var newSamplesData = new Float32Array(this.samples.length + audioData.length); newSamplesData.set(this.samples, 0); newSamplesData.set(audioData, this.samples.length); this.samples = newSamplesData; }; /** * stops audio and clears the buffers */ BaseAudioPlayer.prototype.stopAudio = function () { if (this.audioContext !== null) { this.samples = new Float32Array(); clearInterval(this.autoUpdateBufferTimer); this.audioContext.close(); this.audioContext = null; } }; BaseAudioPlayer.prototype.init = function (audioFormat) { this.audioFormat = audioFormat; this.samples = new Float32Array(); }; BaseAudioPlayer.prototype.ensureInitializedContext = function () { var _this = this; if (this.audioContext === null) { this.createAudioContext(); var timerPeriod = 200; this.autoUpdateBufferTimer = setInterval(function () { _this.updateAudioBuffer(); }, timerPeriod); } }; BaseAudioPlayer.prototype.createAudioContext = function () { // new ((window as any).AudioContext || (window as any).webkitAudioContext)(); this.audioContext = new AudioContext(); // TODO: Various examples shows this gain node, it does not seem to be needed unless we plan // to control the volume, not likely this.gainNode = this.audioContext.createGain(); this.gainNode.gain.value = 1; this.gainNode.connect(this.audioContext.destination); this.startTime = this.audioContext.currentTime; }; BaseAudioPlayer.prototype.formatAudioData = function (audioData) { switch (this.audioFormat.bitsPerSample) { case 8: return this.formatArrayBuffer(new Int8Array(audioData), 128); case 16: return this.formatArrayBuffer(new Int16Array(audioData), 32768); case 32: return this.formatArrayBuffer(new Int32Array(audioData), 2147483648); default: throw new Error_1.InvalidOperationError("Only WAVE_FORMAT_PCM (8/16/32 bps) format supported at this time"); } }; BaseAudioPlayer.prototype.formatArrayBuffer = function (audioData, maxValue) { var float32Data = new Float32Array(audioData.length); for (var i = 0; i < audioData.length; i++) { float32Data[i] = audioData[i] / maxValue; } return float32Data; }; BaseAudioPlayer.prototype.updateAudioBuffer = function () { if (this.samples.length === 0) { return; } var channelCount = this.audioFormat.channels; var bufferSource = this.audioContext.createBufferSource(); var frameCount = this.samples.length / channelCount; var audioBuffer = this.audioContext.createBuffer(channelCount, frameCount, this.audioFormat.samplesPerSec); // TODO: Should we do the conversion in the pushAudioSample instead? for (var channel = 0; channel < channelCount; channel++) { // Fill in individual channel data var channelOffset = channel; var audioData = audioBuffer.getChannelData(channel); for (var i = 0; i < this.samples.length; i++, channelOffset += channelCount) { audioData[i] = this.samples[channelOffset]; } } if (this.startTime < this.audioContext.currentTime) { this.startTime = this.audioContext.currentTime; } bufferSource.buffer = audioBuffer; bufferSource.connect(this.gainNode); bufferSource.start(this.startTime); // Make sure we play the next sample after the current one. this.startTime += audioBuffer.duration; // Clear the samples for the next pushed data. this.samples = new Float32Array(); }; return BaseAudioPlayer; }()); exports.BaseAudioPlayer = BaseAudioPlayer; //# sourceMappingURL=BaseAudioPlayer.js.map