14 #ifndef hifi_AudioInjectorManager_h
15 #define hifi_AudioInjectorManager_h
17 #include <condition_variable>
21 #include <QtCore/QPointer>
22 #include <QtCore/QThread>
24 #include <DependencyManager.h>
26 #include "AudioInjector.h"
28 class AudioInjectorManager :
public QObject,
public Dependency {
32 ~AudioInjectorManager();
34 AudioInjectorPointer playSound(
const SharedSoundPointer& sound,
const AudioInjectorOptions& options,
bool setPendingDelete =
false);
35 AudioInjectorPointer playSound(
const AudioDataPointer& audioData,
const AudioInjectorOptions& options,
bool setPendingDelete =
false);
37 size_t getNumInjectors();
40 void setOptionsAndRestart(
const AudioInjectorPointer& injector,
const AudioInjectorOptions& options);
41 void restart(
const AudioInjectorPointer& injector);
43 void setOptions(
const AudioInjectorPointer& injector,
const AudioInjectorOptions& options);
44 AudioInjectorOptions getOptions(
const AudioInjectorPointer& injector);
46 float getLoudness(
const AudioInjectorPointer& injector);
47 bool isPlaying(
const AudioInjectorPointer& injector);
49 void stop(
const AudioInjectorPointer& injector);
56 using TimeInjectorPointerPair = std::pair<uint64_t, AudioInjectorPointer>;
59 bool operator() (
const TimeInjectorPointerPair& x,
const TimeInjectorPointerPair& y)
const {
60 return x.first > y.first;
64 using InjectorQueue = std::priority_queue<TimeInjectorPointerPair,
65 std::deque<TimeInjectorPointerPair>,
67 using Mutex = std::mutex;
68 using Lock = std::unique_lock<Mutex>;
70 bool threadInjector(
const AudioInjectorPointer& injector);
71 void notifyInjectorReadyCondition() { _injectorReady.notify_one(); }
72 bool wouldExceedLimits();
74 AudioInjectorManager() { createThread(); }
75 Q_DISABLE_COPY(AudioInjectorManager)
79 QThread* _thread {
nullptr };
80 bool _shouldStop {
false };
81 InjectorQueue _injectors;
82 Mutex _injectorsMutex;
83 std::condition_variable _injectorReady;
85 friend class AudioInjector;