From b174e002a9c13dd72b1cd567a20b85cdb83ceb9c Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 24 Sep 2019 12:52:51 +1200 Subject: [PATCH] Implement Recording.setPlayerVolume() --- assignment-client/src/Agent.cpp | 17 ++++++++++++++--- libraries/recording/src/recording/Deck.cpp | 4 ++++ libraries/recording/src/recording/Deck.h | 4 ++++ .../src/RecordingScriptingInterface.cpp | 2 +- .../src/RecordingScriptingInterface.h | 3 ++- 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 68464fef91..799afd64a6 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -433,7 +433,7 @@ void Agent::executeScript() { using namespace recording; static const FrameType AUDIO_FRAME_TYPE = Frame::registerFrameType(AudioConstants::getAudioFrameName()); - Frame::registerFrameHandler(AUDIO_FRAME_TYPE, [this, &scriptedAvatar](Frame::ConstPointer frame) { + Frame::registerFrameHandler(AUDIO_FRAME_TYPE, [this, &player, &scriptedAvatar](Frame::ConstPointer frame) { if (_shouldMuteRecordingAudio) { return; } @@ -442,10 +442,21 @@ void Agent::executeScript() { QByteArray audio(frame->data); - if (_isNoiseGateEnabled) { + auto volume = player->getVolume(); + if (volume != 1.0f || _isNoiseGateEnabled) { int16_t* samples = reinterpret_cast(audio.data()); int numSamples = AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL; - _audioGate.render(samples, samples, numSamples); + + if (volume != 1.0f) { + int32_t fract = (int32_t)(volume * 65536.0f); // Q16 + for (int i = 0; i < numSamples; i++) { // #######: i++ instead of ++i? + samples[i] = (fract * (int32_t)samples[i]) >> 16; + } + } + + if (_isNoiseGateEnabled) { + _audioGate.render(samples, samples, numSamples); + } } computeLoudness(&audio, scriptedAvatar); diff --git a/libraries/recording/src/recording/Deck.cpp b/libraries/recording/src/recording/Deck.cpp index 4d65f0eb1b..bdbbc05d50 100644 --- a/libraries/recording/src/recording/Deck.cpp +++ b/libraries/recording/src/recording/Deck.cpp @@ -103,6 +103,10 @@ float Deck::position() const { return Frame::frameTimeToSeconds(currentPosition); } +void Deck::setVolume(float volume) { + _volume = std::min(std::max(volume, 0.0f), 1.0f); +} + static const Frame::Time MIN_FRAME_WAIT_INTERVAL = Frame::secondsToFrameTime(0.001f); static const Frame::Time MAX_FRAME_PROCESSING_TIME = Frame::secondsToFrameTime(0.004f); diff --git a/libraries/recording/src/recording/Deck.h b/libraries/recording/src/recording/Deck.h index 1f8d58d5e1..12e2dd4b16 100644 --- a/libraries/recording/src/recording/Deck.h +++ b/libraries/recording/src/recording/Deck.h @@ -57,6 +57,9 @@ public: float position() const; void seek(float position); + float getVolume() { return _volume; } + void setVolume(float volume); + signals: void playbackStateChanged(); void looped(); @@ -76,6 +79,7 @@ private: bool _pause { true }; bool _loop { false }; float _length { 0 }; + float _volume { 1.0f }; }; } diff --git a/libraries/script-engine/src/RecordingScriptingInterface.cpp b/libraries/script-engine/src/RecordingScriptingInterface.cpp index e57d80274a..f95edb482b 100644 --- a/libraries/script-engine/src/RecordingScriptingInterface.cpp +++ b/libraries/script-engine/src/RecordingScriptingInterface.cpp @@ -117,7 +117,7 @@ void RecordingScriptingInterface::startPlaying() { } void RecordingScriptingInterface::setPlayerVolume(float volume) { - // FIXME + _player->setVolume(std::min(std::max(volume, 0.0f), 1.0f)); } void RecordingScriptingInterface::setPlayerAudioOffset(float audioOffset) { diff --git a/libraries/script-engine/src/RecordingScriptingInterface.h b/libraries/script-engine/src/RecordingScriptingInterface.h index 6a058feea5..604ec6bc2e 100644 --- a/libraries/script-engine/src/RecordingScriptingInterface.h +++ b/libraries/script-engine/src/RecordingScriptingInterface.h @@ -95,8 +95,9 @@ public slots: /**jsdoc + * Sets the playback audio volume. * @function Recording.setPlayerVolume - * @param {number} volume + * @param {number} volume - The playback audio volume, range 0.01.0. */ void setPlayerVolume(float volume);