[pulseaudio-discuss] [PATCH] card: Created pa_card_put, which should be called after the default profile has been initialised.

Ștefan Săftescu stefan.saftescu at gmail.com
Thu Aug 2 08:42:07 PDT 2012


This patch separates the pa_card_put code from pa_card_new to allow the
card module to initialise the default profile (and have the sinks and sources
created) before finishing the card registration. Previously,
PA_CORE_HOOK_CARD_PUT was being fired without the card having any sinks or
sources.

---
 src/modules/alsa/module-alsa-card.c             |  2 ++
 src/modules/bluetooth/module-bluetooth-device.c |  2 ++
 src/modules/macosx/module-coreaudio-device.c    |  2 ++
 src/pulsecore/card.c                            | 17 +++++++++++++----
 src/pulsecore/card.h                            |  2 ++
 5 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c
index 366f4ba..2ab4c5c 100644
--- a/src/modules/alsa/module-alsa-card.c
+++ b/src/modules/alsa/module-alsa-card.c
@@ -688,6 +688,8 @@ int pa__init(pa_module *m) {
                     "is abused (i.e. fixes are not pushed to ALSA), the decibel fix feature may be removed in some future "
                     "PulseAudio version.", u->card->name);
 
+    pa_card_put(u->card);
+
     return 0;
 
 fail:
diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 06b4033..40c3d4f 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -3130,6 +3130,8 @@ int pa__init(pa_module* m) {
         if (init_profile(u) < 0)
             goto fail;
 
+    pa_card_put(u->card);
+
     if (u->sink || u->source)
         if (start_thread(u) < 0)
             goto fail;
diff --git a/src/modules/macosx/module-coreaudio-device.c b/src/modules/macosx/module-coreaudio-device.c
index 6d39158..824eb9b 100644
--- a/src/modules/macosx/module-coreaudio-device.c
+++ b/src/modules/macosx/module-coreaudio-device.c
@@ -768,6 +768,8 @@ int pa__init(pa_module *m) {
     /* create sources */
     ca_device_create_streams(m, TRUE);
 
+    pa_card_put(u->card);
+
     /* create the message thread */
     if (!(u->thread = pa_thread_new(u->device_name, thread_func, u))) {
         pa_log("Failed to create thread.");
diff --git a/src/pulsecore/card.c b/src/pulsecore/card.c
index 492c051..6e179fb 100644
--- a/src/pulsecore/card.c
+++ b/src/pulsecore/card.c
@@ -172,15 +172,24 @@ pa_card *pa_card_new(pa_core *core, pa_card_new_data *data) {
     pa_device_init_icon(c->proplist, TRUE);
     pa_device_init_intended_roles(c->proplist);
 
-    pa_assert_se(pa_idxset_put(core->cards, c, &c->index) >= 0);
-
     pa_log_info("Created %u \"%s\"", c->index, c->name);
-    pa_subscription_post(core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_NEW, c->index);
 
-    pa_hook_fire(&core->hooks[PA_CORE_HOOK_CARD_PUT], c);
     return c;
 }
 
+void pa_card_put(pa_card *c) {
+    pa_assert(c);
+    /* A card should have at least a sink or a source? What about the Off profile? */
+    /* pa_assert(!pa_idxset_is_empty(c->sinks) || !pa_idxset_is_empty(c->sources)); */
+    /* TODO: do I need to check for other stuff? */
+    /* pa_assert(c->set_profile); */
+
+    pa_assert_se(pa_idxset_put(c->core->cards, c, &c->index) >= 0);
+
+    pa_subscription_post(c->core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_NEW, c->index);
+    pa_hook_fire(&c->core->hooks[PA_CORE_HOOK_CARD_PUT], c);
+}
+
 void pa_card_free(pa_card *c) {
     pa_core *core;
 
diff --git a/src/pulsecore/card.h b/src/pulsecore/card.h
index 6f942e8..f592589 100644
--- a/src/pulsecore/card.h
+++ b/src/pulsecore/card.h
@@ -100,6 +100,8 @@ void pa_card_new_data_done(pa_card_new_data *data);
 pa_card *pa_card_new(pa_core *c, pa_card_new_data *data);
 void pa_card_free(pa_card *c);
 
+void pa_card_put(pa_card *c);
+
 int pa_card_set_profile(pa_card *c, const char *name, pa_bool_t save);
 
 int pa_card_suspend(pa_card *c, pa_bool_t suspend, pa_suspend_cause_t cause);
-- 
1.7.11.2



More information about the pulseaudio-discuss mailing list