/**
 * Created by wangweijie5 on 2016/12/16.
 */

"use strict";

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var __instance = function () {
    var instance = void 0;
    return function (newInstance) {
        if (newInstance) instance = newInstance;
        return instance;
    };
}();

var AudioRenderer = function () {
    function AudioRenderer() {
        _classCallCheck(this, AudioRenderer);

        if (__instance()) return __instance();

        // 确保只有单例
        if (AudioRenderer.unique !== undefined) {
            return AudioRenderer.unique;
        }

        AudioRenderer.unique = this;

        this.oAudioContext = null;
        this.currentVolume = 0.8; // 初始音量
        this.bSetVolume = false;
        this.gainNode = null;
        this.iWndNum = -1; // 窗口号
        this.mVolumes = new Map(); // 用于存储所有音量

        // Init AudioContext
        var AudioContext = window.AudioContext || window.webkitAudioContext;
        this.oAudioContext = new AudioContext();

        this.writeString = function (view, offset, string) {
            for (var i = 0; i < string.length; i++) {
                view.setUint8(offset + i, string.charCodeAt(i));
            }
        };

        this.setBufferToDataview = function (output, offset, input) {
            for (var i = 0; i < input.length; i++, offset++) {
                output.setUint8(offset, input[i]);
            }
        };

        __instance(this);
    }

    /**
     * @synopsis 音频播放
     *
     *  @param dataBuf [IN] 音频缓存
     *  @param dataLen [IN] 缓存长度
     *  @param audioInfo [IN] 音频参数
     *
     * @returns 状态码
     */


    _createClass(AudioRenderer, [{
        key: 'Play',
        value: function Play(dataBuf, dataLen, audioInfo) {
            var bufferData = new ArrayBuffer(44 + dataLen);
            var viewTalk = new DataView(bufferData);
            var sampleRates = audioInfo.samplesPerSec;
            var channels = audioInfo.channels;
            var bitsPerSample = audioInfo.bitsPerSample;

            /* RIFF identifier */
            this.writeString(viewTalk, 0, 'RIFF');
            /* file length */
            viewTalk.setUint32(4, 32 + dataLen * 2, true);
            /* RIFF type */
            this.writeString(viewTalk, 8, 'WAVE');
            /* format chunk identifier */
            this.writeString(viewTalk, 12, 'fmt ');
            /* format chunk length */
            viewTalk.setUint32(16, 16, true);
            /* sample format (raw) */
            viewTalk.setUint16(20, 1, true);
            /* channel count */
            viewTalk.setUint16(22, channels, true);
            /* sample rate */
            viewTalk.setUint32(24, sampleRates, true);
            /* byte rate (sample rate * block align) */
            viewTalk.setUint32(28, sampleRates * 2, true);
            /* block align (channel count * bytes per sample)/8 */
            viewTalk.setUint16(32, channels * bitsPerSample / 8, true);
            /* bits per sample */
            viewTalk.setUint16(34, bitsPerSample, true);
            /* data chunk identifier */
            this.writeString(viewTalk, 36, 'data');
            /* data chunk length */
            viewTalk.setUint32(40, dataLen, true);
            this.setBufferToDataview(viewTalk, 44, dataBuf);

            var self = this;
            this.oAudioContext.decodeAudioData(viewTalk.buffer, function (buffer) {

                var bufferSource = self.oAudioContext.createBufferSource();
                if (bufferSource == null) {
                    return -1;
                }

                bufferSource.buffer = buffer;
                bufferSource.start(0);

                if (self.gainNode == null || self.bSetVolume) {
                    self.gainNode = self.oAudioContext.createGain();
                    // self.gainNode.gain.value = self.currentVolume;
                    // // self.currentVolume = self.gainNode.gain.value;
                    // self.gainNode.connect(self.oAudioContext.destination);

                    self.bSetVolume = false;
                }

                self.gainNode.gain.value = self.currentVolume;
                // self.currentVolume = self.gainNode.gain.value;
                self.gainNode.connect(self.oAudioContext.destination);

                bufferSource.connect(self.gainNode);
            }, function (e) {
                console.log("decode error");
                return -1;
            });

            return 0;
        }

        /**
         * @synopsis 停止播放
         *
         * @returns 返回音量
         */

    }, {
        key: 'Stop',
        value: function Stop() {
            if (this.gainNode != null) {
                this.gainNode.disconnect();
                this.gainNode = null;
            }

            // this.oAudioContext.close();

            // AudioRenderer.unique = undefined;
            // __instance() = null;
            return true;
        }

        /**
         * @synopsis 设置音量
         *
         *  @param iVolume [IN] 音量
         *
         * @returns 状态码
         */

    }, {
        key: 'SetVolume',
        value: function SetVolume(iVolume) {
            this.bSetVolume = true;
            this.currentVolume = iVolume;

            // 储存当前窗口设置音量值
            this.mVolumes.set(this.iWndNum, iVolume);
            return true;
        }

        /**
         * @synopsis 设置窗口号
         *
         *  @param iWndNum [IN] 窗口号
         *
         * @returns 状态码
         */

    }, {
        key: 'SetWndNum',
        value: function SetWndNum(iWndNum) {
            this.iWndNum = iWndNum;

            // 获取当前窗口设置音量值
            var iVolume = this.mVolumes.get(iWndNum);
            if (iVolume == undefined) {
                iVolume = 0.8; // 默认音量
            }
            this.currentVolume = iVolume;

            return true;
        }

        /**
         * @synopsis 获取音量
         *
         * @returns 返回音量
         */

    }, {
        key: 'GetVolume',
        value: function GetVolume() {
            // 获取当前窗口设置音量值
            var iVolume = this.mVolumes.get(this.iWndNum);
            if (iVolume == undefined) {
                iVolume = 0.8; // 默认音量
            }

            return iVolume;
        }
    }]);

    return AudioRenderer;
}();
//# sourceMappingURL=AudioRenderer.js.map