merge upstream/master into andrew/ragdoll

Conflicts:
	interface/src/scripting/GlobalServicesScriptingInterface.cpp
This commit is contained in:
Andrew Meadows 2014-09-13 17:25:35 -07:00
commit 908f4f3a5e
4 changed files with 58 additions and 38 deletions

View file

@ -315,53 +315,69 @@ int AudioMixer::addStreamToMixForListeningNodeWithStream(PositionalAudioStream*
rotatedSourcePosition.y = 0.0f; rotatedSourcePosition.y = 0.0f;
// produce an oriented angle about the y-axis // produce an oriented angle about the y-axis
bearingRelativeAngleToSource = glm::orientedAngle(glm::vec3(0.0f, 0.0f, -1.0f), float bearingAngleToSource = glm::orientedAngle(glm::vec3(0.0f, 0.0f, -1.0f),
glm::normalize(rotatedSourcePosition), glm::normalize(rotatedSourcePosition),
glm::vec3(0.0f, 1.0f, 0.0f)); glm::vec3(0.0f, -1.0f, 0.0f));
const float TWO_OVER_PI = 2.0f / PI;
// if the source is in the range (-pi/2,+pi/2) (e.g, -Z from the listener's perspective const float ZERO_DB = 1.0f;
if (bearingRelativeAngleToSource < -PI_OVER_TWO || bearingRelativeAngleToSource > PI_OVER_TWO) const float NEGATIVE_ONE_DB = 0.891f;
{ const float NEGATIVE_THREE_DB = 0.708f;
AudioFilterHSF1s& penumbraFilter = streamToAdd->getFilter();
const float FULL_POWER = 1.0f; const float FILTER_CUTOFF_FREQUENCY_HZ = 1000.0f;
const float SQUARE_ROOT_OF_TWO_OVER_TWO = 0.71f;
const float HALF_POWER = SQUARE_ROOT_OF_TWO_OVER_TWO; const float penumbraFilterFrequency = FILTER_CUTOFF_FREQUENCY_HZ; // constant frequency
const float penumbraFilterSlope = NEGATIVE_THREE_DB; // constant slope
const float ONE_OVER_TWO_PI = 1.0f / TWO_PI;
const float FILTER_CUTOFF_FREQUENCY_HZ = 1000.0f; float penumbraFilterGainL;
float penumbraFilterGainR;
// calculate the updated gain, frequency and slope.
const float penumbraFilterFrequency = FILTER_CUTOFF_FREQUENCY_HZ; // constant frequency
const float penumbraFilterSlope = SQUARE_ROOT_OF_TWO_OVER_TWO; // constant slope
const float penumbraFilterGainL = (bearingRelativeAngleToSource <= -PI_OVER_TWO) ? // variable gain calculation broken down by quadrent
((+1.0 * ONE_OVER_TWO_PI * (bearingRelativeAngleToSource + PI_OVER_TWO)) + FULL_POWER) : if (bearingAngleToSource < -PI_OVER_TWO && bearingAngleToSource > -PI) {
((+1.0 * ONE_OVER_TWO_PI * (bearingRelativeAngleToSource - PI)) + HALF_POWER); // gainL(-pi/2,0b)->(-pi,-1db)
penumbraFilterGainL = TWO_OVER_PI *
const float penumbraFilterGainR = (bearingRelativeAngleToSource <= -PI_OVER_TWO) ? (ZERO_DB - NEGATIVE_ONE_DB) * (bearingAngleToSource + PI_OVER_TWO) + ZERO_DB;
((-1.0 * ONE_OVER_TWO_PI * (bearingRelativeAngleToSource + PI_OVER_TWO)) + HALF_POWER) : // gainR(-pi/2,-3db)->(-pi,-1db)
((-1.0 * ONE_OVER_TWO_PI * (bearingRelativeAngleToSource - PI)) + HALF_POWER); penumbraFilterGainR = TWO_OVER_PI *
(NEGATIVE_THREE_DB - NEGATIVE_ONE_DB) * (bearingAngleToSource + PI_OVER_TWO) + NEGATIVE_THREE_DB;
} else if (bearingAngleToSource <= PI && bearingAngleToSource > PI_OVER_TWO) {
// gainL(+pi,-1db)->(pi/2,-3db)
penumbraFilterGainL = TWO_OVER_PI *
(NEGATIVE_ONE_DB - NEGATIVE_THREE_DB) * (bearingAngleToSource - PI) + NEGATIVE_ONE_DB;
// gainR(+pi,-1db)->(pi/2,0db)
penumbraFilterGainR = TWO_OVER_PI *
(NEGATIVE_ONE_DB - ZERO_DB) * (bearingAngleToSource - PI) + NEGATIVE_ONE_DB;
} else if (bearingAngleToSource <= PI_OVER_TWO && bearingAngleToSource > 0) {
// gainL(+pi/2,-3db)->(0,0db)
penumbraFilterGainL = TWO_OVER_PI *
(NEGATIVE_THREE_DB - ZERO_DB) * (bearingAngleToSource - PI_OVER_TWO) + NEGATIVE_THREE_DB;
// gainR(+p1/2,0db)->(0,0db)
penumbraFilterGainR = ZERO_DB;
} else {
// gainL(0,0db)->(-pi/2,0db)
penumbraFilterGainL = ZERO_DB;
// gainR(0,0db)->(-pi/2,-3db)
penumbraFilterGainR = TWO_OVER_PI *
(ZERO_DB - NEGATIVE_THREE_DB) * (bearingAngleToSource) + ZERO_DB;
}
#if 0 #if 0
float distanceBetween = glm::length(relativePosition); qDebug() << "avatar="
qDebug() << "avatar=" << listeningNodeStream
<< listeningNodeStream
<< "gainL=" << "gainL="
<< penumbraFilterGainL << penumbraFilterGainL
<< "gainR=" << "gainR="
<< penumbraFilterGainR << penumbraFilterGainR
<< "angle=" << "angle="
<< bearingRelativeAngleToSource << bearingAngleToSource;
<< "dist="
<< distanceBetween;
#endif #endif
// set the gain on both filter channels
penumbraFilter.setParameters(0, 0, SAMPLE_RATE, penumbraFilterFrequency, penumbraFilterGainL, penumbraFilterSlope); // set the gain on both filter channels
penumbraFilter.setParameters(0, 1, SAMPLE_RATE, penumbraFilterFrequency, penumbraFilterGainR, penumbraFilterSlope); AudioFilterHSF1s& penumbraFilter = streamToAdd->getFilter();
penumbraFilter.setParameters(0, 0, SAMPLE_RATE, penumbraFilterFrequency, penumbraFilterGainL, penumbraFilterSlope);
penumbraFilter.setParameters(0, 1, SAMPLE_RATE, penumbraFilterFrequency, penumbraFilterGainR, penumbraFilterSlope);
penumbraFilter.render(_clientSamples, _clientSamples, NETWORK_BUFFER_LENGTH_SAMPLES_STEREO / 2); penumbraFilter.render(_clientSamples, _clientSamples, NETWORK_BUFFER_LENGTH_SAMPLES_STEREO / 2);
}
} }
return 1; return 1;

View file

@ -511,7 +511,7 @@ void Audio::handleAudioInput() {
_inputFrameBuffer.copyFrames(1, inputFrameCount, inputFrameData, false /*copy in*/); _inputFrameBuffer.copyFrames(1, inputFrameCount, inputFrameData, false /*copy in*/);
_inputGain.render(_inputFrameBuffer); // input/mic gain+mute // _inputGain.render(_inputFrameBuffer); // input/mic gain+mute
// Add audio source injection if enabled // Add audio source injection if enabled
if (_audioSourceInjectEnabled && !_muted) { if (_audioSourceInjectEnabled && !_muted) {

View file

@ -104,6 +104,7 @@ void GlobalServicesScriptingInterface::loggedOut() {
emit GlobalServicesScriptingInterface::disconnected(QString("logout")); emit GlobalServicesScriptingInterface::disconnected(QString("logout"));
} }
#ifdef HAVE_QXMPP
void GlobalServicesScriptingInterface::messageReceived(const QXmppMessage& message) { void GlobalServicesScriptingInterface::messageReceived(const QXmppMessage& message) {
if (message.type() != QXmppMessage::GroupChat) { if (message.type() != QXmppMessage::GroupChat) {
return; return;
@ -111,3 +112,4 @@ void GlobalServicesScriptingInterface::messageReceived(const QXmppMessage& messa
const QXmppMucRoom* publicChatRoom = XmppClient::getInstance().getPublicChatRoom(); const QXmppMucRoom* publicChatRoom = XmppClient::getInstance().getPublicChatRoom();
emit GlobalServicesScriptingInterface::incomingMessage(message.from().right(message.from().count() - 1 - publicChatRoom->jid().count()), message.body()); emit GlobalServicesScriptingInterface::incomingMessage(message.from().right(message.from().count() - 1 - publicChatRoom->jid().count()), message.body());
} }
#endif // HAVE_QXMPP

View file

@ -24,7 +24,7 @@
#include <QXmppClient.h> #include <QXmppClient.h>
#include <QXmppMessage.h> #include <QXmppMessage.h>
#endif #endif // HAVE_QXMPP
class GlobalServicesScriptingInterface : public QObject { class GlobalServicesScriptingInterface : public QObject {
Q_OBJECT Q_OBJECT
@ -47,7 +47,9 @@ private slots:
void loggedOut(); void loggedOut();
void onConnected(); void onConnected();
void participantsChanged(); void participantsChanged();
#ifdef HAVE_QXMPP
void messageReceived(const QXmppMessage& message); void messageReceived(const QXmppMessage& message);
#endif // HAVE_QXMPP
signals: signals:
void connected(); void connected();