Do not destroy script reverb settings

This commit is contained in:
Atlante45 2014-10-20 15:06:02 -07:00
parent 5a11104bdf
commit 6f9557fe67
6 changed files with 69 additions and 44 deletions

View file

@ -744,8 +744,6 @@ void AudioMixer::run() {
dataAt += sizeof(float);
memcpy(dataAt, &wetLevel, sizeof(float));
dataAt += sizeof(float);
qDebug() << "Out" << sequence << reverbTime << wetLevel;
} else {
bool hasReverb = false;
memcpy(dataAt, &hasReverb, sizeof(bool));

View file

@ -494,40 +494,43 @@ bool Audio::switchOutputToAudioDevice(const QString& outputDeviceName) {
void Audio::initGverb() {
// Initialize a new gverb instance
_gverb = gverb_new(_outputFormat.sampleRate(), _reverbOptions.getMaxRoomSize(), _reverbOptions.getRoomSize(), _reverbOptions.getReverbTime(),
_reverbOptions.getDamping(), _reverbOptions.getSpread(), _reverbOptions.getInputBandwidth(), _reverbOptions.getEarlyLevel(),
_reverbOptions.getTailLevel());
_gverb = gverb_new(_outputFormat.sampleRate(), _reverbOptions->getMaxRoomSize(), _reverbOptions->getRoomSize(),
_reverbOptions->getReverbTime(), _reverbOptions->getDamping(), _reverbOptions->getSpread(),
_reverbOptions->getInputBandwidth(), _reverbOptions->getEarlyLevel(),
_reverbOptions->getTailLevel());
// Configure the instance (these functions are not super well named - they actually set several internal variables)
gverb_set_roomsize(_gverb, _reverbOptions.getRoomSize());
gverb_set_revtime(_gverb, _reverbOptions.getReverbTime());
gverb_set_damping(_gverb, _reverbOptions.getDamping());
gverb_set_inputbandwidth(_gverb, _reverbOptions.getInputBandwidth());
gverb_set_earlylevel(_gverb, DB_CO(_reverbOptions.getEarlyLevel()));
gverb_set_taillevel(_gverb, DB_CO(_reverbOptions.getTailLevel()));
gverb_set_roomsize(_gverb, _reverbOptions->getRoomSize());
gverb_set_revtime(_gverb, _reverbOptions->getReverbTime());
gverb_set_damping(_gverb, _reverbOptions->getDamping());
gverb_set_inputbandwidth(_gverb, _reverbOptions->getInputBandwidth());
gverb_set_earlylevel(_gverb, DB_CO(_reverbOptions->getEarlyLevel()));
gverb_set_taillevel(_gverb, DB_CO(_reverbOptions->getTailLevel()));
}
void Audio::setReverbOptions(const AudioEffectOptions* options) {
// Save the new options
_reverbOptions.setMaxRoomSize(options->getMaxRoomSize());
_reverbOptions.setRoomSize(options->getRoomSize());
_reverbOptions.setReverbTime(options->getReverbTime());
_reverbOptions.setDamping(options->getDamping());
_reverbOptions.setSpread(options->getSpread());
_reverbOptions.setInputBandwidth(options->getInputBandwidth());
_reverbOptions.setEarlyLevel(options->getEarlyLevel());
_reverbOptions.setTailLevel(options->getTailLevel());
_scriptReverbOptions.setMaxRoomSize(options->getMaxRoomSize());
_scriptReverbOptions.setRoomSize(options->getRoomSize());
_scriptReverbOptions.setReverbTime(options->getReverbTime());
_scriptReverbOptions.setDamping(options->getDamping());
_scriptReverbOptions.setSpread(options->getSpread());
_scriptReverbOptions.setInputBandwidth(options->getInputBandwidth());
_scriptReverbOptions.setEarlyLevel(options->getEarlyLevel());
_scriptReverbOptions.setTailLevel(options->getTailLevel());
_reverbOptions.setDryLevel(options->getDryLevel());
_reverbOptions.setWetLevel(options->getWetLevel());
_scriptReverbOptions.setDryLevel(options->getDryLevel());
_scriptReverbOptions.setWetLevel(options->getWetLevel());
// Apply them to the reverb instance(s)
initGverb();
if (_reverbOptions == &_scriptReverbOptions) {
// Apply them to the reverb instance(s)
initGverb();
}
}
void Audio::addReverb(int16_t* samplesData, int numSamples, QAudioFormat& audioFormat) {
float dryFraction = DB_CO(_reverbOptions.getDryLevel());
float wetFraction = DB_CO(_reverbOptions.getWetLevel());
float dryFraction = DB_CO(_reverbOptions->getDryLevel());
float wetFraction = DB_CO(_reverbOptions->getWetLevel());
float lValue,rValue;
for (int sample = 0; sample < numSamples; sample += audioFormat.channelCount()) {
@ -949,23 +952,26 @@ void Audio::processReceivedSamples(const QByteArray& inputBuffer, QByteArray& ou
numDeviceOutputSamples,
_desiredOutputFormat, _outputFormat);
if (_receivedAudioStream.hasReverb()) {
bool reverbChanged = false;
if (_reverbOptions.getReverbTime() != _receivedAudioStream.getRevebTime()) {
_reverbOptions.setReverbTime(_receivedAudioStream.getRevebTime());
reverbChanged = true;
}
if (_reverbOptions.getWetLevel() != _receivedAudioStream.getWetLevel()) {
_reverbOptions.setWetLevel(_receivedAudioStream.getWetLevel());
reverbChanged = true;
}
if (reverbChanged) {
initGverb();
}
}
if(_reverb || _receivedAudioStream.hasReverb()) {
if (_receivedAudioStream.hasReverb()) {
_reverbOptions = &_zoneReverbOptions;
bool reverbChanged = false;
if (_zoneReverbOptions.getReverbTime() != _receivedAudioStream.getRevebTime()) {
_zoneReverbOptions.setReverbTime(_receivedAudioStream.getRevebTime());
reverbChanged = true;
}
if (_zoneReverbOptions.getWetLevel() != _receivedAudioStream.getWetLevel()) {
_zoneReverbOptions.setWetLevel(_receivedAudioStream.getWetLevel());
reverbChanged = true;
}
if (reverbChanged) {
initGverb();
}
} else {
_reverbOptions = &_scriptReverbOptions;
}
addReverb((int16_t*)outputBuffer.data(), numDeviceOutputSamples, _outputFormat);
}
}

View file

@ -241,7 +241,9 @@ private:
bool _muted;
bool _localEcho;
bool _reverb;
AudioEffectOptions _reverbOptions;
AudioEffectOptions _scriptReverbOptions;
AudioEffectOptions _zoneReverbOptions;
AudioEffectOptions* _reverbOptions;
ty_gverb *_gverb;
GLuint _micTextureId;
GLuint _muteTextureId;

View file

@ -57,7 +57,25 @@ AudioEffectOptions::AudioEffectOptions(QScriptValue arguments) :
if (arguments.property(WET_LEVEL_HANDLE).isNumber()) {
_wetLevel = arguments.property(WET_LEVEL_HANDLE).toNumber();
}
}
AudioEffectOptions::AudioEffectOptions(const AudioEffectOptions &other) {
*this = other;
}
AudioEffectOptions& AudioEffectOptions::operator=(const AudioEffectOptions &other) {
_maxRoomSize = other._maxRoomSize;
_roomSize = other._roomSize;
_reverbTime = other._reverbTime;
_damping = other._damping;
_spread = other._spread;
_inputBandwidth = other._inputBandwidth;
_earlyLevel = other._earlyLevel;
_tailLevel = other._tailLevel;
_dryLevel = other._dryLevel;
_wetLevel = other._wetLevel;
return *this;
}
QScriptValue AudioEffectOptions::constructor(QScriptContext* context, QScriptEngine* engine) {

View file

@ -37,6 +37,8 @@ class AudioEffectOptions : public QObject {
public:
AudioEffectOptions(QScriptValue arguments = QScriptValue());
AudioEffectOptions(const AudioEffectOptions &other);
AudioEffectOptions& operator=(const AudioEffectOptions &other);
static QScriptValue constructor(QScriptContext* context, QScriptEngine* engine);

View file

@ -173,7 +173,6 @@ int InboundAudioStream::parseStreamProperties(PacketType type, const QByteArray&
read += sizeof(float);
memcpy(&_wetLevel, packetAfterSeqNum.data() + read, sizeof(float));
read += sizeof(float);
qDebug() << "In" << _reverbTime << _wetLevel;
}
}