diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2022-10-05 18:43:44 -0400 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2022-10-05 18:43:44 -0400 |
commit | 92c70bda08472d880e23df30661376d526406230 (patch) | |
tree | 382644087193c2a01382fc1b505bea820648816b /src/audio | |
parent | 9dc2e863e847c03cec1cdb53ba7c58e0740ad481 (diff) | |
download | abaddon-portaudio-92c70bda08472d880e23df30661376d526406230.tar.gz abaddon-portaudio-92c70bda08472d880e23df30661376d526406230.zip |
add per user volume slider
Diffstat (limited to 'src/audio')
-rw-r--r-- | src/audio/manager.cpp | 14 | ||||
-rw-r--r-- | src/audio/manager.hpp | 3 |
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)>; |