mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 02:57:10 +02:00
an initial version of distance reverb
This commit is contained in:
parent
a289692215
commit
787835e86d
1 changed files with 48 additions and 20 deletions
|
@ -79,6 +79,11 @@ void attachNewBufferToAgent(Agent *newAgent) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct SharedAudioFactors {
|
||||||
|
float distanceCoefficient;
|
||||||
|
float effectMix;
|
||||||
|
};
|
||||||
|
|
||||||
int main(int argc, const char* argv[]) {
|
int main(int argc, const char* argv[]) {
|
||||||
setvbuf(stdout, NULL, _IOLBF, 0);
|
setvbuf(stdout, NULL, _IOLBF, 0);
|
||||||
|
|
||||||
|
@ -107,11 +112,14 @@ int main(int argc, const char* argv[]) {
|
||||||
int16_t clientSamples[BUFFER_LENGTH_SAMPLES_PER_CHANNEL * 2] = {};
|
int16_t clientSamples[BUFFER_LENGTH_SAMPLES_PER_CHANNEL * 2] = {};
|
||||||
|
|
||||||
// setup STK for the reverb effect
|
// setup STK for the reverb effect
|
||||||
|
const float DISTANCE_REVERB_DAMPING = 0.8f;
|
||||||
|
const float DISTANCE_REVERB_ROOM_SIZE = 1.0f;
|
||||||
|
const float DISTANCE_REVERB_WIDTH = 0.5f;
|
||||||
|
|
||||||
stk::FreeVerb freeVerb;
|
stk::FreeVerb freeVerb;
|
||||||
freeVerb.setEffectMix(0.5f);
|
freeVerb.setDamping(DISTANCE_REVERB_DAMPING);
|
||||||
freeVerb.setDamping(0.5f);
|
freeVerb.setRoomSize(DISTANCE_REVERB_ROOM_SIZE);
|
||||||
freeVerb.setRoomSize(0.5f);
|
freeVerb.setWidth(DISTANCE_REVERB_WIDTH);
|
||||||
freeVerb.setWidth(0.5f);
|
|
||||||
|
|
||||||
gettimeofday(&startTime, NULL);
|
gettimeofday(&startTime, NULL);
|
||||||
|
|
||||||
|
@ -138,8 +146,8 @@ int main(int argc, const char* argv[]) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int numAgents = agentList->size();
|
int numAgents = agentList->size();
|
||||||
float distanceCoefficients[numAgents][numAgents];
|
SharedAudioFactors audioFactors[numAgents][numAgents];
|
||||||
memset(distanceCoefficients, 0, sizeof(distanceCoefficients));
|
memset(audioFactors, 0, sizeof(audioFactors));
|
||||||
|
|
||||||
for (AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) {
|
for (AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) {
|
||||||
if (agent->getType() == AGENT_TYPE_AVATAR) {
|
if (agent->getType() == AGENT_TYPE_AVATAR) {
|
||||||
|
@ -159,6 +167,9 @@ int main(int argc, const char* argv[]) {
|
||||||
int numSamplesDelay = 0;
|
int numSamplesDelay = 0;
|
||||||
float weakChannelAmplitudeRatio = 1.f;
|
float weakChannelAmplitudeRatio = 1.f;
|
||||||
|
|
||||||
|
// echo effect mix is 0
|
||||||
|
freeVerb.setEffectMix(0.0f);
|
||||||
|
|
||||||
if (otherAgent != agent) {
|
if (otherAgent != agent) {
|
||||||
glm::vec3 agentPosition = agentRingBuffer->getPosition();
|
glm::vec3 agentPosition = agentRingBuffer->getPosition();
|
||||||
glm::vec3 otherAgentPosition = otherAgentBuffer->getPosition();
|
glm::vec3 otherAgentPosition = otherAgentBuffer->getPosition();
|
||||||
|
@ -169,7 +180,10 @@ int main(int argc, const char* argv[]) {
|
||||||
int lowAgentIndex = std::min(agent.getAgentIndex(), otherAgent.getAgentIndex());
|
int lowAgentIndex = std::min(agent.getAgentIndex(), otherAgent.getAgentIndex());
|
||||||
int highAgentIndex = std::max(agent.getAgentIndex(), otherAgent.getAgentIndex());
|
int highAgentIndex = std::max(agent.getAgentIndex(), otherAgent.getAgentIndex());
|
||||||
|
|
||||||
if (distanceCoefficients[lowAgentIndex][highAgentIndex] == 0) {
|
const float DISTANCE_REVERB_LOG_REMAINDER = 0.32f;
|
||||||
|
const float DISTANCE_REVERB_MAX_WETNESS = 1.0f;
|
||||||
|
|
||||||
|
if (audioFactors[lowAgentIndex][highAgentIndex].distanceCoefficient == 0) {
|
||||||
float distanceToAgent = sqrtf(powf(agentPosition.x - otherAgentPosition.x, 2) +
|
float distanceToAgent = sqrtf(powf(agentPosition.x - otherAgentPosition.x, 2) +
|
||||||
powf(agentPosition.y - otherAgentPosition.y, 2) +
|
powf(agentPosition.y - otherAgentPosition.y, 2) +
|
||||||
powf(agentPosition.z - otherAgentPosition.z, 2));
|
powf(agentPosition.z - otherAgentPosition.z, 2));
|
||||||
|
@ -178,7 +192,16 @@ int main(int argc, const char* argv[]) {
|
||||||
powf(0.3,
|
powf(0.3,
|
||||||
(logf(DISTANCE_SCALE * distanceToAgent) / logf(2.5))
|
(logf(DISTANCE_SCALE * distanceToAgent) / logf(2.5))
|
||||||
- 1));
|
- 1));
|
||||||
distanceCoefficients[lowAgentIndex][highAgentIndex] = minCoefficient;
|
|
||||||
|
audioFactors[lowAgentIndex][highAgentIndex].distanceCoefficient = minCoefficient;
|
||||||
|
|
||||||
|
float effectMix = powf(2.0f,
|
||||||
|
(logf(distanceToAgent) / logf(2.0f) - DISTANCE_REVERB_LOG_REMAINDER)
|
||||||
|
* DISTANCE_REVERB_MAX_WETNESS);
|
||||||
|
|
||||||
|
audioFactors[lowAgentIndex][highAgentIndex].effectMix = (effectMix / 32.0f);
|
||||||
|
|
||||||
|
// printf("DA: %f, EM: %f\n", distanceToAgent, effectMix / 32.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -222,10 +245,12 @@ int main(int argc, const char* argv[]) {
|
||||||
float offAxisCoefficient = MAX_OFF_AXIS_ATTENUATION +
|
float offAxisCoefficient = MAX_OFF_AXIS_ATTENUATION +
|
||||||
(OFF_AXIS_ATTENUATION_FORMULA_STEP * (fabsf(angleOfDelivery) / 90.0f));
|
(OFF_AXIS_ATTENUATION_FORMULA_STEP * (fabsf(angleOfDelivery) / 90.0f));
|
||||||
|
|
||||||
attenuationCoefficient = distanceCoefficients[lowAgentIndex][highAgentIndex]
|
attenuationCoefficient = audioFactors[lowAgentIndex][highAgentIndex].distanceCoefficient
|
||||||
* otherAgentBuffer->getAttenuationRatio()
|
* otherAgentBuffer->getAttenuationRatio()
|
||||||
* offAxisCoefficient;
|
* offAxisCoefficient;
|
||||||
|
|
||||||
|
freeVerb.setEffectMix(audioFactors[lowAgentIndex][highAgentIndex].effectMix);
|
||||||
|
|
||||||
bearingRelativeAngleToSource *= (M_PI / 180);
|
bearingRelativeAngleToSource *= (M_PI / 180);
|
||||||
|
|
||||||
float sinRatio = fabsf(sinf(bearingRelativeAngleToSource));
|
float sinRatio = fabsf(sinf(bearingRelativeAngleToSource));
|
||||||
|
@ -244,15 +269,25 @@ int main(int argc, const char* argv[]) {
|
||||||
? otherAgentBuffer->getBuffer() + RING_BUFFER_SAMPLES - numSamplesDelay
|
? otherAgentBuffer->getBuffer() + RING_BUFFER_SAMPLES - numSamplesDelay
|
||||||
: otherAgentBuffer->getNextOutput() - numSamplesDelay;
|
: otherAgentBuffer->getNextOutput() - numSamplesDelay;
|
||||||
|
|
||||||
for (int s = 0; s < BUFFER_LENGTH_SAMPLES_PER_CHANNEL; s++) {
|
|
||||||
|
|
||||||
|
for (int s = 0; s < BUFFER_LENGTH_SAMPLES_PER_CHANNEL; s++) {
|
||||||
if (s < numSamplesDelay) {
|
if (s < numSamplesDelay) {
|
||||||
// pull the earlier sample for the delayed channel
|
// pull the earlier sample for the delayed channel
|
||||||
int earlierSample = delaySamplePointer[s] * attenuationCoefficient;
|
int earlierSample = delaySamplePointer[s]
|
||||||
plateauAdditionOfSamples(delayedChannel[s], earlierSample * weakChannelAmplitudeRatio);
|
* attenuationCoefficient
|
||||||
|
* weakChannelAmplitudeRatio;
|
||||||
|
|
||||||
|
// apply the STK FreeVerb effect
|
||||||
|
earlierSample = freeVerb.tick(earlierSample);
|
||||||
|
|
||||||
|
plateauAdditionOfSamples(delayedChannel[s], earlierSample);
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t currentSample = (otherAgentBuffer->getNextOutput()[s] * attenuationCoefficient);
|
int16_t currentSample = (otherAgentBuffer->getNextOutput()[s] * attenuationCoefficient);
|
||||||
|
|
||||||
|
// apply the STK FreeVerb effect
|
||||||
|
currentSample = freeVerb.tick(currentSample);
|
||||||
|
|
||||||
plateauAdditionOfSamples(goodChannel[s], currentSample);
|
plateauAdditionOfSamples(goodChannel[s], currentSample);
|
||||||
|
|
||||||
if (s + numSamplesDelay < BUFFER_LENGTH_SAMPLES_PER_CHANNEL) {
|
if (s + numSamplesDelay < BUFFER_LENGTH_SAMPLES_PER_CHANNEL) {
|
||||||
|
@ -264,13 +299,6 @@ int main(int argc, const char* argv[]) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// apply the FreeVerb to the clientSamples array
|
|
||||||
for (int s = 0; s < BUFFER_LENGTH_SAMPLES_PER_CHANNEL; s++) {
|
|
||||||
clientSamples[s] = freeVerb.tick(clientSamples[s],
|
|
||||||
clientSamples[s + BUFFER_LENGTH_SAMPLES_PER_CHANNEL]);
|
|
||||||
clientSamples[s + BUFFER_LENGTH_SAMPLES_PER_CHANNEL] = freeVerb.lastOut(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(clientPacket + 1, clientSamples, sizeof(clientSamples));
|
memcpy(clientPacket + 1, clientSamples, sizeof(clientSamples));
|
||||||
agentList->getAgentSocket()->send(agent->getPublicSocket(), clientPacket, BUFFER_LENGTH_BYTES + 1);
|
agentList->getAgentSocket()->send(agent->getPublicSocket(), clientPacket, BUFFER_LENGTH_BYTES + 1);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue