From bb356e618696c444628719d006de88e00877a053 Mon Sep 17 00:00:00 2001 From: Alexandre Savard <alexandresavard@alexandresavard-desktop.(none)> Date: Thu, 20 May 2010 15:52:17 -0400 Subject: [PATCH] [#1962] Use ALSA plugin dsnoop in order to share capture device --- sflphone-client-gnome/src/config/audioconf.c | 6 ++-- .../dbus/configurationmanager-introspec.xml | 12 +------- sflphone-client-gnome/src/dbus/dbus.c | 25 +++-------------- sflphone-client-gnome/src/dbus/dbus.h | 8 +----- sflphone-common/src/audio/alsa/alsalayer.cpp | 28 +++++++++++++------ .../dbus/configurationmanager-introspec.xml | 12 +------- .../src/dbus/configurationmanager.cpp | 21 ++------------ .../src/dbus/configurationmanager.h | 3 +- sflphone-common/src/eventthread.cpp | 2 +- sflphone-common/src/global.h | 2 ++ 10 files changed, 37 insertions(+), 82 deletions(-) diff --git a/sflphone-client-gnome/src/config/audioconf.c b/sflphone-client-gnome/src/config/audioconf.c index ad8d00c884..dcaa7e85ce 100644 --- a/sflphone-client-gnome/src/config/audioconf.c +++ b/sflphone-client-gnome/src/config/audioconf.c @@ -94,7 +94,7 @@ void preferences_dialog_fill_codec_list (account_t **a) { * Fill store with output audio plugins */ void -preferences_dialog_fill_output_audio_plugin_list() +preferences_dialog_fill_audio_plugin_list() { GtkTreeIter iter; gchar** list; @@ -103,7 +103,7 @@ preferences_dialog_fill_output_audio_plugin_list() gtk_list_store_clear(pluginlist); // Call dbus to retreive list - list = dbus_get_output_audio_plugin_list(); + list = dbus_get_audio_plugin_list(); // For each API name included in list int c = 0; @@ -787,7 +787,7 @@ GtkWidget* alsa_box() gtk_widget_show( item ); // Set choices of audio managers pluginlist = gtk_list_store_new(1, G_TYPE_STRING); - preferences_dialog_fill_output_audio_plugin_list(); + preferences_dialog_fill_audio_plugin_list(); plugin = gtk_combo_box_new_with_model(GTK_TREE_MODEL(pluginlist)); select_active_output_audio_plugin(); gtk_label_set_mnemonic_widget(GTK_LABEL(item), plugin); diff --git a/sflphone-client-gnome/src/dbus/configurationmanager-introspec.xml b/sflphone-client-gnome/src/dbus/configurationmanager-introspec.xml index f38682c65e..8a0c59c8b2 100644 --- a/sflphone-client-gnome/src/dbus/configurationmanager-introspec.xml +++ b/sflphone-client-gnome/src/dbus/configurationmanager-introspec.xml @@ -466,17 +466,7 @@ <!-- Audio devices methods --> - <method name="getInputAudioPluginList" tp:name-for-bindings="getInputAudioPluginList"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getOutputAudioPluginList" tp:name-for-bindings="getOutputAudioPluginList"> + <method name="getAudioPluginList" tp:name-for-bindings="getAudioPluginList"> <tp:docstring> </tp:docstring> <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> diff --git a/sflphone-client-gnome/src/dbus/dbus.c b/sflphone-client-gnome/src/dbus/dbus.c index 1c67490992..08cf832c4c 100644 --- a/sflphone-client-gnome/src/dbus/dbus.c +++ b/sflphone-client-gnome/src/dbus/dbus.c @@ -1297,44 +1297,27 @@ dbus_set_active_codec_list(const gchar** list, const gchar *accountID) } } -/** - * Get a list of input supported audio plugins - */ -gchar** -dbus_get_input_audio_plugin_list() -{ - gchar** array; - GError* error = NULL; - org_sflphone_SFLphone_ConfigurationManager_get_input_audio_plugin_list( - configurationManagerProxy, &array, &error); - if (error) - { - ERROR("Failed to call get_input_audio_plugin_list() on ConfigurationManager: %s", error->message); - g_error_free(error); - } - return array; -} /** * Get a list of output supported audio plugins */ gchar** -dbus_get_output_audio_plugin_list() +dbus_get_audio_plugin_list() { gchar** array; GError* error = NULL; - if (!org_sflphone_SFLphone_ConfigurationManager_get_output_audio_plugin_list( + if (!org_sflphone_SFLphone_ConfigurationManager_get_audio_plugin_list( configurationManagerProxy, &array, &error)) { if (error->domain == DBUS_GERROR && error->code == DBUS_GERROR_REMOTE_EXCEPTION) { - ERROR ("Caught remote method (get_output_audio_plugin_list) exception %s: %s", dbus_g_error_get_name(error), error->message); + ERROR ("Caught remote method (get_output_plugin_list) exception %s: %s", dbus_g_error_get_name(error), error->message); } else { - ERROR("Error while calling get_out_audio_plugin_list: %s", error->message); + ERROR("Error while calling get_out_plugin_list: %s", error->message); } g_error_free(error); return NULL; diff --git a/sflphone-client-gnome/src/dbus/dbus.h b/sflphone-client-gnome/src/dbus/dbus.h index 394b150569..80d99f1961 100644 --- a/sflphone-client-gnome/src/dbus/dbus.h +++ b/sflphone-client-gnome/src/dbus/dbus.h @@ -241,17 +241,11 @@ void dbus_set_active_codec_list (const gchar** list, const gchar*); */ gchar* dbus_get_current_codec_name(const callable_obj_t * c); -/** - * ConfigurationManager - Get the list of available input audio plugins - * @return gchar** The list of plugins - */ -gchar** dbus_get_input_audio_plugin_list(); - /** * ConfigurationManager - Get the list of available output audio plugins * @return gchar** The list of plugins */ -gchar** dbus_get_output_audio_plugin_list(); +gchar** dbus_get_audio_plugin_list(); /** * ConfigurationManager - Select an input audio plugin diff --git a/sflphone-common/src/audio/alsa/alsalayer.cpp b/sflphone-common/src/audio/alsa/alsalayer.cpp index c5f40038c0..31389f54ba 100644 --- a/sflphone-common/src/audio/alsa/alsalayer.cpp +++ b/sflphone-common/src/audio/alsa/alsalayer.cpp @@ -139,10 +139,20 @@ AlsaLayer::startStream (void) if(is_playback_running() && is_capture_running() ) return; - - std::string pcmp = buildDeviceTopo (_audioPlugin, _indexOut, 0); - std::string pcmr = buildDeviceTopo (_audioPlugin, _indexRing, 0); - std::string pcmc = buildDeviceTopo("default", _indexIn, 0); + std::string pcmp; + std::string pcmr; + std::string pcmc; + + if(_audioPlugin == PCM_DMIX_DSNOOP) { + pcmp = buildDeviceTopo (PCM_DMIX, _indexOut, 0); + pcmr = buildDeviceTopo (PCM_DMIX, _indexRing, 0); + pcmc = buildDeviceTopo(PCM_DSNOOP, _indexIn, 0); + } + else { + pcmp = buildDeviceTopo (_audioPlugin, _indexOut, 0); + pcmr = buildDeviceTopo (_audioPlugin, _indexRing, 0); + pcmc = buildDeviceTopo(_audioPlugin, _indexIn, 0); + } _debug("pcmp: %s, index %d", pcmp.c_str(), _indexOut); _debug("pcmr: %s, index %d", pcmr.c_str(), _indexRing); @@ -647,14 +657,14 @@ AlsaLayer::read (void* buffer, int toCopy) case -ESTRPIPE: case -EIO: - _debugAlsa (" XRUN capture ignored (%s)", snd_strerror (samples)); + _debugAlsa ("Audio: XRUN capture ignored (%s)", snd_strerror (samples)); handle_xrun_capture(); //samples = snd_pcm_readi( _CaptureHandle, buffer, frames); //if (samples<0) samples=0; break; case EPERM: - _debugAlsa (" Capture EPERM (%s)", snd_strerror (samples)); + _debugAlsa ("Audio: Capture EPERM (%s)", snd_strerror (samples)); prepareCaptureStream (); startCaptureStream (); break; @@ -719,10 +729,10 @@ AlsaLayer::handle_xrun_playback (snd_pcm_t *handle) std::string AlsaLayer::buildDeviceTopo (std::string plugin, int card, int subdevice) { - std::string pcm = plugin; std::stringstream ss,ss1; + std::string pcm = plugin; - if (pcm == "default" || pcm == "pulse") + if (pcm == PCM_DEFAULT) return pcm; ss << card; @@ -864,6 +874,8 @@ void AlsaLayer::audioCallback (void) // toGet = framesPerBufferAlsa; // maxBytes = toGet * sizeof (SFLDataFormat); + if(!_PlaybackHandle) + return; int playbackAvailSmpl = snd_pcm_avail_update(_PlaybackHandle); int playbackAvailBytes = playbackAvailSmpl*sizeof(SFLDataFormat); diff --git a/sflphone-common/src/dbus/configurationmanager-introspec.xml b/sflphone-common/src/dbus/configurationmanager-introspec.xml index f38682c65e..8a0c59c8b2 100644 --- a/sflphone-common/src/dbus/configurationmanager-introspec.xml +++ b/sflphone-common/src/dbus/configurationmanager-introspec.xml @@ -466,17 +466,7 @@ <!-- Audio devices methods --> - <method name="getInputAudioPluginList" tp:name-for-bindings="getInputAudioPluginList"> - <tp:docstring> - </tp:docstring> - <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> - <arg type="as" name="list" direction="out"> - <tp:docstring> - </tp:docstring> - </arg> - </method> - - <method name="getOutputAudioPluginList" tp:name-for-bindings="getOutputAudioPluginList"> + <method name="getAudioPluginList" tp:name-for-bindings="getAudioPluginList"> <tp:docstring> </tp:docstring> <annotation name="com.trolltech.QtDBus.QtTypeName.Out0" value="VectorString"/> diff --git a/sflphone-common/src/dbus/configurationmanager.cpp b/sflphone-common/src/dbus/configurationmanager.cpp index 7c2928349c..c7d309b3a7 100644 --- a/sflphone-common/src/dbus/configurationmanager.cpp +++ b/sflphone-common/src/dbus/configurationmanager.cpp @@ -505,28 +505,13 @@ void ConfigurationManager::setActiveCodecList( } -// Audio devices related methods -std::vector<std::string> ConfigurationManager::getInputAudioPluginList() { - - _debug("ConfigurationManager: Active codec list received"); - - std::vector<std::string> v; - - v.push_back("default"); - v.push_back("surround40"); - v.push_back("plug:hw"); - - return v; -} - - - -std::vector<std::string> ConfigurationManager::getOutputAudioPluginList() { +std::vector<std::string> ConfigurationManager::getAudioPluginList() { std::vector<std::string> v; v.push_back(PCM_DEFAULT); - v.push_back(PCM_DMIX); + // v.push_back(PCM_DMIX); + v.push_back(PCM_DMIX_DSNOOP); return v; } diff --git a/sflphone-common/src/dbus/configurationmanager.h b/sflphone-common/src/dbus/configurationmanager.h index 27442ced3c..17ea89be6d 100644 --- a/sflphone-common/src/dbus/configurationmanager.h +++ b/sflphone-common/src/dbus/configurationmanager.h @@ -64,8 +64,7 @@ public: std::vector< std::string > getActiveCodecList (const std::string& accountID); void setActiveCodecList (const std::vector< std::string >& list, const std::string& accountID); - std::vector< std::string > getInputAudioPluginList(); - std::vector< std::string > getOutputAudioPluginList(); + std::vector< std::string > getAudioPluginList(); void setInputAudioPlugin(const std::string& audioPlugin); void setOutputAudioPlugin(const std::string& audioPlugin); std::vector< std::string > getAudioOutputDeviceList(); diff --git a/sflphone-common/src/eventthread.cpp b/sflphone-common/src/eventthread.cpp index 3c548e5f71..9ed09633fc 100644 --- a/sflphone-common/src/eventthread.cpp +++ b/sflphone-common/src/eventthread.cpp @@ -54,7 +54,7 @@ void AudioThread::run (void) { while (!testCancel()) { _alsa->audioCallback(); - Thread::sleep (3); + Thread::sleep (20); } } diff --git a/sflphone-common/src/global.h b/sflphone-common/src/global.h index 312f8407c5..b9812b7255 100644 --- a/sflphone-common/src/global.h +++ b/sflphone-common/src/global.h @@ -86,6 +86,8 @@ static const SOUND_FORMAT INT32 = 0x8; #define PCM_PLUGHW "plughw" /** Alsa plugin */ #define PCM_DEFAULT "default" /** Default ALSA plugin */ #define PCM_DMIX "plug:dmix" /** Alsa plugin for software mixing */ +#define PCM_DSNOOP "plug:dsnoop" /** Alsa plugin for microphone sharing */ +#define PCM_DMIX_DSNOOP "dmix/dsnoop" /** Audio profile using Alsa dmix/dsnoop */ #define SFL_CODEC_VALID_PREFIX "libcodec_" /** Valid prefix for codecs shared library */ #define SFL_CODEC_VALID_EXTEN ".so" /** Valid extension for codecs shared library */ -- GitLab