This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository x2goclient. commit 1f2e09f67938ab1830d9e13c8c750d1090bc85c3 Author: Oleksandr Shneyder <o.shneyder@phoca-gmbh.de> Date: Mon May 15 20:27:31 2017 +0200 Disable/Enable PulseAudio in config dialog. New command line options: --disable-pulse to disable start of PulseAudio --disable-pulse-record to disable audio input. --- debian/changelog | 4 +++ src/configdialog.cpp | 40 +++++++++++++++++++++++++++-- src/configdialog.h | 7 ++++++ src/help.cpp | 4 +++ src/onmainwindow.cpp | 71 ++++++++++++++++++++++++++++++++++++++++++---------- src/onmainwindow.h | 13 ++++++++++ src/pulsemanager.cpp | 9 ++++--- src/pulsemanager.h | 8 +++--- 8 files changed, 133 insertions(+), 23 deletions(-) diff --git a/debian/changelog b/debian/changelog index 99cbffd..b1a0ec9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -165,6 +165,10 @@ x2goclient (4.1.0.1-0x2go1) UNRELEASED; urgency=medium - Move PulseManager MsgBox functions to main window: GUI functions should be used only from main thread. - Check "norecord" option on the first start of PulseAudio. + - Disable/Enable PulseAudio in config dialog. + New command line options: + --disable-pulse to disable start of PulseAudio + --disable-pulse-record to disable audio input. [ Robert Parts ] * New upstream version (4.1.0.1): diff --git a/src/configdialog.cpp b/src/configdialog.cpp index 991e030..481948d 100644 --- a/src/configdialog.cpp +++ b/src/configdialog.cpp @@ -341,10 +341,27 @@ ConfigDialog::ConfigDialog ( QWidget * parent, Qt::WindowFlags f ) QFrame* frp = new QFrame (this); tabWidg->addTab (frp, tr ("PulseAudio settings")); QVBoxLayout* l = new QVBoxLayout (frp); + cbDisablePA = new QCheckBox (tr ("Disable PulseAudio"), frp); cbNoRecord = new QCheckBox (tr ("Disable sound input"), frp); + connect(cbDisablePA, SIGNAL(stateChanged(int)), this, SLOT(slot_cbDisablePAStateChanged(int))); + l->addWidget (cbDisablePA); l->addWidget (cbNoRecord); l->addStretch (1); cbNoRecord->setChecked (st.setting ()->value ("pulse/norecord", false).toBool ()); + cbDisablePA->setChecked (st.setting ()->value ("pulse/disable", false).toBool ()); + ONMainWindow* par= ( ONMainWindow* ) parent; + systemDisablePA=par->getSystemDisablePA(); + systemDisablePARecord=par->getSystemDisablePARecord(); + if(systemDisablePA) + { + cbDisablePA->setChecked(true); + cbDisablePA->setEnabled(false); + } + if(systemDisablePARecord) + { + cbNoRecord->setChecked(true); + cbNoRecord->setEnabled(false); + } #endif /* defined (Q_OS_WIN) || defined (Q_OS_DARWIN) */ } @@ -364,7 +381,10 @@ void ConfigDialog::slot_accepted() st.setting()->setValue ( "trayicon/maxdiscon", cbMaxmizeTray->isChecked() ); #endif #if defined (Q_OS_WIN) || defined (Q_OS_DARWIN) - st.setting()->setValue ( "pulse/norecord", cbNoRecord->isChecked() ); + if(!systemDisablePARecord) + st.setting()->setValue ( "pulse/norecord", cbNoRecord->isChecked() ); + if(!systemDisablePA) + st.setting()->setValue ( "pulse/disable", cbDisablePA->isChecked() ); #endif /* defined (Q_OS_WIN) || defined (Q_OS_DARWIN) */ #ifdef USELDAP if ( !embedMode ) @@ -602,6 +622,18 @@ QString ConfigDialog::getXDarwinDirectory() } #endif +#if defined (Q_OS_WIN) || defined (Q_OS_DARWIN) +void ConfigDialog::slot_cbDisablePAStateChanged(int state) +{ + cbNoRecord->setEnabled(state==Qt::Unchecked); + if(systemDisablePARecord) + { + cbNoRecord->setChecked(true); + cbNoRecord->setEnabled(false); + } +} +#endif /* defined (Q_OS_WIN) || defined (Q_OS_DARWIN) */ + void ConfigDialog::slotAdvClicked() { @@ -636,7 +668,10 @@ void ConfigDialog::slotDefaults() #ifdef Q_OS_WIN case 3: { - cbNoRecord->setChecked(false); + if(!systemDisablePARecord) + cbNoRecord->setChecked(false); + if(!systemDisablePA) + cbDisablePA->setChecked(false); } break; #endif /* defined (Q_OS_WIN) */ @@ -647,6 +682,7 @@ void ConfigDialog::slotDefaults() clientSshPort->setValue ( 22 ); #ifdef Q_OS_DARWIN cbNoRecord->setChecked (false); + cbDisablePA->setChecked (false); #endif /* defined (Q_OS_DARWIN) */ #ifndef CFGPLUGIN gbTrayIcon->setChecked (false); diff --git a/src/configdialog.h b/src/configdialog.h index 14b5cbc..d82d0d0 100644 --- a/src/configdialog.h +++ b/src/configdialog.h @@ -95,6 +95,9 @@ private: #if defined (Q_OS_WIN) || defined (Q_OS_DARWIN) QCheckBox *cbNoRecord; + QCheckBox *cbDisablePA; + bool systemDisablePA; + bool systemDisablePARecord; #endif /* defined (Q_OS_WIN) || defined (Q_OS_DARWIN) */ QGroupBox *gbTrayIcon; @@ -112,6 +115,10 @@ private slots: void slot_selectXDarwin(); void slot_findXDarwin(); #endif +#if defined (Q_OS_WIN) || defined (Q_OS_DARWIN) + void slot_cbDisablePAStateChanged(int state); +#endif /* defined (Q_OS_WIN) || defined (Q_OS_DARWIN) */ + private slots: void slotAdvClicked(); void slotDefaults(); diff --git a/src/help.cpp b/src/help.cpp index e3cb1de..d83f856 100644 --- a/src/help.cpp +++ b/src/help.cpp @@ -117,6 +117,10 @@ help::params_t help::build_params () { ADD_OPT ("--hide", QT_TRANSLATE_NOOP ("Help", "Starts hidden (minimized to system tray where available.)")); ADD_OPT ("--portable", QT_TRANSLATE_NOOP ("Help", "Starts in \"portable\" mode.")); ADD_OPT ("--pgp-card", QT_TRANSLATE_NOOP ("Help", "Forces OpenPGP smart card authentication.")); +#if defined (Q_OS_DARWIN) || defined (Q_OS_WIN) + ADD_OPT ("--disable-pulse", QT_TRANSLATE_NOOP ("Help", "Disable PulseAudio.")); + ADD_OPT ("--disable-pulse-record", QT_TRANSLATE_NOOP ("Help", "Disable sound input.")); +#endif /* defined (Q_OS_DARWIN) || defined (Q_OS_WIN) */ ADD_OPT ("--xinerama", QT_TRANSLATE_NOOP ("Help", "Enables Xinerama by default.")); ADD_OPT ("--ldap-printing", QT_TRANSLATE_NOOP ("Help", "Allows client side printing in LDAP mode.")); ADD_OPT ("--thinclient", QT_TRANSLATE_NOOP ("Help", "Enables thinclient mode. Starts without a window manager.")); diff --git a/src/onmainwindow.cpp b/src/onmainwindow.cpp index 4141570..13d0986 100644 --- a/src/onmainwindow.cpp +++ b/src/onmainwindow.cpp @@ -133,6 +133,10 @@ ONMainWindow::ONMainWindow ( QWidget *parent ) :QMainWindow ( parent ) config.brokerAutologoff=false; config.published=false; cmdAutologin=false; +#if defined (Q_OS_DARWIN) || defined (Q_OS_WIN) + systemDisablePARecord=false; + systemDisablePA=false; +#endif /* defined (Q_OS_DARWIN) || defined (Q_OS_WIN) */ // Try to determine the native DPI and use it for the default @@ -2193,19 +2197,40 @@ void ONMainWindow::slotConfig() int i; #if defined (Q_OS_WIN) || defined (Q_OS_DARWIN) - X2goSettings st ("settings"); - bool newDisableInput = st.setting ()->value ("pulse/norecord", + if(!systemDisablePA) + { + X2goSettings st ("settings"); + bool disablePA = st.setting ()->value ("pulse/disable", (QVariant) false).toBool (); - - if (oldDisableInput != newDisableInput) { - bool ret = pulseManager->set_record (!newDisableInput); - - if (!ret) { - x2goDebug << "Failed to change recording status of PulseManager. PulseAudio not started?" << endl; - } - - pulseManager->restart (); - } + if(!pulseManager && !disablePA) + { + x2goDebug<<"PA manager not inited yet, starting PA thread"; + QTimer::singleShot (10, this, SLOT (pulseManagerWrapper ())); + } + else if(pulseManager && disablePA) + { + if(pulseManager->is_server_running()) + { + x2goDebug<<"Stopping PulseAudio"; + pulseManager->shutdown(); + } + } + else if(pulseManager && !disablePA)//pulse is already inited and not disabled by config dialog + { + bool newDisableInput = st.setting ()->value ("pulse/norecord", + (QVariant) false).toBool (); + if(systemDisablePARecord) + newDisableInput=true; + if (oldDisableInput != newDisableInput) { + bool ret = pulseManager->set_record (!newDisableInput); + + if (!ret) { + x2goDebug << "Failed to change recording status of PulseManager. PulseAudio not started?" << endl; + } + pulseManager->restart (); + } + } + } #endif /* defined (Q_OS_WIN) || defined (Q_OS_DARWIN) */ if ( passForm->isVisible() && !embedMode ) @@ -6748,12 +6773,19 @@ void ONMainWindow::pulseManagerWrapper () { (config.confSnd && config.useSnd)) #endif /* defined (Q_OS_WIN) */ { + X2goSettings st ("settings"); + bool disablePulse = st.setting ()->value ("pulse/disable", + (QVariant) false).toBool (); + if(disablePulse||systemDisablePA) + { + x2goDebug<<"Not starting PulseAudio"; + return; + } pulseManagerThread = new QThread (0); pulseManager = new PulseManager (); connect(pulseManager, SIGNAL(sig_pulse_user_warning(bool, const QString&, const QString&, bool)), this, SLOT(slotShowPAMSGDialog(bool, const QString&, const QString&, bool))); - X2goSettings st ("settings"); bool disableInput = st.setting ()->value ("pulse/norecord", (QVariant) false).toBool (); pulseManager->set_record (!disableInput); @@ -7252,6 +7284,19 @@ bool ONMainWindow::parseParameter ( QString param ) return true; } +#if defined (Q_OS_DARWIN) || defined (Q_OS_WIN) + if (param == "--disable-pulse") + { + systemDisablePA=true; + return true; + } + if (param == "--disable-pulse-record") + { + systemDisablePARecord=true; + return true; + } +#endif /* defined (Q_OS_DARWIN) || defined (Q_OS_WIN) */ + if (param == "--no-autoresume") { autoresume=false; diff --git a/src/onmainwindow.h b/src/onmainwindow.h index 9e749d3..b8e7362 100644 --- a/src/onmainwindow.h +++ b/src/onmainwindow.h @@ -540,6 +540,17 @@ public: return &config; } +#if defined (Q_OS_DARWIN) || defined (Q_OS_WIN) + bool getSystemDisablePARecord() + { + return systemDisablePARecord; + } + bool getSystemDisablePA() + { + return systemDisablePA; + } +#endif /* defined (Q_OS_DARWIN) || defined (Q_OS_WIN) */ + void runApplication(QString exec); @@ -853,6 +864,8 @@ private: #if defined (Q_OS_DARWIN) || defined (Q_OS_WIN) QThread *pulseManagerThread; PulseManager *pulseManager; + bool systemDisablePARecord; + bool systemDisablePA; #endif /* defined (Q_OS_DARWIN) || defined (Q_OS_WIN) */ diff --git a/src/pulsemanager.cpp b/src/pulsemanager.cpp index 4b144e2..a7d93c0 100644 --- a/src/pulsemanager.cpp +++ b/src/pulsemanager.cpp @@ -47,6 +47,7 @@ PulseManager::PulseManager () : app_dir_ (QApplication::applicationDirPath ()), record_ (true), playback_ (true), debug_ (false), + shutdownState(false), system_pulse_ (false) { pulse_dir_ = QDir (QDir::homePath ()); pulse_dir_.mkpath (pulse_dir_.absolutePath () + pulse_X2Go_ + "/tmp"); @@ -773,12 +774,12 @@ void PulseManager::slot_play_startup_sound () { } void PulseManager::slot_on_pulse_finished (int exit_code) { - if (exit_code) + if (exit_code && !shutdownState) { x2goDebug << "Warning! Pulseaudio's exit code is non-zero."; show_startup_warning(true); } - + shutdownState=false; x2goDebug << "Pulseaudio finished with code:"<<exit_code; QByteArray ba (pulse_server_->readAllStandardOutput ()); char *data = ba.data (); @@ -825,6 +826,7 @@ bool PulseManager::is_server_running () const { void PulseManager::shutdown () { QEventLoop loop; + shutdownState=true; connect (this, SIGNAL (sig_pulse_server_terminated ()), &loop, SLOT (quit ())); @@ -886,10 +888,9 @@ bool PulseManager::set_record (bool record) { bool ret = false; if (!(is_server_running ())) { - record_ = record; ret = true; } - + record_ = record; return (ret); } diff --git a/src/pulsemanager.h b/src/pulsemanager.h index 1472596..237ebe0 100644 --- a/src/pulsemanager.h +++ b/src/pulsemanager.h @@ -60,11 +60,14 @@ class PulseManager: public QObject { bool set_record (bool record); bool set_playback (bool playback); void set_debug (bool debug); + bool is_server_running () const; + public slots: void start (); void restart (); + void shutdown (); private: @@ -86,10 +89,6 @@ class PulseManager: public QObject { void create_client_dir (); void cleanup_client_dir (); - void shutdown (); - - bool is_server_running () const; - void show_startup_warning (bool play_startup_sound = false); @@ -130,6 +129,7 @@ class PulseManager: public QObject { bool debug_; bool system_pulse_; + bool shutdownState; }; #endif // PULSEMANAGER_H -- Alioth's /srv/git/code.x2go.org/x2goclient.git//..//_hooks_/post-receive-email on /srv/git/code.x2go.org/x2goclient.git