mirror of
https://github.com/overte-org/overte.git
synced 2025-04-20 01:24:03 +02:00
Merge pull request #8588 from zzmp/test/audio-jitter
add a test for audio jitter in DEV/PR builds
This commit is contained in:
commit
fddbeb6d11
6 changed files with 95 additions and 0 deletions
|
@ -277,6 +277,17 @@ void setupPreferences() {
|
|||
preference->setStep(1);
|
||||
preferences->addPreference(preference);
|
||||
}
|
||||
#if DEV_BUILD || PR_BUILD
|
||||
{
|
||||
auto getter = []()->float { return DependencyManager::get<AudioClient>()->getGateThreshold(); };
|
||||
auto setter = [](float value) { return DependencyManager::get<AudioClient>()->setGateThreshold(value); };
|
||||
auto preference = new SpinnerPreference(AUDIO, "Debug gate threshold", getter, setter);
|
||||
preference->setMin(1);
|
||||
preference->setMax((float)100);
|
||||
preference->setStep(1);
|
||||
preferences->addPreference(preference);
|
||||
}
|
||||
#endif
|
||||
|
||||
{
|
||||
auto getter = []()->float { return qApp->getMaxOctreePacketsPerSecond(); };
|
||||
|
|
|
@ -55,6 +55,8 @@ static const int RECEIVED_AUDIO_STREAM_CAPACITY_FRAMES = 100;
|
|||
static const auto DEFAULT_POSITION_GETTER = []{ return Vectors::ZERO; };
|
||||
static const auto DEFAULT_ORIENTATION_GETTER = [] { return Quaternions::IDENTITY; };
|
||||
|
||||
static const int DEFAULT_AUDIO_OUTPUT_GATE_THRESHOLD = 1;
|
||||
|
||||
Setting::Handle<bool> dynamicJitterBuffers("dynamicJitterBuffers", DEFAULT_DYNAMIC_JITTER_BUFFERS);
|
||||
Setting::Handle<int> maxFramesOverDesired("maxFramesOverDesired", DEFAULT_MAX_FRAMES_OVER_DESIRED);
|
||||
Setting::Handle<int> staticDesiredJitterBufferFrames("staticDesiredJitterBufferFrames",
|
||||
|
@ -99,6 +101,8 @@ private:
|
|||
|
||||
AudioClient::AudioClient() :
|
||||
AbstractAudioInterface(),
|
||||
_gateThreshold("audioOutputGateThreshold", DEFAULT_AUDIO_OUTPUT_GATE_THRESHOLD),
|
||||
_gate(this, _gateThreshold.get()),
|
||||
_audioInput(NULL),
|
||||
_desiredInputFormat(),
|
||||
_inputFormat(),
|
||||
|
@ -540,11 +544,48 @@ void AudioClient::handleAudioDataPacket(QSharedPointer<ReceivedMessage> message)
|
|||
emit receivedFirstPacket();
|
||||
}
|
||||
|
||||
#if DEV_BUILD || PR_BUILD
|
||||
_gate.insert(message);
|
||||
#else
|
||||
// Audio output must exist and be correctly set up if we're going to process received audio
|
||||
_receivedAudioStream.parseData(*message);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
AudioClient::Gate::Gate(AudioClient* audioClient, int threshold) :
|
||||
_audioClient(audioClient),
|
||||
_threshold(threshold) {}
|
||||
|
||||
void AudioClient::Gate::setThreshold(int threshold) {
|
||||
flush();
|
||||
_threshold = std::max(threshold, 1);
|
||||
}
|
||||
|
||||
void AudioClient::Gate::insert(QSharedPointer<ReceivedMessage> message) {
|
||||
// Short-circuit for normal behavior
|
||||
if (_threshold == 1) {
|
||||
_audioClient->_receivedAudioStream.parseData(*message);
|
||||
return;
|
||||
}
|
||||
|
||||
_queue.push(message);
|
||||
_index++;
|
||||
|
||||
if (_index % _threshold == 0) {
|
||||
flush();
|
||||
}
|
||||
}
|
||||
|
||||
void AudioClient::Gate::flush() {
|
||||
while (!_queue.empty()) {
|
||||
_audioClient->_receivedAudioStream.parseData(*_queue.front());
|
||||
_queue.pop();
|
||||
}
|
||||
_index = 0;
|
||||
}
|
||||
|
||||
|
||||
void AudioClient::handleNoisyMutePacket(QSharedPointer<ReceivedMessage> message) {
|
||||
if (!_muted) {
|
||||
toggleMute();
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <memory>
|
||||
#include <vector>
|
||||
#include <mutex>
|
||||
#include <queue>
|
||||
|
||||
#include <QtCore/qsystemdetection.h>
|
||||
#include <QtCore/QByteArray>
|
||||
|
@ -134,6 +135,9 @@ public:
|
|||
int getOutputStarveDetectionThreshold() { return _outputStarveDetectionThreshold.get(); }
|
||||
void setOutputStarveDetectionThreshold(int threshold) { _outputStarveDetectionThreshold.set(threshold); }
|
||||
|
||||
int getGateThreshold() { return _gate.getThreshold(); }
|
||||
void setGateThreshold(int threshold) { _gate.setThreshold(threshold); }
|
||||
|
||||
void setPositionGetter(AudioPositionGetter positionGetter) { _positionGetter = positionGetter; }
|
||||
void setOrientationGetter(AudioOrientationGetter orientationGetter) { _orientationGetter = orientationGetter; }
|
||||
|
||||
|
@ -227,6 +231,27 @@ private:
|
|||
float azimuthForSource(const glm::vec3& relativePosition);
|
||||
float gainForSource(float distance, float volume);
|
||||
|
||||
class Gate {
|
||||
public:
|
||||
Gate(AudioClient* audioClient, int threshold);
|
||||
|
||||
int getThreshold() { return _threshold; }
|
||||
void setThreshold(int threshold);
|
||||
|
||||
void insert(QSharedPointer<ReceivedMessage> message);
|
||||
|
||||
private:
|
||||
void flush();
|
||||
|
||||
AudioClient* _audioClient;
|
||||
std::queue<QSharedPointer<ReceivedMessage>> _queue;
|
||||
int _index{ 0 };
|
||||
int _threshold;
|
||||
};
|
||||
|
||||
Setting::Handle<int> _gateThreshold;
|
||||
Gate _gate;
|
||||
|
||||
Mutex _injectorsMutex;
|
||||
QByteArray firstInputFrame;
|
||||
QAudioInput* _audioInput;
|
||||
|
|
|
@ -12,3 +12,9 @@
|
|||
#include "AudioLogging.h"
|
||||
|
||||
Q_LOGGING_CATEGORY(audio, "hifi.audio")
|
||||
|
||||
#if DEV_BUILD || PR_BUILD
|
||||
Q_LOGGING_CATEGORY(audiostream, "hifi.audio-stream", QtDebugMsg)
|
||||
#else
|
||||
Q_LOGGING_CATEGORY(audiostream, "hifi.audio-stream", QtInfoMsg)
|
||||
#endif
|
||||
|
|
|
@ -15,5 +15,6 @@
|
|||
#include <QLoggingCategory>
|
||||
|
||||
Q_DECLARE_LOGGING_CATEGORY(audio)
|
||||
Q_DECLARE_LOGGING_CATEGORY(audiostream)
|
||||
|
||||
#endif // hifi_AudioLogging_h
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <NodeList.h>
|
||||
|
||||
#include "InboundAudioStream.h"
|
||||
#include "AudioLogging.h"
|
||||
|
||||
const int STARVE_HISTORY_CAPACITY = 50;
|
||||
|
||||
|
@ -174,6 +175,9 @@ int InboundAudioStream::parseData(ReceivedMessage& message) {
|
|||
_currentJitterBufferFrames = 0;
|
||||
|
||||
_oldFramesDropped += framesToDrop;
|
||||
|
||||
qCDebug(audiostream, "Dropped %d frames", framesToDrop);
|
||||
qCDebug(audiostream, "Resetted current jitter frames");
|
||||
}
|
||||
|
||||
framesAvailableChanged();
|
||||
|
@ -228,6 +232,9 @@ int InboundAudioStream::writeDroppableSilentSamples(int silentSamples) {
|
|||
_currentJitterBufferFrames -= numSilentFramesToDrop;
|
||||
_silentFramesDropped += numSilentFramesToDrop;
|
||||
|
||||
qCDebug(audiostream, "Dropped %d silent frames", numSilentFramesToDrop);
|
||||
qCDebug(audiostream, "Set current jitter frames to %d", _currentJitterBufferFrames);
|
||||
|
||||
_framesAvailableStat.reset();
|
||||
}
|
||||
|
||||
|
@ -308,6 +315,8 @@ void InboundAudioStream::framesAvailableChanged() {
|
|||
|
||||
if (_framesAvailableStat.getElapsedUsecs() >= FRAMES_AVAILABLE_STAT_WINDOW_USECS) {
|
||||
_currentJitterBufferFrames = (int)ceil(_framesAvailableStat.getAverage());
|
||||
qCDebug(audiostream, "Set current jitter frames to %d", _currentJitterBufferFrames);
|
||||
|
||||
_framesAvailableStat.reset();
|
||||
}
|
||||
}
|
||||
|
@ -355,6 +364,7 @@ void InboundAudioStream::setToStarved() {
|
|||
// make sure _desiredJitterBufferFrames does not become lower here
|
||||
if (calculatedJitterBufferFrames >= _desiredJitterBufferFrames) {
|
||||
_desiredJitterBufferFrames = calculatedJitterBufferFrames;
|
||||
qCDebug(audiostream, "Set desired jitter frames to %d", _desiredJitterBufferFrames);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -444,6 +454,7 @@ void InboundAudioStream::packetReceivedUpdateTimingStats() {
|
|||
/ (float)AudioConstants::NETWORK_FRAME_USECS);
|
||||
if (calculatedJitterBufferFrames < _desiredJitterBufferFrames) {
|
||||
_desiredJitterBufferFrames = calculatedJitterBufferFrames;
|
||||
qCDebug(audiostream, "Set desired jitter frames to %d", _desiredJitterBufferFrames);
|
||||
}
|
||||
_timeGapStatsForDesiredReduction.clearNewStatsAvailableFlag();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue