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/manager.cpp | |
parent | 9dc2e863e847c03cec1cdb53ba7c58e0740ad481 (diff) | |
download | abaddon-portaudio-92c70bda08472d880e23df30661376d526406230.tar.gz abaddon-portaudio-92c70bda08472d880e23df30661376d526406230.zip |
add per user volume slider
Diffstat (limited to 'src/audio/manager.cpp')
-rw-r--r-- | src/audio/manager.cpp | 14 |
1 files changed, 13 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; |