summaryrefslogtreecommitdiffstats
path: root/kmix
diff options
context:
space:
mode:
authorMichele Calgaro <michele.calgaro@yahoo.it>2020-05-07 18:34:30 +0900
committerMichele Calgaro <michele.calgaro@yahoo.it>2020-05-07 18:34:30 +0900
commit7a39a18686727157d4bbb92348a9eae2ca42ca35 (patch)
treee7cf572703e3f6595e448ed420ce00c443166a8d /kmix
parent85a278813f6df68bfae8c8239c27d5688cd6d7e8 (diff)
downloadtdemultimedia-7a39a18686727157d4bbb92348a9eae2ca42ca35.tar.gz
tdemultimedia-7a39a18686727157d4bbb92348a9eae2ca42ca35.zip
Fixed detection of alsa channels capabilities. This resolves bug 2994
and issue #16. The code is partially based on previous work from TCH <tch@protonmail.com>. Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
Diffstat (limited to 'kmix')
-rw-r--r--kmix/mixer_alsa9.cpp109
1 files changed, 61 insertions, 48 deletions
diff --git a/kmix/mixer_alsa9.cpp b/kmix/mixer_alsa9.cpp
index 46d98d41..22303b43 100644
--- a/kmix/mixer_alsa9.cpp
+++ b/kmix/mixer_alsa9.cpp
@@ -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
/**************************************************************************************