mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 10:37:35 +02:00
Replace the other noise gate, in Agent.cpp
This commit is contained in:
parent
6b740e855d
commit
c47d80574e
2 changed files with 42 additions and 17 deletions
|
@ -55,7 +55,8 @@ static const int RECEIVED_AUDIO_STREAM_CAPACITY_FRAMES = 10;
|
||||||
|
|
||||||
Agent::Agent(ReceivedMessage& message) :
|
Agent::Agent(ReceivedMessage& message) :
|
||||||
ThreadedAssignment(message),
|
ThreadedAssignment(message),
|
||||||
_receivedAudioStream(RECEIVED_AUDIO_STREAM_CAPACITY_FRAMES, RECEIVED_AUDIO_STREAM_CAPACITY_FRAMES)
|
_receivedAudioStream(RECEIVED_AUDIO_STREAM_CAPACITY_FRAMES, RECEIVED_AUDIO_STREAM_CAPACITY_FRAMES),
|
||||||
|
_audioGate(AudioConstants::SAMPLE_RATE, AudioConstants::MONO)
|
||||||
{
|
{
|
||||||
_entityEditSender.setPacketsPerSecond(DEFAULT_ENTITY_PPS_PER_SCRIPT);
|
_entityEditSender.setPacketsPerSecond(DEFAULT_ENTITY_PPS_PER_SCRIPT);
|
||||||
DependencyManager::get<EntityScriptingInterface>()->setPacketSender(&_entityEditSender);
|
DependencyManager::get<EntityScriptingInterface>()->setPacketSender(&_entityEditSender);
|
||||||
|
@ -397,16 +398,23 @@ void Agent::executeScript() {
|
||||||
QByteArray audio(frame->data);
|
QByteArray audio(frame->data);
|
||||||
|
|
||||||
if (_isNoiseGateEnabled) {
|
if (_isNoiseGateEnabled) {
|
||||||
static int numSamples = AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL;
|
int16_t* samples = reinterpret_cast<int16_t*>(audio.data());
|
||||||
_noiseGate.gateSamples(reinterpret_cast<int16_t*>(audio.data()), numSamples);
|
int numSamples = AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL;
|
||||||
|
_audioGate.render(samples, samples, numSamples);
|
||||||
}
|
}
|
||||||
|
|
||||||
computeLoudness(&audio, scriptedAvatar);
|
computeLoudness(&audio, scriptedAvatar);
|
||||||
|
|
||||||
// the codec needs a flush frame before sending silent packets, so
|
// state machine to detect gate opening and closing
|
||||||
// do not send one if the gate closed in this block (eventually this can be crossfaded).
|
bool audioGateOpen = (scriptedAvatar->getAudioLoudness() != 0.0f);
|
||||||
|
bool openedInLastBlock = !_audioGateOpen && audioGateOpen; // the gate just opened
|
||||||
|
bool closedInLastBlock = _audioGateOpen && !audioGateOpen; // the gate just closed
|
||||||
|
_audioGateOpen = audioGateOpen;
|
||||||
|
|
||||||
|
// the codec must be flushed to silence before sending silent packets,
|
||||||
|
// so delay the transition to silent packets by one packet after becoming silent.
|
||||||
auto packetType = PacketType::MicrophoneAudioNoEcho;
|
auto packetType = PacketType::MicrophoneAudioNoEcho;
|
||||||
if (scriptedAvatar->getAudioLoudness() == 0.0f && !_noiseGate.closedInLastBlock()) {
|
if (!audioGateOpen && !closedInLastBlock) {
|
||||||
packetType = PacketType::SilentAudioFrame;
|
packetType = PacketType::SilentAudioFrame;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -619,19 +627,35 @@ void Agent::encodeFrameOfZeros(QByteArray& encodedZeros) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Agent::computeLoudness(const QByteArray* decodedBuffer, QSharedPointer<ScriptableAvatar> scriptableAvatar) {
|
void Agent::computeLoudness(const QByteArray* decodedBuffer, QSharedPointer<ScriptableAvatar> scriptableAvatar) {
|
||||||
float loudness = 0.0f;
|
//float loudness = 0.0f;
|
||||||
|
//if (decodedBuffer) {
|
||||||
|
// auto soundData = reinterpret_cast<const int16_t*>(decodedBuffer->constData());
|
||||||
|
// int numFrames = decodedBuffer->size() / sizeof(int16_t);
|
||||||
|
// // now iterate and come up with average
|
||||||
|
// if (numFrames > 0) {
|
||||||
|
// for(int i = 0; i < numFrames; i++) {
|
||||||
|
// loudness += (float) std::abs(soundData[i]);
|
||||||
|
// }
|
||||||
|
// loudness /= numFrames;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//scriptableAvatar->setAudioLoudness(loudness);
|
||||||
|
|
||||||
|
float lastInputLoudness = 0.0f;
|
||||||
if (decodedBuffer) {
|
if (decodedBuffer) {
|
||||||
auto soundData = reinterpret_cast<const int16_t*>(decodedBuffer->constData());
|
auto samples = reinterpret_cast<const int16_t*>(decodedBuffer->constData());
|
||||||
int numFrames = decodedBuffer->size() / sizeof(int16_t);
|
int numSamples = decodedBuffer->size() / AudioConstants::SAMPLE_SIZE;
|
||||||
// now iterate and come up with average
|
|
||||||
if (numFrames > 0) {
|
assert(numSamples < 65536); // int32_t loudness cannot overflow
|
||||||
for(int i = 0; i < numFrames; i++) {
|
if (numSamples > 0) {
|
||||||
loudness += (float) std::abs(soundData[i]);
|
int32_t loudness = 0;
|
||||||
|
for (int i = 0; i < numSamples; ++i) {
|
||||||
|
loudness += std::abs((int32_t)samples[i]);
|
||||||
}
|
}
|
||||||
loudness /= numFrames;
|
lastInputLoudness = (float)loudness / numSamples;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
scriptableAvatar->setAudioLoudness(loudness);
|
scriptableAvatar->setAudioLoudness(lastInputLoudness);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Agent::processAgentAvatarAudio() {
|
void Agent::processAgentAvatarAudio() {
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
|
|
||||||
#include <plugins/CodecPlugin.h>
|
#include <plugins/CodecPlugin.h>
|
||||||
|
|
||||||
#include "AudioNoiseGate.h"
|
#include "AudioGate.h"
|
||||||
#include "MixedAudioStream.h"
|
#include "MixedAudioStream.h"
|
||||||
#include "avatars/ScriptableAvatar.h"
|
#include "avatars/ScriptableAvatar.h"
|
||||||
|
|
||||||
|
@ -111,7 +111,8 @@ private:
|
||||||
QTimer* _avatarIdentityTimer = nullptr;
|
QTimer* _avatarIdentityTimer = nullptr;
|
||||||
QHash<QUuid, quint16> _outgoingScriptAudioSequenceNumbers;
|
QHash<QUuid, quint16> _outgoingScriptAudioSequenceNumbers;
|
||||||
|
|
||||||
AudioNoiseGate _noiseGate;
|
AudioGate _audioGate;
|
||||||
|
bool _audioGateOpen { false };
|
||||||
bool _isNoiseGateEnabled { false };
|
bool _isNoiseGateEnabled { false };
|
||||||
|
|
||||||
CodecPluginPointer _codec;
|
CodecPluginPointer _codec;
|
||||||
|
|
Loading…
Reference in a new issue