Overte C++ Documentation
AudioInjectorManager.h
1 //
2 // AudioInjectorManager.h
3 // libraries/audio/src
4 //
5 // Created by Stephen Birarda on 2015-11-16.
6 // Copyright 2015 High Fidelity, Inc.
7 //
8 // Distributed under the Apache License, Version 2.0.
9 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10 //
11 
12 #pragma once
13 
14 #ifndef hifi_AudioInjectorManager_h
15 #define hifi_AudioInjectorManager_h
16 
17 #include <condition_variable>
18 #include <queue>
19 #include <mutex>
20 
21 #include <QtCore/QPointer>
22 #include <QtCore/QThread>
23 
24 #include <DependencyManager.h>
25 
26 #include "AudioInjector.h"
27 
28 class AudioInjectorManager : public QObject, public Dependency {
29  Q_OBJECT
30  SINGLETON_DEPENDENCY
31 public:
32  ~AudioInjectorManager();
33 
34  AudioInjectorPointer playSound(const SharedSoundPointer& sound, const AudioInjectorOptions& options, bool setPendingDelete = false);
35  AudioInjectorPointer playSound(const AudioDataPointer& audioData, const AudioInjectorOptions& options, bool setPendingDelete = false);
36 
37  size_t getNumInjectors();
38 
39 public slots:
40  void setOptionsAndRestart(const AudioInjectorPointer& injector, const AudioInjectorOptions& options);
41  void restart(const AudioInjectorPointer& injector);
42 
43  void setOptions(const AudioInjectorPointer& injector, const AudioInjectorOptions& options);
44  AudioInjectorOptions getOptions(const AudioInjectorPointer& injector);
45 
46  float getLoudness(const AudioInjectorPointer& injector);
47  bool isPlaying(const AudioInjectorPointer& injector);
48 
49  void stop(const AudioInjectorPointer& injector);
50 
51 private slots:
52  void run();
53 
54 private:
55 
56  using TimeInjectorPointerPair = std::pair<uint64_t, AudioInjectorPointer>;
57 
58  struct greaterTime {
59  bool operator() (const TimeInjectorPointerPair& x, const TimeInjectorPointerPair& y) const {
60  return x.first > y.first;
61  }
62  };
63 
64  using InjectorQueue = std::priority_queue<TimeInjectorPointerPair,
65  std::deque<TimeInjectorPointerPair>,
66  greaterTime>;
67  using Mutex = std::mutex;
68  using Lock = std::unique_lock<Mutex>;
69 
70  bool threadInjector(const AudioInjectorPointer& injector);
71  void notifyInjectorReadyCondition() { _injectorReady.notify_one(); }
72  bool wouldExceedLimits();
73 
74  AudioInjectorManager() { createThread(); }
75  Q_DISABLE_COPY(AudioInjectorManager)
76 
77  void createThread();
78 
79  QThread* _thread { nullptr };
80  bool _shouldStop { false };
81  InjectorQueue _injectors;
82  Mutex _injectorsMutex;
83  std::condition_variable _injectorReady;
84 
85  friend class AudioInjector;
86 };
87 
88 
89 
90 #endif // hifi_AudioInjectorManager_h