From 1f011bfe9d559e2d9069a12107ea1fa0ec97ce5d Mon Sep 17 00:00:00 2001 From: wangyix Date: Mon, 11 Aug 2014 11:22:37 -0700 Subject: [PATCH] repetition-with-fade option added, not implemented --- assignment-client/src/Agent.cpp | 2 +- assignment-client/src/audio/AudioMixer.cpp | 8 ++ .../resources/web/settings/describe.json | 6 ++ interface/src/Menu.cpp | 2 + interface/src/ui/PreferencesDialog.cpp | 8 +- interface/ui/preferencesDialog.ui | 99 ++++++++++++++++++- libraries/audio/src/InboundAudioStream.cpp | 4 +- libraries/audio/src/InboundAudioStream.h | 18 +++- 8 files changed, 130 insertions(+), 17 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index ecc6414622..e7b11f6029 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -43,7 +43,7 @@ Agent::Agent(const QByteArray& packet) : _receivedAudioStream(NETWORK_BUFFER_LENGTH_SAMPLES_STEREO, RECEIVED_AUDIO_STREAM_CAPACITY_FRAMES, InboundAudioStream::Settings(0, false, RECEIVED_AUDIO_STREAM_CAPACITY_FRAMES, false, DEFAULT_WINDOW_STARVE_THRESHOLD, DEFAULT_WINDOW_SECONDS_FOR_DESIRED_CALC_ON_TOO_MANY_STARVES, - DEFAULT_WINDOW_SECONDS_FOR_DESIRED_REDUCTION)), + DEFAULT_WINDOW_SECONDS_FOR_DESIRED_REDUCTION, false)), _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 0f76d17da1..bd8877a128 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -477,6 +477,14 @@ void AudioMixer::run() { } qDebug() << "Window B length:" << _streamSettings._windowSecondsForDesiredReduction << "seconds"; + const QString REPETITION_WITH_FADE_JSON_KEY = "H-repetition-with-fade"; + _streamSettings._repetitionWithFade = audioGroupObject[REPETITION_WITH_FADE_JSON_KEY].toBool(); + if (_streamSettings._repetitionWithFade) { + qDebug() << "Repetition with fade enabled"; + } else { + qDebug() << "Repetition with fade disabled"; + } + const QString UNATTENUATED_ZONE_KEY = "Z-unattenuated-zone"; diff --git a/domain-server/resources/web/settings/describe.json b/domain-server/resources/web/settings/describe.json index bb63c5f0a0..db2809bffb 100644 --- a/domain-server/resources/web/settings/describe.json +++ b/domain-server/resources/web/settings/describe.json @@ -45,6 +45,12 @@ "placeholder": "10", "default": "10" }, + "H-repetition-with-fade": { + "type": "checkbox", + "label": "Repetition with Fade:", + "help": "If enabled, dropped frames and mixing during starves will repeat the last frame, eventually fading to silence", + "default": true + }, "Z-unattenuated-zone": { "label": "Unattenuated Zone", "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)", diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index ecf28bcb17..a0943ebb52 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -638,6 +638,7 @@ void Menu::loadSettings(QSettings* settings) { _receivedAudioStreamSettings._windowStarveThreshold = settings->value("windowStarveThreshold", DEFAULT_WINDOW_STARVE_THRESHOLD).toInt(); _receivedAudioStreamSettings._windowSecondsForDesiredCalcOnTooManyStarves = settings->value("windowSecondsForDesiredCalcOnTooManyStarves", DEFAULT_WINDOW_SECONDS_FOR_DESIRED_CALC_ON_TOO_MANY_STARVES).toInt(); _receivedAudioStreamSettings._windowSecondsForDesiredReduction = settings->value("windowSecondsForDesiredReduction", DEFAULT_WINDOW_SECONDS_FOR_DESIRED_REDUCTION).toInt(); + _receivedAudioStreamSettings._repetitionWithFade = settings->value("repetitionWithFade", DEFAULT_REPETITION_WITH_FADE).toBool(); _fieldOfView = loadSetting(settings, "fieldOfView", DEFAULT_FIELD_OF_VIEW_DEGREES); _realWorldFieldOfView = loadSetting(settings, "realWorldFieldOfView", DEFAULT_REAL_WORLD_FIELD_OF_VIEW_DEGREES); @@ -695,6 +696,7 @@ void Menu::saveSettings(QSettings* settings) { settings->setValue("windowStarveThreshold", _receivedAudioStreamSettings._windowStarveThreshold); settings->setValue("windowSecondsForDesiredCalcOnTooManyStarves", _receivedAudioStreamSettings._windowSecondsForDesiredCalcOnTooManyStarves); settings->setValue("windowSecondsForDesiredReduction", _receivedAudioStreamSettings._windowSecondsForDesiredReduction); + settings->setValue("repetitionWithFade", _receivedAudioStreamSettings._repetitionWithFade); settings->setValue("fieldOfView", _fieldOfView); settings->setValue("faceshiftEyeDeflection", _faceshiftEyeDeflection); diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index bde3cfd65a..c585b6ba0c 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -152,18 +152,13 @@ void PreferencesDialog::loadPreferences() { const InboundAudioStream::Settings& streamSettings = menuInstance->getReceivedAudioStreamSettings(); ui.dynamicJitterBuffersCheckBox->setChecked(streamSettings._dynamicJitterBuffers); - ui.staticDesiredJitterBufferFramesSpin->setValue(streamSettings._staticDesiredJitterBufferFrames); - ui.maxFramesOverDesiredSpin->setValue(streamSettings._maxFramesOverDesired); - ui.useStdevForJitterCalcCheckBox->setChecked(streamSettings._useStDevForJitterCalc); - ui.windowStarveThresholdSpin->setValue(streamSettings._windowStarveThreshold); - ui.windowSecondsForDesiredCalcOnTooManyStarvesSpin->setValue(streamSettings._windowSecondsForDesiredCalcOnTooManyStarves); - ui.windowSecondsForDesiredReductionSpin->setValue(streamSettings._windowSecondsForDesiredReduction); + ui.repetitionWithFadeCheckBox->setChecked(streamSettings._repetitionWithFade); ui.realWorldFieldOfViewSpin->setValue(menuInstance->getRealWorldFieldOfView()); @@ -261,6 +256,7 @@ void PreferencesDialog::savePreferences() { streamSettings._windowStarveThreshold = ui.windowStarveThresholdSpin->value(); streamSettings._windowSecondsForDesiredCalcOnTooManyStarves = ui.windowSecondsForDesiredCalcOnTooManyStarvesSpin->value(); streamSettings._windowSecondsForDesiredReduction = ui.windowSecondsForDesiredReductionSpin->value(); + streamSettings._repetitionWithFade = ui.repetitionWithFadeCheckBox->isChecked(); Menu::getInstance()->setReceivedAudioStreamSettings(streamSettings); Application::getInstance()->getAudio()->setReceivedAudioStreamSettings(streamSettings); diff --git a/interface/ui/preferencesDialog.ui b/interface/ui/preferencesDialog.ui index cddc0f1299..e35c66af5a 100644 --- a/interface/ui/preferencesDialog.ui +++ b/interface/ui/preferencesDialog.ui @@ -1683,7 +1683,7 @@ padding: 10px;margin-top:10px - + Arial @@ -1777,7 +1777,7 @@ padding: 10px;margin-top:10px - + Arial @@ -1867,7 +1867,7 @@ padding: 10px;margin-top:10px - + Arial @@ -1961,7 +1961,7 @@ padding: 10px;margin-top:10px - + Arial @@ -2055,7 +2055,7 @@ padding: 10px;margin-top:10px - + Arial @@ -2110,6 +2110,95 @@ padding: 10px;margin-top:10px + + + + + + + 0 + + + 10 + + + 0 + + + 10 + + + + + + Arial + + + + color: rgb(51, 51, 51) + + + Repetition with Fade + + + 15 + + + repetitionWithFadeCheckBox + + + + + + + + Arial + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + + 32 + 0 + + + + + 0 + 0 + + + + + + + + 32 + 32 + + + + + + diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index f393a4af44..39cd544b15 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -41,7 +41,8 @@ InboundAudioStream::InboundAudioStream(int numFrameSamples, int numFramesCapacit _starveThreshold(settings._windowStarveThreshold), _framesAvailableStat(), _currentJitterBufferFrames(0), - _timeGapStatsForStatsPacket(0, STATS_FOR_STATS_PACKET_WINDOW_SECONDS) + _timeGapStatsForStatsPacket(0, STATS_FOR_STATS_PACKET_WINDOW_SECONDS), + _repetitionWithFade(settings._repetitionWithFade) { } @@ -333,6 +334,7 @@ void InboundAudioStream::setSettings(const Settings& settings) { setWindowStarveThreshold(settings._windowStarveThreshold); setWindowSecondsForDesiredCalcOnTooManyStarves(settings._windowSecondsForDesiredCalcOnTooManyStarves); setWindowSecondsForDesiredReduction(settings._windowSecondsForDesiredReduction); + setRepetitionWithFade(settings._repetitionWithFade); } void InboundAudioStream::setDynamicJitterBuffers(bool dynamicJitterBuffers) { diff --git a/libraries/audio/src/InboundAudioStream.h b/libraries/audio/src/InboundAudioStream.h index dac1bb138c..f41d9255ff 100644 --- a/libraries/audio/src/InboundAudioStream.h +++ b/libraries/audio/src/InboundAudioStream.h @@ -43,6 +43,7 @@ const bool DEFAULT_USE_STDEV_FOR_JITTER_CALC = false; const int DEFAULT_WINDOW_STARVE_THRESHOLD = 3; const int DEFAULT_WINDOW_SECONDS_FOR_DESIRED_CALC_ON_TOO_MANY_STARVES = 50; const int DEFAULT_WINDOW_SECONDS_FOR_DESIRED_REDUCTION = 10; +const bool DEFAULT_REPETITION_WITH_FADE = true; class InboundAudioStream : public NodeData { Q_OBJECT @@ -56,19 +57,21 @@ public: _useStDevForJitterCalc(DEFAULT_USE_STDEV_FOR_JITTER_CALC), _windowStarveThreshold(DEFAULT_WINDOW_STARVE_THRESHOLD), _windowSecondsForDesiredCalcOnTooManyStarves(DEFAULT_WINDOW_SECONDS_FOR_DESIRED_CALC_ON_TOO_MANY_STARVES), - _windowSecondsForDesiredReduction(DEFAULT_WINDOW_SECONDS_FOR_DESIRED_REDUCTION) + _windowSecondsForDesiredReduction(DEFAULT_WINDOW_SECONDS_FOR_DESIRED_REDUCTION), + _repetitionWithFade(DEFAULT_REPETITION_WITH_FADE) {} Settings(int maxFramesOverDesired, bool dynamicJitterBuffers, int staticDesiredJitterBufferFrames, bool useStDevForJitterCalc, int windowStarveThreshold, int windowSecondsForDesiredCalcOnTooManyStarves, - int _windowSecondsForDesiredReduction) + int _windowSecondsForDesiredReduction, bool repetitionWithFade) : _maxFramesOverDesired(maxFramesOverDesired), _dynamicJitterBuffers(dynamicJitterBuffers), _staticDesiredJitterBufferFrames(staticDesiredJitterBufferFrames), _useStDevForJitterCalc(useStDevForJitterCalc), _windowStarveThreshold(windowStarveThreshold), _windowSecondsForDesiredCalcOnTooManyStarves(windowSecondsForDesiredCalcOnTooManyStarves), - _windowSecondsForDesiredReduction(windowSecondsForDesiredCalcOnTooManyStarves) + _windowSecondsForDesiredReduction(windowSecondsForDesiredCalcOnTooManyStarves), + _repetitionWithFade(repetitionWithFade) {} // max number of frames over desired in the ringbuffer. @@ -86,6 +89,10 @@ public: int _windowStarveThreshold; int _windowSecondsForDesiredCalcOnTooManyStarves; int _windowSecondsForDesiredReduction; + + // if true, the prev frame will be repeated (fading to silence) for dropped frames. + // otherwise, silence will be inserted. + bool _repetitionWithFade; }; public: @@ -116,7 +123,8 @@ public: void setWindowStarveThreshold(int windowStarveThreshold) { _starveThreshold = windowStarveThreshold; } void setWindowSecondsForDesiredCalcOnTooManyStarves(int windowSecondsForDesiredCalcOnTooManyStarves); void setWindowSecondsForDesiredReduction(int windowSecondsForDesiredReduction); - + void setRepetitionWithFade(bool repetitionWithFade) { _repetitionWithFade = repetitionWithFade; } + virtual AudioStreamStats getAudioStreamStats() const; @@ -234,6 +242,8 @@ protected: int _currentJitterBufferFrames; MovingMinMaxAvg _timeGapStatsForStatsPacket; + + bool _repetitionWithFade; }; #endif // hifi_InboundAudioStream_h