From d49970d01001226bf45ca6ee7b44063472b9464f Mon Sep 17 00:00:00 2001 From: wangyix Date: Tue, 29 Jul 2014 15:57:32 -0700 Subject: [PATCH] maxFramesOverDesired added; settable from domain page and preferences --- assignment-client/src/Agent.cpp | 2 +- assignment-client/src/audio/AudioMixer.cpp | 5 + assignment-client/src/audio/AudioMixer.h | 3 + .../src/audio/AudioMixerClientData.cpp | 4 +- .../src/audio/AvatarAudioStream.cpp | 4 +- .../src/audio/AvatarAudioStream.h | 2 +- .../resources/web/settings/describe.json | 6 ++ interface/src/Application.cpp | 3 + interface/src/Audio.cpp | 4 +- interface/src/Audio.h | 3 + interface/src/Menu.cpp | 3 + interface/src/Menu.h | 3 + interface/src/ui/PreferencesDialog.cpp | 7 +- interface/ui/preferencesDialog.ui | 95 ++++++++++++++++++- libraries/audio/src/InboundAudioStream.cpp | 4 +- libraries/audio/src/InboundAudioStream.h | 5 +- libraries/audio/src/InjectedAudioStream.cpp | 4 +- libraries/audio/src/InjectedAudioStream.h | 2 +- libraries/audio/src/MixedAudioStream.cpp | 4 +- libraries/audio/src/MixedAudioStream.h | 2 +- libraries/audio/src/PositionalAudioStream.cpp | 4 +- libraries/audio/src/PositionalAudioStream.h | 2 +- 22 files changed, 149 insertions(+), 22 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index d4da989198..90009636f6 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -36,7 +36,7 @@ Agent::Agent(const QByteArray& packet) : _voxelEditSender(), _particleEditSender(), _modelEditSender(), - _receivedAudioStream(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO, 1, false), + _receivedAudioStream(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO, 1, false, 0), _avatarHashMap() { // be the parent of the script engine so it gets moved when we do diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 9c86c2faf2..5f52a175cc 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -68,6 +68,7 @@ void attachNewNodeDataToNode(Node *newNode) { } bool AudioMixer::_useDynamicJitterBuffers = false; +int AudioMixer::_maxFramesOverDesired = 20; AudioMixer::AudioMixer(const QByteArray& packet) : ThreadedAssignment(packet), @@ -469,6 +470,10 @@ void AudioMixer::run() { qDebug() << "Dynamic jitter buffers disabled, using old behavior."; _useDynamicJitterBuffers = false; } + + const QString MAX_FRAMES_OVER_DESIRED_JSON_KEY = "max-frames-over-desired"; + _maxFramesOverDesired = audioGroupObject[MAX_FRAMES_OVER_DESIRED_JSON_KEY].toString().toInt(); + qDebug() << "Max frames over desired:" << _maxFramesOverDesired; } int nextFrame = 0; diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h index bfdb49f393..9aca4d3cee 100644 --- a/assignment-client/src/audio/AudioMixer.h +++ b/assignment-client/src/audio/AudioMixer.h @@ -38,6 +38,7 @@ public slots: void sendStatsPacket(); static bool getUseDynamicJitterBuffers() { return _useDynamicJitterBuffers; } + static int getMaxFramesOverDesired() { return _maxFramesOverDesired; } private: /// adds one stream to the mix for a listening node @@ -59,7 +60,9 @@ private: int _sumMixes; AABox* _sourceUnattenuatedZone; AABox* _listenerUnattenuatedZone; + static bool _useDynamicJitterBuffers; + static int _maxFramesOverDesired; quint64 _lastSendAudioStreamStatsTime; }; diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index d3c16dc04e..79c5d6c3a8 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -74,7 +74,7 @@ int AudioMixerClientData::parseData(const QByteArray& packet) { bool isStereo = channelFlag == 1; _audioStreams.insert(nullUUID, - matchingStream = new AvatarAudioStream(isStereo, AudioMixer::getUseDynamicJitterBuffers())); + matchingStream = new AvatarAudioStream(isStereo, AudioMixer::getUseDynamicJitterBuffers(), AudioMixer::getMaxFramesOverDesired())); } else { matchingStream = _audioStreams.value(nullUUID); } @@ -87,7 +87,7 @@ int AudioMixerClientData::parseData(const QByteArray& packet) { if (!_audioStreams.contains(streamIdentifier)) { _audioStreams.insert(streamIdentifier, - matchingStream = new InjectedAudioStream(streamIdentifier, AudioMixer::getUseDynamicJitterBuffers())); + matchingStream = new InjectedAudioStream(streamIdentifier, AudioMixer::getUseDynamicJitterBuffers(), AudioMixer::getMaxFramesOverDesired())); } else { matchingStream = _audioStreams.value(streamIdentifier); } diff --git a/assignment-client/src/audio/AvatarAudioStream.cpp b/assignment-client/src/audio/AvatarAudioStream.cpp index c6a7d31468..88a2276ddb 100644 --- a/assignment-client/src/audio/AvatarAudioStream.cpp +++ b/assignment-client/src/audio/AvatarAudioStream.cpp @@ -13,8 +13,8 @@ #include "AvatarAudioStream.h" -AvatarAudioStream::AvatarAudioStream(bool isStereo, bool dynamicJitterBuffer) : - PositionalAudioStream(PositionalAudioStream::Microphone, isStereo, dynamicJitterBuffer) +AvatarAudioStream::AvatarAudioStream(bool isStereo, bool dynamicJitterBuffer, int maxFramesOverDesired) : + PositionalAudioStream(PositionalAudioStream::Microphone, isStereo, dynamicJitterBuffer, maxFramesOverDesired) { } diff --git a/assignment-client/src/audio/AvatarAudioStream.h b/assignment-client/src/audio/AvatarAudioStream.h index de7920c278..545bee4e0a 100644 --- a/assignment-client/src/audio/AvatarAudioStream.h +++ b/assignment-client/src/audio/AvatarAudioStream.h @@ -18,7 +18,7 @@ class AvatarAudioStream : public PositionalAudioStream { public: - AvatarAudioStream(bool isStereo = false, bool dynamicJitterBuffer = false); + AvatarAudioStream(bool isStereo, bool dynamicJitterBuffer, int maxFramesOverDesired); private: // disallow copying of AvatarAudioStream objects diff --git a/domain-server/resources/web/settings/describe.json b/domain-server/resources/web/settings/describe.json index 227b6bf0cd..7cba68e795 100644 --- a/domain-server/resources/web/settings/describe.json +++ b/domain-server/resources/web/settings/describe.json @@ -8,6 +8,12 @@ "help": "Boxes for source and listener (corner x, corner y, corner z, size x, size y, size z, corner x, corner y, corner z, size x, size y, size z)", "placeholder": "no zone", "default": "" + }, + "max-frames-over-desired": { + "label": "Max Frames Over Desired", + "help": "The highest number of frames an AudioMixer's ringbuffer can exceed the desired jitter buffer frames by", + "placeholder": "20", + "default": "" }, "dynamic-jitter-buffer": { "type": "checkbox", diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3ef4334fa5..f4e67fea31 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1711,6 +1711,9 @@ void Application::init() { if (Menu::getInstance()->getAudioJitterBufferFrames() != 0) { _audio.overrideDesiredJitterBufferFramesTo(Menu::getInstance()->getAudioJitterBufferFrames()); } + + _audio.setMaxFramesOverDesired(Menu::getInstance()->getMaxFramesOverDesired()); + qDebug("Loaded settings"); // initialize our face trackers after loading the menu settings diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 1be38377a6..2a801eb009 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -76,9 +76,9 @@ Audio::Audio(QObject* parent) : // this delay will slowly add up and the longer someone runs, they more delayed their audio will be. _inputRingBuffer(0), #ifdef _WIN32 - _receivedAudioStream(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO, 100, true, true), + _receivedAudioStream(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO, 100, true, 20, true), #else - _receivedAudioStream(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO, 10, true, true), // DO NOT CHANGE THIS UNLESS YOU SOLVE THE AUDIO DEVICE DRIFT PROBLEM!!! + _receivedAudioStream(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO, 10, true, 20, true), // DO NOT CHANGE THIS UNLESS YOU SOLVE THE AUDIO DEVICE DRIFT PROBLEM!!! #endif _isStereoInput(false), _averagedLatency(0.0), diff --git a/interface/src/Audio.h b/interface/src/Audio.h index 87472740d0..cb042ef25e 100644 --- a/interface/src/Audio.h +++ b/interface/src/Audio.h @@ -59,6 +59,9 @@ public: void overrideDesiredJitterBufferFramesTo(int desired) { _receivedAudioStream.overrideDesiredJitterBufferFramesTo(desired); } void unoverrideDesiredJitterBufferFrames() { _receivedAudioStream.unoverrideDesiredJitterBufferFrames(); } + + void setMaxFramesOverDesired(int maxFramesOverDesired) { _receivedAudioStream.setMaxFramesOverDesired(maxFramesOverDesired); } + int getDesiredJitterBufferFrames() const { return _receivedAudioStream.getDesiredJitterBufferFrames(); } float getCollisionSoundMagnitude() { return _collisionSoundMagnitude; } diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index fb1bbd07cf..3fe2ac9e5d 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -83,6 +83,7 @@ const int CONSOLE_HEIGHT = 200; Menu::Menu() : _actionHash(), _audioJitterBufferFrames(0), + _maxFramesOverDesired(0), _bandwidthDialog(NULL), _fieldOfView(DEFAULT_FIELD_OF_VIEW_DEGREES), _realWorldFieldOfView(DEFAULT_REAL_WORLD_FIELD_OF_VIEW_DEGREES), @@ -628,6 +629,7 @@ void Menu::loadSettings(QSettings* settings) { } _audioJitterBufferFrames = loadSetting(settings, "audioJitterBufferFrames", 0); + _maxFramesOverDesired = loadSetting(settings, "maxFramesOverDesired", 0); _fieldOfView = loadSetting(settings, "fieldOfView", DEFAULT_FIELD_OF_VIEW_DEGREES); _realWorldFieldOfView = loadSetting(settings, "realWorldFieldOfView", DEFAULT_REAL_WORLD_FIELD_OF_VIEW_DEGREES); _faceshiftEyeDeflection = loadSetting(settings, "faceshiftEyeDeflection", DEFAULT_FACESHIFT_EYE_DEFLECTION); @@ -678,6 +680,7 @@ void Menu::saveSettings(QSettings* settings) { } settings->setValue("audioJitterBufferFrames", _audioJitterBufferFrames); + settings->setValue("maxFramesOverDesired", _maxFramesOverDesired); settings->setValue("fieldOfView", _fieldOfView); settings->setValue("faceshiftEyeDeflection", _faceshiftEyeDeflection); settings->setValue("maxVoxels", _maxVoxels); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 6d5ad4e78c..2bc750007a 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -87,6 +87,8 @@ public: float getAudioJitterBufferFrames() const { return _audioJitterBufferFrames; } void setAudioJitterBufferFrames(float audioJitterBufferSamples) { _audioJitterBufferFrames = audioJitterBufferSamples; } + int getMaxFramesOverDesired() const { return _maxFramesOverDesired; } + void setMaxFramesOverDesired(int maxFramesOverDesired) { _maxFramesOverDesired = maxFramesOverDesired; } float getFieldOfView() const { return _fieldOfView; } void setFieldOfView(float fieldOfView) { _fieldOfView = fieldOfView; } float getRealWorldFieldOfView() const { return _realWorldFieldOfView; } @@ -258,6 +260,7 @@ private: QHash _actionHash; int _audioJitterBufferFrames; /// number of extra samples to wait before starting audio playback + int _maxFramesOverDesired; BandwidthDialog* _bandwidthDialog; float _fieldOfView; /// in Degrees, doesn't apply to HMD like Oculus float _realWorldFieldOfView; // The actual FOV set by the user's monitor size and view distance diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index 6f87b08093..7d18ae4490 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -151,6 +151,8 @@ void PreferencesDialog::loadPreferences() { ui.audioJitterSpin->setValue(menuInstance->getAudioJitterBufferFrames()); + ui.maxFramesOverDesiredSpin->setValue(menuInstance->getMaxFramesOverDesired()); + ui.realWorldFieldOfViewSpin->setValue(menuInstance->getRealWorldFieldOfView()); ui.fieldOfViewSpin->setValue(menuInstance->getFieldOfView()); @@ -241,11 +243,14 @@ void PreferencesDialog::savePreferences() { Menu::getInstance()->setAudioJitterBufferFrames(ui.audioJitterSpin->value()); if (Menu::getInstance()->getAudioJitterBufferFrames() != 0) { - Application::getInstance()->getAudio()->overrideDesiredJitterBufferFramesTo(ui.audioJitterSpin->value()); + Application::getInstance()->getAudio()->overrideDesiredJitterBufferFramesTo(Menu::getInstance()->getAudioJitterBufferFrames()); } else { Application::getInstance()->getAudio()->unoverrideDesiredJitterBufferFrames(); } + Menu::getInstance()->setMaxFramesOverDesired(ui.maxFramesOverDesiredSpin->value()); + Application::getInstance()->getAudio()->setMaxFramesOverDesired(Menu::getInstance()->getMaxFramesOverDesired()); + Application::getInstance()->resizeGL(Application::getInstance()->getGLWidget()->width(), Application::getInstance()->getGLWidget()->height()); } diff --git a/interface/ui/preferencesDialog.ui b/interface/ui/preferencesDialog.ui index d610b4e8bd..566c24e4e3 100644 --- a/interface/ui/preferencesDialog.ui +++ b/interface/ui/preferencesDialog.ui @@ -1543,7 +1543,7 @@ padding: 10px;margin-top:10px - -10000 + 0 10000 @@ -1555,6 +1555,99 @@ padding: 10px;margin-top:10px + + + + 0 + + + 10 + + + 0 + + + 10 + + + + + + Arial + + + + color: rgb(51, 51, 51) + + + Max Frames Over Desired + + + 15 + + + maxFramesOverDesiredSpin + + + + + + + + Arial + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 95 + 36 + + + + + 70 + 16777215 + + + + + Arial + + + + 0 + + + 10000 + + + 1 + + + + + + + diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index a1d76655ac..cbf9e5a0bb 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -13,7 +13,7 @@ #include "PacketHeaders.h" InboundAudioStream::InboundAudioStream(int numFrameSamples, int numFramesCapacity, - bool dynamicJitterBuffers, /*int maxFramesOverDesired,*/ bool useStDevForJitterCalc) : + bool dynamicJitterBuffers, int maxFramesOverDesired, bool useStDevForJitterCalc) : _ringBuffer(numFrameSamples, false, numFramesCapacity), _lastPopSucceeded(false), _lastPopOutput(), @@ -23,7 +23,7 @@ InboundAudioStream::InboundAudioStream(int numFrameSamples, int numFramesCapacit _calculatedJitterBufferFramesUsingMaxGap(0), _calculatedJitterBufferFramesUsingStDev(0), _desiredJitterBufferFrames(1), - _maxFramesOverDesired(20),//maxFramesOverDesired), // PLACEHOLDER!!!!!!!!! + _maxFramesOverDesired(maxFramesOverDesired), _isStarved(true), _hasStarted(false), _consecutiveNotMixedCount(0), diff --git a/libraries/audio/src/InboundAudioStream.h b/libraries/audio/src/InboundAudioStream.h index 1a880d565f..4b1db354c1 100644 --- a/libraries/audio/src/InboundAudioStream.h +++ b/libraries/audio/src/InboundAudioStream.h @@ -50,7 +50,7 @@ class InboundAudioStream : public NodeData { Q_OBJECT public: InboundAudioStream(int numFrameSamples, int numFramesCapacity, - bool dynamicJitterBuffers, //int maxFramesOverDesired, + bool dynamicJitterBuffers, int maxFramesOverDesired, bool useStDevForJitterCalc = false); void reset(); @@ -75,6 +75,8 @@ public: /// this function should be called once per second to ensure the seq num stats history spans ~30 seconds AudioStreamStats updateSeqHistoryAndGetAudioStreamStats(); + void setMaxFramesOverDesired(int maxFramesOverDesired) { _maxFramesOverDesired = maxFramesOverDesired; } + virtual AudioStreamStats getAudioStreamStats() const; /// returns the desired number of jitter buffer frames under the dyanmic jitter buffers scheme @@ -88,6 +90,7 @@ public: int getCalculatedJitterBufferFramesUsingMaxGap() const { return _calculatedJitterBufferFramesUsingMaxGap; } int getDesiredJitterBufferFrames() const { return _desiredJitterBufferFrames; } + int getMaxFramesOverDesired() const { return _maxFramesOverDesired; } int getNumFrameSamples() const { return _ringBuffer.getNumFrameSamples(); } int getFrameCapacity() const { return _ringBuffer.getFrameCapacity(); } int getFramesAvailable() const { return _ringBuffer.framesAvailable(); } diff --git a/libraries/audio/src/InjectedAudioStream.cpp b/libraries/audio/src/InjectedAudioStream.cpp index 4c23fbd823..c50b609be0 100644 --- a/libraries/audio/src/InjectedAudioStream.cpp +++ b/libraries/audio/src/InjectedAudioStream.cpp @@ -19,8 +19,8 @@ #include "InjectedAudioStream.h" -InjectedAudioStream::InjectedAudioStream(const QUuid& streamIdentifier, bool dynamicJitterBuffer) : - PositionalAudioStream(PositionalAudioStream::Injector, false, dynamicJitterBuffer), +InjectedAudioStream::InjectedAudioStream(const QUuid& streamIdentifier, bool dynamicJitterBuffer, int maxFramesOverDesired) : + PositionalAudioStream(PositionalAudioStream::Injector, false, dynamicJitterBuffer, maxFramesOverDesired), _streamIdentifier(streamIdentifier), _radius(0.0f), _attenuationRatio(0) diff --git a/libraries/audio/src/InjectedAudioStream.h b/libraries/audio/src/InjectedAudioStream.h index b92736b0ba..d856c4cbd4 100644 --- a/libraries/audio/src/InjectedAudioStream.h +++ b/libraries/audio/src/InjectedAudioStream.h @@ -18,7 +18,7 @@ class InjectedAudioStream : public PositionalAudioStream { public: - InjectedAudioStream(const QUuid& streamIdentifier = QUuid(), bool dynamicJitterBuffer = false); + InjectedAudioStream(const QUuid& streamIdentifier, bool dynamicJitterBuffer, int maxFramesOverDesired); float getRadius() const { return _radius; } float getAttenuationRatio() const { return _attenuationRatio; } diff --git a/libraries/audio/src/MixedAudioStream.cpp b/libraries/audio/src/MixedAudioStream.cpp index b2c57c46d6..4a388d2b14 100644 --- a/libraries/audio/src/MixedAudioStream.cpp +++ b/libraries/audio/src/MixedAudioStream.cpp @@ -1,8 +1,8 @@ #include "MixedAudioStream.h" -MixedAudioStream::MixedAudioStream(int numFrameSamples, int numFramesCapacity, bool dynamicJitterBuffers, bool useStDevForJitterCalc) - : InboundAudioStream(numFrameSamples, numFramesCapacity, dynamicJitterBuffers, useStDevForJitterCalc) +MixedAudioStream::MixedAudioStream(int numFrameSamples, int numFramesCapacity, bool dynamicJitterBuffers, int maxFramesOverDesired, bool useStDevForJitterCalc) + : InboundAudioStream(numFrameSamples, numFramesCapacity, dynamicJitterBuffers, maxFramesOverDesired, useStDevForJitterCalc) { } diff --git a/libraries/audio/src/MixedAudioStream.h b/libraries/audio/src/MixedAudioStream.h index 17769be128..30b3061548 100644 --- a/libraries/audio/src/MixedAudioStream.h +++ b/libraries/audio/src/MixedAudioStream.h @@ -17,7 +17,7 @@ class MixedAudioStream : public InboundAudioStream { public: - MixedAudioStream(int numFrameSamples, int numFramesCapacity, bool dynamicJitterBuffers, bool useStDevForJitterCalc = false); + MixedAudioStream(int numFrameSamples, int numFramesCapacity, bool dynamicJitterBuffers, int maxFramesOverDesired, bool useStDevForJitterCalc = false); float getNextOutputFrameLoudness() const { return _ringBuffer.getNextOutputFrameLoudness(); } diff --git a/libraries/audio/src/PositionalAudioStream.cpp b/libraries/audio/src/PositionalAudioStream.cpp index 1e465b925d..cc6a9add90 100644 --- a/libraries/audio/src/PositionalAudioStream.cpp +++ b/libraries/audio/src/PositionalAudioStream.cpp @@ -21,9 +21,9 @@ #include #include -PositionalAudioStream::PositionalAudioStream(PositionalAudioStream::Type type, bool isStereo, bool dynamicJitterBuffers) : +PositionalAudioStream::PositionalAudioStream(PositionalAudioStream::Type type, bool isStereo, bool dynamicJitterBuffers, int maxFramesOverDesired) : InboundAudioStream(isStereo ? NETWORK_BUFFER_LENGTH_SAMPLES_STEREO : NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL, - AUDIOMIXER_INBOUND_RING_BUFFER_FRAME_CAPACITY, dynamicJitterBuffers), + AUDIOMIXER_INBOUND_RING_BUFFER_FRAME_CAPACITY, dynamicJitterBuffers, maxFramesOverDesired), _type(type), _position(0.0f, 0.0f, 0.0f), _orientation(0.0f, 0.0f, 0.0f, 0.0f), diff --git a/libraries/audio/src/PositionalAudioStream.h b/libraries/audio/src/PositionalAudioStream.h index c9739d9588..5df9972311 100644 --- a/libraries/audio/src/PositionalAudioStream.h +++ b/libraries/audio/src/PositionalAudioStream.h @@ -27,7 +27,7 @@ public: Injector }; - PositionalAudioStream(PositionalAudioStream::Type type, bool isStereo = false, bool dynamicJitterBuffers = false); + PositionalAudioStream(PositionalAudioStream::Type type, bool isStereo, bool dynamicJitterBuffers, int maxFramesOverDesired); virtual AudioStreamStats getAudioStreamStats() const;