mirror of
https://github.com/overte-org/overte.git
synced 2025-04-21 08:04:01 +02:00
Update AudioClient to use packet callbacks
This commit is contained in:
parent
3b7ad982a4
commit
bb132e354b
2 changed files with 104 additions and 3 deletions
|
@ -140,6 +140,14 @@ AudioClient::AudioClient() :
|
|||
// create GVerb filter
|
||||
_gverb = createGverbFilter();
|
||||
configureGverbFilter(_gverb);
|
||||
|
||||
auto& packetReceiver = DependencyManager::get<NodeList>()->getPacketReceiver();
|
||||
packetReceiver.registerPacketListener(PacketType::AudioEnvironment, this, "handleAudioStreamStatsPacket");
|
||||
packetReceiver.registerPacketListener(PacketType::AudioStreamStats, this, "handleAudioEnvironmentDataPacket");
|
||||
packetReceiver.registerPacketListener(PacketType::MixedAudio, this, "handleAudioDataPacket");
|
||||
packetReceiver.registerPacketListener(PacketType::SilentAudioFrame, this, "handleSilentAudioFrame");
|
||||
packetReceiver.registerPacketListener(PacketType::NoisyMute, this, "handleNoisyMutePacket");
|
||||
packetReceiver.registerPacketListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket");
|
||||
}
|
||||
|
||||
AudioClient::~AudioClient() {
|
||||
|
@ -527,6 +535,93 @@ void AudioClient::stop() {
|
|||
}
|
||||
}
|
||||
|
||||
void AudioClient::handleAudioStreamStatsPacket(std::unique_ptr<NLPacket> packet, HifiSockAddr senderSockAddr) {
|
||||
_stats.parseAudioStreamStatsPacket(packet->getData());
|
||||
|
||||
updateLastHeardFromAudioMixer(packet);
|
||||
}
|
||||
|
||||
void AudioClient::handleAudioEnvironmentDataPacket(std::unique_ptr<NLPacket> packet, HifiSockAddr senderSockAddr) {
|
||||
const char* dataAt = packet->getPayload();
|
||||
|
||||
char bitset;
|
||||
memcpy(&bitset, dataAt, sizeof(char));
|
||||
dataAt += sizeof(char);
|
||||
|
||||
bool hasReverb = oneAtBit(bitset, HAS_REVERB_BIT);;
|
||||
if (hasReverb) {
|
||||
float reverbTime, wetLevel;
|
||||
memcpy(&reverbTime, dataAt, sizeof(float));
|
||||
dataAt += sizeof(float);
|
||||
memcpy(&wetLevel, dataAt, sizeof(float));
|
||||
dataAt += sizeof(float);
|
||||
_receivedAudioStream.setReverb(reverbTime, wetLevel);
|
||||
} else {
|
||||
_receivedAudioStream.clearReverb();
|
||||
}
|
||||
|
||||
updateLastHeardFromAudioMixer(packet);
|
||||
}
|
||||
|
||||
void AudioClient::handleAudioDataPacket(std::unique_ptr<NLPacket> packet, HifiSockAddr senderSockAddr) {
|
||||
auto nodeList = DependencyManager::get<NodeList>();
|
||||
nodeList->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::ReceiveFirstAudioPacket);
|
||||
|
||||
if (_audioOutput) {
|
||||
|
||||
if (!_hasReceivedFirstPacket) {
|
||||
_hasReceivedFirstPacket = true;
|
||||
|
||||
// have the audio scripting interface emit a signal to say we just connected to mixer
|
||||
emit receivedFirstPacket();
|
||||
}
|
||||
|
||||
// Audio output must exist and be correctly set up if we're going to process received audio
|
||||
_receivedAudioStream.parseData(packet->getData());
|
||||
}
|
||||
|
||||
updateLastHeardFromAudioMixer(packet);
|
||||
}
|
||||
|
||||
void AudioClient::handleSilentAudioFrame(std::unique_ptr<NLPacket> packet, HifiSockAddr senderSockAddr) {
|
||||
updateLastHeardFromAudioMixer(packet);
|
||||
}
|
||||
|
||||
void AudioClient::handleNoisyMutePacket(std::unique_ptr<NLPacket> packet, HifiSockAddr senderSockAddr) {
|
||||
if (!_muted) {
|
||||
toggleMute();
|
||||
// TODO reimplement on interface side
|
||||
//AudioScriptingInterface::getInstance().mutedByMixer();
|
||||
}
|
||||
}
|
||||
|
||||
void AudioClient::handleMuteEnvironmentPacket(std::unique_ptr<NLPacket> packet, HifiSockAddr senderSockAddr) {
|
||||
glm::vec3 position;
|
||||
float radius;
|
||||
|
||||
int headerSize = numBytesForPacketHeaderGivenPacketType(PacketType::MuteEnvironment);
|
||||
memcpy(&position, packet->getPayload(), sizeof(glm::vec3));
|
||||
memcpy(&radius, packet->getPayload() + sizeof(glm::vec3), sizeof(float));
|
||||
float distance = glm::distance(DependencyManager::get<AvatarManager>()->getMyAvatar()->getPosition(),
|
||||
position);
|
||||
bool shouldMute = !_muted && (distance < radius);
|
||||
|
||||
if (shouldMute) {
|
||||
toggleMute();
|
||||
// TODO reimplement on interface side
|
||||
//AudioScriptingInterface::getInstance().environmentMuted();
|
||||
}
|
||||
}
|
||||
|
||||
void AudioClient::updateLastHeardFromAudioMixer(std::unique_ptr<NLPacket>& packet) {
|
||||
// update having heard from the audio-mixer and record the bytes received
|
||||
SharedNodePointer audioMixer = nodeList->nodeWithUUID(packet->getSourceID());
|
||||
if (audioMixer) {
|
||||
audioMixer->setLastHeardMicrostamp(usecTimestampNow());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
QString AudioClient::getDefaultDeviceName(QAudio::Mode mode) {
|
||||
QAudioDeviceInfo deviceInfo = defaultAudioDeviceForMode(mode);
|
||||
return deviceInfo.deviceName();
|
||||
|
|
|
@ -133,10 +133,15 @@ public:
|
|||
public slots:
|
||||
void start();
|
||||
void stop();
|
||||
void addReceivedAudioToStream(const QByteArray& audioByteArray);
|
||||
void parseAudioEnvironmentData(const QByteArray& packet);
|
||||
|
||||
void handleAudioStreamStatsPacket(std::unique_ptr<NLPacket> packet, HifiSockAddr senderSockAddr);
|
||||
void handleAudioEnvironmentDataPacket(std::unique_ptr<NLPacket> packet, HifiSockAddr senderSockAddr);
|
||||
void handleAudioDataPacket(std::unique_ptr<NLPacket> packet, HifiSockAddr senderSockAddr);
|
||||
void handleSilentAudioFrame(std::unique_ptr<NLPacket> packet, HifiSockAddr senderSockAddr);
|
||||
void handleNoisyMutePacket(std::unique_ptr<NLPacket> packet, HifiSockAddr senderSockAddr);
|
||||
void handleMuteEnvironmentPacket(std::unique_ptr<NLPacket> packet, HifiSockAddr senderSockAddr);
|
||||
|
||||
void sendDownstreamAudioStatsPacket() { _stats.sendDownstreamAudioStatsPacket(); }
|
||||
void parseAudioStreamStatsPacket(const QByteArray& packet) { _stats.parseAudioStreamStatsPacket(packet); }
|
||||
void handleAudioInput();
|
||||
void reset();
|
||||
void audioMixerKilled();
|
||||
|
@ -202,6 +207,7 @@ private slots:
|
|||
void audioStateChanged(QAudio::State state);
|
||||
|
||||
private:
|
||||
void updateLastHeardFromAudioMixer(std::unique_ptr<NLPacket>& packet);
|
||||
void outputFormatChanged();
|
||||
|
||||
QByteArray firstInputFrame;
|
||||
|
|
Loading…
Reference in a new issue