kmix/kmix-platforms.cpp | 18 ++++++++++-------- kmix/mixer.cpp | 5 +++++ kmix/mixer.h | 1 + kmix/mixer_alsa.h | 7 +++++++ kmix/mixer_alsa9.cpp | 30 ++++++++++++++++++++++++------ kmix/mixer_backend.cpp | 25 +++++++++++++++++++++++++ kmix/mixer_backend.h | 12 ++++++++++++ kmix/mixer_oss.cpp | 2 +- kmix/mixertoolbox.cpp | 16 +++++++++++++++- 9 files changed, 100 insertions(+), 16 deletions(-) diff --git a/kmix/kmix-platforms.cpp b/kmix/kmix-platforms.cpp index a492345..e43e114 100644 --- a/kmix/kmix-platforms.cpp +++ b/kmix/kmix-platforms.cpp @@ -109,42 +109,44 @@ typedef Mixer_Backend *getMixerFunc( int device ); typedef QString getDriverNameFunc( ); +typedef DevIterator* getDevIteratorFunc( ); struct MixerFactory { getMixerFunc *getMixer; getDriverNameFunc *getDriverName; + getDevIteratorFunc *getDevIterator; }; MixerFactory g_mixerFactories[] = { #if defined(NAS_MIXER) - { NAS_getMixer, 0 }, + { NAS_getMixer, NULL, NULL }, #endif #if defined(SUN_MIXER) - { SUN_getMixer, SUN_getDriverName }, + { SUN_getMixer, SUN_getDriverName, NULL }, #endif #if defined(IRIX_MIXER) - { IRIX_getMixer, IRIX_getDriverName }, + { IRIX_getMixer, IRIX_getDriverName, NULL }, #endif #if defined(ALSA_MIXER) - { ALSA_getMixer, ALSA_getDriverName }, + { ALSA_getMixer, ALSA_getDriverName, ALSA_getDevIterator }, #endif #if defined(OSS4_MIXER) - { OSS4_getMixer, OSS4_getDriverName }, + { OSS4_getMixer, OSS4_getDriverName, NULL }, #endif #if defined(OSS_MIXER) - { OSS_getMixer, OSS_getDriverName }, + { OSS_getMixer, OSS_getDriverName, NULL }, #endif #if defined(HPUX_MIXER) - { HPUX_getMixer, HPUX_getDriverName }, + { HPUX_getMixer, HPUX_getDriverName, NULL }, #endif - { 0, 0 } + { NULL, NULL, NULL } }; diff --git a/kmix/mixer.cpp b/kmix/mixer.cpp index 316625e..da5459b 100644 --- a/kmix/mixer.cpp +++ b/kmix/mixer.cpp @@ -347,6 +347,11 @@ QString Mixer::mixerName() return _mixerBackend->m_mixerName; } +int Mixer::devnum() +{ + return _mixerBackend->m_devnum; +} + QString Mixer::driverName( int driver ) { getDriverNameFunc *f = g_mixerFactories[driver].getDriverName; diff --git a/kmix/mixer.h b/kmix/mixer.h index b6d0917..30e5a76 100644 --- a/kmix/mixer.h +++ b/kmix/mixer.h @@ -82,6 +82,7 @@ class Mixer : public QObject, virtual public MixerIface QString& stateMessage() const; virtual QString mixerName(); + virtual int devnum(); // Returns the name of the driver, e.g. "OSS" or "ALSA0.9" static QString driverName(int num); diff --git a/kmix/mixer_alsa.h b/kmix/mixer_alsa.h index da04e37..0d73dc7 100644 --- a/kmix/mixer_alsa.h +++ b/kmix/mixer_alsa.h @@ -50,4 +50,11 @@ class Mixer_ALSA : public Mixer_Backend }; +class ALSA_DevIterator : public DevIterator +{ + public: + ALSA_DevIterator(); + virtual void next(); +}; + #endif diff --git a/kmix/mixer_alsa9.cpp b/kmix/mixer_alsa9.cpp index e55f611..4fbfdc6 100644 --- a/kmix/mixer_alsa9.cpp +++ b/kmix/mixer_alsa9.cpp @@ -114,12 +114,8 @@ Mixer_ALSA::open() snd_mixer_selem_id_alloca( &sid ); // Card information - if( m_devnum == -1 ) - m_devnum = 0; - if ( (unsigned)m_devnum > 31 ) - devName = "default"; - else - devName = QString( "hw:%1" ).arg( m_devnum ); + if ((unsigned)m_devnum > 31) m_devnum = -1; + devName = m_devnum == -1 ? "default" : QString("hw:%1").arg(m_devnum); QString probeMessage; @@ -146,6 +142,8 @@ Mixer_ALSA::open() //mixer_device_name = snd_ctl_card_info_get_mixername( hw_info ); // Copy the name of kmix mixer from card name (mixername is rumoured to be not that good) m_mixerName = mixer_card_name; + if (m_devnum == -1) m_devnum = snd_card_get_index(snd_ctl_card_info_get_id(hw_info)); + if (m_devnum < 0) m_devnum = -1; snd_ctl_close( ctl_handle ); @@ -826,3 +824,23 @@ ALSA_getDriverName() } +ALSA_DevIterator::ALSA_DevIterator() +{ + N = -1; + NMax = 31; +} + +void ALSA_DevIterator::next() +{ +#if 0 + int rc = snd_card_next(&N); + if (rc || (N == -1)) N = NMax + 1; +#else + if ((snd_card_next(&N) != 0) || (N == -1)) N = NMax + 1; +#endif +} + +DevIterator* ALSA_getDevIterator() +{ + return new ALSA_DevIterator(); +} diff --git a/kmix/mixer_backend.cpp b/kmix/mixer_backend.cpp index 2eb6108..7d2a840 100644 --- a/kmix/mixer_backend.cpp +++ b/kmix/mixer_backend.cpp @@ -145,3 +145,28 @@ QString Mixer_Backend::errorText(int mixer_error) return l_s_errmsg; } + +DevIterator::DevIterator() +{ + N = 0; + NMax = 19; +} + +void DevIterator::next() +{ + N++; +} + +int DevIterator::getdev() +{ + return N; +} + +bool DevIterator::end() +{ + return N > NMax; +} + +DevIterator::~DevIterator() +{ +} diff --git a/kmix/mixer_backend.h b/kmix/mixer_backend.h index 8132ea0..93340cf 100644 --- a/kmix/mixer_backend.h +++ b/kmix/mixer_backend.h @@ -101,4 +101,16 @@ protected: MixDevice* m_recommendedMaster; }; +class DevIterator +{ +public: + DevIterator(); + virtual ~DevIterator(); + virtual void next(); + virtual int getdev(); + virtual bool end(); +protected: + int N, NMax; +}; + #endif diff --git a/kmix/mixer_oss.cpp b/kmix/mixer_oss.cpp index 6991c1a..cc2eb84 100644 --- a/kmix/mixer_oss.cpp +++ b/kmix/mixer_oss.cpp @@ -133,7 +133,7 @@ int Mixer_OSS::open() readVolumeFromHW( idx, vol ); MixDevice* md = new MixDevice( idx, vol, recmask & ( 1 << idx ), true, - i18n(MixerDevNames[idx]), + MixerDevNames[idx], MixerChannelTypes[idx]); md->setRecSource( isRecsrcHW( idx ) ); m_mixDevices.append( md ); diff --git a/kmix/mixertoolbox.cpp b/kmix/mixertoolbox.cpp index 9b6ee94..9b6e103 100644 --- a/kmix/mixertoolbox.cpp +++ b/kmix/mixertoolbox.cpp @@ -99,11 +99,25 @@ void MixerToolBox::initMixer(QPtrList &mixers, bool multiDriverMode, QStr // New: We don't try be that clever anymore. We now blindly scan 20 cards, as the clever // approach doesn't work for the one or other user. int devNumMax = 19; - for( int dev=0; dev<=devNumMax; dev++ ) + getDevIteratorFunc* f = g_mixerFactories[drv].getDevIterator; + for( DevIterator* I = f ? f() : new DevIterator(); !I->end(); I->next()) { + int dev = I->getdev(); Mixer *mixer = new Mixer( drv, dev ); if ( mixer->isValid() ) { mixer->open(); + Mixer* m; + if (dev >= 0) { + for (m = mixers.first(); m; m = mixers.next()) +#if 0 + if ((mixer->devnum() == m->devnum()) && + m->id().startsWith(mixer->driverName(drv) + "::", true)) +#else + if (mixer->devnum() == m->devnum()) +#endif + break; + if (m) continue; + } mixers.append( mixer ); // Count mixer nums for every mixer name to identify mixers with equal names. // This is for creating persistent (reusable) primary keys, which can safely