[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kmix] /: Added a default entry for selecting master control.
From:       Christian Esken <esken () kde ! org>
Date:       2014-08-14 20:26:07
Message-ID: E1XI1b5-0002vK-Sn () scm ! kde ! org
[Download RAW message or body]

Git commit db9c8fafaec131f46f054d27370f6f91918b07c7 by Christian Esken.
Committed on 14/08/2014 at 20:25.
Pushed by esken into branch 'master'.

Added a default entry for selecting master control.
REVIEW: 116851

M  +4    -6    apps/kmix.cpp
M  +34   -8    core/mixer.cpp
M  +2    -1    core/mixer.h
M  +33   -5    gui/dialogselectmaster.cpp

http://commits.kde.org/kmix/db9c8fafaec131f46f054d27370f6f91918b07c7

diff --git a/apps/kmix.cpp b/apps/kmix.cpp
index df368b0..96473b5 100644
--- a/apps/kmix.cpp
+++ b/apps/kmix.cpp
@@ -419,12 +419,10 @@ void KMixWindow::saveBaseConfig()
 	config.writeEntry("ConfigVersion", KMIX_CONFIG_VERSION);
 	config.writeEntry("AutoUseMultimediaKeys", m_autouseMultimediaKeys);
 
-	MasterControl& master = Mixer::getGlobalMasterPreferred();
-	if (master.isValid())
-	{
-		config.writeEntry("MasterMixer", master.getCard());
-		config.writeEntry("MasterMixerDevice", master.getControl());
-	}
+	MasterControl& master = Mixer::getGlobalMasterPreferred(false);
+	config.writeEntry("MasterMixer", master.getCard());
+	config.writeEntry("MasterMixerDevice", master.getControl());
+
 	QString mixerIgnoreExpression = MixerToolBox::instance()->mixerIgnoreExpression();
 	config.writeEntry("MixerIgnoreExpression", mixerIgnoreExpression);
 
diff --git a/core/mixer.cpp b/core/mixer.cpp
index 1134a9c..2f9203b 100644
--- a/core/mixer.cpp
+++ b/core/mixer.cpp
@@ -275,6 +275,8 @@ bool Mixer::openIfValid()
         {
             if ( !m_dynamic )
                 kError(67100) << "Mixer::open() no master detected." << endl;
+            else
+                kDebug(67100) << "Mixer::open() no master detected." << endl;
             QString noMaster = "---no-master-detected---";
             setLocalMasterMD(noMaster); // no master
         }
@@ -507,16 +509,25 @@ Mixer* Mixer::getGlobalMasterMixer()
  * Return the preferred global master.
  * If there is no preferred global master, returns the current master instead.
  */
-MasterControl& Mixer::getGlobalMasterPreferred()
+MasterControl& Mixer::getGlobalMasterPreferred(bool fallbackAllowed)
 {
-    if ( _globalMasterPreferred.isValid() ) {
+    static MasterControl result;
+
+    if ( !fallbackAllowed || _globalMasterPreferred.isValid() ) {
         kDebug() << "Returning preferred master";
         return _globalMasterPreferred;
     }
-    else {
-        kDebug() << "Returning current master";
-        return _globalMasterCurrent;
+
+    Mixer* mm = Mixer::getGlobalMasterMixerNoFalback();
+    if (mm) {
+        result.set(_globalMasterPreferred.getCard(), mm->getRecommendedDeviceId());
+        if (!result.getControl().isEmpty())
+            kDebug() << "Returning extended preferred master";
+            return result;
     }
+
+    kDebug() << "Returning current master";
+    return _globalMasterCurrent;
 }
 
 
@@ -536,6 +547,12 @@ shared_ptr<MixDevice> Mixer::getGlobalMasterMD(bool fallbackAllowed)
 	if ( mixer == 0 )
 		return mdRet;
 
+	if (_globalMasterCurrent.getControl().isEmpty())
+	{
+		// Default (recommended) control
+		return mixer->_mixerBackend->recommendedMaster();
+	}
+
 	foreach (shared_ptr<MixDevice> md, mixer->_mixerBackend->m_mixDevices )
 	{
 		if ( md.get() == 0 )
@@ -559,12 +576,21 @@ shared_ptr<MixDevice> Mixer::getGlobalMasterMD(bool fallbackAllowed)
 	return mdRet;
 }
 
-
-
+QString Mixer::getRecommendedDeviceId()
+{
+    if ( _mixerBackend != 0 ) {
+        shared_ptr<MixDevice> recommendedMaster = _mixerBackend->recommendedMaster();
+        if ( recommendedMaster.get() != 0 )
+            return recommendedMaster->id();
+    }
+    return QString();
+}
 
 shared_ptr<MixDevice> Mixer::getLocalMasterMD()
 {
-  return find( _masterDevicePK );
+    if (_mixerBackend && _masterDevicePK.isEmpty())
+        return _mixerBackend->recommendedMaster();
+    return find( _masterDevicePK );
 }
 
 void Mixer::setLocalMasterMD(QString &devPK)
diff --git a/core/mixer.h b/core/mixer.h
index e8c7eae..b04bce2 100644
--- a/core/mixer.h
+++ b/core/mixer.h
@@ -150,7 +150,8 @@ public:
     static shared_ptr<MixDevice> getGlobalMasterMD(bool fallbackAllowed);
     static Mixer* getGlobalMasterMixer();
     static Mixer* getGlobalMasterMixerNoFalback();
-    static MasterControl& getGlobalMasterPreferred();
+    static MasterControl& getGlobalMasterPreferred(bool fallbackAllowed = true);
+    QString getRecommendedDeviceId();
 
     /******************************************
     The recommended master of this Mixer.
diff --git a/gui/dialogselectmaster.cpp b/gui/dialogselectmaster.cpp
index cfbbd7f..788cdb9 100644
--- a/gui/dialogselectmaster.cpp
+++ b/gui/dialogselectmaster.cpp
@@ -155,13 +155,41 @@ void DialogSelectMaster::createPage(Mixer* mixer)
 	_layout->addWidget(m_channelSelector);
 
 
-    shared_ptr<MixDevice> master = mixer->getLocalMasterMD();
-    QString masterKey = ( master.get() != 0 ) ? master->id() : "----noMaster---"; // Use \
non-matching name as default +//    shared_ptr<MixDevice> master = mixer->getLocalMasterMD();
+//    QString masterKey = ( master.get() != 0 ) ? master->id() : "----noMaster---"; // Use \
non-matching name as default  
     const MixSet& mixset = mixer->getMixSet();
-    MixSet& mset = const_cast<MixSet&>(mixset);
-    // Populate ListView with the MixDevice's having a playbakc volume (excludes pure capture \
                controls and pure enum's)
-    for( int i=0; i< mset.count(); ++i )
+	MixSet& mset = const_cast<MixSet&>(mixset);
+
+	MasterControl mc = mixer->getGlobalMasterPreferred(false);
+	QString masterKey = mc.getControl();
+	if (!masterKey.isEmpty() && !mset.get(masterKey))
+	{
+		shared_ptr<MixDevice> master = mixer->getLocalMasterMD();
+		if (master.get() != 0)
+			masterKey = master->id();
+	}
+
+	int msetCount = 0;
+	for (int i = 0; i < mset.count(); ++i)
+    {
+    	shared_ptr<MixDevice> md = mset[i];
+        if ( md->playbackVolume().hasVolume() )
+        	++msetCount;
+    }
+
+	if (msetCount > 0 && !mixer->isDynamic())
+	{
+        QString mdName = i18n("Automatic (%1 recommendation)").arg(mixer->getDriverName());
+		QPixmap icon = KIconLoader::global()->loadIcon("audio-volume-high", KIconLoader::Small, \
IconSize(KIconLoader::Small)); +        QListWidgetItem *item = new QListWidgetItem(icon, \
mdName, m_channelSelector); +        item->setData(Qt::UserRole, QString());  // ID here: see \
apply(), empty String => Automatic +		if (masterKey.isEmpty())
+			m_channelSelector->setCurrentItem(item);
+	}
+
+	// Populate ListView with the MixDevice's having a playbakc volume (excludes pure capture \
controls and pure enum's) +	for (int i = 0; i < mset.count(); ++i)
     {
     	shared_ptr<MixDevice> md = mset[i];
         if ( md->playbackVolume().hasVolume() )


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic