mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 00:17:25 +02:00
cap distance amplification at 1, create spatialized mix
This commit is contained in:
parent
400cb238f2
commit
c23b5ff785
1 changed files with 36 additions and 6 deletions
|
@ -35,6 +35,7 @@ const long MAX_SAMPLE_VALUE = std::numeric_limits<int16_t>::max();
|
||||||
const long MIN_SAMPLE_VALUE = std::numeric_limits<int16_t>::min();
|
const long MIN_SAMPLE_VALUE = std::numeric_limits<int16_t>::min();
|
||||||
|
|
||||||
const float DISTANCE_RATIO = 3.0/4.2;
|
const float DISTANCE_RATIO = 3.0/4.2;
|
||||||
|
const int PHASE_DELAY_AT_90 = 20;
|
||||||
|
|
||||||
char DOMAIN_HOSTNAME[] = "highfidelity.below92.com";
|
char DOMAIN_HOSTNAME[] = "highfidelity.below92.com";
|
||||||
char DOMAIN_IP[100] = ""; // IP Address will be re-set by lookup on startup
|
char DOMAIN_IP[100] = ""; // IP Address will be re-set by lookup on startup
|
||||||
|
@ -69,7 +70,6 @@ void *sendBuffer(void *args)
|
||||||
agentBuffer->setStarted(true);
|
agentBuffer->setStarted(true);
|
||||||
agentBuffer->setAddedToMix(true);
|
agentBuffer->setAddedToMix(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -79,13 +79,13 @@ void *sendBuffer(void *args)
|
||||||
int16_t clientMix[BUFFER_LENGTH_SAMPLES_PER_CHANNEL * 2] = {};
|
int16_t clientMix[BUFFER_LENGTH_SAMPLES_PER_CHANNEL * 2] = {};
|
||||||
|
|
||||||
for (int j = 0; j < agentList.getAgents().size(); j++) {
|
for (int j = 0; j < agentList.getAgents().size(); j++) {
|
||||||
if (i == j) {
|
if (i != j) {
|
||||||
AudioRingBuffer *agentRingBuffer = (AudioRingBuffer *) agent->getLinkedData();
|
AudioRingBuffer *agentRingBuffer = (AudioRingBuffer *) agent->getLinkedData();
|
||||||
AudioRingBuffer *otherAgentBuffer = (AudioRingBuffer *)agentList.getAgents()[j].getLinkedData();
|
AudioRingBuffer *otherAgentBuffer = (AudioRingBuffer *)agentList.getAgents()[j].getLinkedData();
|
||||||
|
|
||||||
|
|
||||||
float *agentPosition = agentRingBuffer->getPosition();
|
float *agentPosition = agentRingBuffer->getPosition();
|
||||||
float otherAgentPosition[3] = {0,0,0};
|
float *otherAgentPosition = otherAgentBuffer->getPosition();
|
||||||
|
|
||||||
// calculate the distance to the other agent
|
// calculate the distance to the other agent
|
||||||
float distanceToAgent = sqrtf(powf(agentPosition[0] - otherAgentPosition[0], 2) +
|
float distanceToAgent = sqrtf(powf(agentPosition[0] - otherAgentPosition[0], 2) +
|
||||||
|
@ -93,6 +93,7 @@ void *sendBuffer(void *args)
|
||||||
powf(agentPosition[2] - otherAgentPosition[2], 2));
|
powf(agentPosition[2] - otherAgentPosition[2], 2));
|
||||||
// use the distance to the other agent to calculate the change in volume for this frame
|
// use the distance to the other agent to calculate the change in volume for this frame
|
||||||
float distanceCoeff = powf((logf(DISTANCE_RATIO * distanceToAgent) / logf(3)), 2);
|
float distanceCoeff = powf((logf(DISTANCE_RATIO * distanceToAgent) / logf(3)), 2);
|
||||||
|
distanceCoeff = std::max(1.0f, distanceCoeff);
|
||||||
|
|
||||||
// get the angle from the right-angle triangle
|
// get the angle from the right-angle triangle
|
||||||
float triangleAngle = atan2f(fabsf(agentPosition[2] - otherAgentPosition[2]), fabsf(agentPosition[0] - otherAgentPosition[0])) * (180 / M_PI);
|
float triangleAngle = atan2f(fabsf(agentPosition[2] - otherAgentPosition[2]), fabsf(agentPosition[0] - otherAgentPosition[0])) * (180 / M_PI);
|
||||||
|
@ -115,10 +116,39 @@ void *sendBuffer(void *args)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (angleToSource > 180) {
|
||||||
|
angleToSource -= 360;
|
||||||
|
} else if (angleToSource < -180) {
|
||||||
|
angleToSource += 360;
|
||||||
|
}
|
||||||
|
|
||||||
|
angleToSource *= (M_PI / 180);
|
||||||
|
|
||||||
|
float sinRatio = fabsf(sinf(angleToSource));
|
||||||
|
int numSamplesDelay = PHASE_DELAY_AT_90 * sinRatio;
|
||||||
|
|
||||||
|
int16_t *goodChannel = angleToSource > 0 ? clientMix + BUFFER_LENGTH_SAMPLES_PER_CHANNEL : clientMix;
|
||||||
|
int16_t *delayedChannel = angleToSource > 0 ? clientMix : clientMix + BUFFER_LENGTH_SAMPLES_PER_CHANNEL;
|
||||||
|
|
||||||
|
int16_t *delaySamplePointer = otherAgentBuffer->getNextOutput() == otherAgentBuffer->getBuffer()
|
||||||
|
? otherAgentBuffer->getBuffer() + RING_BUFFER_SAMPLES - 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++) {
|
||||||
int16_t sample = (otherAgentBuffer->getNextOutput()[s] / distanceCoeff);
|
|
||||||
clientMix[s] += sample;
|
if (s < numSamplesDelay) {
|
||||||
clientMix[s + BUFFER_LENGTH_SAMPLES_PER_CHANNEL] += sample;
|
// pull the earlier sample for the delayed channel
|
||||||
|
|
||||||
|
int earlierSample = delaySamplePointer[s] / distanceCoeff;
|
||||||
|
delayedChannel[s] = earlierSample;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t currentSample = (otherAgentBuffer->getNextOutput()[s] / distanceCoeff);
|
||||||
|
goodChannel[s] = currentSample;
|
||||||
|
|
||||||
|
if (s + numSamplesDelay < BUFFER_LENGTH_SAMPLES_PER_CHANNEL) {
|
||||||
|
delayedChannel[s + numSamplesDelay] = currentSample;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue