|
|
|
@ -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
|
|
|
|
|
|
|
|
|
|
/**************************************************************************************
|
|
|
|
|