mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 12:08:54 +02:00
made AudioRingBuffer frames capacity variable
This commit is contained in:
parent
3730be9804
commit
a5943e3608
14 changed files with 37 additions and 27 deletions
|
@ -31,12 +31,14 @@
|
||||||
|
|
||||||
#include "Agent.h"
|
#include "Agent.h"
|
||||||
|
|
||||||
|
static const int AUDIO_RING_BUFFER_CAPACITY_FRAMES = 10;
|
||||||
|
|
||||||
Agent::Agent(const QByteArray& packet) :
|
Agent::Agent(const QByteArray& packet) :
|
||||||
ThreadedAssignment(packet),
|
ThreadedAssignment(packet),
|
||||||
_voxelEditSender(),
|
_voxelEditSender(),
|
||||||
_particleEditSender(),
|
_particleEditSender(),
|
||||||
_modelEditSender(),
|
_modelEditSender(),
|
||||||
_receivedAudioBuffer(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO),
|
_receivedAudioBuffer(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO, AUDIO_RING_BUFFER_CAPACITY_FRAMES),
|
||||||
_avatarHashMap()
|
_avatarHashMap()
|
||||||
{
|
{
|
||||||
// be the parent of the script engine so it gets moved when we do
|
// be the parent of the script engine so it gets moved when we do
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
#include "AudioMixer.h"
|
#include "AudioMixer.h"
|
||||||
#include "AudioMixerClientData.h"
|
#include "AudioMixerClientData.h"
|
||||||
|
|
||||||
|
static const int AUDIO_RING_BUFFER_CAPACITY_FRAMES = 100;
|
||||||
|
|
||||||
AudioMixerClientData::AudioMixerClientData() :
|
AudioMixerClientData::AudioMixerClientData() :
|
||||||
_ringBuffers(),
|
_ringBuffers(),
|
||||||
_outgoingMixedAudioSequenceNumber(0),
|
_outgoingMixedAudioSequenceNumber(0),
|
||||||
|
@ -76,7 +78,7 @@ int AudioMixerClientData::parseData(const QByteArray& packet) {
|
||||||
|
|
||||||
if (!avatarRingBuffer) {
|
if (!avatarRingBuffer) {
|
||||||
// we don't have an AvatarAudioRingBuffer yet, so add it
|
// we don't have an AvatarAudioRingBuffer yet, so add it
|
||||||
avatarRingBuffer = new AvatarAudioRingBuffer(isStereo, AudioMixer::getUseDynamicJitterBuffers());
|
avatarRingBuffer = new AvatarAudioRingBuffer(AUDIO_RING_BUFFER_CAPACITY_FRAMES, isStereo, AudioMixer::getUseDynamicJitterBuffers());
|
||||||
_ringBuffers.push_back(avatarRingBuffer);
|
_ringBuffers.push_back(avatarRingBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,7 +103,7 @@ int AudioMixerClientData::parseData(const QByteArray& packet) {
|
||||||
|
|
||||||
if (!matchingInjectedRingBuffer) {
|
if (!matchingInjectedRingBuffer) {
|
||||||
// we don't have a matching injected audio ring buffer, so add it
|
// we don't have a matching injected audio ring buffer, so add it
|
||||||
matchingInjectedRingBuffer = new InjectedAudioRingBuffer(streamIdentifier,
|
matchingInjectedRingBuffer = new InjectedAudioRingBuffer(AUDIO_RING_BUFFER_CAPACITY_FRAMES, streamIdentifier,
|
||||||
AudioMixer::getUseDynamicJitterBuffers());
|
AudioMixer::getUseDynamicJitterBuffers());
|
||||||
_ringBuffers.push_back(matchingInjectedRingBuffer);
|
_ringBuffers.push_back(matchingInjectedRingBuffer);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,8 +13,8 @@
|
||||||
|
|
||||||
#include "AvatarAudioRingBuffer.h"
|
#include "AvatarAudioRingBuffer.h"
|
||||||
|
|
||||||
AvatarAudioRingBuffer::AvatarAudioRingBuffer(bool isStereo, bool dynamicJitterBuffer) :
|
AvatarAudioRingBuffer::AvatarAudioRingBuffer(int numFramesCapacity, bool isStereo, bool dynamicJitterBuffer) :
|
||||||
PositionalAudioRingBuffer(PositionalAudioRingBuffer::Microphone, isStereo, dynamicJitterBuffer) {
|
PositionalAudioRingBuffer(PositionalAudioRingBuffer::Microphone, numFramesCapacity, isStereo, dynamicJitterBuffer) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
|
|
||||||
class AvatarAudioRingBuffer : public PositionalAudioRingBuffer {
|
class AvatarAudioRingBuffer : public PositionalAudioRingBuffer {
|
||||||
public:
|
public:
|
||||||
AvatarAudioRingBuffer(bool isStereo = false, bool dynamicJitterBuffer = false);
|
AvatarAudioRingBuffer(int numFramesCapacity, bool isStereo = false, bool dynamicJitterBuffer = false);
|
||||||
|
|
||||||
int parseData(const QByteArray& packet);
|
int parseData(const QByteArray& packet);
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -48,6 +48,8 @@ static const float AUDIO_CALLBACK_MSECS = (float) NETWORK_BUFFER_LENGTH_SAMPLES_
|
||||||
|
|
||||||
static const int NUMBER_OF_NOISE_SAMPLE_FRAMES = 300;
|
static const int NUMBER_OF_NOISE_SAMPLE_FRAMES = 300;
|
||||||
|
|
||||||
|
static const int AUDIO_RING_BUFFER_CAPACITY_FRAMES = 10;
|
||||||
|
|
||||||
// Mute icon configration
|
// Mute icon configration
|
||||||
static const int MUTE_ICON_SIZE = 24;
|
static const int MUTE_ICON_SIZE = 24;
|
||||||
|
|
||||||
|
@ -66,8 +68,8 @@ Audio::Audio(int16_t initialJitterBufferSamples, QObject* parent) :
|
||||||
_loopbackOutputDevice(NULL),
|
_loopbackOutputDevice(NULL),
|
||||||
_proceduralAudioOutput(NULL),
|
_proceduralAudioOutput(NULL),
|
||||||
_proceduralOutputDevice(NULL),
|
_proceduralOutputDevice(NULL),
|
||||||
_inputRingBuffer(0),
|
_inputRingBuffer(0, AUDIO_RING_BUFFER_CAPACITY_FRAMES),
|
||||||
_ringBuffer(NETWORK_BUFFER_LENGTH_BYTES_PER_CHANNEL),
|
_ringBuffer(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO, AUDIO_RING_BUFFER_CAPACITY_FRAMES),
|
||||||
_isStereoInput(false),
|
_isStereoInput(false),
|
||||||
_averagedLatency(0.0),
|
_averagedLatency(0.0),
|
||||||
_measuredJitter(0),
|
_measuredJitter(0),
|
||||||
|
|
|
@ -19,10 +19,11 @@
|
||||||
#include "AudioRingBuffer.h"
|
#include "AudioRingBuffer.h"
|
||||||
|
|
||||||
|
|
||||||
AudioRingBuffer::AudioRingBuffer(int numFrameSamples, bool randomAccessMode) :
|
AudioRingBuffer::AudioRingBuffer(int numFrameSamples, int numFramesCapacity, bool randomAccessMode) :
|
||||||
NodeData(),
|
NodeData(),
|
||||||
_overflowCount(0),
|
_overflowCount(0),
|
||||||
_sampleCapacity(numFrameSamples * RING_BUFFER_LENGTH_FRAMES),
|
_frameCapacity(numFramesCapacity),
|
||||||
|
_sampleCapacity(numFrameSamples * numFramesCapacity),
|
||||||
_isFull(false),
|
_isFull(false),
|
||||||
_numFrameSamples(numFrameSamples),
|
_numFrameSamples(numFrameSamples),
|
||||||
_isStarved(true),
|
_isStarved(true),
|
||||||
|
@ -48,6 +49,8 @@ AudioRingBuffer::~AudioRingBuffer() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioRingBuffer::reset() {
|
void AudioRingBuffer::reset() {
|
||||||
|
_overflowCount = 0;
|
||||||
|
_isFull = false;
|
||||||
_endOfLastWrite = _buffer;
|
_endOfLastWrite = _buffer;
|
||||||
_nextOutput = _buffer;
|
_nextOutput = _buffer;
|
||||||
_isStarved = true;
|
_isStarved = true;
|
||||||
|
@ -55,13 +58,13 @@ void AudioRingBuffer::reset() {
|
||||||
|
|
||||||
void AudioRingBuffer::resizeForFrameSize(qint64 numFrameSamples) {
|
void AudioRingBuffer::resizeForFrameSize(qint64 numFrameSamples) {
|
||||||
delete[] _buffer;
|
delete[] _buffer;
|
||||||
_sampleCapacity = numFrameSamples * RING_BUFFER_LENGTH_FRAMES;
|
_sampleCapacity = numFrameSamples * _frameCapacity;
|
||||||
|
_numFrameSamples = numFrameSamples;
|
||||||
_buffer = new int16_t[_sampleCapacity];
|
_buffer = new int16_t[_sampleCapacity];
|
||||||
if (_randomAccessMode) {
|
if (_randomAccessMode) {
|
||||||
memset(_buffer, 0, _sampleCapacity * sizeof(int16_t));
|
memset(_buffer, 0, _sampleCapacity * sizeof(int16_t));
|
||||||
}
|
}
|
||||||
_nextOutput = _buffer;
|
reset();
|
||||||
_endOfLastWrite = _buffer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int AudioRingBuffer::parseData(const QByteArray& packet) {
|
int AudioRingBuffer::parseData(const QByteArray& packet) {
|
||||||
|
|
|
@ -31,15 +31,13 @@ const int NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL = NETWORK_BUFFER_LENGTH_BYTE
|
||||||
const unsigned int BUFFER_SEND_INTERVAL_USECS = floorf((NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL
|
const unsigned int BUFFER_SEND_INTERVAL_USECS = floorf((NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL
|
||||||
/ (float) SAMPLE_RATE) * 1000 * 1000);
|
/ (float) SAMPLE_RATE) * 1000 * 1000);
|
||||||
|
|
||||||
const short RING_BUFFER_LENGTH_FRAMES = 10;
|
|
||||||
|
|
||||||
const int MAX_SAMPLE_VALUE = std::numeric_limits<int16_t>::max();
|
const int MAX_SAMPLE_VALUE = std::numeric_limits<int16_t>::max();
|
||||||
const int MIN_SAMPLE_VALUE = std::numeric_limits<int16_t>::min();
|
const int MIN_SAMPLE_VALUE = std::numeric_limits<int16_t>::min();
|
||||||
|
|
||||||
class AudioRingBuffer : public NodeData {
|
class AudioRingBuffer : public NodeData {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
AudioRingBuffer(int numFrameSamples, bool randomAccessMode = false);
|
AudioRingBuffer(int numFrameSamples, int numFramesCapacity, bool randomAccessMode = false);
|
||||||
~AudioRingBuffer();
|
~AudioRingBuffer();
|
||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
|
@ -84,6 +82,7 @@ protected:
|
||||||
|
|
||||||
int _overflowCount; /// how many times has the ring buffer has overwritten old data
|
int _overflowCount; /// how many times has the ring buffer has overwritten old data
|
||||||
|
|
||||||
|
int _frameCapacity;
|
||||||
int _sampleCapacity;
|
int _sampleCapacity;
|
||||||
bool _isFull;
|
bool _isFull;
|
||||||
int _numFrameSamples;
|
int _numFrameSamples;
|
||||||
|
|
|
@ -19,8 +19,8 @@
|
||||||
|
|
||||||
#include "InjectedAudioRingBuffer.h"
|
#include "InjectedAudioRingBuffer.h"
|
||||||
|
|
||||||
InjectedAudioRingBuffer::InjectedAudioRingBuffer(const QUuid& streamIdentifier, bool dynamicJitterBuffer) :
|
InjectedAudioRingBuffer::InjectedAudioRingBuffer(int numFramesCapacity, const QUuid& streamIdentifier, bool dynamicJitterBuffer) :
|
||||||
PositionalAudioRingBuffer(PositionalAudioRingBuffer::Injector, /* isStereo=*/ false , dynamicJitterBuffer),
|
PositionalAudioRingBuffer(PositionalAudioRingBuffer::Injector, numFramesCapacity, false, dynamicJitterBuffer),
|
||||||
_streamIdentifier(streamIdentifier),
|
_streamIdentifier(streamIdentifier),
|
||||||
_radius(0.0f),
|
_radius(0.0f),
|
||||||
_attenuationRatio(0)
|
_attenuationRatio(0)
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
|
|
||||||
class InjectedAudioRingBuffer : public PositionalAudioRingBuffer {
|
class InjectedAudioRingBuffer : public PositionalAudioRingBuffer {
|
||||||
public:
|
public:
|
||||||
InjectedAudioRingBuffer(const QUuid& streamIdentifier = QUuid(), bool dynamicJitterBuffer = false);
|
InjectedAudioRingBuffer(int numFramesCapacity, const QUuid& streamIdentifier = QUuid(), bool dynamicJitterBuffer = false);
|
||||||
|
|
||||||
int parseData(const QByteArray& packet);
|
int parseData(const QByteArray& packet);
|
||||||
|
|
||||||
|
|
|
@ -11,8 +11,8 @@
|
||||||
|
|
||||||
#include "MixedAudioRingBuffer.h"
|
#include "MixedAudioRingBuffer.h"
|
||||||
|
|
||||||
MixedAudioRingBuffer::MixedAudioRingBuffer(int numFrameSamples) :
|
MixedAudioRingBuffer::MixedAudioRingBuffer(int numFrameSamples, int numFramesCapacity) :
|
||||||
AudioRingBuffer(numFrameSamples),
|
AudioRingBuffer(numFrameSamples, numFramesCapacity),
|
||||||
_lastReadFrameAverageLoudness(0.0f)
|
_lastReadFrameAverageLoudness(0.0f)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
class MixedAudioRingBuffer : public AudioRingBuffer {
|
class MixedAudioRingBuffer : public AudioRingBuffer {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
MixedAudioRingBuffer(int numFrameSamples);
|
MixedAudioRingBuffer(int numFrameSamples, int numFramesCapacity);
|
||||||
|
|
||||||
float getLastReadFrameAverageLoudness() const { return _lastReadFrameAverageLoudness; }
|
float getLastReadFrameAverageLoudness() const { return _lastReadFrameAverageLoudness; }
|
||||||
|
|
||||||
|
|
|
@ -85,10 +85,11 @@ quint64 InterframeTimeGapStats::getWindowMaxGap() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PositionalAudioRingBuffer::PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type,
|
PositionalAudioRingBuffer::PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type, int numFramesCapacity,
|
||||||
bool isStereo, bool dynamicJitterBuffers) :
|
bool isStereo, bool dynamicJitterBuffers) :
|
||||||
|
|
||||||
AudioRingBuffer(isStereo ? NETWORK_BUFFER_LENGTH_SAMPLES_STEREO : NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL),
|
AudioRingBuffer(isStereo ? NETWORK_BUFFER_LENGTH_SAMPLES_STEREO : NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL,
|
||||||
|
numFramesCapacity),
|
||||||
_type(type),
|
_type(type),
|
||||||
_position(0.0f, 0.0f, 0.0f),
|
_position(0.0f, 0.0f, 0.0f),
|
||||||
_orientation(0.0f, 0.0f, 0.0f, 0.0f),
|
_orientation(0.0f, 0.0f, 0.0f, 0.0f),
|
||||||
|
@ -261,7 +262,7 @@ void PositionalAudioRingBuffer::updateDesiredJitterBufferFrames() {
|
||||||
if (_desiredJitterBufferFrames < 1) {
|
if (_desiredJitterBufferFrames < 1) {
|
||||||
_desiredJitterBufferFrames = 1;
|
_desiredJitterBufferFrames = 1;
|
||||||
}
|
}
|
||||||
const int maxDesired = RING_BUFFER_LENGTH_FRAMES - 1;
|
const int maxDesired = _frameCapacity - 1;
|
||||||
if (_desiredJitterBufferFrames > maxDesired) {
|
if (_desiredJitterBufferFrames > maxDesired) {
|
||||||
_desiredJitterBufferFrames = maxDesired;
|
_desiredJitterBufferFrames = maxDesired;
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,8 @@ public:
|
||||||
Injector
|
Injector
|
||||||
};
|
};
|
||||||
|
|
||||||
PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type, bool isStereo = false, bool dynamicJitterBuffers = false);
|
PositionalAudioRingBuffer(PositionalAudioRingBuffer::Type type, int numFramesCapacity,
|
||||||
|
bool isStereo = false, bool dynamicJitterBuffers = false);
|
||||||
|
|
||||||
int parseData(const QByteArray& packet);
|
int parseData(const QByteArray& packet);
|
||||||
int parsePositionalData(const QByteArray& positionalByteArray);
|
int parsePositionalData(const QByteArray& positionalByteArray);
|
||||||
|
|
|
@ -29,7 +29,7 @@ void AudioRingBufferTests::runAllTests() {
|
||||||
int readIndexAt;
|
int readIndexAt;
|
||||||
|
|
||||||
|
|
||||||
AudioRingBuffer ringBuffer(10); // makes buffer of 100 int16_t samples
|
AudioRingBuffer ringBuffer(10, 10); // makes buffer of 100 int16_t samples
|
||||||
for (int T = 0; T < 300; T++) {
|
for (int T = 0; T < 300; T++) {
|
||||||
|
|
||||||
writeIndexAt = 0;
|
writeIndexAt = 0;
|
||||||
|
|
Loading…
Reference in a new issue