diff options
Diffstat (limited to 'src/ChannelListenerManager.cpp')
-rw-r--r-- | src/ChannelListenerManager.cpp | 86 |
1 files changed, 54 insertions, 32 deletions
diff --git a/src/ChannelListenerManager.cpp b/src/ChannelListenerManager.cpp index 4954bb0ff..7151d90c1 100644 --- a/src/ChannelListenerManager.cpp +++ b/src/ChannelListenerManager.cpp @@ -10,13 +10,17 @@ #include <QReadLocker> #include <QWriteLocker> +std::size_t qHash(const ChannelListener &listener) { + return std::hash< ChannelListener >()(listener); +}; + +bool operator==(const ChannelListener &lhs, const ChannelListener &rhs) { + return lhs.channelID == rhs.channelID && lhs.userSession == rhs.userSession; +} + ChannelListenerManager::ChannelListenerManager() - : QObject(nullptr), m_listenerLock(), m_listeningUsers(), m_listenedChannels() -#ifdef MUMBLE - , - m_volumeLock(), m_listenerVolumeAdjustments() -#endif -{ + : QObject(nullptr), m_listenerLock(), m_listeningUsers(), m_listenedChannels(), m_volumeLock(), + m_listenerVolumeAdjustments() { } void ChannelListenerManager::addListener(unsigned int userSession, int channelID) { @@ -75,49 +79,69 @@ int ChannelListenerManager::getListenedChannelCountForUser(unsigned int userSess return m_listeningUsers[userSession].size(); } -#ifdef MUMBLE -void ChannelListenerManager::setListenerLocalVolumeAdjustment(int channelID, float volumeAdjustment) { - float oldValue; +void ChannelListenerManager::setListenerVolumeAdjustment(unsigned int userSession, int channelID, + const VolumeAdjustment &volumeAdjustment) { + float oldValue = 1.0f; { QWriteLocker lock(&m_volumeLock); - oldValue = m_listenerVolumeAdjustments.value(channelID, 1.0f); - m_listenerVolumeAdjustments.insert(channelID, volumeAdjustment); + ChannelListener key = {}; + key.channelID = channelID; + key.userSession = userSession; + + auto it = m_listenerVolumeAdjustments.find(key); + if (it != m_listenerVolumeAdjustments.end()) { + oldValue = it->second.factor; + } + + m_listenerVolumeAdjustments[key] = volumeAdjustment; } - if (oldValue != volumeAdjustment) { - emit localVolumeAdjustmentsChanged(channelID, volumeAdjustment, oldValue); + if (oldValue != volumeAdjustment.factor) { + emit localVolumeAdjustmentsChanged(channelID, volumeAdjustment.factor, oldValue); } } -float ChannelListenerManager::getListenerLocalVolumeAdjustment(int channelID) const { +const VolumeAdjustment &ChannelListenerManager::getListenerVolumeAdjustment(unsigned int userSession, + int channelID) const { + static VolumeAdjustment fallbackObj = VolumeAdjustment::fromFactor(1.0f); + QReadLocker lock(&m_volumeLock); - return m_listenerVolumeAdjustments.value(channelID, 1.0f); -} + ChannelListener key = {}; + key.channelID = channelID; + key.userSession = userSession; -QHash< int, float > ChannelListenerManager::getAllListenerLocalVolumeAdjustments(bool filter) const { - QReadLocker lock(&m_volumeLock); + auto it = m_listenerVolumeAdjustments.find(key); - if (!filter) { - return m_listenerVolumeAdjustments; + if (it == m_listenerVolumeAdjustments.end()) { + return fallbackObj; } else { - QHash< int, float > volumeMap; + return it->second; + } +} - QHashIterator< int, float > it(m_listenerVolumeAdjustments); +std::unordered_map< int, VolumeAdjustment > + ChannelListenerManager::getAllListenerVolumeAdjustments(unsigned int userSession) const { + QReadLocker lock1(&m_volumeLock); + QReadLocker lock2(&m_listenerLock); - while (it.hasNext()) { - it.next(); + std::unordered_map< int, VolumeAdjustment > adjustments; - if (it.value() != 1.0f) { - volumeMap.insert(it.key(), it.value()); - } - } + for (int channelID : m_listeningUsers.value(userSession)) { + ChannelListener listener = {}; + listener.channelID = channelID; + listener.userSession = userSession; - return volumeMap; + auto it = m_listenerVolumeAdjustments.find(listener); + + if (it != m_listenerVolumeAdjustments.end() && it->second.factor != 1.0f) { + adjustments[channelID] = it->second; + } } + + return adjustments; } -#endif void ChannelListenerManager::clear() { { @@ -125,10 +149,8 @@ void ChannelListenerManager::clear() { m_listeningUsers.clear(); m_listenedChannels.clear(); } -#ifdef MUMBLE { QWriteLocker lock(&m_volumeLock); m_listenerVolumeAdjustments.clear(); } -#endif } |