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);