summaryrefslogtreecommitdiff
path: root/src/audio/manager.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio/manager.hpp')
-rw-r--r--src/audio/manager.hpp75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/audio/manager.hpp b/src/audio/manager.hpp
new file mode 100644
index 0000000..9d270fa
--- /dev/null
+++ b/src/audio/manager.hpp
@@ -0,0 +1,75 @@
+#pragma once
+#ifdef WITH_VOICE
+// clang-format off
+
+#include <array>
+#include <atomic>
+#include <deque>
+#include <mutex>
+#include <thread>
+#include <unordered_map>
+#include <unordered_set>
+#include <vector>
+#include <miniaudio.h>
+#include <opus.h>
+#include <sigc++/sigc++.h>
+// clang-format on
+
+class AudioManager {
+public:
+ AudioManager();
+ ~AudioManager();
+
+ void AddSSRC(uint32_t ssrc);
+ void RemoveSSRC(uint32_t ssrc);
+ void RemoveAllSSRCs();
+
+ void SetOpusBuffer(uint8_t *ptr);
+ void FeedMeOpus(uint32_t ssrc, const std::vector<uint8_t> &data);
+
+ void SetCapture(bool capture);
+ void SetPlayback(bool playback);
+
+ void SetMuteSSRC(uint32_t ssrc, bool mute);
+ void SetVolumeSSRC(uint32_t ssrc, double volume);
+
+ [[nodiscard]] bool OK() const;
+
+private:
+ void OnCapturedPCM(const int16_t *pcm, ma_uint32 frames);
+
+ friend void data_callback(ma_device *, void *, const void *, ma_uint32);
+ friend void capture_data_callback(ma_device *, void *, const void *, ma_uint32);
+
+ std::thread m_thread;
+
+ bool m_ok;
+
+ // playback
+ ma_device m_device;
+ ma_device_config m_device_config;
+ // capture
+ ma_device m_capture_device;
+ ma_device_config m_capture_config;
+
+ std::mutex m_mutex;
+ std::unordered_map<uint32_t, std::pair<std::deque<int16_t>, OpusDecoder *>> m_sources;
+
+ OpusEncoder *m_encoder;
+
+ uint8_t *m_opus_buffer = nullptr;
+
+ std::atomic<bool> m_should_capture = true;
+ std::atomic<bool> m_should_playback = true;
+
+ std::unordered_set<uint32_t> m_muted_ssrcs;
+ std::unordered_map<uint32_t, double> m_volume_ssrc;
+
+public:
+ using type_signal_opus_packet = sigc::signal<void(int payload_size)>;
+ type_signal_opus_packet signal_opus_packet();
+
+private:
+ type_signal_opus_packet m_signal_opus_packet;
+};
+#endif