[pulseaudio-discuss] [PATCH] card-restore: Fix profile restoring with bluetooth
David Henningsson
david.henningsson at canonical.com
Tue Dec 16 05:02:05 PST 2014
When I test this patch, I get bitten by the same thing I got when I
developed my version of the patch: The "remote end hung up" problem
which causes the sink to be constantly suspended.
I worked around this myself by disabling this code:
- release = (t->state != PA_BLUETOOTH_TRANSPORT_STATE_PLAYING &&
u->profile == t->profile);
+ release = (false && t->state !=
PA_BLUETOOTH_TRANSPORT_STATE_PLAYING && u->profile == t->profile);
...but that's obviously wrong.
On 2014-12-16 12:14, Tanu Kaskinen wrote:
> The bluetooth card is created when the first profile becomes
> available, which means that the card may have profiles that are not
> available when the card is initialized. If module-card-restore tries
> to restore such profile, that will fail, and the card will be
> initialized with the "off" profile active.
>
> This patch modifies module-card-restore so that if follows the profile
> availability status, and when the saved profile becomes available, it
> is activated. Additionally, module-card-restore is modified so that it
> doesn't even try to restore unavailable profiles, when the necessary
> information is available. In practice there are two existing places
> where the profile is restored, and only one of those contexts has the
> necessary information available. Unfortunately, it's the more
> important context (card creation) where the information is not
> available. This means that module-card-restore will set the initial
> profile of a new card even if the profile is unavailable, and this
> will cause an ugly warning in the log, even though there's nothing
> abnormal happening.
>
> BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=87081
> ---
> src/modules/module-card-restore.c | 34 ++++++++++++++++++++++++++++++++++
> 1 file changed, 34 insertions(+)
>
> diff --git a/src/modules/module-card-restore.c b/src/modules/module-card-restore.c
> index 681acca..beb748e 100644
> --- a/src/modules/module-card-restore.c
> +++ b/src/modules/module-card-restore.c
> @@ -66,6 +66,7 @@ struct userdata {
> pa_hook_slot *card_put_hook_slot;
> pa_hook_slot *card_profile_changed_hook_slot;
> pa_hook_slot *card_profile_added_hook_slot;
> + pa_hook_slot *profile_available_changed_hook_slot;
> pa_hook_slot *port_offset_hook_slot;
> pa_time_event *save_time_event;
> pa_database *database;
> @@ -412,6 +413,9 @@ static pa_hook_result_t card_profile_added_callback(pa_core *c, pa_card_profile
>
> pa_assert(profile);
>
> + if (profile->available == PA_AVAILABLE_NO)
> + return PA_HOOK_OK;
> +
> if (!(entry = entry_read(u, profile->card->name)))
> return PA_HOOK_OK;
>
> @@ -425,6 +429,33 @@ static pa_hook_result_t card_profile_added_callback(pa_core *c, pa_card_profile
> return PA_HOOK_OK;
> }
>
> +static pa_hook_result_t profile_available_changed_callback(void *hook_data, void *call_data, void *userdata) {
> + pa_card_profile *profile = call_data;
> + pa_card *card;
> + struct userdata *u = userdata;
> + struct entry *entry;
> +
> + pa_assert(profile);
> + pa_assert(u);
> +
> + card = profile->card;
> +
> + if (profile->available == PA_AVAILABLE_NO)
> + return PA_HOOK_OK;
> +
> + entry = entry_read(u, card->name);
> + if (!entry)
> + return PA_HOOK_OK;
> +
> + if (!pa_streq(profile->name, entry->profile))
> + return PA_HOOK_OK;
> +
> + pa_log_info("Card %s profile %s became available, activating.", card->name, profile->name);
> + pa_card_set_profile(profile->card, profile, true);
> +
> + return PA_HOOK_OK;
> +}
> +
> static pa_hook_result_t port_offset_change_callback(pa_core *c, pa_device_port *port, struct userdata *u) {
> struct entry *entry;
> pa_card *card;
> @@ -511,6 +542,8 @@ int pa__init(pa_module*m) {
> u->card_put_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_CARD_PUT], PA_HOOK_NORMAL, (pa_hook_cb_t) card_put_hook_callback, u);
> u->card_profile_changed_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_CARD_PROFILE_CHANGED], PA_HOOK_NORMAL, (pa_hook_cb_t) card_profile_changed_callback, u);
> u->card_profile_added_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_CARD_PROFILE_ADDED], PA_HOOK_NORMAL, (pa_hook_cb_t) card_profile_added_callback, u);
> + u->profile_available_changed_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_CARD_PROFILE_AVAILABLE_CHANGED],
> + PA_HOOK_NORMAL, profile_available_changed_callback, u);
> u->port_offset_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_PORT_LATENCY_OFFSET_CHANGED], PA_HOOK_NORMAL, (pa_hook_cb_t) port_offset_change_callback, u);
> u->hooks_connected = true;
>
> @@ -551,6 +584,7 @@ void pa__done(pa_module*m) {
> pa_hook_slot_free(u->card_put_hook_slot);
> pa_hook_slot_free(u->card_profile_changed_hook_slot);
> pa_hook_slot_free(u->card_profile_added_hook_slot);
> + pa_hook_slot_free(u->profile_available_changed_hook_slot);
> pa_hook_slot_free(u->port_offset_hook_slot);
> }
>
>
--
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic
More information about the pulseaudio-discuss
mailing list