mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-29 05:40:23 -04:00
card: Add card profile availability
Some cards are capable to announce if a specific profile is available or not, effectively predicting whether a profile switch would fail or would likely succeed. This can for example be useful for a UI that would gray out any unavailable profile. In addition, this information can be useful for internal modules implementing automatic profile-switching policies, such as module-switch-on-port-available or module-bluetooth-policy. In particular, this information is essential when a port is associated to multiple card profiles and therefore the port availability flag does not provide enough information. The port "bluetooth-output" falls into this category, for example, since it doesn't distinguish HSP/HFP from A2DP.
This commit is contained in:
parent
8851644a3c
commit
afd33da56a
3 changed files with 25 additions and 0 deletions
|
|
@ -63,6 +63,26 @@ void pa_card_profile_free(pa_card_profile *c) {
|
|||
pa_xfree(c);
|
||||
}
|
||||
|
||||
void pa_card_profile_set_available(pa_card_profile *c, pa_available_t available) {
|
||||
pa_core *core;
|
||||
|
||||
pa_assert(c);
|
||||
pa_assert(c->card); /* Modify member variable directly during creation instead of using this function */
|
||||
|
||||
if (c->available == available)
|
||||
return;
|
||||
|
||||
c->available = available;
|
||||
pa_log_debug("Setting card %s profile %s to availability status %s", c->card->name, c->name,
|
||||
available == PA_AVAILABLE_YES ? "yes" : available == PA_AVAILABLE_NO ? "no" : "unknown");
|
||||
|
||||
/* Post subscriptions to the card which owns us */
|
||||
pa_assert_se(core = c->card->core);
|
||||
pa_subscription_post(core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_CHANGE, c->card->index);
|
||||
|
||||
pa_hook_fire(&core->hooks[PA_CORE_HOOK_CARD_PROFILE_AVAILABLE_CHANGED], c);
|
||||
}
|
||||
|
||||
pa_card_new_data* pa_card_new_data_init(pa_card_new_data *data) {
|
||||
pa_assert(data);
|
||||
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ typedef struct pa_card_profile {
|
|||
char *description;
|
||||
|
||||
unsigned priority;
|
||||
pa_available_t available; /* PA_AVAILABLE_UNKNOWN, PA_AVAILABLE_NO or PA_AVAILABLE_YES */
|
||||
|
||||
/* We probably want to have different properties later on here */
|
||||
unsigned n_sinks;
|
||||
|
|
@ -101,6 +102,9 @@ typedef struct pa_card_new_data {
|
|||
pa_card_profile *pa_card_profile_new(const char *name, const char *description, size_t extra);
|
||||
void pa_card_profile_free(pa_card_profile *c);
|
||||
|
||||
/* The profile's available status has changed */
|
||||
void pa_card_profile_set_available(pa_card_profile *c, pa_available_t available);
|
||||
|
||||
pa_card_new_data *pa_card_new_data_init(pa_card_new_data *data);
|
||||
void pa_card_new_data_set_name(pa_card_new_data *data, const char *name);
|
||||
void pa_card_new_data_set_profile(pa_card_new_data *data, const char *profile);
|
||||
|
|
|
|||
|
|
@ -114,6 +114,7 @@ typedef enum pa_core_hook {
|
|||
PA_CORE_HOOK_CARD_UNLINK,
|
||||
PA_CORE_HOOK_CARD_PROFILE_CHANGED,
|
||||
PA_CORE_HOOK_CARD_PROFILE_ADDED,
|
||||
PA_CORE_HOOK_CARD_PROFILE_AVAILABLE_CHANGED,
|
||||
PA_CORE_HOOK_PORT_AVAILABLE_CHANGED,
|
||||
PA_CORE_HOOK_PORT_ADDED,
|
||||
PA_CORE_HOOK_PORT_LATENCY_OFFSET_CHANGED,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue