--- ./kmix/backends/mixer_backend.cpp.orig	2011-08-30 10:51:10.757627695 +0200
+++ ./kmix/backends/mixer_backend.cpp	2011-08-30 11:02:19.000000000 +0200
@@ -25,50 +25,54 @@
 #include "core/mixer.h"
 #include <QTimer>
 
+#define POLL_OSS_RATE_SLOW 1500
+#define POLL_OSS_RATE_FAST 50
+
+
 #include "mixer_backend_i18n.cpp"
 
 Mixer_Backend::Mixer_Backend(Mixer *mixer, int device) :
-        m_devnum (device) , m_isOpen(false), m_recommendedMaster(0), _mixer(mixer), _pollingTimer(0)
+m_devnum (device) , m_isOpen(false), m_recommendedMaster(0), _mixer(mixer), _pollingTimer(0)
 
 {
-   // In all cases create a QTimer. We will use it once as a singleShot(), even if something smart
-   // like ::select() is possible (as in ALSA).
-   _pollingTimer = new QTimer(); // will be started on open() and stopped on close()
-   connect( _pollingTimer, SIGNAL(timeout()), this, SLOT(readSetFromHW()), Qt::QueuedConnection);
+	// In all cases create a QTimer. We will use it once as a singleShot(), even if something smart
+	// like ::select() is possible (as in ALSA).
+	_pollingTimer = new QTimer(); // will be started on open() and stopped on close()
+	connect( _pollingTimer, SIGNAL(timeout()), this, SLOT(readSetFromHW()), Qt::QueuedConnection);
 }
 
 Mixer_Backend::~Mixer_Backend()
 {
-    delete _pollingTimer;
-    qDeleteAll(m_mixDevices);
-    m_mixDevices.clear();
+	delete _pollingTimer;
+	qDeleteAll(m_mixDevices);
+	m_mixDevices.clear();
 }
 
 
 bool Mixer_Backend::openIfValid() {
-    bool valid = false;
-    int ret = open();
-    if ( ret == 0  && (m_mixDevices.count() > 0 || _mixer->isDynamic())) {
-        valid = true;
-        // A better ID is now calculated in mixertoolbox.cpp, and set via setID(),
-        // but we want a somehow usable fallback just in case.
-    
-        if ( needsPolling() ) {
-            _pollingTimer->start(50);
-        }
-        else {
-            // The initial state must be read manually
-            QTimer::singleShot( 50, this, SLOT( readSetFromHW() ) );
-        }
-    } // cold be opened
-    else {
-        close();
-    }
-    return valid;
+	bool valid = false;
+	int ret = open();
+	if ( ret == 0  && (m_mixDevices.count() > 0 || _mixer->isDynamic())) {
+		valid = true;
+		// A better ID is now calculated in mixertoolbox.cpp, and set via setID(),
+		// but we want a somehow usable fallback just in case.
+
+		if ( needsPolling() ) {
+			_pollingTimer->start(POLL_OSS_RATE_FAST);
+		}
+		else {
+			// The initial state must be read manually
+			QTimer::singleShot( POLL_OSS_RATE_FAST, this, SLOT(readSetFromHW()) );
+		}
+	} // cold be opened
+	else {
+		close();
+	}
+	return valid;
 }
 
 bool Mixer_Backend::isOpen() {
-  return m_isOpen;
+	return m_isOpen;
 }
 
 /**
@@ -77,7 +81,7 @@
  * @return true, if there are changes. Otherwise false is returned.
  */
 bool Mixer_Backend::prepareUpdateFromHW() {
-  return true;
+	return true;
 }
 
 
@@ -90,47 +94,81 @@
  * 2) When reconstructing any MixerWidget (e.g. DockIcon after applying preferences)
  */
 void Mixer_Backend::readSetFromHWforceUpdate() const {
-   _readSetFromHWforceUpdate = true;
+	_readSetFromHWforceUpdate = true;
 }
 
 
 /**
    You can call this to retrieve the freshest information from the mixer HW.
    This method is also called regulary by the mixer timer.
-*/
+ */
 void Mixer_Backend::readSetFromHW()
 {
-    bool updated = prepareUpdateFromHW();
-    if ( (! updated) && (! _readSetFromHWforceUpdate) ) {
-        // Some drivers (ALSA) are smart. We don't need to run the following
-        // time-consuming update loop if there was no change
-        kDebug(67100) << "Mixer::readSetFromHW(): smart-update-tick";
-        return;
-    }
-    _readSetFromHWforceUpdate = false;
+	bool updated = prepareUpdateFromHW();
+	if ( (! updated) && (! _readSetFromHWforceUpdate) ) {
+		// Some drivers (ALSA) are smart. We don't need to run the following
+		// time-consuming update loop if there was no change
+		kDebug(67100) << "Mixer::readSetFromHW(): smart-update-tick";
+		return;
+	}
 
-	int ret = Mixer::OK;
+	//kDebug() << "---tick---" << QTime::currentTime();
+	_readSetFromHWforceUpdate = false;
 
-    int mdCount = m_mixDevices.count();
-    for(int i=0; i<mdCount  ; ++i )
-    {
-        MixDevice *md = m_mixDevices[i];
-        ret = readVolumeFromHW( md->id(), md );
-        if (md->isEnum() ) {
-            /*
-             * This could be reworked:
-             * Plan: Read everything (incuding enum's) in readVolumeFromHW().
-             * readVolumeFromHW() should then be renamed to readHW().
-             */
-            md->setEnumId( enumIdHW(md->id()) ); 
-        }
-    }
-    
-    if ( ret == Mixer::OK )
+	int ret = Mixer::OK_UNCHANGED;
+
+	int mdCount = m_mixDevices.count();
+	for(int i=0; i<mdCount  ; ++i )
+	{
+		MixDevice *md = m_mixDevices[i];
+		int retLoop = readVolumeFromHW( md->id(), md );
+		if (md->isEnum() ) {
+			/*
+			 * This could be reworked:
+			 * Plan: Read everything (incuding enum's) in readVolumeFromHW().
+			 * readVolumeFromHW() should then be renamed to readHW().
+			 */
+			md->setEnumId( enumIdHW(md->id()) );
+		}
+		if ( retLoop == Mixer::OK && ret == Mixer::OK_UNCHANGED )
+		{
+			ret = Mixer::OK;
+		}
+		else if ( retLoop != Mixer::OK && retLoop != Mixer::OK_UNCHANGED )
+		{
+			ret = retLoop;
+		}
+	}
+
+	if ( ret == Mixer::OK )
 	{
 		// We explicitely exclude Mixer::OK_UNCHANGED and Mixer::ERROR_READ
+		if ( needsPolling() )
+		{
+			_pollingTimer->setInterval(POLL_OSS_RATE_FAST);
+			QTime fastPollingEndsAt = QTime::currentTime ();
+			fastPollingEndsAt = fastPollingEndsAt.addSecs(5);
+			_fastPollingEndsAt = fastPollingEndsAt;
+			//_fastPollingEndsAt = fastPollingEndsAt;
+			kDebug() << "Start fast polling from " << QTime::currentTime() <<"until " << _fastPollingEndsAt;
+		}
 		emit controlChanged();
 	}
+
+	else
+	{
+		// This code path is entered on Mixer::OK_UNCHANGED and ERROR
+		if ( !_fastPollingEndsAt.isNull() )
+		{
+			if( _fastPollingEndsAt < QTime::currentTime () )
+			{
+				kDebug() << "End fast polling";
+				_fastPollingEndsAt = QTime();
+				if ( needsPolling() )
+					_pollingTimer->setInterval(POLL_OSS_RATE_SLOW);
+			}
+		}
+	}
 }
 
 /**
@@ -139,19 +177,19 @@
  * The users preference is NOT returned by this method - see the Mixer class for that.
  */
 MixDevice* Mixer_Backend::recommendedMaster() {
-   if ( m_recommendedMaster != 0 ) {
-      return m_recommendedMaster;   // Backend has set a recommended master. Thats fine.
-   } // recommendation from Backend
-   else if ( m_mixDevices.count() > 0 ) {
-      return m_mixDevices.at(0);  // Backend has NOT set a recommended master. Evil backend => lets help out.
-   } //first device (if exists)
-   else {
-      if ( !_mixer->isDynamic()) {
-         // This should never ever happen, as KMix doe NOT accept soundcards without controls
-         kError(67100) << "Mixer_Backend::recommendedMaster(): returning invalid master. This is a bug in KMix. Please file a bug report stating how you produced this." << endl;
-      }
-      return (MixDevice*)0;
-   }
+	if ( m_recommendedMaster != 0 ) {
+		return m_recommendedMaster;   // Backend has set a recommended master. Thats fine.
+	} // recommendation from Backend
+	else if ( m_mixDevices.count() > 0 ) {
+		return m_mixDevices.at(0);  // Backend has NOT set a recommended master. Evil backend => lets help out.
+	} //first device (if exists)
+	else {
+		if ( !_mixer->isDynamic()) {
+			// This should never ever happen, as KMix doe NOT accept soundcards without controls
+			kError(67100) << "Mixer_Backend::recommendedMaster(): returning invalid master. This is a bug in KMix. Please file a bug report stating how you produced this." << endl;
+		}
+		return (MixDevice*)0;
+	}
 }
 
 /**
@@ -161,7 +199,7 @@
  * code in its subclass (see Mixer_ALSA.cpp for an example).
  */
 void Mixer_Backend::setEnumIdHW(const QString& , unsigned int) {
-  return;
+	return;
 }
 
 /**
@@ -171,55 +209,55 @@
  * code in its subclass (see Mixer_ALSA.cpp for an example).
  */
 unsigned int Mixer_Backend::enumIdHW(const QString& ) {
-  return 0;
+	return 0;
 }
 
 /**
  * Move the stream to a new destination
  */
 bool Mixer_Backend::moveStream( const QString& id, const QString& destId ) {
-  Q_UNUSED(id);
-  Q_UNUSED(destId);
-  return false;
+	Q_UNUSED(id);
+	Q_UNUSED(destId);
+	return false;
 }
 
 void Mixer_Backend::errormsg(int mixer_error)
 {
-  QString l_s_errText;
-  l_s_errText = errorText(mixer_error);
-  kError() << l_s_errText << "\n";
+	QString l_s_errText;
+	l_s_errText = errorText(mixer_error);
+	kError() << l_s_errText << "\n";
 }
 
 int Mixer_Backend::id2num(const QString& id)
 {
-   return id.toInt();
+	return id.toInt();
 }
 
 QString Mixer_Backend::errorText(int mixer_error)
 {
-  QString l_s_errmsg;
-  switch (mixer_error)
-  {
-    case Mixer::ERR_PERM:
-      l_s_errmsg = i18n("kmix:You do not have permission to access the mixer device.\n" \
-	  "Please check your operating systems manual to allow the access.");
-      break;
-    case Mixer::ERR_WRITE:
-      l_s_errmsg = i18n("kmix: Could not write to mixer.");
-      break;
-    case Mixer::ERR_READ:
-      l_s_errmsg = i18n("kmix: Could not read from mixer.");
-      break;
-    case Mixer::ERR_OPEN:
-      l_s_errmsg = i18n("kmix: Mixer cannot be found.\n" \
-	  "Please check that the soundcard is installed and that\n" \
-	  "the soundcard driver is loaded.\n");
-      break;
-    default:
-      l_s_errmsg = i18n("kmix: Unknown error. Please report how you produced this error.");
-      break;
-  }
-  return l_s_errmsg;
+	QString l_s_errmsg;
+	switch (mixer_error)
+	{
+	case Mixer::ERR_PERM:
+		l_s_errmsg = i18n("kmix:You do not have permission to access the mixer device.\n" \
+				"Please check your operating systems manual to allow the access.");
+		break;
+	case Mixer::ERR_WRITE:
+		l_s_errmsg = i18n("kmix: Could not write to mixer.");
+		break;
+	case Mixer::ERR_READ:
+		l_s_errmsg = i18n("kmix: Could not read from mixer.");
+		break;
+	case Mixer::ERR_OPEN:
+		l_s_errmsg = i18n("kmix: Mixer cannot be found.\n" \
+				"Please check that the soundcard is installed and that\n" \
+				"the soundcard driver is loaded.\n");
+		break;
+	default:
+		l_s_errmsg = i18n("kmix: Unknown error. Please report how you produced this error.");
+		break;
+	}
+	return l_s_errmsg;
 }
 
 
--- ./kmix/backends/mixer_backend.h.orig	2011-08-31 14:40:43.854565142 +0200
+++ ./kmix/backends/mixer_backend.h	2011-08-31 14:45:05.104683569 +0200
@@ -22,6 +22,8 @@
 #ifndef MIXER_BACKEND_H
 #define MIXER_BACKEND_H
 
+#include <QTime>
+
 #include "core/mixer.h"
 
 class Mixer_Backend : public QObject
@@ -140,6 +142,9 @@
 
 protected slots:
   virtual void readSetFromHW();
+
+private:
+  QTime _fastPollingEndsAt;
 };
 
 #endif
--- ./kmix/core/mixer.h.orig	2011-08-30 10:43:44.917744648 +0200
+++ ./kmix/core/mixer.h	2011-08-30 10:48:24.467617529 +0200
@@ -56,7 +56,7 @@
 	 * 
 	 */
     enum MixerError { OK=0, ERR_PERM=1, ERR_WRITE, ERR_READ,
-        ERR_OPEN, ERR_LASTERR, OK_UNCHANGED };
+        ERR_OPEN, OK_UNCHANGED };
 
 
     Mixer( QString& ref_driverName, int device );
