[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdemultimedia/kmix
From: Christian Esken <esken () kde ! org>
Date: 2011-06-16 19:52:00
Message-ID: 20110616195200.4588FAC7E2 () svn ! kde ! org
[Download RAW message or body]
SVN commit 1237035 by esken:
Avoid DBUS flooding by the OSS (v3) backend.
M +8 -1 backends/mixer_backend.cpp
M +27 -1 backends/mixer_oss.cpp
M +13 -2 core/mixer.h
--- trunk/KDE/kdemultimedia/kmix/backends/mixer_backend.cpp #1237034:1237035
@@ -109,11 +109,13 @@
}
_readSetFromHWforceUpdate = false;
+ int ret = Mixer::OK;
+
int mdCount = m_mixDevices.count();
for(int i=0; i<mdCount ; ++i )
{
MixDevice *md = m_mixDevices[i];
- readVolumeFromHW( md->id(), md );
+ ret = readVolumeFromHW( md->id(), md );
if (md->isEnum() ) {
/*
* This could be reworked:
@@ -123,8 +125,13 @@
md->setEnumId( enumIdHW(md->id()) );
}
}
+
+ if ( ret == Mixer::OK )
+ {
+ // We explicitely exclude Mixer::OK_UNCHANGED and Mixer::ERROR_READ
emit controlChanged();
}
+}
/**
* Return the MixDevice, that would qualify best as MasterDevice. The default is to \
return the
--- trunk/KDE/kdemultimedia/kmix/backends/mixer_oss.cpp #1237034:1237035
@@ -326,6 +326,9 @@
Volume& vol = md->playbackVolume();
int devnum = id2num(id);
+
+ bool controlChanged = false;
+
if ( vol.hasVolume() ) {
int volume;
if (ioctl(m_fd, MIXER_READ( devnum ), &volume) == -1)
@@ -343,12 +346,20 @@
if ( ! isMuted ) {
// Muted is represented in OSS by value 0. We don't want to write the \
value 0 as a volume,
// but instead we onlm mark it muted (see setMuted() above).
+ int volLeftOld = vol.getVolume(Volume::LEFT);
vol.setVolume( Volume::LEFT, volLeft);
+ if ( volLeftOld != volLeft )
+ controlChanged = true;
if( vol.count() > 1 )
+ {
+ int volRightOld = vol.getVolume(Volume::RIGHT);
vol.setVolume( Volume::RIGHT, volRight);
+ if ( volRightOld != volRight )
+ controlChanged = true;
}
}
}
+ }
// --- RECORD SWITCH ---
@@ -356,14 +367,29 @@
int recsrcMask;
if (ioctl(m_fd, SOUND_MIXER_READ_RECSRC, &recsrcMask) == -1)
ret = Mixer::ERR_READ;
- else {
+ else
+ {
+ bool isRecsrcOld = md->isRecSource();
// test if device bit is set in record bit mask
bool isRecsrc = ( (recsrcMask & ( 1<<devnum)) != 0 );
md->setRecSource(isRecsrc);
+ if ( isRecsrcOld != isRecsrc )
+ controlChanged = true;
+
}
+ if ( ret== 0)
+ {
+ if ( controlChanged )
+ return 0;
+ else
+ return Mixer::OK_UNCHANGED;
+ }
+ else
+ {
return ret;
}
+}
--- trunk/KDE/kdemultimedia/kmix/core/mixer.h #1237034:1237035
@@ -45,9 +45,20 @@
Q_OBJECT
public:
- enum MixerError { ERR_PERM=1, ERR_WRITE, ERR_READ,
- ERR_OPEN, ERR_LASTERR };
+ /**
+ * Status for Mixer operations.
+ *
+ * OK_UNCHANGED is a apecial variant of OK. It must be implemented by
+ * backends that use needsPolling() == true. See Mixer_OSS.cpp for an
+ * example. Rationale is that we need a proper change check: Otherwise
+ * the DBUS Session Bus is massively spammed. Also quite likely the Mixer
+ * GUI might get updated all the time.
+ *
+ */
+ enum MixerError { OK=0, ERR_PERM=1, ERR_WRITE, ERR_READ,
+ ERR_OPEN, ERR_LASTERR, OK_UNCHANGED };
+
Mixer( QString& ref_driverName, int device );
virtual ~Mixer();
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic