{"version":3,"sources":["src/common/RiffPcmEncoder.ts"],"names":[],"mappings":"AAGA,qBAAa,cAAc;IAEvB,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,qBAAqB,CAAS;gBAEnB,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM;IAK/D,MAAM,CAAC,gBAAgB,EAAE,YAAY,GAAG,WAAW;IAiB1D,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,oBAAoB;CA+B/B","file":"RiffPcmEncoder.d.ts","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nexport class RiffPcmEncoder {\r\n\r\n    private privActualSampleRate: number;\r\n    private privDesiredSampleRate: number;\r\n\r\n    public constructor(actualSampleRate: number, desiredSampleRate: number) {\r\n        this.privActualSampleRate = actualSampleRate;\r\n        this.privDesiredSampleRate = desiredSampleRate;\r\n    }\r\n\r\n    public encode(actualAudioFrame: Float32Array): ArrayBuffer {\r\n\r\n        const audioFrame = this.downSampleAudioFrame(actualAudioFrame, this.privActualSampleRate, this.privDesiredSampleRate);\r\n\r\n        if (!audioFrame) {\r\n            return null;\r\n        }\r\n\r\n        const audioLength = audioFrame.length * 2;\r\n\r\n        const buffer = new ArrayBuffer(audioLength);\r\n        const view = new DataView(buffer);\r\n        this.floatTo16BitPCM(view, 0, audioFrame);\r\n\r\n        return buffer;\r\n    }\r\n\r\n    private setString(view: DataView, offset: number, str: string): void {\r\n        for (let i = 0; i < str.length; i++) {\r\n            view.setUint8(offset + i, str.charCodeAt(i));\r\n        }\r\n    }\r\n\r\n    private floatTo16BitPCM(view: DataView, offset: number, input: Float32Array): void {\r\n        for (let i = 0; i < input.length; i++ , offset += 2) {\r\n            const s = Math.max(-1, Math.min(1, input[i]));\r\n            view.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);\r\n        }\r\n    }\r\n\r\n    private downSampleAudioFrame(\r\n        srcFrame: Float32Array,\r\n        srcRate: number,\r\n        dstRate: number): Float32Array {\r\n\r\n        if (!srcFrame) {\r\n            return null;\r\n        }\r\n\r\n        if (dstRate === srcRate || dstRate > srcRate) {\r\n            return srcFrame;\r\n        }\r\n\r\n        const ratio = srcRate / dstRate;\r\n        const dstLength = Math.round(srcFrame.length / ratio);\r\n        const dstFrame = new Float32Array(dstLength);\r\n        let srcOffset = 0;\r\n        let dstOffset = 0;\r\n        while (dstOffset < dstLength) {\r\n            const nextSrcOffset = Math.round((dstOffset + 1) * ratio);\r\n            let accum = 0;\r\n            let count = 0;\r\n            while (srcOffset < nextSrcOffset && srcOffset < srcFrame.length) {\r\n                accum += srcFrame[srcOffset++];\r\n                count++;\r\n            }\r\n            dstFrame[dstOffset++] = accum / count;\r\n        }\r\n\r\n        return dstFrame;\r\n    }\r\n}\r\n"]}