[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