mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 01:56:54 +02:00
Move AudioEnv packet send to own function
Audio environment packet moved to own function and out of the if/else So it is now sent all the time, now matter if there are other people around you
This commit is contained in:
parent
efc86b9f75
commit
44cb35778a
2 changed files with 63 additions and 53 deletions
|
@ -463,6 +463,63 @@ int AudioMixer::prepareMixForListeningNode(Node* node) {
|
||||||
return streamsMixed;
|
return streamsMixed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AudioMixer::sendAudioEnvironmentPacket(SharedNodePointer node) {
|
||||||
|
static char clientEnvBuffer[MAX_PACKET_SIZE];
|
||||||
|
|
||||||
|
// Send stream properties
|
||||||
|
bool hasReverb = false;
|
||||||
|
float reverbTime, wetLevel;
|
||||||
|
// find reverb properties
|
||||||
|
for (int i = 0; i < _zoneReverbSettings.size(); ++i) {
|
||||||
|
AudioMixerClientData* data = static_cast<AudioMixerClientData*>(node->getLinkedData());
|
||||||
|
glm::vec3 streamPosition = data->getAvatarAudioStream()->getPosition();
|
||||||
|
if (_audioZones[_zoneReverbSettings[i].zone].contains(streamPosition)) {
|
||||||
|
hasReverb = true;
|
||||||
|
reverbTime = _zoneReverbSettings[i].reverbTime;
|
||||||
|
wetLevel = _zoneReverbSettings[i].wetLevel;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AudioMixerClientData* nodeData = static_cast<AudioMixerClientData*>(node->getLinkedData());
|
||||||
|
AvatarAudioStream* stream = nodeData->getAvatarAudioStream();
|
||||||
|
bool dataChanged = (stream->hasReverb() != hasReverb) ||
|
||||||
|
(stream->hasReverb() && (stream->getRevebTime() != reverbTime ||
|
||||||
|
stream->getWetLevel() != wetLevel));
|
||||||
|
if (dataChanged) {
|
||||||
|
// Update stream
|
||||||
|
if (hasReverb) {
|
||||||
|
stream->setReverb(reverbTime, wetLevel);
|
||||||
|
} else {
|
||||||
|
stream->clearReverb();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send at change or every so often
|
||||||
|
float CHANCE_OF_SEND = 0.01f;
|
||||||
|
bool sendData = dataChanged || (randFloat() < CHANCE_OF_SEND);
|
||||||
|
|
||||||
|
if (sendData) {
|
||||||
|
int numBytesEnvPacketHeader = populatePacketHeader(clientEnvBuffer, PacketTypeAudioEnvironment);
|
||||||
|
char* envDataAt = clientEnvBuffer + numBytesEnvPacketHeader;
|
||||||
|
|
||||||
|
unsigned char bitset = 0;
|
||||||
|
if (hasReverb) {
|
||||||
|
setAtBit(bitset, HAS_REVERB_BIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(envDataAt, &bitset, sizeof(unsigned char));
|
||||||
|
envDataAt += sizeof(unsigned char);
|
||||||
|
|
||||||
|
if (hasReverb) {
|
||||||
|
memcpy(envDataAt, &reverbTime, sizeof(float));
|
||||||
|
envDataAt += sizeof(float);
|
||||||
|
memcpy(envDataAt, &wetLevel, sizeof(float));
|
||||||
|
envDataAt += sizeof(float);
|
||||||
|
}
|
||||||
|
NodeList::getInstance()->writeDatagram(clientEnvBuffer, envDataAt - clientEnvBuffer, node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void AudioMixer::readPendingDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr) {
|
void AudioMixer::readPendingDatagram(const QByteArray& receivedPacket, const HifiSockAddr& senderSockAddr) {
|
||||||
NodeList* nodeList = NodeList::getInstance();
|
NodeList* nodeList = NodeList::getInstance();
|
||||||
|
|
||||||
|
@ -640,7 +697,6 @@ void AudioMixer::run() {
|
||||||
timer.start();
|
timer.start();
|
||||||
|
|
||||||
char clientMixBuffer[MAX_PACKET_SIZE];
|
char clientMixBuffer[MAX_PACKET_SIZE];
|
||||||
char clientEnvBuffer[MAX_PACKET_SIZE];
|
|
||||||
|
|
||||||
int usecToSleep = BUFFER_SEND_INTERVAL_USECS;
|
int usecToSleep = BUFFER_SEND_INTERVAL_USECS;
|
||||||
|
|
||||||
|
@ -734,58 +790,6 @@ void AudioMixer::run() {
|
||||||
// pack mixed audio samples
|
// pack mixed audio samples
|
||||||
memcpy(mixDataAt, _mixSamples, NETWORK_BUFFER_LENGTH_BYTES_STEREO);
|
memcpy(mixDataAt, _mixSamples, NETWORK_BUFFER_LENGTH_BYTES_STEREO);
|
||||||
mixDataAt += NETWORK_BUFFER_LENGTH_BYTES_STEREO;
|
mixDataAt += NETWORK_BUFFER_LENGTH_BYTES_STEREO;
|
||||||
|
|
||||||
// Send stream properties
|
|
||||||
bool hasReverb = false;
|
|
||||||
float reverbTime, wetLevel;
|
|
||||||
// find reverb properties
|
|
||||||
for (int i = 0; i < _zoneReverbSettings.size(); ++i) {
|
|
||||||
AudioMixerClientData* data = static_cast<AudioMixerClientData*>(node->getLinkedData());
|
|
||||||
glm::vec3 streamPosition = data->getAvatarAudioStream()->getPosition();
|
|
||||||
if (_audioZones[_zoneReverbSettings[i].zone].contains(streamPosition)) {
|
|
||||||
hasReverb = true;
|
|
||||||
reverbTime = _zoneReverbSettings[i].reverbTime;
|
|
||||||
wetLevel = _zoneReverbSettings[i].wetLevel;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
AvatarAudioStream* stream = nodeData->getAvatarAudioStream();
|
|
||||||
bool dataChanged = (stream->hasReverb() != hasReverb) ||
|
|
||||||
(stream->hasReverb() && (stream->getRevebTime() != reverbTime ||
|
|
||||||
stream->getWetLevel() != wetLevel));
|
|
||||||
if (dataChanged) {
|
|
||||||
// Update stream
|
|
||||||
if (hasReverb) {
|
|
||||||
stream->setReverb(reverbTime, wetLevel);
|
|
||||||
} else {
|
|
||||||
stream->clearReverb();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send at change or every so often
|
|
||||||
float CHANCE_OF_SEND = 0.01f;
|
|
||||||
bool sendData = dataChanged || (randFloat() < CHANCE_OF_SEND);
|
|
||||||
|
|
||||||
if (sendData) {
|
|
||||||
int numBytesEnvPacketHeader = populatePacketHeader(clientEnvBuffer, PacketTypeAudioEnvironment);
|
|
||||||
char* envDataAt = clientEnvBuffer + numBytesEnvPacketHeader;
|
|
||||||
|
|
||||||
unsigned char bitset = 0;
|
|
||||||
if (hasReverb) {
|
|
||||||
setAtBit(bitset, HAS_REVERB_BIT);
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(envDataAt, &bitset, sizeof(unsigned char));
|
|
||||||
envDataAt += sizeof(unsigned char);
|
|
||||||
|
|
||||||
if (hasReverb) {
|
|
||||||
memcpy(envDataAt, &reverbTime, sizeof(float));
|
|
||||||
envDataAt += sizeof(float);
|
|
||||||
memcpy(envDataAt, &wetLevel, sizeof(float));
|
|
||||||
envDataAt += sizeof(float);
|
|
||||||
}
|
|
||||||
nodeList->writeDatagram(clientEnvBuffer, envDataAt - clientEnvBuffer, node);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// pack header
|
// pack header
|
||||||
int numBytesPacketHeader = populatePacketHeader(clientMixBuffer, PacketTypeSilentAudioFrame);
|
int numBytesPacketHeader = populatePacketHeader(clientMixBuffer, PacketTypeSilentAudioFrame);
|
||||||
|
@ -801,6 +805,9 @@ void AudioMixer::run() {
|
||||||
memcpy(mixDataAt, &numSilentSamples, sizeof(quint16));
|
memcpy(mixDataAt, &numSilentSamples, sizeof(quint16));
|
||||||
mixDataAt += sizeof(quint16);
|
mixDataAt += sizeof(quint16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Send audio environment
|
||||||
|
sendAudioEnvironmentPacket(node);
|
||||||
|
|
||||||
// send mixed audio packet
|
// send mixed audio packet
|
||||||
nodeList->writeDatagram(clientMixBuffer, mixDataAt - clientMixBuffer, node);
|
nodeList->writeDatagram(clientMixBuffer, mixDataAt - clientMixBuffer, node);
|
||||||
|
|
|
@ -49,6 +49,9 @@ private:
|
||||||
|
|
||||||
/// prepares and sends a mix to one Node
|
/// prepares and sends a mix to one Node
|
||||||
int prepareMixForListeningNode(Node* node);
|
int prepareMixForListeningNode(Node* node);
|
||||||
|
|
||||||
|
/// Send Audio Environment packet for a single node
|
||||||
|
void sendAudioEnvironmentPacket(SharedNodePointer node);
|
||||||
|
|
||||||
// used on a per stream basis to run the filter on before mixing, large enough to handle the historical
|
// used on a per stream basis to run the filter on before mixing, large enough to handle the historical
|
||||||
// data from a phase delay as well as an entire network buffer
|
// data from a phase delay as well as an entire network buffer
|
||||||
|
|
Loading…
Reference in a new issue