@lls/lls-audio 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1244 -0
- package/common/adapter.js +2592 -0
- package/common/waveform.js +181 -0
- package/package.json +50 -0
- package/player/Audio.js +192 -0
- package/player/CustomPlayer.js +218 -0
- package/player/CustomWave.js +158 -0
- package/player/Speed.js +98 -0
- package/player/Wave.js +173 -0
- package/player/index.js +218 -0
- package/player/styles/fallbackTimelineClassNames.js +43 -0
- package/player/styles/sliderDefaultClassNames.js +120 -0
- package/player/styles/styles.js +65 -0
- package/player/styles/timelineClassNames.js +62 -0
- package/player/styles/volumeClassNames.js +44 -0
- package/player/utils.js +53 -0
- package/recorder/AsyncLoader.js +84 -0
- package/recorder/DesktopAudioRecorder.js +165 -0
- package/recorder/DesktopRecorder.js +144 -0
- package/recorder/MobileRecorder.js +46 -0
- package/recorder/index.js +35 -0
- package/stories/customPlayer.js +21 -0
- package/stories/index.js +53 -0
- package/stories/player.js +21 -0
- package/stories/recorder.js +30 -0
- package/utils/audio.js +123 -0
- package/utils/audioContext.js +10 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
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; }; }();
|
|
8
|
+
|
|
9
|
+
var _react = require('react');
|
|
10
|
+
|
|
11
|
+
var _react2 = _interopRequireDefault(_react);
|
|
12
|
+
|
|
13
|
+
var _msr = require('msr');
|
|
14
|
+
|
|
15
|
+
var _msr2 = _interopRequireDefault(_msr);
|
|
16
|
+
|
|
17
|
+
var _Wave = require('../player/Wave');
|
|
18
|
+
|
|
19
|
+
var _Wave2 = _interopRequireDefault(_Wave);
|
|
20
|
+
|
|
21
|
+
var _audioContext = require('../utils/audioContext');
|
|
22
|
+
|
|
23
|
+
var _audioContext2 = _interopRequireDefault(_audioContext);
|
|
24
|
+
|
|
25
|
+
var _audio = require('../utils/audio');
|
|
26
|
+
|
|
27
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
28
|
+
|
|
29
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
30
|
+
|
|
31
|
+
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
32
|
+
|
|
33
|
+
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
34
|
+
|
|
35
|
+
var audioContext = new _audioContext2.default();
|
|
36
|
+
|
|
37
|
+
var DesktopRecorder = function (_Component) {
|
|
38
|
+
_inherits(DesktopRecorder, _Component);
|
|
39
|
+
|
|
40
|
+
function DesktopRecorder(props) {
|
|
41
|
+
_classCallCheck(this, DesktopRecorder);
|
|
42
|
+
|
|
43
|
+
var _this = _possibleConstructorReturn(this, (DesktopRecorder.__proto__ || Object.getPrototypeOf(DesktopRecorder)).call(this, props));
|
|
44
|
+
|
|
45
|
+
_this.state = {
|
|
46
|
+
isRecording: false,
|
|
47
|
+
recordedData: null
|
|
48
|
+
};
|
|
49
|
+
_this.mediaRecorder = null;
|
|
50
|
+
_this.buffers = [];
|
|
51
|
+
return _this;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
_createClass(DesktopRecorder, [{
|
|
55
|
+
key: 'render',
|
|
56
|
+
value: function render() {
|
|
57
|
+
var _this2 = this;
|
|
58
|
+
|
|
59
|
+
var _state = this.state,
|
|
60
|
+
isRecording = _state.isRecording,
|
|
61
|
+
recordedData = _state.recordedData;
|
|
62
|
+
|
|
63
|
+
return _react2.default.createElement(
|
|
64
|
+
'div',
|
|
65
|
+
null,
|
|
66
|
+
'Desktop recorder',
|
|
67
|
+
isRecording ? _react2.default.createElement(
|
|
68
|
+
'button',
|
|
69
|
+
{ onClick: function onClick() {
|
|
70
|
+
return _this2.stopRecording();
|
|
71
|
+
} },
|
|
72
|
+
' stop recording '
|
|
73
|
+
) : _react2.default.createElement(
|
|
74
|
+
'button',
|
|
75
|
+
{ onClick: function onClick() {
|
|
76
|
+
return _this2.record();
|
|
77
|
+
} },
|
|
78
|
+
' record '
|
|
79
|
+
),
|
|
80
|
+
recordedData ? _react2.default.createElement(_Wave2.default, {
|
|
81
|
+
width: 500,
|
|
82
|
+
currentTime: 0,
|
|
83
|
+
height: 40,
|
|
84
|
+
isLoading: false,
|
|
85
|
+
buffer: recordedData }) : null
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
}, {
|
|
89
|
+
key: 'record',
|
|
90
|
+
value: function record() {
|
|
91
|
+
var _this3 = this;
|
|
92
|
+
|
|
93
|
+
window.navigator.getUserMedia({ audio: true }, function (stream) {
|
|
94
|
+
return _this3.onMediaSuccess(stream);
|
|
95
|
+
}, function (stream) {
|
|
96
|
+
return _this3.onMediaError(stream);
|
|
97
|
+
});
|
|
98
|
+
this.setState({
|
|
99
|
+
isRecording: true
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}, {
|
|
103
|
+
key: 'onMediaSuccess',
|
|
104
|
+
value: function onMediaSuccess(stream) {
|
|
105
|
+
var _this4 = this;
|
|
106
|
+
|
|
107
|
+
this.mediaRecorder = new _msr2.default(stream);
|
|
108
|
+
this.mediaRecorder.mimeType = 'audio/wav'; // check this line for audio/wav
|
|
109
|
+
this.mediaRecorder.bufferSize = 256; // check this line for audio/wav
|
|
110
|
+
this.mediaRecorder.ondataavailable = function (blob) {
|
|
111
|
+
(0, _audio.convertBlobToAudioBuffer)(blob, _this4.onRecordingConverted.bind(_this4));
|
|
112
|
+
};
|
|
113
|
+
this.mediaRecorder.start();
|
|
114
|
+
}
|
|
115
|
+
}, {
|
|
116
|
+
key: 'onRecordingConverted',
|
|
117
|
+
value: function onRecordingConverted(audioBuffer) {
|
|
118
|
+
var recordedData = this.state.recordedData;
|
|
119
|
+
|
|
120
|
+
var mergedBuffer = (0, _audio.appendBuffer)(recordedData, audioBuffer);
|
|
121
|
+
console.log("mergedBuffer", mergedBuffer);
|
|
122
|
+
this.setState({
|
|
123
|
+
recordedData: mergedBuffer
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}, {
|
|
127
|
+
key: 'onMediaError',
|
|
128
|
+
value: function onMediaError(e) {
|
|
129
|
+
console.error('media error', e);
|
|
130
|
+
}
|
|
131
|
+
}, {
|
|
132
|
+
key: 'stopRecording',
|
|
133
|
+
value: function stopRecording() {
|
|
134
|
+
this.mediaRecorder.stop();
|
|
135
|
+
this.setState({
|
|
136
|
+
isRecording: false
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}]);
|
|
140
|
+
|
|
141
|
+
return DesktopRecorder;
|
|
142
|
+
}(_react.Component);
|
|
143
|
+
|
|
144
|
+
exports.default = DesktopRecorder;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
|
|
9
|
+
var _react2 = _interopRequireDefault(_react);
|
|
10
|
+
|
|
11
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
|
+
|
|
13
|
+
var MobileRecorder = function MobileRecorder() {
|
|
14
|
+
return _react2.default.createElement(
|
|
15
|
+
"div",
|
|
16
|
+
null,
|
|
17
|
+
_react2.default.createElement(
|
|
18
|
+
"h3",
|
|
19
|
+
null,
|
|
20
|
+
"IOS and Android (nb: IOS does not support audio, just video) "
|
|
21
|
+
),
|
|
22
|
+
_react2.default.createElement(
|
|
23
|
+
"p",
|
|
24
|
+
null,
|
|
25
|
+
" audio : ",
|
|
26
|
+
_react2.default.createElement("input", { type: "file", accept: "audio/*;capture=microphone" }),
|
|
27
|
+
" "
|
|
28
|
+
),
|
|
29
|
+
_react2.default.createElement(
|
|
30
|
+
"p",
|
|
31
|
+
null,
|
|
32
|
+
" camcorder : ",
|
|
33
|
+
_react2.default.createElement("input", { type: "file", accept: "audio/*;capture=camcorder" }),
|
|
34
|
+
" "
|
|
35
|
+
),
|
|
36
|
+
_react2.default.createElement(
|
|
37
|
+
"p",
|
|
38
|
+
null,
|
|
39
|
+
" camera : ",
|
|
40
|
+
_react2.default.createElement("input", { type: "file", accept: "image/*;capture=camera" }),
|
|
41
|
+
" "
|
|
42
|
+
)
|
|
43
|
+
);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
exports.default = MobileRecorder;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
var _react = require('react');
|
|
8
|
+
|
|
9
|
+
var _react2 = _interopRequireDefault(_react);
|
|
10
|
+
|
|
11
|
+
var _is_js = require('is_js');
|
|
12
|
+
|
|
13
|
+
var _DesktopAudioRecorder = require('./DesktopAudioRecorder');
|
|
14
|
+
|
|
15
|
+
var _DesktopAudioRecorder2 = _interopRequireDefault(_DesktopAudioRecorder);
|
|
16
|
+
|
|
17
|
+
var _MobileRecorder = require('./MobileRecorder');
|
|
18
|
+
|
|
19
|
+
var _MobileRecorder2 = _interopRequireDefault(_MobileRecorder);
|
|
20
|
+
|
|
21
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
22
|
+
|
|
23
|
+
// Check browser support
|
|
24
|
+
var isUserMediaSupported = !!(window.navigator.getUserMedia || window.navigator.webkitGetUserMedia || window.navigator.mozGetUserMedia || window.navigator.msGetUserMedia);
|
|
25
|
+
var desktop = !((0, _is_js.tablet)() && (0, _is_js.mobile)());
|
|
26
|
+
|
|
27
|
+
var Recorder = function Recorder() {
|
|
28
|
+
return desktop ? isUserMediaSupported ? _react2.default.createElement(_DesktopAudioRecorder2.default, null) : _react2.default.createElement(
|
|
29
|
+
'div',
|
|
30
|
+
null,
|
|
31
|
+
' not supported '
|
|
32
|
+
) : _react2.default.createElement(_MobileRecorder2.default, null);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
exports.default = Recorder;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
var _react = require('react');
|
|
8
|
+
|
|
9
|
+
var _react2 = _interopRequireDefault(_react);
|
|
10
|
+
|
|
11
|
+
var _CustomPlayer = require('../player/CustomPlayer');
|
|
12
|
+
|
|
13
|
+
var _CustomPlayer2 = _interopRequireDefault(_CustomPlayer);
|
|
14
|
+
|
|
15
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
16
|
+
|
|
17
|
+
var CustomPlayerExample = function CustomPlayerExample() {
|
|
18
|
+
return _react2.default.createElement(_CustomPlayer2.default, { url: 'cranberries_zombie.mp3' });
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
exports.default = CustomPlayerExample;
|
package/stories/index.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _react = require('react');
|
|
4
|
+
|
|
5
|
+
var _react2 = _interopRequireDefault(_react);
|
|
6
|
+
|
|
7
|
+
var _storybook = require('@kadira/storybook');
|
|
8
|
+
|
|
9
|
+
var _getMuiTheme = require('material-ui/styles/getMuiTheme');
|
|
10
|
+
|
|
11
|
+
var _getMuiTheme2 = _interopRequireDefault(_getMuiTheme);
|
|
12
|
+
|
|
13
|
+
var _MuiThemeProvider = require('material-ui/styles/MuiThemeProvider');
|
|
14
|
+
|
|
15
|
+
var _MuiThemeProvider2 = _interopRequireDefault(_MuiThemeProvider);
|
|
16
|
+
|
|
17
|
+
var _player = require('./player');
|
|
18
|
+
|
|
19
|
+
var _player2 = _interopRequireDefault(_player);
|
|
20
|
+
|
|
21
|
+
var _customPlayer = require('./customPlayer');
|
|
22
|
+
|
|
23
|
+
var _customPlayer2 = _interopRequireDefault(_customPlayer);
|
|
24
|
+
|
|
25
|
+
var _recorder = require('./recorder');
|
|
26
|
+
|
|
27
|
+
var _recorder2 = _interopRequireDefault(_recorder);
|
|
28
|
+
|
|
29
|
+
require('../common/material-ui.css');
|
|
30
|
+
|
|
31
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
32
|
+
|
|
33
|
+
//import PlayerCustom from './playerCustom'
|
|
34
|
+
(0, _storybook.storiesOf)('Player', module).add('Soundclound waveform', function () {
|
|
35
|
+
return _react2.default.createElement(
|
|
36
|
+
_MuiThemeProvider2.default,
|
|
37
|
+
{ muiTheme: (0, _getMuiTheme2.default)() },
|
|
38
|
+
_react2.default.createElement(_player2.default, null)
|
|
39
|
+
);
|
|
40
|
+
}).add('Custom waveform', function () {
|
|
41
|
+
return _react2.default.createElement(
|
|
42
|
+
_MuiThemeProvider2.default,
|
|
43
|
+
{ muiTheme: (0, _getMuiTheme2.default)() },
|
|
44
|
+
_react2.default.createElement(_customPlayer2.default, null)
|
|
45
|
+
);
|
|
46
|
+
});
|
|
47
|
+
(0, _storybook.storiesOf)('Recorder', module).add('Normal', function () {
|
|
48
|
+
return _react2.default.createElement(
|
|
49
|
+
_MuiThemeProvider2.default,
|
|
50
|
+
{ muiTheme: (0, _getMuiTheme2.default)() },
|
|
51
|
+
_react2.default.createElement(_recorder2.default, null)
|
|
52
|
+
);
|
|
53
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
var _react = require('react');
|
|
8
|
+
|
|
9
|
+
var _react2 = _interopRequireDefault(_react);
|
|
10
|
+
|
|
11
|
+
var _player = require('../player');
|
|
12
|
+
|
|
13
|
+
var _player2 = _interopRequireDefault(_player);
|
|
14
|
+
|
|
15
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
16
|
+
|
|
17
|
+
var PlayerExample = function PlayerExample() {
|
|
18
|
+
return _react2.default.createElement(_player2.default, { url: 'cranberries_zombie.mp3' });
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
exports.default = PlayerExample;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
var _react = require('react');
|
|
8
|
+
|
|
9
|
+
var _react2 = _interopRequireDefault(_react);
|
|
10
|
+
|
|
11
|
+
var _player = require('../player');
|
|
12
|
+
|
|
13
|
+
var _player2 = _interopRequireDefault(_player);
|
|
14
|
+
|
|
15
|
+
var _recorder = require('../recorder');
|
|
16
|
+
|
|
17
|
+
var _recorder2 = _interopRequireDefault(_recorder);
|
|
18
|
+
|
|
19
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
20
|
+
|
|
21
|
+
var RecorderExample = function RecorderExample() {
|
|
22
|
+
return _react2.default.createElement(
|
|
23
|
+
'div',
|
|
24
|
+
null,
|
|
25
|
+
_react2.default.createElement(_player2.default, { url: 'english.mp3' }),
|
|
26
|
+
_react2.default.createElement(_recorder2.default, null)
|
|
27
|
+
);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
exports.default = RecorderExample;
|
package/utils/audio.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.convertBlobToaudioBuffer = exports.appendBuffer = exports.convertAudioBufferToWaveform = exports.getWaveform = undefined;
|
|
7
|
+
|
|
8
|
+
var _audioContext = require('./audioContext');
|
|
9
|
+
|
|
10
|
+
var _audioContext2 = _interopRequireDefault(_audioContext);
|
|
11
|
+
|
|
12
|
+
var _webaudio = require('waveform-data/webaudio');
|
|
13
|
+
|
|
14
|
+
var _webaudio2 = _interopRequireDefault(_webaudio);
|
|
15
|
+
|
|
16
|
+
var _waveformData = require('waveform-data');
|
|
17
|
+
|
|
18
|
+
var _waveformData2 = _interopRequireDefault(_waveformData);
|
|
19
|
+
|
|
20
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
+
|
|
22
|
+
var audioContext = _audioContext2.default ? new _audioContext2.default() : null;
|
|
23
|
+
|
|
24
|
+
var bufferCache = {};
|
|
25
|
+
|
|
26
|
+
var getWaveform = exports.getWaveform = function getWaveform(url) {
|
|
27
|
+
return new Promise(function (resolve, reject) {
|
|
28
|
+
if (bufferCache[url]) {
|
|
29
|
+
resolve(bufferCache[url]);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
var xhr = new XMLHttpRequest();
|
|
33
|
+
|
|
34
|
+
// URL of a CORS MP3/Ogg file
|
|
35
|
+
xhr.open("GET", url);
|
|
36
|
+
xhr.responseType = "arraybuffer";
|
|
37
|
+
|
|
38
|
+
xhr.addEventListener("load", function onResponse(progressEvent) {
|
|
39
|
+
(0, _webaudio2.default)(audioContext, this.response, function (error, waveform) {
|
|
40
|
+
if (error) reject(error);
|
|
41
|
+
bufferCache[url] = waveform;
|
|
42
|
+
resolve(waveform);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
xhr.send();
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
var convertAudioBufferToWaveform = exports.convertAudioBufferToWaveform = function convertAudioBufferToWaveform(audioBuffer) {
|
|
51
|
+
// All this code (except the last line) is stolen/inspired from https://github.com/bbc/waveform-data.js/blob/master/lib/builders/audiodecoder.js
|
|
52
|
+
var scale = 512;
|
|
53
|
+
var scaleAdjuster = 127;
|
|
54
|
+
var dataLength = Math.floor(audioBuffer.length / scale);
|
|
55
|
+
var offset = 20;
|
|
56
|
+
var dataObject = new DataView(new ArrayBuffer(offset + dataLength * 2));
|
|
57
|
+
var leftChannel = void 0,
|
|
58
|
+
rightChannel = void 0;
|
|
59
|
+
var minValue = Infinity,
|
|
60
|
+
max_value = -Infinity,
|
|
61
|
+
scale_counter = scale;
|
|
62
|
+
var bufferLength = audioBuffer.length;
|
|
63
|
+
|
|
64
|
+
dataObject.setInt32(0, 1, true); //version
|
|
65
|
+
dataObject.setUint32(4, 1, true); //is 8 bit
|
|
66
|
+
dataObject.setInt32(8, audioBuffer.sampleRate, true); //sample rate
|
|
67
|
+
dataObject.setInt32(12, scale, true); //scale
|
|
68
|
+
dataObject.setInt32(16, dataLength, true); //length
|
|
69
|
+
|
|
70
|
+
leftChannel = audioBuffer.getChannelData(0);
|
|
71
|
+
rightChannel = audioBuffer.getChannelData(1);
|
|
72
|
+
|
|
73
|
+
for (var i = 0; i < bufferLength; i++) {
|
|
74
|
+
var sample = (leftChannel[i] + rightChannel[i]) / 2 * scaleAdjuster;
|
|
75
|
+
|
|
76
|
+
if (sample < minValue) {
|
|
77
|
+
minValue = sample;
|
|
78
|
+
if (minValue < -128) {
|
|
79
|
+
minValue = -128;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (sample > max_value) {
|
|
84
|
+
max_value = sample;
|
|
85
|
+
if (max_value > 127) {
|
|
86
|
+
max_value = 127;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (--scale_counter === 0) {
|
|
91
|
+
dataObject.setInt8(offset++, Math.floor(minValue));
|
|
92
|
+
dataObject.setInt8(offset++, Math.floor(max_value));
|
|
93
|
+
minValue = Infinity;max_value = -Infinity;scale_counter = scale;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return _waveformData2.default.create(dataObject.buffer);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
var appendBuffer = exports.appendBuffer = function appendBuffer(buffer1, buffer2) {
|
|
101
|
+
if (!buffer1) return buffer2;
|
|
102
|
+
if (!buffer2) return buffer1;
|
|
103
|
+
var numberOfChannels = Math.min(buffer1.numberOfChannels, buffer2.numberOfChannels);
|
|
104
|
+
var tmp = audioContext.createBuffer(numberOfChannels, buffer1.length + buffer2.length, buffer1.sampleRate);
|
|
105
|
+
for (var i = 0; i < numberOfChannels; i++) {
|
|
106
|
+
var channel = tmp.getChannelData(i);
|
|
107
|
+
channel.set(buffer1.getChannelData(i), 0);
|
|
108
|
+
channel.set(buffer2.getChannelData(i), buffer1.length);
|
|
109
|
+
}
|
|
110
|
+
return tmp;
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
var convertBlobToaudioBuffer = exports.convertBlobToaudioBuffer = function convertBlobToaudioBuffer(blob, cb) {
|
|
114
|
+
var fileReader = new FileReader();
|
|
115
|
+
fileReader.onload = function (_ref) {
|
|
116
|
+
var result = _ref.target.result;
|
|
117
|
+
|
|
118
|
+
audioContext.decodeAudioData(result, function (buf) {
|
|
119
|
+
cb(buf);
|
|
120
|
+
});
|
|
121
|
+
};
|
|
122
|
+
fileReader.readAsArrayBuffer(blob);
|
|
123
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
window.AudioContext = window.AudioContext || window.webkitAudioContext;
|
|
7
|
+
|
|
8
|
+
window.OfflineAudioContext = window.OfflineAudioContext || window.webkitOfflineAudioContext;
|
|
9
|
+
|
|
10
|
+
exports.default = window.AudioContext;
|