@ -199,9 +199,10 @@ Mixer_ALSA::open()
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 ;
bool canPlay = false ;
bool canCapture = false ;
bool hasPlaySwitch = false ;
bool hasCaptureSwitch = false ;
long maxVolumePlay = 0 , minVolumePlay = 0 ;
long maxVolumeRec = 0 , minVolumeRec = 0 ;
validDevice = true ;
@ -261,6 +262,7 @@ Mixer_ALSA::open()
? Volume : : MLEFT : ( Volume : : ChannelMask ) ( Volume : : MLEFT | Volume : : MRIGHT ) ;
chn = ( Volume : : ChannelMask ) ( chn | chnTmp ) ;
cc = MixDevice : : SLIDER ;
canPlay = true ;
volPlay = new Volume ( chn , maxVolumePlay , minVolumePlay ) ;
} else {
volPlay = new Volume ( ) ;
@ -283,72 +285,83 @@ Mixer_ALSA::open()
mixer_sid_list . append ( sid ) ;
if ( snd_mixer_selem_has_playback_switch ( elem ) ) {
//kdDebug(67100) << "has_playback_switch()" << endl;
canMute = true ;
//kdDebug(67100) << "has_playback_switch()" << endl;
hasPlaySwitch = true ;
}
if ( snd_mixer_selem_has_capture_switch ( elem ) ) {
//kdDebug(67100) << "has_capture_switch()" << endl;
canRecord = true ;
//kdDebug(67100) << "has_capture_switch()" << endl;
hasCaptureSwitch = true ;
}
if ( snd_mixer_selem_has_common_switch ( elem ) ) {
//kdDebug(67100) << "has_common_switch()" << endl;
canMute = true ;
canRecord = true ;
//kdDebug(67100) << "has_common_switch()" << endl;
hasPlaySwitch = true ;
hasCaptureSwitch = true ;
}
if ( /*snd_mixer_selem_has_common_switch ( elem ) || */
cc = = MixDevice : : UNDEFINED )
if ( cc = = MixDevice : : UNDEFINED )
{
// Everything unknown is handled as switch
cc = MixDevice : : SWITCH ;
}
} // is ordinary mixer element (NOT an enum)
if ( canPlay | | cc = = MixDevice : : SWITCH | | cc = = MixDevice : : ENUM )
{
MixDevice * md = new MixDevice ( mixerIdx ,
canCapture ? * volCapture : * volPlay ,
canCapture ? true : canRecord ,
canMute ,
snd_mixer_selem_id_get_name ( sid ) ,
ct ,
cc ) ;
m_mixDevices . append ( md ) ;
* volPlay ,
false ,
hasPlaySwitch ,
snd_mixer_selem_id_get_name ( sid ) ,
ct ,
cc ) ;
m_mixDevices . append ( md ) ;
if ( ! masterChosen & & ct = = MixDevice : : VOLUME ) {
// Determine a nicer MasterVolume
m_recommendedMaster = md ;
masterChosen = true ;
// Determine a nicer MasterVolume
m_recommendedMaster = md ;
masterChosen = true ;
}
if ( enumList . count ( ) > 0 ) {
int maxEnumId = enumList . count ( ) ;
TQPtrList < TQString > & enumValuesRef = md - > enumValues ( ) ; // retrieve a ref
for ( int i = 0 ; i < maxEnumId ; i + + ) {
// we have an enum. Lets set the names of the enum items in the MixDevice
// the enum names are assumed to be static!
enumValuesRef . append ( enumList . at ( i ) ) ;
}
int maxEnumId = enumList . count ( ) ;
TQPtrList < TQString > & enumValuesRef = md - > enumValues ( ) ; // retrieve a ref
for ( int i = 0 ; i < maxEnumId ; i + + ) {
// we have an enum. Lets set the names of the enum items in the MixDevice
// the enum names are assumed to be static!
enumValuesRef . append ( enumList . at ( i ) ) ;
}
}
//kdDebug(67100) << "ALSA create MDW, vol= " << *vol << endl;
delete volPlay ;
delete volCapture ;
} // virginOpen
else
}
if ( canCapture )
{
MixDevice * md ;
bool found = false ;
for ( md = m_mixDevices . first ( ) ; md ! = 0 ; md = m_mixDevices . next ( ) ) {
if ( md - > num ( ) = = mixerIdx ) {
found = true ;
writeVolumeToHW ( mixerIdx , md - > getVolume ( ) ) ;
}
}
if ( ! found )
{
return Mixer : : ERR_INCOMPATIBLESET ;
}
} // !virginOpen
MixDevice * md = new MixDevice ( mixerIdx ,
* volCapture ,
true ,
hasCaptureSwitch ,
snd_mixer_selem_id_get_name ( sid ) ,
ct ,
cc ) ;
m_mixDevices . append ( md ) ;
}
//kdDebug(67100) << "ALSA create MDW, vol= " << *vol << endl;
delete volPlay ;
delete volCapture ;
} // virginOpen
else
{
MixDevice * md ;
bool found = false ;
for ( md = m_mixDevices . first ( ) ; md ! = 0 ; md = m_mixDevices . next ( ) ) {
if ( md - > num ( ) = = mixerIdx ) {
found = true ;
writeVolumeToHW ( mixerIdx , md - > getVolume ( ) ) ;
}
}
if ( ! found )
{
return Mixer : : ERR_INCOMPATIBLESET ;
}
} // !virginOpen
} // for all elems
/**************************************************************************************