diff --git a/sflphone-gtk/src/dbus.c b/sflphone-gtk/src/dbus.c index 68c226137728cbb2d70415fdf122bab1ebb26c1d..db01375dbb8d819d4fcd1d0051493c7686f01016 100644 --- a/sflphone-gtk/src/dbus.c +++ b/sflphone-gtk/src/dbus.c @@ -150,6 +150,13 @@ accounts_changed_cb (DBusGProxy *proxy, config_window_fill_account_list(); } +static void +error_alert(DBusGProxy *proxy, + void * foo ) +{ + g_print ("Error notifying \n"); +} + gboolean dbus_connect () { @@ -244,6 +251,10 @@ dbus_connect () dbus_g_proxy_connect_signal (configurationManagerProxy, "accountsChanged", G_CALLBACK(accounts_changed_cb), NULL, NULL); + dbus_g_proxy_add_signal (configurationManagerProxy, + "errorAlert", G_TYPE_INVALID); + dbus_g_proxy_connect_signal (configurationManagerProxy, + "errorAlert", G_CALLBACK(error_alert), NULL, NULL); return TRUE; } diff --git a/src/audio/audiolayer.cpp b/src/audio/audiolayer.cpp index 55c43f93548e045d1255563e929d4ac57410ee9f..49d01cebc4a7f5a62819c27acbb32b0370ed7068 100644 --- a/src/audio/audiolayer.cpp +++ b/src/audio/audiolayer.cpp @@ -298,6 +298,7 @@ AudioLayer::isCaptureActive(void) { bool AudioLayer::open_device(std::string pcm_p, std::string pcm_c, int flag) { + std::stringstream errMsg; int err; snd_pcm_hw_params_t* hwParams = NULL; snd_pcm_sw_params_t *swparams = NULL; @@ -314,7 +315,9 @@ AudioLayer::open_device(std::string pcm_p, std::string pcm_c, int flag) { _debugAlsa(" Opening capture device %s\n", pcm_c.c_str()); if(err = snd_pcm_open(&_CaptureHandle, pcm_c.c_str(), SND_PCM_STREAM_CAPTURE, 0) < 0){ - _debugAlsa(" Error while opening capture device %s (%s)\n", pcm_c.c_str(), snd_strerror(err)); + errMsg << " Error while opening capture device " << pcm_c.c_str() << " (" << snd_strerror(err) << ")"; + _debugAlsa(" %s\n", errMsg.str().c_str()); + setErrorMessage( errMsg.str() ); return false; } @@ -339,7 +342,9 @@ AudioLayer::open_device(std::string pcm_p, std::string pcm_c, int flag) _debugAlsa(" Opening playback device %s\n", pcm_p.c_str()); if(err = snd_pcm_open(&_PlaybackHandle, pcm_p.c_str(), SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK ) < 0){ - _debugAlsa(" Error while opening playback device %s (%s)\n", pcm_p.c_str(), snd_strerror(err)); + errMsg << " Error while opening playback device " << pcm_p.c_str() << " (" << snd_strerror(err) << ")"; + _debugAlsa(" %s\n", errMsg.str().c_str()); + setErrorMessage( errMsg.str() ); return false; } if( err = snd_pcm_hw_params_malloc( &hwParams ) < 0 ) { diff --git a/src/dbus/configurationmanager-glue.h b/src/dbus/configurationmanager-glue.h index 811dac37ad8eecb75e0f11e175404d372834fa8d..8fcd2b22e326dd6cf773744624cae2159fb63330 100644 --- a/src/dbus/configurationmanager-glue.h +++ b/src/dbus/configurationmanager-glue.h @@ -228,6 +228,11 @@ public: { { 0, 0, 0 } }; + static ::DBus::IntrospectedArgument errorAlert_args[] = + { + { "errMsg", "s", false }, + { 0, 0, 0 } + }; static ::DBus::IntrospectedMethod ConfigurationManager_methods[] = { { "getAccountDetails", getAccountDetails_args }, @@ -268,6 +273,7 @@ public: { { "parametersChanged", parametersChanged_args }, { "accountsChanged", accountsChanged_args }, + { "errorAlert", errorAlert_args }, { 0, 0 } }; static ::DBus::IntrospectedProperty ConfigurationManager_properties[] = @@ -344,6 +350,13 @@ public: ::DBus::SignalMessage sig("accountsChanged"); emit_signal(sig); } + void errorAlert( const ::DBus::String& arg1 ) + { + ::DBus::SignalMessage sig("errorAlert"); + ::DBus::MessageIter wi = sig.writer(); + wi << arg1; + emit_signal(sig); + } private: diff --git a/src/dbus/configurationmanager-introspec.xml b/src/dbus/configurationmanager-introspec.xml index 2ea00b91c3bd673135c732a400b1e97414d5aa49..39fd2c01db43920842193af805626a362b5ca539 100644 --- a/src/dbus/configurationmanager-introspec.xml +++ b/src/dbus/configurationmanager-introspec.xml @@ -148,5 +148,10 @@ <signal name="accountsChanged"> </signal> + + <signal name="errorAlert"> + <arg type="s" name="errMsg" direction="out"/> + </signal> + </interface> </node> diff --git a/src/managerimpl.cpp b/src/managerimpl.cpp index 6a213943f1361f8cf54728d95c014157c5f2c734..7121d35b0fa33f5f37c5745ca187b2a5818b01d8 100644 --- a/src/managerimpl.cpp +++ b/src/managerimpl.cpp @@ -1258,12 +1258,15 @@ ManagerImpl::getOutputAudioPluginList(void) ManagerImpl::setInputAudioPlugin(const std::string& audioPlugin) { _debug("Set input audio plugin\n"); + _audiodriver -> setErrorMessage( "" ); _audiodriver -> openDevice( _audiodriver -> getIndexIn(), _audiodriver -> getIndexOut(), _audiodriver -> getSampleRate(), _audiodriver -> getFrameSize(), SFL_PCM_CAPTURE, audioPlugin); + if( _audiodriver -> getErrorMessage() != "") + notifyErrClient( _audiodriver -> getErrorMessage() ); } /** @@ -1273,12 +1276,15 @@ ManagerImpl::setInputAudioPlugin(const std::string& audioPlugin) ManagerImpl::setOutputAudioPlugin(const std::string& audioPlugin) { _debug("Set output audio plugin\n"); + _audiodriver -> setErrorMessage( "" ); _audiodriver -> openDevice( _audiodriver -> getIndexIn(), _audiodriver -> getIndexOut(), _audiodriver -> getSampleRate(), _audiodriver -> getFrameSize(), SFL_PCM_PLAYBACK, audioPlugin); + if( _audiodriver -> getErrorMessage() != "") + notifyErrClient( _audiodriver -> getErrorMessage() ); // set config setConfig( AUDIO , ALSA_PLUGIN , audioPlugin ); } @@ -1300,12 +1306,15 @@ ManagerImpl::getAudioOutputDeviceList(void) ManagerImpl::setAudioOutputDevice(const int index) { _debug("Set audio output device: %i\n", index); + _audiodriver -> setErrorMessage( "" ); _audiodriver->openDevice(_audiodriver->getIndexIn(), index, _audiodriver->getSampleRate(), _audiodriver->getFrameSize(), SFL_PCM_PLAYBACK, _audiodriver->getAudioPlugin()); + if( _audiodriver -> getErrorMessage() != "") + notifyErrClient( _audiodriver -> getErrorMessage() ); // set config setConfig( AUDIO , ALSA_CARD_ID_OUT , index ); } @@ -1327,12 +1336,15 @@ ManagerImpl::getAudioInputDeviceList(void) ManagerImpl::setAudioInputDevice(const int index) { _debug("Set audio input device %i\n", index); + _audiodriver -> setErrorMessage( "" ); _audiodriver->openDevice(index, _audiodriver->getIndexOut(), _audiodriver->getSampleRate(), _audiodriver->getFrameSize(), SFL_PCM_CAPTURE, _audiodriver->getAudioPlugin()); + if( _audiodriver -> getErrorMessage() != "") + notifyErrClient( _audiodriver -> getErrorMessage() ); // set config setConfig( AUDIO , ALSA_CARD_ID_IN , index ); } @@ -1403,6 +1415,13 @@ ManagerImpl::setRingtoneChoice( const std::string& tone ) setConfig( AUDIO , RING_CHOICE , tone ); } +void +ManagerImpl::notifyErrClient( const std::string& errMsg ) +{ + _debug("Call notifyErrClient: %s\n" , errMsg.c_str()); + if( _dbus ) _dbus -> getConfigurationManager() -> errorAlert( errMsg ); +} + int ManagerImpl::getAudioDeviceIndex(const std::string name) { @@ -1468,6 +1487,8 @@ ManagerImpl::selectAudioDriver (void) _debugInit(" AudioLayer Opening Device"); _audiodriver->setErrorMessage(""); _audiodriver->openDevice( numCardIn , numCardOut, sampleRate, frameSize, SFL_PCM_BOTH, alsaPlugin ); + if( _audiodriver -> getErrorMessage() != "") + notifyErrClient( _audiodriver -> getErrorMessage()); } /** diff --git a/src/managerimpl.h b/src/managerimpl.h index d10e28e407917034be9b48d140ccb7372f51a1da..6d01ab20e78e0cdf8e3c0558652e5c57c1d02520 100644 --- a/src/managerimpl.h +++ b/src/managerimpl.h @@ -363,6 +363,11 @@ public: */ void setDefaultAccount(const AccountID& accountID); + /* + * Notify the client that an error occured + * @param errMsg The error message that should popup on the client side + */ + void notifyErrClient( const std::string& errMsg ); bool getConfigAll(const std::string& sequenceId); bool getConfig(const std::string& section, const std::string& name, TokenList& arg);