changed class name to AudioStreamStats, reverted ScriptEngine packing back to QDataStream

This commit is contained in:
wangyix 2014-06-30 09:42:22 -07:00
parent c3f571745c
commit de3c1ebf0f
7 changed files with 34 additions and 41 deletions

View file

@ -156,7 +156,7 @@ void AudioMixerClientData::pushBuffersAfterFrameSend() {
}
}
void AudioMixerClientData::getJitterBuffersStats(AudioMixerJitterBuffersStats& stats) const {
void AudioMixerClientData::getAudioStreamStats(AudioStreamStats& stats) const {
int avatarJitterBufferFrames = 0;
int maxJitterBufferFrames = 0;
int sumJitterBufferFrames = 0;
@ -185,10 +185,10 @@ int AudioMixerClientData::encodeAudioStreamStatsPacket(char* packet) const {
char* dataAt = packet + numBytesPacketHeader;
// pack jitter buffer stats
AudioMixerJitterBuffersStats jitterBufferStats;
getJitterBuffersStats(jitterBufferStats);
memcpy(dataAt, &jitterBufferStats, sizeof(AudioMixerJitterBuffersStats));
dataAt += sizeof(AudioMixerJitterBuffersStats);
AudioStreamStats stats;
getAudioStreamStats(stats);
memcpy(dataAt, &stats, sizeof(AudioStreamStats));
dataAt += sizeof(AudioStreamStats);
return dataAt - packet;
}

View file

@ -32,7 +32,7 @@ public:
void checkBuffersBeforeFrameSend(AABox* checkSourceZone = NULL, AABox* listenerZone = NULL);
void pushBuffersAfterFrameSend();
void getJitterBuffersStats(AudioMixerJitterBuffersStats& stats) const;
void getAudioStreamStats(AudioStreamStats& stats) const;
int encodeAudioStreamStatsPacket(char* packet) const;

View file

@ -103,7 +103,7 @@ Audio::Audio(int16_t initialJitterBufferSamples, QObject* parent) :
_scopeInput(0),
_scopeOutputLeft(0),
_scopeOutputRight(0),
_audioMixerJitterBufferStats(),
_audioMixerStreamStats(),
_outgoingAvatarAudioSequenceNumber(0)
{
// clear the array of locally injected samples
@ -721,8 +721,8 @@ void Audio::parseAudioStreamStatsPacket(const QByteArray& packet) {
const char* dataAt = packet.constData() + numBytesPacketHeader;
// parse audio mixer jitter buffer stats
memcpy(&_audioMixerJitterBufferStats, dataAt, sizeof(AudioMixerJitterBuffersStats));
dataAt += sizeof(AudioMixerJitterBuffersStats);
memcpy(&_audioMixerStreamStats, dataAt, sizeof(AudioStreamStats));
dataAt += sizeof(AudioStreamStats);
}
// NOTE: numSamples is the total number of single channel samples, since callers will always call this with stereo

View file

@ -104,7 +104,7 @@ public slots:
float getInputVolume() const { return (_audioInput) ? _audioInput->volume() : 0.0f; }
void setInputVolume(float volume) { if (_audioInput) _audioInput->setVolume(volume); }
const AudioMixerJitterBuffersStats& getAudioMixerJitterBuffersStats() const { return _audioMixerJitterBufferStats; }
const AudioStreamStats& getAudioMixerStreamStats() const { return _audioMixerStreamStats; }
signals:
bool muteToggled();
@ -237,7 +237,7 @@ private:
QByteArray* _scopeOutputLeft;
QByteArray* _scopeOutputRight;
AudioMixerJitterBuffersStats _audioMixerJitterBufferStats;
AudioStreamStats _audioMixerStreamStats;
quint16 _outgoingAvatarAudioSequenceNumber;
SequenceNumberStats _incomingMixedAudioSequenceNumberStats;

View file

@ -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;
const AudioMixerJitterBuffersStats& audioMixerJitterBufferStats =
Application::getInstance()->getAudio()->getAudioMixerJitterBuffersStats();
const AudioStreamStats& audioMixerStreamStats =
Application::getInstance()->getAudio()->getAudioMixerStreamStats();
char* audioMixerJitterBuffersStatsLabel = "AudioMixer j-buffers msecs:";
char audioMixerJitterBuffersStats[30];
sprintf(audioMixerJitterBuffersStats, "mic/max/avg: %.1f / %.1f / %.1f", audioMixerJitterBufferStats._avatarJitterBufferFrames * MSECS_PER_FRAME,
audioMixerJitterBufferStats._maxJitterBufferFrames * MSECS_PER_FRAME, audioMixerJitterBufferStats._avgJitterBufferFrames * MSECS_PER_FRAME);
sprintf(audioMixerJitterBuffersStats, "mic/max/avg: %.1f / %.1f / %.1f", audioMixerStreamStats._avatarJitterBufferFrames * MSECS_PER_FRAME,
audioMixerStreamStats._maxJitterBufferFrames * MSECS_PER_FRAME, audioMixerStreamStats._avgJitterBufferFrames * MSECS_PER_FRAME);
verticalOffset += STATS_PELS_PER_LINE;
drawText(horizontalOffset, verticalOffset, scale, rotation, font, audioMixerJitterBuffersStatsLabel, color);

View file

@ -12,9 +12,9 @@
#ifndef hifi_AudioStreamStats_h
#define hifi_AudioStreamStats_h
class AudioMixerJitterBuffersStats {
class AudioStreamStats {
public:
AudioMixerJitterBuffersStats()
AudioStreamStats()
: _avatarJitterBufferFrames(0), _maxJitterBufferFrames(0), _avgJitterBufferFrames(0)
{}

View file

@ -458,54 +458,47 @@ void ScriptEngine::run() {
_numAvatarSoundSentBytes = 0;
}
}
QByteArray audioPacket = byteArrayWithPopulatedHeader(silentFrame
? PacketTypeSilentAudioFrame
: PacketTypeMicrophoneAudioNoEcho);
char audioPacket[MAX_PACKET_SIZE];
QDataStream packetStream(&audioPacket, QIODevice::Append);
// pack header
int numBytesPacketHeader = populatePacketHeader(audioPacket, silentFrame
? PacketTypeSilentAudioFrame
: 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);
// pack a placeholder value for sequence number for now, will be packed when destination node is known
int numPreSequenceNumberBytes = audioPacket.size();
packetStream << (quint16)0;
// use the orientation and position of this avatar for the source of this audio
memcpy(dataAt, &_avatarData->getPosition(), sizeof(glm::vec3));
dataAt += sizeof(glm::vec3);
packetStream.writeRawData(reinterpret_cast<const char*>(&_avatarData->getPosition()), sizeof(glm::vec3));
glm::quat headOrientation = _avatarData->getHeadOrientation();
memcpy(dataAt, &headOrientation, sizeof(glm::quat));
dataAt += sizeof(glm::quat);
packetStream.writeRawData(reinterpret_cast<const char*>(&headOrientation), sizeof(glm::quat));
if (silentFrame) {
if (!_isListeningToAudioStream) {
// if we have a silent frame and we're not listening then just send nothing and break out of here
break;
}
// write the number of silent samples so the audio-mixer can uphold timing
memcpy(dataAt, &SCRIPT_AUDIO_BUFFER_SAMPLES, sizeof(int16_t));
dataAt += sizeof(int16_t);
packetStream.writeRawData(reinterpret_cast<const char*>(&SCRIPT_AUDIO_BUFFER_SAMPLES), sizeof(int16_t));
} else if (nextSoundOutput) {
// write the raw audio data
int numAvailableBytes = numAvailableSamples * sizeof(int16_t);
memcpy(dataAt, nextSoundOutput, numAvailableBytes);
dataAt += numAvailableBytes;
packetStream.writeRawData(reinterpret_cast<const char*>(nextSoundOutput),
numAvailableSamples * sizeof(int16_t));
}
// write audio packet to AudioMixer nodes
int audioPacketSize = dataAt - audioPacket;
NodeList* nodeList = NodeList::getInstance();
foreach(const SharedNodePointer& node, nodeList->getNodeHash()) {
// only send to nodes of type AudioMixer
if (node->getType() == NodeType::AudioMixer) {
// pack sequence number
quint16 sequence = _outgoingScriptAudioSequenceNumbers[node->getUUID()]++;
memcpy(sequenceAt, &sequence, sizeof(quint16));
memcpy(audioPacket.data() + numPreSequenceNumberBytes, &sequence, sizeof(quint16));
// send audio packet
nodeList->writeDatagram(audioPacket, audioPacketSize, node);
nodeList->writeDatagram(audioPacket, node);
}
}
}