From 641498546113dd9057051e1666b88d3462aec0c3 Mon Sep 17 00:00:00 2001 From: Eric Rosenbaum <eric.rosenbaum@gmail.com> Date: Thu, 5 Sep 2019 13:49:22 -0400 Subject: [PATCH] Calc tooLoud with chunkLevels, disable louder btn --- src/components/sound-editor/sound-editor.jsx | 2 ++ src/containers/sound-editor.jsx | 12 ++++++++++++ src/lib/audio/audio-effects.js | 18 +----------------- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/components/sound-editor/sound-editor.jsx b/src/components/sound-editor/sound-editor.jsx index 84f56d08b..32a018a56 100644 --- a/src/components/sound-editor/sound-editor.jsx +++ b/src/components/sound-editor/sound-editor.jsx @@ -265,6 +265,7 @@ const SoundEditor = props => ( onClick={props.onSlower} /> <IconButton + disabled={props.tooLoud} className={classNames(styles.effectButton, styles.flipInRtl)} img={louderIcon} title={<FormattedMessage {...messages.louder} />} @@ -340,6 +341,7 @@ SoundEditor.propTypes = { onUndo: PropTypes.func.isRequired, playhead: PropTypes.number, setRef: PropTypes.func, + tooLoud: PropTypes.bool.isRequired, trimEnd: PropTypes.number, trimStart: PropTypes.number }; diff --git a/src/containers/sound-editor.jsx b/src/containers/sound-editor.jsx index a2b19719f..2a2aa4e7e 100644 --- a/src/containers/sound-editor.jsx +++ b/src/containers/sound-editor.jsx @@ -14,6 +14,8 @@ import log from '../lib/log.js'; const UNDO_STACK_SIZE = 99; +const MAX_RMS = 1.2; + class SoundEditor extends React.Component { constructor (props) { super(props); @@ -265,6 +267,15 @@ class SoundEditor extends React.Component { } }); } + tooLoud () { + const numChunks = this.state.chunkLevels.length; + const startIndex = this.state.trimStart === null ? + 0 : Math.floor(this.state.trimStart * numChunks); + const endIndex = this.state.trimEnd === null ? + numChunks - 1 : Math.floor(this.state.trimEnd * numChunks); + const trimChunks = this.state.chunkLevels.slice(startIndex, endIndex + 1); + return Math.max(...trimChunks) > MAX_RMS; + } getUndoItem () { return { ...this.copyCurrentBuffer(), @@ -399,6 +410,7 @@ class SoundEditor extends React.Component { name={this.props.name} playhead={this.state.playhead} setRef={this.setRef} + tooLoud={this.tooLoud()} trimEnd={this.state.trimEnd} trimStart={this.state.trimStart} onChangeName={this.handleChangeName} diff --git a/src/lib/audio/audio-effects.js b/src/lib/audio/audio-effects.js index 263199c46..8dd551f38 100644 --- a/src/lib/audio/audio-effects.js +++ b/src/lib/audio/audio-effects.js @@ -3,7 +3,6 @@ import RobotEffect from './effects/robot-effect.js'; import VolumeEffect from './effects/volume-effect.js'; import FadeEffect from './effects/fade-effect.js'; import MuteEffect from './effects/mute-effect.js'; -import {computeChunkedRMS} from './audio-util.js'; const effectTypes = { ROBOT: 'robot', @@ -97,21 +96,6 @@ class AudioEffects { this.buffer = buffer; } - // If the sound is louder than an RMS limit, do not apply gain. - // This helps reduce distortion due to clipping. - this.louderGain = 1.25; - this.rmsLimit = 1.2; - if (name === effectTypes.LOUDER) { - const trimStartSamples = Math.floor(trimStart * buffer.length); - const trimEndSamples = Math.floor(trimEnd * buffer.length); - const slicedBuffer = buffer.getChannelData(0).slice(trimStartSamples, trimEndSamples); - const rmsChunks = computeChunkedRMS(slicedBuffer); - const maxRMS = Math.max(...rmsChunks); - if (maxRMS > this.rmsLimit) { - this.louderGain = 1; - } - } - this.source = this.audioContext.createBufferSource(); this.source.buffer = this.buffer; this.name = name; @@ -127,7 +111,7 @@ class AudioEffects { this.source.playbackRate.setValueAtTime(1.0, this.adjustedTrimEndSeconds); break; case effectTypes.LOUDER: - ({input, output} = new VolumeEffect(this.audioContext, this.louderGain, + ({input, output} = new VolumeEffect(this.audioContext, 1.25, this.adjustedTrimStartSeconds, this.adjustedTrimEndSeconds)); break; case effectTypes.SOFTER: -- GitLab