From b5853350dfc537b48a1cd15af900dfdee9443668 Mon Sep 17 00:00:00 2001
From: yanmorin <yanmorin>
Date: Tue, 23 May 2006 00:06:53 +0000
Subject: [PATCH] New AudioDriver testing button

---
 src/gui/Makefile.am                     |   2 +-
 src/gui/guiframework.cpp                |   4 +-
 src/gui/guiframework.h                  |   2 +-
 src/gui/qt/ConfigurationManagerImpl.cpp |  59 ++++++++-
 src/gui/qt/ConfigurationManagerImpl.hpp |  24 +++-
 src/gui/qt/ConfigurationPanel.ui        |  78 +++++++++---
 src/gui/qt/ConfigurationPanel.ui.h      | 155 ++++++++++++++++++------
 src/gui/qt/PhoneLineManagerImpl.cpp     |  66 +++++++---
 src/gui/qt/PhoneLineManagerImpl.hpp     |  10 +-
 src/gui/qt/Request.cpp                  |   8 +-
 src/gui/qt/SFLPhoneApp.cpp              |  17 ++-
 src/gui/qt/SFLPhoneWindow.cpp           |  26 ++--
 src/gui/qt/SFLPhoneWindow.hpp           |   8 +-
 src/gui/qt/Session.cpp                  |  14 ++-
 src/gui/qt/Session.hpp                  |  14 ++-
 src/gui/qt/globals.h                    |   3 +
 src/gui/server/requestconfig.cpp        |   7 +-
 src/managerimpl.cpp                     |  24 +++-
 src/managerimpl.h                       |  10 +-
 19 files changed, 404 insertions(+), 127 deletions(-)

diff --git a/src/gui/Makefile.am b/src/gui/Makefile.am
index 846fa28d47..f584fb1cb8 100644
--- a/src/gui/Makefile.am
+++ b/src/gui/Makefile.am
@@ -13,7 +13,7 @@ endif
 #	cd qt && make
 
 
-SUBDIRS = $(serverdir) $(qtdir) cli
+SUBDIRS = $(serverdir) $(qtdir) cli qt
 
 noinst_LTLIBRARIES = libguiframework.la
 
diff --git a/src/gui/guiframework.cpp b/src/gui/guiframework.cpp
index 49150ab495..56ff4e6074 100644
--- a/src/gui/guiframework.cpp
+++ b/src/gui/guiframework.cpp
@@ -264,7 +264,7 @@ GuiFramework::getRegistrationState(std::string& stateCode, std::string& stateMes
 }
 
 bool 
-GuiFramework::setSwitch(const std::string& switchName)
+GuiFramework::setSwitch(const std::string& switchName, std::string& returnMessage)
 {
-  return Manager::instance().setSwitch(switchName);
+  return Manager::instance().setSwitch(switchName, returnMessage);
 }
diff --git a/src/gui/guiframework.h b/src/gui/guiframework.h
index 9a45ac5ca0..347a93757a 100644
--- a/src/gui/guiframework.h
+++ b/src/gui/guiframework.h
@@ -92,7 +92,7 @@ public:
   bool setMicVolume(int volume);
   int getSpkrVolume();
   int getMicVolume();
-  bool setSwitch(const std::string& switchName);
+  bool setSwitch(const std::string& switchName, std::string& returnMessage);
 
   bool hasLoadedSetup();
   const CallID& getCurrentId();
diff --git a/src/gui/qt/ConfigurationManagerImpl.cpp b/src/gui/qt/ConfigurationManagerImpl.cpp
index 68d432e963..c4a2f7442c 100644
--- a/src/gui/qt/ConfigurationManagerImpl.cpp
+++ b/src/gui/qt/ConfigurationManagerImpl.cpp
@@ -1,5 +1,6 @@
-/**
- *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+/*
+ *  Copyright (C) 2004-2006 Savoir-Faire Linux inc.
+ *  Author: Yan Morin <yan.morin@savoirfairelinux.com>
  *  Author: Jean-Philippe Barrette-LaPierre
               <jean-philippe.barrette-lapierre@savoirfairelinux.com>
  *                                                                              
@@ -56,9 +57,9 @@ ConfigurationManagerImpl::save()
     while(pos != mEntries.end()) {
       VariableMap::iterator vpos = pos->second.begin();
       while(vpos != pos->second.end()) {
-	ConfigEntry entry(vpos->second);
-	mSession->configSet(entry.section, entry.name, entry.value);
-	vpos++;
+        ConfigEntry entry(vpos->second);
+        mSession->configSet(entry.section, entry.name, entry.value);
+        vpos++;
       }
 
       pos++;
@@ -100,7 +101,45 @@ void
 ConfigurationManagerImpl::add(const AudioDevice &entry)
 {
   mAudioDevices.push_back(entry);
-  emit audioDevicesUpdated();
+  // emit audioDevicesUpdated(); // <-- wrong call with success
+}
+
+void
+ConfigurationManagerImpl::addAudioDeviceIn(QString index, 
+					 QString hostApiName, 
+					 QString deviceName)
+{
+  AudioDevice device;
+  device.index = index;
+  device.hostApiName = hostApiName;
+  device.deviceName = deviceName;
+  addIn(device);
+}
+
+void
+ConfigurationManagerImpl::addIn(const AudioDevice &entry)
+{
+  mAudioDevicesIn.push_back(entry);
+  //emit audioDevicesInUpdated(); // <-- wrong call with success()
+}
+
+void
+ConfigurationManagerImpl::addAudioDeviceOut(QString index, 
+					 QString hostApiName, 
+					 QString deviceName)
+{
+  AudioDevice device;
+  device.index = index;
+  device.hostApiName = hostApiName;
+  device.deviceName = deviceName;
+  addOut(device);
+}
+
+void
+ConfigurationManagerImpl::addOut(const AudioDevice &entry)
+{
+  mAudioDevicesOut.push_back(entry);
+  //emit audioDevicesOutUpdated(); // <-- wrong call with success()
 }
 
 void
@@ -136,6 +175,7 @@ ConfigurationManagerImpl::add(const Codec &entry)
   mCodecs.push_back(entry);
   emit codecsUpdated();
 }
+
 void
 ConfigurationManagerImpl::set(const QString &section,
 			      const QString &name,
@@ -150,6 +190,13 @@ ConfigurationManagerImpl::set(const QString &section,
   }
 }
 
+void
+ConfigurationManagerImpl::save(const QString &section, const QString &name)
+{
+  QString value = get(section, name);
+  mSession->configSet(section, name, value);
+}
+
 QString
 ConfigurationManagerImpl::get(const QString &section,
 			      const QString &name)
diff --git a/src/gui/qt/ConfigurationManagerImpl.hpp b/src/gui/qt/ConfigurationManagerImpl.hpp
index 10391f9ad9..51fa3de318 100644
--- a/src/gui/qt/ConfigurationManagerImpl.hpp
+++ b/src/gui/qt/ConfigurationManagerImpl.hpp
@@ -1,5 +1,6 @@
-/**
- *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+/*
+ *  Copyright (C) 2004-2006 Savoir-Faire Linux inc.
+ *  Author: Yan Morin <yan.morin@savoirfairelinux.com>
  *  Author: Jean-Philippe Barrette-LaPierre
               <jean-philippe.barrette-lapierre@savoirfairelinux.com>
  *                                                                              
@@ -88,6 +89,8 @@ class ConfigurationManagerImpl : public QObject
 
 signals:
   void audioDevicesUpdated();
+  void audioDevicesInUpdated();
+  void audioDevicesOutUpdated();
   void ringtonesUpdated();
   void codecsUpdated();
   void updated();
@@ -126,9 +129,17 @@ public:
 	   
   void clearAudioDevices()
   {mAudioDevices.clear();}
+  void clearAudioDevicesIn()
+  {mAudioDevices.clear();}
+  void clearAudioDevicesOut()
+  {mAudioDevices.clear();}
   
   std::list< AudioDevice > getAudioDevices()
   {return mAudioDevices;}
+  std::list< AudioDevice > getAudioDevicesIn()
+  {return mAudioDevicesIn;}
+  std::list< AudioDevice > getAudioDevicesOut()
+  {return mAudioDevicesOut;}
   
   std::list< Ringtone > getRingtones()
   {return mRingtones;}
@@ -143,6 +154,7 @@ public:
   {emit updated();}
 
   void save();
+  void save(const QString& section, const QString& name);
 
   void finishSave();
 
@@ -152,6 +164,12 @@ public slots:
   void addAudioDevice(QString index, QString hostApiName, QString deviceName);
   void add(const AudioDevice &entry);
 
+  void addAudioDeviceIn(QString index, QString hostApiName, QString deviceName);
+  void addIn(const AudioDevice &entry);
+
+  void addAudioDeviceOut(QString index, QString hostApiName, QString deviceName);
+  void addOut(const AudioDevice &entry);
+
   void addRingtone(QString index, QString filename);
   void add(const Ringtone &entry);
 
@@ -165,6 +183,8 @@ private:
   SectionMap mEntries;
 
   std::list< AudioDevice > mAudioDevices;
+  std::list< AudioDevice > mAudioDevicesIn;
+  std::list< AudioDevice > mAudioDevicesOut;
   std::list< Ringtone > mRingtones;
   std::list< Codec > mCodecs;
 
diff --git a/src/gui/qt/ConfigurationPanel.ui b/src/gui/qt/ConfigurationPanel.ui
index 3d2016dbd9..2f7db9b344 100644
--- a/src/gui/qt/ConfigurationPanel.ui
+++ b/src/gui/qt/ConfigurationPanel.ui
@@ -741,22 +741,37 @@
                     <attribute name="title">
                         <string>Drivers</string>
                     </attribute>
-                    <widget class="QButtonGroup">
-                        <property name="name">
-                            <cstring>DriverChoice</cstring>
-                        </property>
-                        <property name="geometry">
-                            <rect>
-                                <x>10</x>
-                                <y>10</y>
-                                <width>410</width>
-                                <height>180</height>
-                            </rect>
-                        </property>
-                        <property name="title">
-                            <string>Drivers list</string>
-                        </property>
-                    </widget>
+<widget class="QLayoutWidget">
+ <property name="geometry">
+    <rect><x>0</x><y>0</y><width>410</width><height>360</height></rect>
+ </property>
+ <vbox>
+   <widget class="QVButtonGroup">
+    <property name="name"><cstring>DriverChoice</cstring></property>
+    <property name="title"><string>Driver for Speaker</string></property>
+   </widget>
+   <widget class="QVButtonGroup">
+    <property name="name"><cstring>DriverChoiceIn</cstring></property>
+    <property name="title"><string>Driver for Microphone</string></property>
+   </widget>
+  <widget class="QLayoutWidget">
+   <property name="name"><cstring>layoutforsounddriver</cstring></property>
+   <hbox>
+    <property name="name"><cstring>unnamed</cstring></property>
+    <widget class="QPushButton">
+     <property name="name"><cstring>buttonTestSoundDriver</cstring></property>
+     <property name="enabled"><bool>true</bool></property>
+     <property name="text"><string>Test</string></property>
+    </widget>
+    <widget class="QLabel">
+     <property name="name"><cstring>lblSoundDriver</cstring></property>
+     <property name="text"><string></string></property>
+     <property name="paletteForegroundColor"><color><red>255</red><green>0</green><blue>0</blue></color></property>
+    </widget>
+   </hbox>
+  </widget>
+ </vbox>
+</widget>
                 </widget>
                 <widget class="QWidget">
                     <property name="name">
@@ -766,7 +781,7 @@
                         <string>Codecs</string>
                     </attribute>
                     <widget class="QButtonGroup">
-                        <property name="name">
+                       <property name="name">
                             <cstring>CodecsChoice</cstring>
                         </property>
                         <property name="geometry">
@@ -1405,12 +1420,30 @@ Montreal, Quebec H2T 1S6&lt;/p&gt;</string>
         <receiver>ConfigurationPanel</receiver>
         <slot>changeTabSlot()</slot>
     </connection>
+    <connection>
+        <sender>buttonRegister</sender>
+        <signal>clicked()</signal>
+        <receiver>ConfigurationPanel</receiver>
+        <slot>slotRegister()</slot>
+    </connection>
     <connection>
         <sender>DriverChoice</sender>
         <signal>clicked(int)</signal>
         <receiver>ConfigurationPanel</receiver>
         <slot>driverSlot(int)</slot>
     </connection>
+    <connection>
+        <sender>DriverChoiceIn</sender>
+        <signal>clicked(int)</signal>
+        <receiver>ConfigurationPanel</receiver>
+        <slot>driverSlotIn(int)</slot>
+    </connection>
+    <connection>
+        <sender>buttonTestSoundDriver</sender>
+        <signal>clicked()</signal>
+        <receiver>ConfigurationPanel</receiver>
+        <slot>slotTestSoundDriver()</slot>
+    </connection>
     <connection>
         <sender>buttonCancel</sender>
         <signal>clicked()</signal>
@@ -1462,6 +1495,7 @@ Montreal, Quebec H2T 1S6&lt;/p&gt;</string>
     <tabstop>sendDTMFas</tabstop>
     <tabstop>Menu</tabstop>
     <tabstop>Tab_Audio</tabstop>
+    <tabstop>buttonTestSoundDriver</tabstop>
     <tabstop>codec1</tabstop>
     <tabstop>codec2</tabstop>
     <tabstop>codec3</tabstop>
@@ -1474,20 +1508,26 @@ Montreal, Quebec H2T 1S6&lt;/p&gt;</string>
 </includes>
 <signals>
     <signal>needRegister()</signal>
+    <signal>soundDriverChanged()</signal>
 </signals>
 <slots>
     <slot>generate()</slot>
-    <slot>slotRegisterFailed( QString )</slot>
-    <slot>slotRegisterSucceed( QString )</slot>
+    <slot>slotRegister()</slot>
+    <slot>slotRegisterReturn( bool, QString )</slot>
+    <slot>slotTestSoundDriver()</slot>
+    <slot>slotSoundDriverReturn( bool, QString )</slot>
     <slot>saveSlot()</slot>
     <slot>changeTabSlot()</slot>
     <slot>useStunSlot( int id )</slot>
     <slot>applySkinSlot()</slot>
     <slot>driverSlot( int id )</slot>
+    <slot>driverSlotIn( int id )</slot>
     <slot>updateSkins()</slot>
     <slot>updateRingtones()</slot>
     <slot>updateCodecs()</slot>
     <slot>updateAudioDevices()</slot>
+    <slot>updateAudioDevicesIn()</slot>
+    <slot>updateAudioDevicesOut()</slot>
     <slot>SkinChoice_selected( const QString &amp; )</slot>
 </slots>
 <functions>
diff --git a/src/gui/qt/ConfigurationPanel.ui.h b/src/gui/qt/ConfigurationPanel.ui.h
index fe7c445f70..0e81493e93 100644
--- a/src/gui/qt/ConfigurationPanel.ui.h
+++ b/src/gui/qt/ConfigurationPanel.ui.h
@@ -34,6 +34,7 @@
 #include <qmessagebox.h>
 #include <qstringlist.h>
 #include <qcolor.h>
+#include <qvbuttongroup.h>
 
 #include "globals.h"
 #include "ConfigurationManager.hpp"
@@ -109,12 +110,6 @@ void ConfigurationPanel::init()
 			 TransparentWidget::retreive(ABOUT_IMAGE),
 			 "About", 
 			 Menu);
-    
-    // we save the configuration, then we try to register
-    QObject::connect(buttonRegister, SIGNAL(clicked()), this, SLOT(saveSlot()));
-    QObject::connect(buttonRegister, SIGNAL(clicked()),
-		     this, SIGNAL(needRegister()));
-
 }
 
 void 
@@ -129,8 +124,7 @@ ConfigurationPanel::generate()
 			 .get(AUDIO_SECTION, AUDIO_CODEC3));
 
 
-  ringsChoice->setCurrentText(ConfigurationManager::instance()
-			      .get(AUDIO_SECTION,
+  ringsChoice->setCurrentText(ConfigurationManager::instance().get(AUDIO_SECTION,
 				   AUDIO_RINGTONE));
   
   QString account = ACCOUNT_DEFAULT_NAME;
@@ -171,11 +165,17 @@ ConfigurationPanel::generate()
   QRadioButton* device = 
     static_cast< QRadioButton * >(DriverChoice->find(ConfigurationManager::instance()
 						     .get(AUDIO_SECTION, 
-							  AUDIO_DEFAULT_DEVICE).toUInt()));
+							  AUDIO_DEFAULT_DEVICEOUT).toUInt()));
   if(device) {
     device->setChecked(true);
   }
 
+  device = static_cast< QRadioButton * >(DriverChoiceIn->find(ConfigurationManager::instance()
+	.get(AUDIO_SECTION, AUDIO_DEFAULT_DEVICEIN).toUInt()));
+  if (device) {
+    device->setChecked(true);
+  }
+
   //preference tab
   updateSkins();
 }
@@ -220,33 +220,25 @@ void ConfigurationPanel::saveSlot()
 				       QString::number(sendDTMFas->currentItem()));
 
   if (codec1->currentText() != NULL) {
-    ConfigurationManager::instance().set(AUDIO_SECTION, 
-				       AUDIO_CODEC1,
-				       codec1->currentText());
+    ConfigurationManager::instance().set(AUDIO_SECTION, AUDIO_CODEC1, codec1->currentText());
   }
   if (codec2->currentText() != NULL) {
-    ConfigurationManager::instance().set(AUDIO_SECTION,
-				       AUDIO_CODEC2,
-				       codec2->currentText());
+    ConfigurationManager::instance().set(AUDIO_SECTION, AUDIO_CODEC2, codec2->currentText());
   }
   if (codec3->currentText() != NULL) {
-    ConfigurationManager::instance().set(AUDIO_SECTION,
-				       AUDIO_CODEC3,
-				       codec3->currentText());
+    ConfigurationManager::instance().set(AUDIO_SECTION, AUDIO_CODEC3, codec3->currentText());
   }
   
   if (ringsChoice->currentText() != NULL) {
-    ConfigurationManager::instance().set(AUDIO_SECTION,
-					 AUDIO_RINGTONE,
-					 ringsChoice->currentText());
+    ConfigurationManager::instance().set(AUDIO_SECTION, AUDIO_RINGTONE, ringsChoice->currentText());
   }
 
   SkinManager::instance().load(SkinChoice->currentText());
   SkinManager::instance().save();
 
 #if 0 
-  QMessageBox::information(this, "Save settings",
-			   "You must restart SFLPhone",
+  QMessageBox::information(this, tr("Save settings"),
+			   tr("You must restart SFLPhone"),
 			   QMessageBox::Yes);
 #endif
 
@@ -258,14 +250,14 @@ void ConfigurationPanel::changeTabSlot()
 {
   switch (Menu->currentItem()) {
   case 0:
-    TitleTab->setText("Setup signalisation");
+    TitleTab->setText(tr("Setup signalisation"));
     Tab_Signalisations->show();
     Tab_Audio->hide();
     Tab_Preferences->hide();
     Tab_About->hide();
     break;
   case 1:
-    TitleTab->setText("Setup audio");
+    TitleTab->setText(tr("Setup audio"));
     Tab_Signalisations->hide();
     Tab_Audio->show();
     Tab_Preferences->hide();
@@ -273,14 +265,14 @@ void ConfigurationPanel::changeTabSlot()
     break;
   case 2:
     updateSkins();
-    TitleTab->setText("Setup preferences");
+    TitleTab->setText(tr("Setup preferences"));
     Tab_Signalisations->hide();
     Tab_Audio->hide();
     Tab_Preferences->show();
     Tab_About->hide();
     break; 
   case 3:
-    TitleTab->setText("About");
+    TitleTab->setText(tr("About"));
     Tab_Signalisations->hide();
     Tab_Audio->hide();
     Tab_Preferences->hide();
@@ -308,8 +300,19 @@ void ConfigurationPanel::applySkinSlot()
 void ConfigurationPanel::driverSlot(int id)
 {
   ConfigurationManager::instance().set(AUDIO_SECTION, 
-				       AUDIO_DEFAULT_DEVICE, 
+				       AUDIO_DEFAULT_DEVICEOUT, 
+				       QString::number(id));
+  lblSoundDriver->setPaletteForegroundColor(black);
+  lblSoundDriver->setText(tr("Not tested"));
+}
+
+void ConfigurationPanel::driverSlotIn(int id)
+{
+  ConfigurationManager::instance().set(AUDIO_SECTION, 
+				       AUDIO_DEFAULT_DEVICEIN, 
 				       QString::number(id));
+  lblSoundDriver->setPaletteForegroundColor(black);
+  lblSoundDriver->setText(tr("Not tested"));
 }
 
 void ConfigurationPanel::updateSkins()
@@ -346,8 +349,55 @@ void ConfigurationPanel::updateCodecs()
     codec3->insertItem(pos->codecName);
   } 
 }
-  
 
+void ConfigurationPanel::updateAudioDevicesIn() 
+{
+  static std::list< QRadioButton * > buttonsIn;
+  while(buttonsIn.begin() != buttonsIn.end()) {
+    DriverChoiceIn->remove(*buttonsIn.begin());
+    buttonsIn.pop_front();
+  }
+  int top = 0;
+
+  //In
+  std::list< AudioDevice > audio = ConfigurationManager::instance().getAudioDevicesIn();
+  std::list< AudioDevice >::iterator pos;
+
+  for (pos = audio.begin(); pos != audio.end(); pos++) {
+    QString hostApiName = pos->hostApiName;
+    QString deviceName = pos->deviceName;
+    
+    QString name = hostApiName + 
+      QObject::tr(" (device #%1)").arg(pos->index);
+    
+    // New radio button with found device name
+    QRadioButton* device = new QRadioButton(DriverChoiceIn);
+    buttonsIn.push_back(device);
+    DriverChoiceIn->insert(device, pos->index.toUInt());
+    //device->setGeometry( QRect( 10, 30 + top, 360, 21 ) );
+    // Set label of radio button
+    //device->setText(deviceName);
+    // Add tooltip for each one
+    QString text = deviceName + " " + name;
+    
+    if(text.length() > 50) {
+      device->setText(text.left(50) + "...");
+    }
+    else {
+      device->setText(text);
+    }
+    
+    QToolTip::add(device, text);
+    top += 30;
+  }
+  // Set position of the button group, with appropriate length
+  //DriverChoiceIn->setGeometry( QRect( 10, 200, 410, top + 30 ) );
+}
+
+void ConfigurationPanel::updateAudioDevicesOut() 
+{
+  updateAudioDevices();
+}
 
 void ConfigurationPanel::updateAudioDevices()
 {
@@ -359,7 +409,7 @@ void ConfigurationPanel::updateAudioDevices()
   }
 
   int top = 0;
-  std::list< AudioDevice > audio = ConfigurationManager::instance().getAudioDevices();
+  std::list< AudioDevice > audio = ConfigurationManager::instance().getAudioDevicesOut();
   std::list< AudioDevice >::iterator pos;
   
   for (pos = audio.begin(); pos != audio.end(); pos++) {
@@ -373,7 +423,7 @@ void ConfigurationPanel::updateAudioDevices()
     QRadioButton* device = new QRadioButton(DriverChoice); 
     buttons.push_back(device);
     DriverChoice->insert(device, pos->index.toUInt());
-    device->setGeometry( QRect( 10, 30 + top, 390, 21 ) );
+    //device->setGeometry( QRect( 10, 30 + top, 360, 21 ) );
     // Set label of radio button
     //device->setText(deviceName);
     // Add tooltip for each one
@@ -391,8 +441,10 @@ void ConfigurationPanel::updateAudioDevices()
     
     top += 30;
   }
+  
   // Set position of the button group, with appropriate length
-  DriverChoice->setGeometry( QRect( 10, 10, 410, top + 30 ) );
+  //DriverChoice->setGeometry( QRect( 10, 10, 410, top + 30 ) );
+
 }
 
 
@@ -402,19 +454,42 @@ ConfigurationPanel::SkinChoice_selected( const QString & )
 
 }
 
+void
+ConfigurationPanel::slotRegister()
+{
+  saveSlot();
+  emit needRegister();
+}
+
 void 
-ConfigurationPanel::slotRegisterFailed( QString message ) 
+ConfigurationPanel::slotRegisterReturn( bool hasError, QString ) 
+{
+  if (hasError) {
+    lblError->setPaletteForegroundColor(red); // red
+    lblError->setText("Register failed");
+  } else {
+    lblError->setPaletteForegroundColor(black); // black
+    lblError->setText("Register Succeed");
+  }
+  lblError->show();
+}
+
+void ConfigurationPanel::slotTestSoundDriver()
 {
-	lblError->setPaletteForegroundColor(QColor(255,0,0)); // red
-	lblError->setText("Register failed");
-	lblError->show();
+  ConfigurationManager::instance().save(AUDIO_SECTION, AUDIO_DEFAULT_DEVICEOUT);
+  ConfigurationManager::instance().save(AUDIO_SECTION, AUDIO_DEFAULT_DEVICEIN);
+  emit soundDriverChanged();
 }
 
 void 
-ConfigurationPanel::slotRegisterSucceed( QString message ) 
+ConfigurationPanel::slotSoundDriverReturn( bool hasError, QString message ) 
 {
-	lblError->setPaletteForegroundColor(QColor(0,0,0)); // black
-	lblError->setText("Register Succeed");
-	lblError->show(); 
+  if (hasError) { // no error
+    lblSoundDriver->setPaletteForegroundColor(red); // error in red
+  } else {
+    lblSoundDriver->setPaletteForegroundColor(black);
+  }
+  lblSoundDriver->setText(message);
+  lblSoundDriver->show();
 }
 
diff --git a/src/gui/qt/PhoneLineManagerImpl.cpp b/src/gui/qt/PhoneLineManagerImpl.cpp
index 960c763a18..9d0e5441c4 100644
--- a/src/gui/qt/PhoneLineManagerImpl.cpp
+++ b/src/gui/qt/PhoneLineManagerImpl.cpp
@@ -68,14 +68,10 @@ PhoneLineManagerImpl::PhoneLineManagerImpl()
   EventFactory::instance().registerEvent< BusyStatus >("114");
   EventFactory::instance().registerEvent< CongestionStatus >("115");
   EventFactory::instance().registerEvent< WrongNumberStatus >("116");
-  QObject::connect(this, SIGNAL(disconnected()),
-		   this, SLOT(closeSession()));
-  QObject::connect(this, SIGNAL(readyToHandleEvents()),
-		   this, SLOT(handleEvents()));
-  QObject::connect(this, SIGNAL(connected()),
-		   this, SIGNAL(readyToSendStatus()));
-  QObject::connect(this, SIGNAL(readyToSendStatus()),
-		   this, SLOT(startSession()));
+  QObject::connect(this, SIGNAL(disconnected()),        this, SLOT(closeSession()));
+  QObject::connect(this, SIGNAL(readyToHandleEvents()), this, SLOT(handleEvents()));
+  QObject::connect(this, SIGNAL(connected()),           this, SIGNAL(readyToSendStatus()));
+  QObject::connect(this, SIGNAL(readyToSendStatus()),   this, SLOT(startSession()));
   
 }
 
@@ -129,10 +125,10 @@ PhoneLineManagerImpl::connect()
 }
 
 void
-PhoneLineManagerImpl::registerToServer()
+PhoneLineManagerImpl::slotRegisterToServer()
 {
   isInitialized();
-  
+
   Request *r = mSession->registerToServer();
   QObject::connect(r, SIGNAL(success(QString, QString)),
 		   this, SLOT(slotRegisterSucceed(QString, QString)));
@@ -141,17 +137,42 @@ PhoneLineManagerImpl::registerToServer()
 }
 
 void 
-PhoneLineManagerImpl::slotRegisterSucceed(QString /*code*/, QString message) 
+PhoneLineManagerImpl::slotRegisterSucceed(QString message, QString /* code */) 
 {
-  emit registerSucceed(message);
+  emit registerReturn(false, message);
 }
 
 void 
-PhoneLineManagerImpl::slotRegisterFailed(QString /*code*/, QString message) 
+PhoneLineManagerImpl::slotRegisterFailed(QString message, QString /* code */) 
 {
-  emit registerFailed(message);
+  // it's true, we have error
+  emit registerReturn(true, message);
 }
 
+void
+PhoneLineManagerImpl::slotReloadSoundDriver()
+{
+  Request *r = mSession->switchAudioDriver();
+  QObject::connect(r, SIGNAL(success(QString, QString)),
+		   this, SLOT(slotSoundDriverSucceed(QString, QString)));
+  QObject::connect(r, SIGNAL(error(QString, QString)),
+		   this, SLOT(slotSoundDriverFailed(QString,QString)));
+}
+
+void 
+PhoneLineManagerImpl::slotSoundDriverSucceed(QString message, QString /* code */) 
+{
+  emit testSoundDriverReturn(false, message);
+}
+
+void 
+PhoneLineManagerImpl::slotSoundDriverFailed(QString message, QString /* code */) 
+{
+  // it's true, we have error
+  emit testSoundDriverReturn(true, message);
+}
+
+
 void
 PhoneLineManagerImpl::stop()
 {
@@ -194,6 +215,7 @@ PhoneLineManagerImpl::handleEvents()
   QObject::connect(r, SIGNAL(success(QString, QString)),
 		   &ConfigurationManager::instance(), SIGNAL(ringtonesUpdated()));
   
+/*
   r = mSession->list("audiodevice");
   QObject::connect(r, SIGNAL(parsedEntry(QString, QString, QString, QString, QString)),
 		   &ConfigurationManager::instance(), SLOT(addAudioDevice(QString, 
@@ -201,6 +223,22 @@ PhoneLineManagerImpl::handleEvents()
 									  QString)));
   QObject::connect(r, SIGNAL(success(QString, QString)),
 		   &ConfigurationManager::instance(), SIGNAL(audioDevicesUpdated()));
+*/
+  r = mSession->list("audiodevicein");
+  QObject::connect(r, SIGNAL(parsedEntry(QString, QString, QString, QString, QString)),
+		   &ConfigurationManager::instance(), SLOT(addAudioDeviceIn(QString, 
+									  QString,
+									  QString)));
+  QObject::connect(r, SIGNAL(success(QString, QString)),
+		   &ConfigurationManager::instance(), SIGNAL(audioDevicesInUpdated()));
+
+  r = mSession->list("audiodeviceout");
+  QObject::connect(r, SIGNAL(parsedEntry(QString, QString, QString, QString, QString)),
+		   &ConfigurationManager::instance(), SLOT(addAudioDeviceOut(QString, 
+									  QString,
+									  QString)));
+  QObject::connect(r, SIGNAL(success(QString, QString)),
+		   &ConfigurationManager::instance(), SIGNAL(audioDevicesOutUpdated()));
 
   r = mSession->list("codecdescriptor");
   QObject::connect(r, SIGNAL(parsedEntry(QString, QString, QString, QString, QString)),
diff --git a/src/gui/qt/PhoneLineManagerImpl.hpp b/src/gui/qt/PhoneLineManagerImpl.hpp
index dbb6a02825..924d59b3fb 100644
--- a/src/gui/qt/PhoneLineManagerImpl.hpp
+++ b/src/gui/qt/PhoneLineManagerImpl.hpp
@@ -82,9 +82,8 @@ signals:
   void lineStatusSet(QString);
   void talkingStarted(QTime);
   void talkingStopped();
-  void registerFailed(QString);
-  void registerSucceed(QString);
-
+  void registerReturn(bool, QString);
+  void testSoundDriverReturn(bool, QString);
   void stopped();
 
   void volumeUpdated(int);
@@ -97,9 +96,12 @@ public slots:
 
   void hasDisconnected();
 
-  void registerToServer();
+  void slotRegisterToServer();
   void slotRegisterFailed(QString, QString);
   void slotRegisterSucceed(QString, QString);
+  void slotReloadSoundDriver();
+  void slotSoundDriverFailed(QString, QString);
+  void slotSoundDriverSucceed(QString, QString);
 
   /**
    * You need to call this function once. It must be
diff --git a/src/gui/qt/Request.cpp b/src/gui/qt/Request.cpp
index c563888a43..81e83290f8 100644
--- a/src/gui/qt/Request.cpp
+++ b/src/gui/qt/Request.cpp
@@ -60,8 +60,10 @@ Request::onError(const QString &code, const QString &message)
     .arg(code)
     .arg(mSequenceId)
     .arg(message);
+  QString messageDecoded = message;
+  Url::decode(messageDecoded);
 
-  emit error(message, code);
+  emit error(messageDecoded, code);
 }
 
 void
@@ -111,8 +113,10 @@ Request::onSuccess(const QString &code, const QString &message)
     .arg(code)
     .arg(mSequenceId)
     .arg(message);
+  QString messageDecoded = message;
+  Url::decode(messageDecoded);
 
-  emit success(message, code);
+  emit success(messageDecoded, code);
 }
 
 QString
diff --git a/src/gui/qt/SFLPhoneApp.cpp b/src/gui/qt/SFLPhoneApp.cpp
index 651c788fb5..e26a4e3f31 100644
--- a/src/gui/qt/SFLPhoneApp.cpp
+++ b/src/gui/qt/SFLPhoneApp.cpp
@@ -58,6 +58,7 @@ SFLPhoneApp::SFLPhoneApp(int argc, char **argv)
   Requester::instance().registerObject< Request >(QString("playdtmf"));
 
   Requester::instance().registerObject< Request >(QString("register"));
+  Requester::instance().registerObject< Request >(QString("switch"));
   Requester::instance().registerObject< ConfigGetAllRequest >(QString("configgetall"));
   Requester::instance().registerObject< ConfigSaveRequest >(QString("configsave"));
   Requester::instance().registerObject< StopRequest >(QString("stop"));
@@ -126,9 +127,15 @@ SFLPhoneApp::initConnections(SFLPhoneWindow *w)
 
 
   QObject::connect(w, SIGNAL(needRegister()),
-		   &PhoneLineManager::instance(), SLOT(registerToServer()));
-  QObject::connect(&PhoneLineManager::instance(), SIGNAL(registerFailed(QString)), w, SIGNAL(registerFailed(QString)));
-  QObject::connect(&PhoneLineManager::instance(), SIGNAL(registerSucceed(QString)), w, SIGNAL(registerSucceed(QString)));
+                   &PhoneLineManager::instance(), SLOT(slotRegisterToServer()));
+  QObject::connect(&PhoneLineManager::instance(), SIGNAL(registerReturn(bool, QString)), 
+                   w, SIGNAL(registerReturn(bool, QString)));
+
+  QObject::connect(w, SIGNAL(soundDriverChanged()),
+                   &PhoneLineManager::instance(), SLOT(slotReloadSoundDriver()));
+  QObject::connect(&PhoneLineManager::instance(), SIGNAL(testSoundDriverReturn(bool, QString)), 
+                   w, SIGNAL(testSoundDriverReturn(bool, QString)));
+
 
   //QObject::connect(&PhoneLineManager::instance(), SIGNAL(registered()),
   //		   w, SIGNAL(registered()));
@@ -231,6 +238,10 @@ SFLPhoneApp::initConnections(SFLPhoneWindow *w)
 		   w, SIGNAL(ringtonesUpdated()));
   QObject::connect(&ConfigurationManager::instance(), SIGNAL(audioDevicesUpdated()),
 		   w, SIGNAL(audioDevicesUpdated()));
+  QObject::connect(&ConfigurationManager::instance(), SIGNAL(audioDevicesInUpdated()),
+		   w, SIGNAL(audioDevicesInUpdated()));
+  QObject::connect(&ConfigurationManager::instance(), SIGNAL(audioDevicesOutUpdated()),
+		   w, SIGNAL(audioDevicesOutUpdated()));
   QObject::connect(&ConfigurationManager::instance(), SIGNAL(codecsUpdated()),
 		   w, SIGNAL(codecsUpdated()));
   //QObject::connect(&ConfigurationManager::instance(), SIGNAL(saved()),
diff --git a/src/gui/qt/SFLPhoneWindow.cpp b/src/gui/qt/SFLPhoneWindow.cpp
index 1e8928b023..79f35e10fb 100644
--- a/src/gui/qt/SFLPhoneWindow.cpp
+++ b/src/gui/qt/SFLPhoneWindow.cpp
@@ -58,18 +58,20 @@ SFLPhoneWindow::SFLPhoneWindow()
 {
   mLastWindowPos = pos();
   mSetupPanel = new ConfigurationPanel(this, "ConfigurationPanel");
-  connect(this, SIGNAL(ringtonesUpdated()),
-	  mSetupPanel, SLOT(updateRingtones()));
-  connect(this, SIGNAL(audioDevicesUpdated()),
-	  mSetupPanel, SLOT(updateAudioDevices()));
-  connect(this, SIGNAL(codecsUpdated()),
-	  mSetupPanel, SLOT(updateCodecs()));
-  connect(mSetupPanel, SIGNAL(needRegister()), 
-          this, SIGNAL(needRegister()));
-  connect(this, SIGNAL(registerFailed(QString)),
-	  mSetupPanel, SLOT(slotRegisterFailed(QString)));
-  connect(this, SIGNAL(registerSucceed(QString)),
-	  mSetupPanel, SLOT(slotRegisterSucceed(QString)));
+  connect(this, SIGNAL(ringtonesUpdated()),      mSetupPanel, SLOT(updateRingtones()));
+  connect(this, SIGNAL(audioDevicesUpdated()),   mSetupPanel, SLOT(updateAudioDevices()));
+  connect(this, SIGNAL(audioDevicesInUpdated()), mSetupPanel, SLOT(updateAudioDevicesIn()));
+  connect(this, SIGNAL(audioDevicesOutUpdated()),mSetupPanel, SLOT(updateAudioDevicesOut()));
+  connect(this, SIGNAL(codecsUpdated()),         mSetupPanel, SLOT(updateCodecs()));
+
+  connect(mSetupPanel, SIGNAL(needRegister()), this, SIGNAL(needRegister()));
+  connect(this, SIGNAL(registerReturn(bool, QString)),  mSetupPanel, SLOT(slotRegisterReturn(bool, QString)));
+  
+  // when we receive a signal from mSetupPanel, we should resend one to...
+  connect(mSetupPanel, SIGNAL(soundDriverChanged()), this, SIGNAL(soundDriverChanged()));
+
+  // we are an intermediate... 
+  connect(this, SIGNAL(testSoundDriverReturn(bool, QString)),  mSetupPanel, SLOT(slotSoundDriverReturn(bool, QString)));
 
   // Initialize the background image
   setName("main");
diff --git a/src/gui/qt/SFLPhoneWindow.hpp b/src/gui/qt/SFLPhoneWindow.hpp
index d8679b5e17..b32e817442 100644
--- a/src/gui/qt/SFLPhoneWindow.hpp
+++ b/src/gui/qt/SFLPhoneWindow.hpp
@@ -62,11 +62,15 @@ signals:
   void needToCloseDaemon();
   void ringtonesUpdated();
   void audioDevicesUpdated();
+  void audioDevicesInUpdated();
+  void audioDevicesOutUpdated();
   void codecsUpdated();
+
   void needRegister();
-  void registerFailed(QString);
-  void registerSucceed(QString);
+  void registerReturn(bool, QString);
 
+  void soundDriverChanged();
+  void testSoundDriverReturn(bool, QString);
 
 public slots:
   void delayedMove(const QPoint &point);
diff --git a/src/gui/qt/Session.cpp b/src/gui/qt/Session.cpp
index 9491565ac6..1647687321 100644
--- a/src/gui/qt/Session.cpp
+++ b/src/gui/qt/Session.cpp
@@ -1,5 +1,6 @@
-/**
- *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+/*
+ *  Copyright (C) 2004-2006 Savoir-Faire Linux inc.
+ *  Author: Yan Morin <yan.morin@savoirfairelinux.com>
  *  Author: Jean-Philippe Barrette-LaPierre
  *             <jean-philippe.barrette-lapierre@savoirfairelinux.com>
  *                                                                              
@@ -82,7 +83,6 @@ Session::configSet(const QString &section,
   return Requester::instance().send(mId, "configset", args);
 }
 
-
 Request * 
 Session::configGetAll() const
 {
@@ -167,6 +167,14 @@ Session::registerToServer() const
   return Requester::instance().send(mId, "register", args);
 }
 
+Request *
+Session::switchAudioDriver() const
+{
+  std::list< QString > args; 
+  args.push_back("audiodriver");
+  return Requester::instance().send(mId, "switch", args);
+}
+
 Account
 Session::getAccount(const QString &name) const
 {
diff --git a/src/gui/qt/Session.hpp b/src/gui/qt/Session.hpp
index 1d79d63144..cfd997b9c5 100644
--- a/src/gui/qt/Session.hpp
+++ b/src/gui/qt/Session.hpp
@@ -1,5 +1,6 @@
-/**
- *  Copyright (C) 2004-2005 Savoir-Faire Linux inc.
+/*
+ *  Copyright (C) 2004-2006 Savoir-Faire Linux inc.
+ *  Author: Yan Morin <yan.morin@savoirfairelinux.com>
  *  Author: Jean-Philippe Barrette-LaPierre
  *             <jean-philippe.barrette-lapierre@savoirfairelinux.com>
  *                                                                              
@@ -77,14 +78,17 @@ class Session
    */
   Request *registerToServer() const;
 
+  /**
+   * This function try to switch audio (sound) driver
+   */
+  Request *switchAudioDriver() const;
+
   /**
    * This function will stop sflphoned.
    */
   Request *stop() const;
 
-  Request *configSet(const QString &section, 
-		    const QString &name,
-		    const QString &value) const;
+  Request *configSet(const QString &section, const QString &name, const QString &value) const;
   Request *configSave() const;
   Request *configGetAll() const;
 
diff --git a/src/gui/qt/globals.h b/src/gui/qt/globals.h
index 80565bebd6..64933f858c 100644
--- a/src/gui/qt/globals.h
+++ b/src/gui/qt/globals.h
@@ -27,6 +27,9 @@
 
 #define AUDIO_SECTION "Audio"
 #define AUDIO_DEFAULT_DEVICE "Drivers.driverName"
+#define AUDIO_DEFAULT_DEVICEIN "Drivers.driverNameIn"
+#define AUDIO_DEFAULT_DEVICEOUT "Drivers.driverNameOut"
+
 #define AUDIO_CODEC1 "Codecs.codec1"
 #define AUDIO_CODEC2 "Codecs.codec2"
 #define AUDIO_CODEC3 "Codecs.codec3"
diff --git a/src/gui/server/requestconfig.cpp b/src/gui/server/requestconfig.cpp
index c87376bcb5..e06c2602de 100644
--- a/src/gui/server/requestconfig.cpp
+++ b/src/gui/server/requestconfig.cpp
@@ -296,10 +296,11 @@ RequestSwitch::RequestSwitch(const std::string &sequenceId, const TokenList& arg
 ResponseMessage
 RequestSwitch::execute()
 {
-  if (GUIServer::instance().setSwitch(_switchName)) {
-    return message("200", _("OK"));
+  std::string switchMessage;
+  if (GUIServer::instance().setSwitch(_switchName, switchMessage)) {
+    return message("200", switchMessage);
   } else {
-    return message("500",_("Server Error"));
+    return message("500", switchMessage);
   }
 }
 
diff --git a/src/managerimpl.cpp b/src/managerimpl.cpp
index 6ccde181ce..ae9f04f765 100644
--- a/src/managerimpl.cpp
+++ b/src/managerimpl.cpp
@@ -892,15 +892,15 @@ ManagerImpl::notificationIncomingCall(void) {
 
   AudioLayer* audiolayer = getAudioDriver();
   if (audiolayer != 0) {
-    unsigned int sampleRate = audiolayer->getSampleRate();
+    unsigned int samplerate = audiolayer->getSampleRate();
     std::ostringstream frequency;
     frequency << "440/" << FRAME_PER_BUFFER;
 
-    Tone tone(frequency.str(), sampleRate, audiolayer->getOutChannel());
-    unsigned int nbInt16 = tone.getSize();
-    int16 buf[nbInt16];
+    Tone tone(frequency.str(), samplerate, audiolayer->getOutChannel());
+    unsigned int nbint16 = tone.getSize();
+    int16 buf[nbint16];
     tone.getNext(buf, tone.getSize());
-    audiolayer->putUrgent(buf, sizeof(int16)*nbInt16);
+    audiolayer->putUrgent(buf, sizeof(int16)*nbint16);
   }
 }
 
@@ -1093,6 +1093,7 @@ ManagerImpl::selectAudioDriver (void)
         noDeviceOut = 0;
       }
     }
+    _debug(" Setting audiolayer to device in=%d and out=%d\n", noDeviceIn, noDeviceOut);
     _debugInit(" AudioLayer Opening Device");
     _audiodriverPA->openDevice(noDeviceIn, noDeviceOut);
   } catch(...) {
@@ -1433,6 +1434,7 @@ ManagerImpl::getAudioDeviceList(const std::string& sequenceId, int ioDeviceMask)
   } catch (...) {
     returnValue = false;
   }
+
   return returnValue;
 }
 
@@ -1495,34 +1497,44 @@ ManagerImpl::getDirListing(const std::string& sequenceId, const std::string& pat
  * Experimental...
  */
 bool
-ManagerImpl::setSwitch(const std::string& switchName) {
+ManagerImpl::setSwitch(const std::string& switchName, std::string& message) {
   if (switchName == "audiodriver" ) {
     try 
       {
         selectAudioDriver();
+        message = _("Change with success");
+        playDtmf('9');
+        getAudioDriver()->sleep(300); // in milliseconds
+        playDtmf('1');
+        getAudioDriver()->sleep(300); // in milliseconds
+        playDtmf('1');
         return true;
       }
     catch (const portaudio::PaException &e) 
       {
         getAudioDriver()->setErrorMessage(e.paErrorText());
         _debug("Portaudio exception: %s\n", e.paErrorText());
+        message = e.paErrorText();
         return false;
       }
     catch (const portaudio::PaCppException &e) 
       {
         getAudioDriver()->setErrorMessage(e.what());
         _debug("Portaudio exception: %s\n", e.what());
+        message = e.what();
         return false;
       }
     catch (const std::runtime_error &e) 
       {
         getAudioDriver()->setErrorMessage(e.what());
         _debug("Portaudio exception: %s\n", e.what());
+        message = e.what();
         return false;
       } 
     catch(...) 
       {
         _debug("Portaudio exception: <unknown>\n");
+        message = _("Sound error, please use another configuration");
         return false;
       }
   } else {
diff --git a/src/managerimpl.h b/src/managerimpl.h
index e12c51908e..31c655a78e 100644
--- a/src/managerimpl.h
+++ b/src/managerimpl.h
@@ -202,8 +202,14 @@ public:
   bool setConfig(const std::string& section, const std::string& name, int value);
   bool getConfigList(const std::string& sequenceId, const std::string& name);
   void selectAudioDriver(void);
-  /** Set Audio Driver with switchName == audiodriver */
-  bool setSwitch(const std::string& switchName);
+  /** 
+   * Set Audio Driver with switchName == audiodriver 
+   * @param sflphoned internal parameter to change
+   * @param message to return to the user
+   * @return true if everything is ok
+   */
+  
+  bool setSwitch(const std::string& switchName, std::string& message);
 
   // configuration function for extern
   // throw an Conf::ConfigTreeItemException if not found
-- 
GitLab