12 #ifndef hifi_AudioInjector_h
13 #define hifi_AudioInjector_h
17 #include <QtCore/QElapsedTimer>
18 #include <QtCore/QObject>
19 #include <QtCore/QSharedPointer>
20 #include <QtCore/QThread>
22 #include <shared/ReadWriteLockable.h>
24 #include <glm/glm.hpp>
25 #include <glm/gtx/quaternion.hpp>
29 #include "AudioInjectorLocalBuffer.h"
30 #include "AudioInjectorOptions.h"
31 #include "AudioHRTF.h"
35 class AbstractAudioInterface;
36 class AudioInjectorManager;
38 using AudioInjectorPointer = QSharedPointer<AudioInjector>;
41 enum class AudioInjectorState : uint8_t {
45 LocalInjectionFinished = 4,
46 NetworkInjectionFinished = 8
49 AudioInjectorState operator& (AudioInjectorState lhs, AudioInjectorState rhs);
50 AudioInjectorState& operator|= (AudioInjectorState& lhs, AudioInjectorState rhs);
54 class AudioInjector :
public QObject,
public QEnableSharedFromThis<AudioInjector>,
public ReadWriteLockable {
57 AudioInjector(SharedSoundPointer sound,
const AudioInjectorOptions& injectorOptions);
58 AudioInjector(AudioDataPointer audioData,
const AudioInjectorOptions& injectorOptions);
61 bool isFinished()
const {
return (stateHas(AudioInjectorState::Finished)); }
63 int getCurrentSendOffset()
const {
return _currentSendOffset; }
64 void setCurrentSendOffset(
int currentSendOffset) { _currentSendOffset = currentSendOffset; }
66 QSharedPointer<AudioInjectorLocalBuffer> getLocalBuffer()
const {
return _localBuffer; }
67 AudioHRTF& getLocalHRTF() {
return _localHRTF; }
68 AudioFOA& getLocalFOA() {
return _localFOA; }
70 float getLoudness()
const {
return resultWithReadLock<float>([&] {
return _loudness; }); }
71 bool isPlaying()
const {
return !stateHas(AudioInjectorState::Finished); }
73 bool isLocalOnly()
const {
return resultWithReadLock<bool>([&] {
return _options.localOnly; }); }
74 float getVolume()
const {
return resultWithReadLock<float>([&] {
return _options.volume; }); }
75 bool isPositionSet()
const {
return resultWithReadLock<bool>([&] {
return _options.positionSet; }); }
76 glm::vec3 getPosition()
const {
return resultWithReadLock<glm::vec3>([&] {
return _options.position; }); }
77 glm::quat getOrientation()
const {
return resultWithReadLock<glm::quat>([&] {
return _options.orientation; }); }
78 bool isStereo()
const {
return resultWithReadLock<bool>([&] {
return _options.stereo; }); }
79 bool isAmbisonic()
const {
return resultWithReadLock<bool>([&] {
return _options.ambisonic; }); }
81 AudioInjectorOptions getOptions()
const {
return resultWithReadLock<AudioInjectorOptions>([&] {
return _options; }); }
82 void setOptions(
const AudioInjectorOptions& options);
84 bool stateHas(AudioInjectorState state)
const ;
85 static void setLocalAudioInterface(AbstractAudioInterface* audioInterface) { _localAudioInterface = audioInterface; }
90 void finishNetworkInjection();
93 void finishLocalInjection();
100 int64_t injectNextFrame();
101 bool inject(
bool(AudioInjectorManager::*injection)(
const AudioInjectorPointer&));
102 bool injectLocally();
103 void sendStopInjectorPacket();
105 static AbstractAudioInterface* _localAudioInterface;
107 const SharedSoundPointer _sound;
108 AudioDataPointer _audioData;
109 AudioInjectorOptions _options;
110 AudioInjectorState _state { AudioInjectorState::NotFinished };
111 bool _hasSentFirstFrame {
false };
112 float _loudness { 0.0f };
113 int _currentSendOffset { 0 };
114 std::unique_ptr<NLPacket> _currentPacket {
nullptr };
115 QSharedPointer<AudioInjectorLocalBuffer> _localBuffer {
nullptr };
117 int64_t _nextFrame { 0 };
118 std::unique_ptr<QElapsedTimer> _frameTimer {
nullptr };
119 quint16 _outgoingSequenceNumber { 0 };
122 AudioHRTF _localHRTF;
125 QUuid _streamID { QUuid::createUuid() };
127 friend class AudioInjectorManager;
130 Q_DECLARE_METATYPE(AudioInjectorPointer)