src/modules/alsa/alsa-sink.c        |    9 +++++++++
 src/modules/alsa/alsa-source.c      |    9 +++++++++
 src/modules/alsa/module-alsa-card.c |    8 ++++++++
 3 files changed, 26 insertions(+)

New commits:
commit efb14524a210e84fff573753f697b3c9baaa67a3
Author: Alexander E. Patrakov <patra...@gmail.com>
Date:   Sun May 22 02:03:21 2016 +0500

    alsa: reread configuration when opening new devices
    
    If a card has been hot-plugged after pulseaudio start, alsa-lib still has
    old configuration in memory, which doesn't have PCM definitions for the
    new card. Thus, this error appears, and the device doesn't work:
    
    I: [pulseaudio] (alsa-lib)confmisc.c: Unable to find definition 
'cards.USB-Audio.pcm.front.0:CARD=0'
    I: [pulseaudio] (alsa-lib)conf.c: function snd_func_refer returned error: 
No such file or directory
    I: [pulseaudio] (alsa-lib)conf.c: Evaluate error: No such file or directory
    I: [pulseaudio] (alsa-lib)pcm.c: Unknown PCM front:0
    I: [pulseaudio] alsa-util.c: Error opening PCM device front:0: No such file 
or directory
    
    The snd_config_update_free_global() function makes alsa-lib forget any
    cached configuration and reparse all PCM definitions from scratch next
    time it is told to open anything.
    
    The trick has been copied from Phonon.
    
    Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=54029
    Signed-off-by: Alexander E. Patrakov <patra...@gmail.com>

diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
index 2fdebe0..63674e2 100644
--- a/src/modules/alsa/alsa-sink.c
+++ b/src/modules/alsa/alsa-sink.c
@@ -2146,6 +2146,15 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, 
const char*driver, pa_ca
     b = use_mmap;
     d = use_tsched;
 
+    /* Force ALSA to reread its configuration if module-alsa-card didn't
+     * do it for us. This matters if our device was hot-plugged after ALSA
+     * has already read its configuration - see
+     * https://bugs.freedesktop.org/show_bug.cgi?id=54029
+     */
+
+    if (!card)
+        snd_config_update_free_global();
+
     if (mapping) {
 
         if (!(dev_id = pa_modargs_get_value(ma, "device_id", NULL))) {
diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c
index 4683dfe..0820b48 100644
--- a/src/modules/alsa/alsa-source.c
+++ b/src/modules/alsa/alsa-source.c
@@ -1854,6 +1854,15 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs 
*ma, const char*driver, p
     b = use_mmap;
     d = use_tsched;
 
+    /* Force ALSA to reread its configuration if module-alsa-card didn't
+     * do it for us. This matters if our device was hot-plugged after ALSA
+     * has already read its configuration - see
+     * https://bugs.freedesktop.org/show_bug.cgi?id=54029
+     */
+
+    if (!card)
+        snd_config_update_free_global();
+
     if (mapping) {
 
         if (!(dev_id = pa_modargs_get_value(ma, "device_id", NULL))) {
diff --git a/src/modules/alsa/module-alsa-card.c 
b/src/modules/alsa/module-alsa-card.c
index 286cfc9..45ac263 100644
--- a/src/modules/alsa/module-alsa-card.c
+++ b/src/modules/alsa/module-alsa-card.c
@@ -686,6 +686,14 @@ int pa__init(pa_module *m) {
     }
 
     pa_modargs_get_value_boolean(u->modargs, "use_ucm", &u->use_ucm);
+
+    /* Force ALSA to reread its configuration. This matters if our device
+     * was hot-plugged after ALSA has already read its configuration - see
+     * https://bugs.freedesktop.org/show_bug.cgi?id=54029
+     */
+
+    snd_config_update_free_global();
+
     if (u->use_ucm && !pa_alsa_ucm_query_profiles(&u->ucm, 
u->alsa_card_index)) {
         pa_log_info("Found UCM profiles");
 

_______________________________________________
pulseaudio-commits mailing list
pulseaudio-commits@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/pulseaudio-commits

Reply via email to