20 #include <QtCore/QObject>
21 #include <QtCore/QSharedPointer>
22 #include <QtCore/QUrl>
23 #include <QtCore/QTimer>
25 #include <QtCore/QSharedPointer>
27 #include <EntityEditPacketSender.h>
28 #include <EntityTree.h>
29 #include <ScriptEngine.h>
30 #include <ThreadedAssignment.h>
32 #include <plugins/CodecPlugin.h>
35 #include "AudioGate.h"
36 #include "MixedAudioStream.h"
37 #include "entities/EntityTreeHeadlessViewer.h"
38 #include "avatars/ScriptableAvatar.h"
42 using ScriptEnginePointer = std::shared_ptr<ScriptEngine>;
43 using ScriptManagerPointer = std::shared_ptr<ScriptManager>;
45 class Agent :
public ThreadedAssignment {
48 Q_PROPERTY(
bool isAvatar READ isAvatar WRITE setIsAvatar)
49 Q_PROPERTY(
bool isPlayingAvatarSound READ isPlayingAvatarSound)
50 Q_PROPERTY(
bool isListeningToAudioStream READ isListeningToAudioStream WRITE setIsListeningToAudioStream)
51 Q_PROPERTY(
bool isNoiseGateEnabled READ isNoiseGateEnabled WRITE setIsNoiseGateEnabled)
52 Q_PROPERTY(
float lastReceivedAudioLoudness READ getLastReceivedAudioLoudness)
53 Q_PROPERTY(QUuid sessionUUID READ getSessionUUID)
56 Agent(ReceivedMessage& message);
58 bool isPlayingAvatarSound()
const {
return _avatarSound != NULL; }
60 bool isListeningToAudioStream()
const {
return _isListeningToAudioStream; }
61 void setIsListeningToAudioStream(
bool isListeningToAudioStream);
63 bool isNoiseGateEnabled()
const {
return _isNoiseGateEnabled; }
64 void setIsNoiseGateEnabled(
bool isNoiseGateEnabled);
66 float getLastReceivedAudioLoudness()
const {
return _lastReceivedAudioLoudness; }
67 QUuid getSessionUUID()
const;
69 virtual void aboutToFinish()
override;
74 void playAvatarSound(SharedSoundPointer avatarSound);
76 void setIsAvatar(
bool isAvatar);
77 bool isAvatar()
const {
return _isAvatar; }
79 Q_INVOKABLE
virtual void stop()
override;
83 void scriptRequestFinished();
86 void handleAudioPacket(QSharedPointer<ReceivedMessage> message);
87 void handleOctreePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
88 void handleSelectedAudioFormat(QSharedPointer<ReceivedMessage> message);
90 void nodeActivated(SharedNodePointer activatedNode);
91 void nodeKilled(SharedNodePointer killedNode);
93 void processAgentAvatarAudio();
96 void negotiateAudioFormat();
97 void selectAudioFormat(
const QString& selectedCodecName);
98 void encodeFrameOfZeros(QByteArray& encodedZeros);
99 void computeLoudness(
const QByteArray* decodedBuffer, QSharedPointer<ScriptableAvatar>);
101 ScriptManagerPointer _scriptManager;
103 EntityTreeHeadlessViewer _entityViewer;
105 MixedAudioStream _receivedAudioStream;
106 float _lastReceivedAudioLoudness;
108 void setAvatarSound(SharedSoundPointer avatarSound) { _avatarSound = avatarSound; }
112 QString _scriptContents;
113 QTimer* _scriptRequestTimeout {
nullptr };
114 ResourceRequest* _pendingScriptRequest {
nullptr };
115 bool _isListeningToAudioStream =
false;
116 SharedSoundPointer _avatarSound;
117 bool _shouldMuteRecordingAudio {
false };
118 int _numAvatarSoundSentBytes = 0;
119 bool _isAvatar =
false;
120 QTimer* _avatarQueryTimer =
nullptr;
121 QHash<QUuid, quint16> _outgoingScriptAudioSequenceNumbers;
123 AudioGate _audioGate;
124 bool _audioGateOpen {
true };
125 bool _isNoiseGateEnabled {
false };
127 CodecPluginPointer _codec;
128 QString _selectedCodecName;
129 Encoder* _encoder {
nullptr };
130 QTimer _avatarAudioTimer;
131 bool _flushEncoder {
false };
Utility for processing, packing, queueing and sending of outbound edit voxel messages.
Definition: EntityEditPacketSender.h:25
Provides an engine-independent interface for a scripting engine.
Definition: ScriptEngine.h:93
Manages a single scripting engine.
Definition: ScriptManager.h:281