Showing the changes to libraries/script-engine/src/ScriptEngine.cpp (1 of 1 file). Show all
Unified · Split
| @@ -267,15 +267,36 @@ void ScriptEngine::run() { · 266 unmodified lines | ||
| 267 | 267 | |
| 268 | 268 | if (_avatarAudioBuffer && _numAvatarAudioBufferSamples > 0) { |
| 269 | 269 | // if have an avatar audio stream then send it out to our audio-mixer |
| 270 | − QByteArray audioPacket = byteArrayWithPopulatedHeader(PacketTypeMicrophoneAudioNoEcho); | |
| 270 | + | |
| 271 | + bool silentFrame = true; | |
| 272 | + | |
| 273 | + // check if the all of the _numAvatarAudioBufferSamples to be sent are silence | |
| 274 | + for (int i = 0; i < _numAvatarAudioBufferSamples; ++i) { | |
| 275 | + if (_avatarAudioBuffer[i] != 0) { | |
| 276 | + silentFrame = false; | |
| 277 | + break; | |
| 278 | + } | |
| 279 | + } | |
| 280 | + | |
| 281 | + QByteArray audioPacket = byteArrayWithPopulatedHeader(silentFrame | |
| 282 | + ? PacketTypeSilentAudioFrame | |
| 283 | + : PacketTypeMicrophoneAudioNoEcho); | |
| 271 | 284 | QDataStream packetStream(&audioPacket, QIODevice::Append); |
| 272 | 285 | |
| 273 | 286 | // use the orientation and position of this avatar for the source of this audio |
| 274 | 287 | packetStream.writeRawData(reinterpret_cast<const char*>(&_avatarData->getPosition()), sizeof(glm::vec3)); |
| 275 | 288 | glm::quat headOrientation = _avatarData->getHeadOrientation(); |
| 276 | 289 | packetStream.writeRawData(reinterpret_cast<const char*>(&headOrientation), sizeof(glm::quat)); |
| 277 | − packetStream.writeRawData(reinterpret_cast<const char*>(_avatarAudioBuffer), | |
| 278 | − _numAvatarAudioBufferSamples * sizeof(int16_t)); | |
| 290 | + | |
| 291 | + if (silentFrame) { | |
| 292 | + // write the number of silent samples so the audio-mixer can uphold timing | |
| 293 | + int16_t numSilentSamples = _numAvatarAudioBufferSamples; | |
| 294 | + packetStream.writeRawData(reinterpret_cast<const char*>(&numSilentSamples), sizeof(int16_t)); | |
| 295 | + } else { | |
| 296 | + // write the raw audio data | |
| 297 | + packetStream.writeRawData(reinterpret_cast<const char*>(_avatarAudioBuffer), | |
| 298 | + _numAvatarAudioBufferSamples * sizeof(int16_t)); | |
| 299 | + } | |
| 279 | 300 | |
| 280 | 301 | nodeList->broadcastToNodes(audioPacket, NodeSet() << NodeType::AudioMixer); |
| 281 | 302 | } |