mirror of
https://github.com/lubosz/overte.git
synced 2025-08-07 20:31:29 +02:00
changed class name to AudioStreamStats, reverted ScriptEngine packing back to QDataStream
This commit is contained in:
parent
c3f571745c
commit
de3c1ebf0f
7 changed files with 34 additions and 41 deletions
|
@ -156,7 +156,7 @@ void AudioMixerClientData::pushBuffersAfterFrameSend() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AudioMixerClientData::getJitterBuffersStats(AudioMixerJitterBuffersStats& stats) const {
|
void AudioMixerClientData::getAudioStreamStats(AudioStreamStats& stats) const {
|
||||||
int avatarJitterBufferFrames = 0;
|
int avatarJitterBufferFrames = 0;
|
||||||
int maxJitterBufferFrames = 0;
|
int maxJitterBufferFrames = 0;
|
||||||
int sumJitterBufferFrames = 0;
|
int sumJitterBufferFrames = 0;
|
||||||
|
@ -185,10 +185,10 @@ int AudioMixerClientData::encodeAudioStreamStatsPacket(char* packet) const {
|
||||||
char* dataAt = packet + numBytesPacketHeader;
|
char* dataAt = packet + numBytesPacketHeader;
|
||||||
|
|
||||||
// pack jitter buffer stats
|
// pack jitter buffer stats
|
||||||
AudioMixerJitterBuffersStats jitterBufferStats;
|
AudioStreamStats stats;
|
||||||
getJitterBuffersStats(jitterBufferStats);
|
getAudioStreamStats(stats);
|
||||||
memcpy(dataAt, &jitterBufferStats, sizeof(AudioMixerJitterBuffersStats));
|
memcpy(dataAt, &stats, sizeof(AudioStreamStats));
|
||||||
dataAt += sizeof(AudioMixerJitterBuffersStats);
|
dataAt += sizeof(AudioStreamStats);
|
||||||
|
|
||||||
return dataAt - packet;
|
return dataAt - packet;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ public:
|
||||||
void checkBuffersBeforeFrameSend(AABox* checkSourceZone = NULL, AABox* listenerZone = NULL);
|
void checkBuffersBeforeFrameSend(AABox* checkSourceZone = NULL, AABox* listenerZone = NULL);
|
||||||
void pushBuffersAfterFrameSend();
|
void pushBuffersAfterFrameSend();
|
||||||
|
|
||||||
void getJitterBuffersStats(AudioMixerJitterBuffersStats& stats) const;
|
void getAudioStreamStats(AudioStreamStats& stats) const;
|
||||||
|
|
||||||
int encodeAudioStreamStatsPacket(char* packet) const;
|
int encodeAudioStreamStatsPacket(char* packet) const;
|
||||||
|
|
||||||
|
|
|
@ -103,7 +103,7 @@ Audio::Audio(int16_t initialJitterBufferSamples, QObject* parent) :
|
||||||
_scopeInput(0),
|
_scopeInput(0),
|
||||||
_scopeOutputLeft(0),
|
_scopeOutputLeft(0),
|
||||||
_scopeOutputRight(0),
|
_scopeOutputRight(0),
|
||||||
_audioMixerJitterBufferStats(),
|
_audioMixerStreamStats(),
|
||||||
_outgoingAvatarAudioSequenceNumber(0)
|
_outgoingAvatarAudioSequenceNumber(0)
|
||||||
{
|
{
|
||||||
// clear the array of locally injected samples
|
// clear the array of locally injected samples
|
||||||
|
@ -721,8 +721,8 @@ void Audio::parseAudioStreamStatsPacket(const QByteArray& packet) {
|
||||||
const char* dataAt = packet.constData() + numBytesPacketHeader;
|
const char* dataAt = packet.constData() + numBytesPacketHeader;
|
||||||
|
|
||||||
// parse audio mixer jitter buffer stats
|
// parse audio mixer jitter buffer stats
|
||||||
memcpy(&_audioMixerJitterBufferStats, dataAt, sizeof(AudioMixerJitterBuffersStats));
|
memcpy(&_audioMixerStreamStats, dataAt, sizeof(AudioStreamStats));
|
||||||
dataAt += sizeof(AudioMixerJitterBuffersStats);
|
dataAt += sizeof(AudioStreamStats);
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: numSamples is the total number of single channel samples, since callers will always call this with stereo
|
// NOTE: numSamples is the total number of single channel samples, since callers will always call this with stereo
|
||||||
|
|
|
@ -104,7 +104,7 @@ public slots:
|
||||||
float getInputVolume() const { return (_audioInput) ? _audioInput->volume() : 0.0f; }
|
float getInputVolume() const { return (_audioInput) ? _audioInput->volume() : 0.0f; }
|
||||||
void setInputVolume(float volume) { if (_audioInput) _audioInput->setVolume(volume); }
|
void setInputVolume(float volume) { if (_audioInput) _audioInput->setVolume(volume); }
|
||||||
|
|
||||||
const AudioMixerJitterBuffersStats& getAudioMixerJitterBuffersStats() const { return _audioMixerJitterBufferStats; }
|
const AudioStreamStats& getAudioMixerStreamStats() const { return _audioMixerStreamStats; }
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
bool muteToggled();
|
bool muteToggled();
|
||||||
|
@ -237,7 +237,7 @@ private:
|
||||||
QByteArray* _scopeOutputLeft;
|
QByteArray* _scopeOutputLeft;
|
||||||
QByteArray* _scopeOutputRight;
|
QByteArray* _scopeOutputRight;
|
||||||
|
|
||||||
AudioMixerJitterBuffersStats _audioMixerJitterBufferStats;
|
AudioStreamStats _audioMixerStreamStats;
|
||||||
|
|
||||||
quint16 _outgoingAvatarAudioSequenceNumber;
|
quint16 _outgoingAvatarAudioSequenceNumber;
|
||||||
SequenceNumberStats _incomingMixedAudioSequenceNumberStats;
|
SequenceNumberStats _incomingMixedAudioSequenceNumberStats;
|
||||||
|
|
|
@ -325,13 +325,13 @@ void Stats::display(
|
||||||
|
|
||||||
static const float MSECS_PER_FRAME = (float)NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL * (float)MSECS_PER_SECOND / (float)SAMPLE_RATE;
|
static const float MSECS_PER_FRAME = (float)NETWORK_BUFFER_LENGTH_SAMPLES_PER_CHANNEL * (float)MSECS_PER_SECOND / (float)SAMPLE_RATE;
|
||||||
|
|
||||||
const AudioMixerJitterBuffersStats& audioMixerJitterBufferStats =
|
const AudioStreamStats& audioMixerStreamStats =
|
||||||
Application::getInstance()->getAudio()->getAudioMixerJitterBuffersStats();
|
Application::getInstance()->getAudio()->getAudioMixerStreamStats();
|
||||||
|
|
||||||
char* audioMixerJitterBuffersStatsLabel = "AudioMixer j-buffers msecs:";
|
char* audioMixerJitterBuffersStatsLabel = "AudioMixer j-buffers msecs:";
|
||||||
char audioMixerJitterBuffersStats[30];
|
char audioMixerJitterBuffersStats[30];
|
||||||
sprintf(audioMixerJitterBuffersStats, "mic/max/avg: %.1f / %.1f / %.1f", audioMixerJitterBufferStats._avatarJitterBufferFrames * MSECS_PER_FRAME,
|
sprintf(audioMixerJitterBuffersStats, "mic/max/avg: %.1f / %.1f / %.1f", audioMixerStreamStats._avatarJitterBufferFrames * MSECS_PER_FRAME,
|
||||||
audioMixerJitterBufferStats._maxJitterBufferFrames * MSECS_PER_FRAME, audioMixerJitterBufferStats._avgJitterBufferFrames * MSECS_PER_FRAME);
|
audioMixerStreamStats._maxJitterBufferFrames * MSECS_PER_FRAME, audioMixerStreamStats._avgJitterBufferFrames * MSECS_PER_FRAME);
|
||||||
|
|
||||||
verticalOffset += STATS_PELS_PER_LINE;
|
verticalOffset += STATS_PELS_PER_LINE;
|
||||||
drawText(horizontalOffset, verticalOffset, scale, rotation, font, audioMixerJitterBuffersStatsLabel, color);
|
drawText(horizontalOffset, verticalOffset, scale, rotation, font, audioMixerJitterBuffersStatsLabel, color);
|
||||||
|
|
|
@ -12,9 +12,9 @@
|
||||||
#ifndef hifi_AudioStreamStats_h
|
#ifndef hifi_AudioStreamStats_h
|
||||||
#define hifi_AudioStreamStats_h
|
#define hifi_AudioStreamStats_h
|
||||||
|
|
||||||
class AudioMixerJitterBuffersStats {
|
class AudioStreamStats {
|
||||||
public:
|
public:
|
||||||
AudioMixerJitterBuffersStats()
|
AudioStreamStats()
|
||||||
: _avatarJitterBufferFrames(0), _maxJitterBufferFrames(0), _avgJitterBufferFrames(0)
|
: _avatarJitterBufferFrames(0), _maxJitterBufferFrames(0), _avgJitterBufferFrames(0)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
|
@ -458,54 +458,47 @@ void ScriptEngine::run() {
|
||||||
_numAvatarSoundSentBytes = 0;
|
_numAvatarSoundSentBytes = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QByteArray audioPacket = byteArrayWithPopulatedHeader(silentFrame
|
||||||
|
? PacketTypeSilentAudioFrame
|
||||||
|
: PacketTypeMicrophoneAudioNoEcho);
|
||||||
|
|
||||||
char audioPacket[MAX_PACKET_SIZE];
|
QDataStream packetStream(&audioPacket, QIODevice::Append);
|
||||||
|
|
||||||
// pack header
|
// pack a placeholder value for sequence number for now, will be packed when destination node is known
|
||||||
int numBytesPacketHeader = populatePacketHeader(audioPacket, silentFrame
|
int numPreSequenceNumberBytes = audioPacket.size();
|
||||||
? PacketTypeSilentAudioFrame
|
packetStream << (quint16)0;
|
||||||
: PacketTypeMicrophoneAudioNoEcho);
|
|
||||||
char* dataAt = audioPacket + numBytesPacketHeader;
|
|
||||||
|
|
||||||
// skip over sequence number for now; will be packed when destination node is known
|
|
||||||
char* sequenceAt = dataAt;
|
|
||||||
dataAt += sizeof(quint16);
|
|
||||||
|
|
||||||
// use the orientation and position of this avatar for the source of this audio
|
// use the orientation and position of this avatar for the source of this audio
|
||||||
memcpy(dataAt, &_avatarData->getPosition(), sizeof(glm::vec3));
|
packetStream.writeRawData(reinterpret_cast<const char*>(&_avatarData->getPosition()), sizeof(glm::vec3));
|
||||||
dataAt += sizeof(glm::vec3);
|
|
||||||
|
|
||||||
glm::quat headOrientation = _avatarData->getHeadOrientation();
|
glm::quat headOrientation = _avatarData->getHeadOrientation();
|
||||||
memcpy(dataAt, &headOrientation, sizeof(glm::quat));
|
packetStream.writeRawData(reinterpret_cast<const char*>(&headOrientation), sizeof(glm::quat));
|
||||||
dataAt += sizeof(glm::quat);
|
|
||||||
|
|
||||||
if (silentFrame) {
|
if (silentFrame) {
|
||||||
if (!_isListeningToAudioStream) {
|
if (!_isListeningToAudioStream) {
|
||||||
// if we have a silent frame and we're not listening then just send nothing and break out of here
|
// if we have a silent frame and we're not listening then just send nothing and break out of here
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// write the number of silent samples so the audio-mixer can uphold timing
|
// write the number of silent samples so the audio-mixer can uphold timing
|
||||||
memcpy(dataAt, &SCRIPT_AUDIO_BUFFER_SAMPLES, sizeof(int16_t));
|
packetStream.writeRawData(reinterpret_cast<const char*>(&SCRIPT_AUDIO_BUFFER_SAMPLES), sizeof(int16_t));
|
||||||
dataAt += sizeof(int16_t);
|
|
||||||
} else if (nextSoundOutput) {
|
} else if (nextSoundOutput) {
|
||||||
// write the raw audio data
|
// write the raw audio data
|
||||||
int numAvailableBytes = numAvailableSamples * sizeof(int16_t);
|
packetStream.writeRawData(reinterpret_cast<const char*>(nextSoundOutput),
|
||||||
memcpy(dataAt, nextSoundOutput, numAvailableBytes);
|
numAvailableSamples * sizeof(int16_t));
|
||||||
dataAt += numAvailableBytes;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// write audio packet to AudioMixer nodes
|
// write audio packet to AudioMixer nodes
|
||||||
int audioPacketSize = dataAt - audioPacket;
|
|
||||||
NodeList* nodeList = NodeList::getInstance();
|
NodeList* nodeList = NodeList::getInstance();
|
||||||
foreach(const SharedNodePointer& node, nodeList->getNodeHash()) {
|
foreach(const SharedNodePointer& node, nodeList->getNodeHash()) {
|
||||||
// only send to nodes of type AudioMixer
|
// only send to nodes of type AudioMixer
|
||||||
if (node->getType() == NodeType::AudioMixer) {
|
if (node->getType() == NodeType::AudioMixer) {
|
||||||
// pack sequence number
|
// pack sequence number
|
||||||
quint16 sequence = _outgoingScriptAudioSequenceNumbers[node->getUUID()]++;
|
quint16 sequence = _outgoingScriptAudioSequenceNumbers[node->getUUID()]++;
|
||||||
memcpy(sequenceAt, &sequence, sizeof(quint16));
|
memcpy(audioPacket.data() + numPreSequenceNumberBytes, &sequence, sizeof(quint16));
|
||||||
|
|
||||||
// send audio packet
|
// send audio packet
|
||||||
nodeList->writeDatagram(audioPacket, audioPacketSize, node);
|
nodeList->writeDatagram(audioPacket, node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue