diff -U2 -r kdemultimedia-3.3.2/kmix/mdwslider.cpp ../kdemultimedia-3.3.2/kmix/mdwslider.cpp
--- kdemultimedia-3.3.2/kmix/mdwslider.cpp	2004-11-28 11:06:34.000000000 -0600
+++ ../kdemultimedia-3.3.2/kmix/mdwslider.cpp	2004-12-17 11:24:45.851809626 -0600
@@ -411,4 +411,5 @@
 {
    setStereoLinked( !isStereoLinked() );
+   MDWSlider::update();
 }
 
diff -U2 -r kdemultimedia-3.3.2/kmix/mixer_alsa.h ../kdemultimedia-3.3.2/kmix/mixer_alsa.h
--- kdemultimedia-3.3.2/kmix/mixer_alsa.h	2004-11-28 11:06:35.000000000 -0600
+++ ../kdemultimedia-3.3.2/kmix/mixer_alsa.h	2004-12-17 11:26:06.791870661 -0600
@@ -19,5 +19,4 @@
 		virtual bool isRecsrcHW( int devnum );
 	        virtual bool prepareUpdate();
-
 		
 	protected:
@@ -29,4 +28,6 @@
 		snd_mixer_elem_t* getMixerElem(int devnum);
 
+		bool getRecordStatus(int mixdevnum);
+		void createVolumeObject(snd_mixer_elem_t* elem, unsigned int &mixerIdx, bool isRecordable);
 		virtual QString errorText(int mixer_error);
 		typedef QValueList<snd_mixer_selem_id_t *>AlsaMixerSidList;
diff -U2 -r kdemultimedia-3.3.2/kmix/mixer_alsa9.cpp ../kdemultimedia-3.3.2/kmix/mixer_alsa9.cpp
--- kdemultimedia-3.3.2/kmix/mixer_alsa9.cpp	2004-11-28 11:06:35.000000000 -0600
+++ ../kdemultimedia-3.3.2/kmix/mixer_alsa9.cpp	2004-12-17 11:29:08.495358865 -0600
@@ -199,80 +199,39 @@
 	sid = (snd_mixer_selem_id_t*)malloc(snd_mixer_selem_id_sizeof());  // I believe *we* must malloc it for ourself
 	snd_mixer_selem_get_id( elem, sid );
-
-	bool canRecord = false;
-	bool canMute = false;
-	long maxVolumePlay= 0, minVolumePlay= 0;
-	long maxVolumeRec = 0, minVolumeRec = 0;
+	
 	validDevice = true;
 
-	snd_mixer_selem_get_playback_volume_range( elem, &minVolumePlay, &maxVolumePlay );
-	snd_mixer_selem_get_capture_volume_range( elem, &minVolumeRec , &maxVolumeRec  );
-	// New mix device
-	MixDevice::ChannelType ct = (MixDevice::ChannelType)identify( sid );
-
 	if( virginOpen )
 	{
-		MixDevice::DeviceCategory cc = MixDevice::UNDEFINED;
-		
 		kdDebug() << "--- Loop: name=" << snd_mixer_selem_id_get_name( sid ) << " , mixerIdx=" << mixerIdx << "------------" << endl;
-		
-		Volume::ChannelMask chn = Volume::MNONE;
-		Volume::ChannelMask chnTmp;
-		if ( snd_mixer_selem_has_playback_volume(elem) ) {
-			kdDebug(67100) << "has_playback_volume()" << endl;
-			chnTmp = snd_mixer_selem_is_playback_mono ( elem )
-				? Volume::MLEFT : (Volume::ChannelMask)(Volume::MLEFT | Volume::MRIGHT);
+		if ( snd_mixer_selem_has_capture_volume(elem) && snd_mixer_selem_has_playback_volume(elem) ) {
+                        kdDebug(67100) << "has_capture_volume and playback()" << endl;
+/*			chnTmp = snd_mixer_selem_is_capture_mono( elem )
+                                ? Volume::MLEFT : (Volume::ChannelMask)(Volume::MLEFT| Volume::MRIGHT );
 			chn = (Volume::ChannelMask) (chn | chnTmp);
 			cc = MixDevice::SLIDER;
-		}
-		else if ( snd_mixer_selem_has_capture_volume(elem) ) {
-			kdDebug(67100) << "has_capture_volume()" << endl;
-			chnTmp = snd_mixer_selem_is_capture_mono( elem )
-				? Volume::MLEFT : (Volume::ChannelMask)(Volume::MLEFT | Volume::MRIGHT );
+			snd_mixer_selem_get_capture_volume_range( elem, &minVolumeRec, &maxVolumeRec ); */
+			createVolumeObject(elem, mixerIdx, true);
+			mixerIdx+=1;
+			createVolumeObject(elem, mixerIdx, false);
+		} else if ( snd_mixer_selem_has_capture_volume(elem) ) {
+                        kdDebug(67100) << "has_capture_volume()" << endl;
+/*			chnTmp = snd_mixer_selem_is_capture_mono( elem )
+                                ? Volume::MLEFT : (Volume::ChannelMask)(Volume::MLEFT| Volume::MRIGHT );
 			chn = (Volume::ChannelMask) (chn | chnTmp);
 			cc = MixDevice::SLIDER;
-			// We can have Playback OR Capture. Not both at same time
-			// It's not best coding ever, anyway
-			snd_mixer_selem_get_capture_volume_range( elem, &minVolumePlay, &maxVolumePlay );
-		}
-		
-		/* Create Volume object. If there is no volume on this device,
-		 * it will be created with maxVolume == 0 && minVolume == 0 */
-		Volume* vol = new Volume( chn, maxVolumePlay, minVolumePlay, maxVolumeRec, minVolumeRec );
-		//mixer_elem_list.append( elem );
-		mixer_sid_list.append( sid );
-		
-		if ( snd_mixer_selem_has_playback_switch ( elem ) ) {   
-			kdDebug(67100) << "has_playback_switch()" << endl;
-			canMute = true;
-		}
-		if ( snd_mixer_selem_has_capture_switch ( elem ) )	{
-			kdDebug(67100) << "has_capture_switch()" << endl;
-			canRecord = true;
-		}
-		if ( snd_mixer_selem_has_common_switch ( elem ) ) {
-			kdDebug(67100) << "has_common_switch()" << endl;
-			canMute = true;
-			canRecord = true;
-		}
-
-		if ( /*snd_mixer_selem_has_common_switch ( elem ) || */
-                     cc == MixDevice::UNDEFINED )
-		{
-		    // Everything unknown is handled as switch
-		    cc = MixDevice::SWITCH;
+			snd_mixer_selem_get_capture_volume_range( elem, &minVolumeRec, &maxVolumeRec ); */
+			createVolumeObject(elem, mixerIdx, true);
+		} else if ( snd_mixer_selem_has_playback_volume(elem) ) {
+			kdDebug(67100) << "has_playback_volume()" << endl;
+/*			chnTmp = snd_mixer_selem_is_playback_mono ( elem )
+				? Volume::MLEFT : (Volume::ChannelMask)(Volume::MLEFT | Volume::MRIGHT);
+			chn = (Volume::ChannelMask) (chn | chnTmp);
+			cc = MixDevice::SLIDER; */
+			createVolumeObject(elem, mixerIdx, false);
+		} else {
+			kdDebug(67100) << "Must be a switch :)" << endl;
+			createVolumeObject(elem, mixerIdx, false);
 		}
-
-		MixDevice* mdw =
-		    new MixDevice( mixerIdx,
-				   *vol,
-					canRecord,
-				   canMute,
-				   snd_mixer_selem_id_get_name( sid ),
-				   ct,
-				   cc );
-		m_mixDevices.append( mdw );
-		//kdDebug(67100) << "ALSA create MDW, vol= " << *vol << endl;
-		delete vol;
 	    } // virginOpen
 	    else
@@ -326,4 +285,103 @@
 }
 
+bool Mixer_ALSA::getRecordStatus(int mixdevnum) {
+	MixDevice* mdCopyA = m_mixDevices.at(mixdevnum);
+	if( !mdCopyA )
+	{
+	    kdDebug(67100) << "Couldn't find the mixer element in getRecordStatus" << endl;
+	    return false;
+	}
+		
+	if (mdCopyA->isRecordable()) {
+//		kdDebug(67100) << mdCopyA->name() << " is a recordable source." << endl;
+		return true;
+	} else {
+//		kdDebug(67100) << mdCopyA->name() << " is NOT a recordable source." << endl;
+		return false;
+	}
+		
+//	return mixer_elem_list[ devnum ];
+}
+
+void Mixer_ALSA::createVolumeObject(snd_mixer_elem_t* elem, unsigned int &mixerIdx, bool isRecordable) {
+	/* Create Volume object. If there is no volume on this device,
+	 * it will be created with maxVolume == 0 && minVolume == 0 */
+	
+	Volume::ChannelMask chn = Volume::MNONE;
+	Volume::ChannelMask chnTmp;
+	long maxVolumePlay= 0, minVolumePlay= 0;
+	long maxVolumeRec = 0, minVolumeRec = 0;
+	MixDevice::DeviceCategory cc = MixDevice::UNDEFINED;
+	snd_mixer_selem_get_playback_volume_range( elem, &minVolumePlay, &maxVolumePlay );
+	snd_mixer_selem_get_capture_volume_range( elem, &minVolumeRec , &maxVolumeRec  );
+	snd_mixer_selem_id_t *sid;
+	snd_mixer_selem_id_alloca( &sid );
+
+
+	sid = (snd_mixer_selem_id_t*)malloc(snd_mixer_selem_id_sizeof());  // I believe *we* must malloc it for ourself
+	snd_mixer_selem_get_id( elem, sid );
+
+	// New mix device
+	MixDevice::ChannelType ct = (MixDevice::ChannelType)identify( sid );
+
+	if (isRecordable) {
+		chnTmp = snd_mixer_selem_is_capture_mono( elem )
+			? Volume::MLEFT : (Volume::ChannelMask)(Volume::MLEFT| Volume::MRIGHT );
+		chn = (Volume::ChannelMask) (chn | chnTmp);
+		cc = MixDevice::SLIDER;
+		snd_mixer_selem_get_capture_volume_range( elem, &minVolumeRec, &maxVolumeRec );
+	} else if (snd_mixer_selem_has_playback_volume( elem )) {
+		chnTmp = snd_mixer_selem_is_playback_mono ( elem )
+			? Volume::MLEFT : (Volume::ChannelMask)(Volume::MLEFT | Volume::MRIGHT);
+		chn = (Volume::ChannelMask) (chn | chnTmp);
+		cc = MixDevice::SLIDER;
+	}
+	
+	Volume* vol = new Volume( chn, maxVolumePlay, minVolumePlay, maxVolumeRec, minVolumeRec );
+	bool canRecord = false;
+	bool canMute = false;
+	
+	//mixer_elem_list.append( elem );
+	mixer_sid_list.append( sid );
+		if ( snd_mixer_selem_has_capture_volume ( elem ) && isRecordable) {
+//		kdDebug(67100) << "has_capture_volume" << endl;
+		canRecord=true;
+	}
+	if ( snd_mixer_selem_has_playback_switch ( elem ) && !isRecordable) {   
+		kdDebug(67100) << "has_playback_switch()" << endl;
+		canMute = true;
+	}
+	if ( snd_mixer_selem_has_capture_switch ( elem ) )	{
+		kdDebug(67100) << "has_capture_switch()" << endl;
+		canRecord = true;
+	}
+	if ( snd_mixer_selem_has_common_switch ( elem ) ) {
+		kdDebug(67100) << "has_common_switch()" << endl;
+		canMute = true;
+		canRecord = true;
+	}
+		if ( /*snd_mixer_selem_has_common_switch ( elem ) || */
+                    cc == MixDevice::UNDEFINED )
+	{
+	    // Everything unknown is handled as switch
+	    cc = MixDevice::SWITCH;
+	}
+		
+	
+	MixDevice* mdw =
+		new MixDevice( mixerIdx,
+		*vol,
+		canRecord,
+		canMute,
+		snd_mixer_selem_id_get_name( sid ),
+		ct,
+		cc );
+	
+	m_mixDevices.append( mdw );
+	//kdDebug(67100) << "ALSA create MDW, vol= " << *vol << endl;
+	delete vol;
+	return; 
+}
+
 bool Mixer_ALSA::prepareUpdate() {
     //kdDebug(67100) << "Mixer_ALSA::prepareUpdate() 1\n";
@@ -508,14 +566,20 @@
 	int elem_sw;
 	long left, right;
-
+	bool recordable;
+	
 	snd_mixer_elem_t *elem = getMixerElem( mixerIdx );
 	if ( !elem )
 	{
 		return 0;
-	}
-		
+	} 
 
+	if ( getRecordStatus( mixerIdx) == true ) {
+		recordable=true;
+	} else {
+		recordable=false;
+	} 
+	
 	// *** READ PLAYBACK VOLUMES *************
-	if ( snd_mixer_selem_has_playback_volume( elem ) )
+	if ( snd_mixer_selem_has_playback_volume( elem ) && !recordable)
 	{
 		int ret = snd_mixer_selem_get_playback_volume( elem, SND_MIXER_SCHN_FRONT_LEFT, &left );
@@ -532,6 +596,6 @@
                 }
 	}
-	else
-	if ( snd_mixer_selem_has_capture_volume ( elem ) )
+	
+	if ( snd_mixer_selem_has_capture_volume ( elem ) && recordable)
 	{
             int ret = snd_mixer_selem_get_capture_volume ( elem, SND_MIXER_SCHN_FRONT_LEFT, &left );
@@ -544,10 +608,10 @@
 	    {
 		int ret = snd_mixer_selem_get_capture_volume( elem, SND_MIXER_SCHN_FRONT_RIGHT, &right );
-		if ( ret != 0 ) kdDebug(67100) << "readVolumeFromHW(" << mixerIdx << ") [has_capture_volume,R] failed, errno=" << ret << endl;			
+		if ( ret != 0 ) kdDebug(67100) << "readVolumeFromHW(" << mixerIdx << ") [has_capture_volume,R] failed, errno=" << ret << endl;
 		volume.setVolume( Volume::LEFT , left );
 		volume.setVolume( Volume::RIGHT, right );
 	    }
 	}
-
+	else
 	if ( snd_mixer_selem_has_playback_switch( elem ) )
 	{
@@ -566,5 +630,6 @@
 {
 	int left, right;
-	
+	bool recordable;
+		
 	snd_mixer_elem_t *elem = getMixerElem( devnum );
 	if ( !elem )
@@ -573,15 +638,22 @@
 	}
 	
+	
+	if ( getRecordStatus( devnum ) == true ) {
+		recordable=true;
+	} else {
+		recordable=false;
+	} 
+	
 	// --- VOLUME  - WE HAVE JUST ONE TYPE OF VOLUME A TIME, 
 	// CAPTURE OR PLAYBACK, SO IT"S JUST USE VOLUME ------------
 	left = volume[ Volume::LEFT ];
 	right = volume[ Volume::RIGHT ];
-	
-	if (snd_mixer_selem_has_playback_volume( elem ) ) {
+
+	if (snd_mixer_selem_has_playback_volume( elem ) && !recordable) {
 		snd_mixer_selem_set_playback_volume ( elem, SND_MIXER_SCHN_FRONT_LEFT, left );
 		if ( ! snd_mixer_selem_is_playback_mono ( elem ) )
 			snd_mixer_selem_set_playback_volume ( elem, SND_MIXER_SCHN_FRONT_RIGHT, right );
 	}
-	else if ( snd_mixer_selem_has_capture_volume( elem ) ) {
+	else if ( snd_mixer_selem_has_capture_volume( elem ) && recordable) {
 		snd_mixer_selem_set_capture_volume ( elem, SND_MIXER_SCHN_FRONT_LEFT, left );
 		if ( ! snd_mixer_selem_is_playback_mono ( elem ) )
