Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mumble-voip/mumble.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/ChannelListenerManager.cpp')
-rw-r--r--src/ChannelListenerManager.cpp86
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
}