diff --git a/sflphone-gtk/src/audioconf.c b/sflphone-gtk/src/audioconf.c index d7b20f282fcfab2da6a407aaaa9fc9a2ff1e570a..e8d0a71ac10c2f142f1f1a3a5573eef8161ff17f 100644 --- a/sflphone-gtk/src/audioconf.c +++ b/sflphone-gtk/src/audioconf.c @@ -90,15 +90,18 @@ config_window_fill_output_audio_plugin_list() // Call dbus to retreive list list = dbus_get_output_audio_plugin_list(); - // For each API name included in list int c = 0; - for(managerName = list[c]; managerName != NULL; managerName = list[c]) - { - c++; - gtk_list_store_append(pluginlist, &iter); - gtk_list_store_set(pluginlist, &iter, 0 , managerName, -1); - } + + if (list != NULL){ + for(managerName = list[c]; managerName != NULL; managerName = list[c]) + { + c++; + gtk_list_store_append(pluginlist, &iter); + gtk_list_store_set(pluginlist, &iter, 0 , managerName, -1); + } + } + list = NULL; } /** diff --git a/sflphone-gtk/src/dbus.c b/sflphone-gtk/src/dbus.c index a5f037e1a39a213d286a8b32fddb6dacd2573838..8795c1ef8baededd09bc6c910dc1215262c45923 100644 --- a/sflphone-gtk/src/dbus.c +++ b/sflphone-gtk/src/dbus.c @@ -823,22 +823,22 @@ dbus_get_input_audio_plugin_list() gchar** dbus_get_output_audio_plugin_list() { - g_print("Before get output audio plugin list"); gchar** array; GError* error = NULL; - org_sflphone_SFLphone_ConfigurationManager_get_output_audio_plugin_list( - configurationManagerProxy, - &array, - &error); - g_print("After"); - if(error) + + if(!org_sflphone_SFLphone_ConfigurationManager_get_output_audio_plugin_list( configurationManagerProxy, &array, &error)) { - g_printerr("Failed to call get_output_audio_plugin_list() on ConfigurationManager: %s\n", error->message); - g_error_free(error); + if(error->domain == DBUS_GERROR && error->code == DBUS_GERROR_REMOTE_EXCEPTION) + g_printerr ("Caught remote method (get_output_audio_plugin_list) exception %s: %s\n", dbus_g_error_get_name(error), error->message); + else + g_printerr("Error while calling get_out_audio_plugin_list: %s\n", error->message); + g_error_free (error); + return NULL; } - else + else{ g_print("DBus called get_output_audio_plugin_list() on ConfigurationManager\n"); - return array; + return array; + } } void diff --git a/src/audio/audiostream.cpp b/src/audio/audiostream.cpp index 254f8ae19e42b18bb7b2ce5ef38ff12063a768c1..63654ce0768347134a292e829eddf722e5379e1a 100644 --- a/src/audio/audiostream.cpp +++ b/src/audio/audiostream.cpp @@ -18,9 +18,11 @@ */ #include <audiostream.h> +#include "pulselayer.h" static pa_channel_map channel_map ; + AudioStream::AudioStream( pa_context* context, int type, std::string desc, double vol UNUSED ) : _audiostream(NULL), _streamType(type), _streamDescription(desc), flag(PA_STREAM_AUTO_TIMING_UPDATE), sample_spec(), _volume() { @@ -48,19 +50,25 @@ AudioStream::disconnect( void ) pa_stream_unref( pulseStream() ); } - void +void AudioStream::stream_state_callback( pa_stream* s, void* user_data UNUSED ) { _debug("The state of the stream changed\n"); assert(s); switch(pa_stream_get_state(s)){ case PA_STREAM_CREATING: - case PA_STREAM_TERMINATED: _debug("Stream is creating...\n"); break; + case PA_STREAM_TERMINATED: + _debug("Stream is terminating...\n" ); + PulseLayer::streamState++; + break; case PA_STREAM_READY: _debug("Stream successfully created, connected to %s\n", pa_stream_get_device_name( s )); break; + case PA_STREAM_UNCONNECTED: + _debug("Stream unconnected\n"); + break; case PA_STREAM_FAILED: default: _debug("Stream error - Sink/Source doesn't exists: %s\n" , pa_strerror(pa_context_errno(pa_stream_get_context(s)))); diff --git a/src/audio/pulselayer.cpp b/src/audio/pulselayer.cpp index ef6e6a52b52ae7af2ec6ddc2b756a631911a42e3..98a6cd6aa54fcf9e3a25a0ae50eb1e263a9f53c5 100644 --- a/src/audio/pulselayer.cpp +++ b/src/audio/pulselayer.cpp @@ -21,6 +21,8 @@ int framesPerBuffer = 2048; +int PulseLayer::streamState; + static void audioCallback ( pa_stream* s, size_t bytes, void* userdata ) { assert( s && bytes ); @@ -39,6 +41,7 @@ static void audioCallback ( pa_stream* s, size_t bytes, void* userdata ) , record() , cache() { + PulseLayer::streamState = 0; _debug("Pulse audio constructor: Create context\n"); } @@ -54,10 +57,14 @@ PulseLayer::~PulseLayer (void) void PulseLayer::closeLayer( void ) -{ +{ playback->disconnect(); record->disconnect(); - pa_context_disconnect( context ); + + while(PulseLayer::streamState != 2) + ; + PulseLayer::streamState = 0; + pa_context_disconnect( context ); pa_context_unref( context ); sleep(2); } diff --git a/src/audio/pulselayer.h b/src/audio/pulselayer.h index 2a055c81c67290309dfa96d87ef491d20bbecb67..dc22bfaedd968324b232946770ff06b7d08b5428 100644 --- a/src/audio/pulselayer.h +++ b/src/audio/pulselayer.h @@ -255,6 +255,8 @@ class PulseLayer : public AudioLayer { int spkrVolume; int micVolume; +public: + static int streamState; }; #endif // _PULSE_LAYER_H_