summaryrefslogtreecommitdiff
path: root/src/audio
diff options
context:
space:
mode:
authorouwou <26526779+ouwou@users.noreply.github.com>2022-10-05 18:43:44 -0400
committerouwou <26526779+ouwou@users.noreply.github.com>2022-10-05 18:43:44 -0400
commit92c70bda08472d880e23df30661376d526406230 (patch)
tree382644087193c2a01382fc1b505bea820648816b /src/audio
parent9dc2e863e847c03cec1cdb53ba7c58e0740ad481 (diff)
downloadabaddon-portaudio-92c70bda08472d880e23df30661376d526406230.tar.gz
abaddon-portaudio-92c70bda08472d880e23df30661376d526406230.zip
add per user volume slider
Diffstat (limited to 'src/audio')
-rw-r--r--src/audio/manager.cpp14
-rw-r--r--src/audio/manager.hpp3
2 files changed, 16 insertions, 1 deletions
diff --git a/src/audio/manager.cpp b/src/audio/manager.cpp
index 8321c3e..37f696e 100644
--- a/src/audio/manager.cpp
+++ b/src/audio/manager.cpp
@@ -28,13 +28,18 @@ void data_callback(ma_device *pDevice, void *pOutput, const void *pInput, ma_uin
AudioManager *mgr = reinterpret_cast<AudioManager *>(pDevice->pUserData);
if (mgr == nullptr) return;
std::lock_guard<std::mutex> _(mgr->m_mutex);
+ std::lock_guard<std::mutex> _2(mgr->m_volume_ssrc_mutex);
auto *pOutputF32 = static_cast<float *>(pOutput);
for (auto &[ssrc, pair] : mgr->m_sources) {
+ double volume = 1.0;
+ if (const auto vol_it = mgr->m_volume_ssrc.find(ssrc); vol_it != mgr->m_volume_ssrc.end()) {
+ volume = vol_it->second;
+ }
auto &buf = pair.first;
const size_t n = std::min(static_cast<size_t>(buf.size()), static_cast<size_t>(frameCount * 2ULL));
for (size_t i = 0; i < n; i++) {
- pOutputF32[i] += buf[i] / 32768.F;
+ pOutputF32[i] += volume * buf[i] / 32768.F;
}
buf.erase(buf.begin(), buf.begin() + n);
}
@@ -180,6 +185,13 @@ void AudioManager::SetMuteSSRC(uint32_t ssrc, bool mute) {
}
}
+void AudioManager::SetVolumeSSRC(uint32_t ssrc, double volume) {
+ std::lock_guard<std::mutex> _(m_volume_ssrc_mutex);
+ volume *= 0.01;
+ constexpr const double E = 2.71828182845904523536;
+ m_volume_ssrc[ssrc] = (std::exp(volume) - 1) / (E - 1);
+}
+
void AudioManager::OnCapturedPCM(const int16_t *pcm, ma_uint32 frames) {
if (m_opus_buffer == nullptr || !m_should_capture) return;
diff --git a/src/audio/manager.hpp b/src/audio/manager.hpp
index 277f2f3..4d2299e 100644
--- a/src/audio/manager.hpp
+++ b/src/audio/manager.hpp
@@ -31,6 +31,7 @@ public:
void SetPlayback(bool playback);
void SetMuteSSRC(uint32_t ssrc, bool mute);
+ void SetVolumeSSRC(uint32_t ssrc, double volume);
[[nodiscard]] bool OK() const;
@@ -62,8 +63,10 @@ private:
std::atomic<bool> m_should_playback = true;
std::unordered_set<uint32_t> m_muted_ssrcs;
+ std::unordered_map<uint32_t, double> m_volume_ssrc;
mutable std::mutex m_muted_ssrc_mutex;
+ mutable std::mutex m_volume_ssrc_mutex;
public:
using type_signal_opus_packet = sigc::signal<void(int payload_size)>;