diff options
| author | Lennart Poettering <lennart@poettering.net> | 2009-01-20 20:35:18 +0100 | 
|---|---|---|
| committer | Lennart Poettering <lennart@poettering.net> | 2009-01-20 20:35:18 +0100 | 
| commit | 7368a6e6be5dbbdc8e13003ef6841fe3fe1840bc (patch) | |
| tree | 0c1fbef18992fcdb5d782f4988d54e25e8e00b10 | |
| parent | b3a043fd3179fcb60730466ae43f16ffe14a9b4c (diff) | |
add priority logic to find best default profile
| -rw-r--r-- | src/modules/alsa/alsa-util.c | 35 | ||||
| -rw-r--r-- | src/modules/alsa/alsa-util.h | 1 | ||||
| -rw-r--r-- | src/modules/alsa/module-alsa-card.c | 1 | ||||
| -rw-r--r-- | src/pulsecore/card.c | 17 | ||||
| -rw-r--r-- | src/pulsecore/card.h | 2 | ||||
| -rw-r--r-- | src/pulsecore/cli-text.c | 2 | 
6 files changed, 43 insertions, 15 deletions
| diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c index 65221764..eb7042b8 100644 --- a/src/modules/alsa/alsa-util.c +++ b/src/modules/alsa/alsa-util.c @@ -495,62 +495,72 @@ static const struct pa_alsa_profile_info device_table[] = {      {{ 1, { PA_CHANNEL_POSITION_MONO }},       "hw",       "Analog Mono", -     "analog-mono" }, +     "analog-mono", +     1 },      {{ 2, { PA_CHANNEL_POSITION_LEFT, PA_CHANNEL_POSITION_RIGHT }},       "front",       "Analog Stereo", -     "analog-stereo" }, +     "analog-stereo", +     10 },      {{ 2, { PA_CHANNEL_POSITION_LEFT, PA_CHANNEL_POSITION_RIGHT }},       "iec958",       "IEC958 Digital Stereo", -     "iec958-stereo" }, +     "iec958-stereo", +     5 },      {{ 2, { PA_CHANNEL_POSITION_LEFT, PA_CHANNEL_POSITION_RIGHT }},       "hdmi",       "HDMI Digital Stereo", -     "hdmi-stereo"}, +     "hdmi-stereo", +     4 },      {{ 4, { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT,              PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT }},       "surround40",       "Analog Surround 4.0", -     "analog-surround-40" }, +     "analog-surround-40", +     7 },      {{ 4, { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT,              PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT }},       "a52",       "IEC958/AC3 Digital Surround 4.0", -     "iec958-ac3-surround-40" }, +     "iec958-ac3-surround-40", +     2 },      {{ 5, { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT,              PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT,              PA_CHANNEL_POSITION_LFE }},       "surround41",       "Analog Surround 4.1", -     "analog-surround-41"}, +     "analog-surround-41", +     7 },      {{ 5, { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT,              PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT,              PA_CHANNEL_POSITION_CENTER }},       "surround50",       "Analog Surround 5.0", -     "analog-surround-50" }, +     "analog-surround-50", +     7 },      {{ 6, { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT,              PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT,              PA_CHANNEL_POSITION_CENTER, PA_CHANNEL_POSITION_LFE }},       "surround51",       "Analog Surround 5.1", -     "analog-surround-51" }, +     "analog-surround-51", +     8 },      {{ 6, { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_CENTER,              PA_CHANNEL_POSITION_FRONT_RIGHT, PA_CHANNEL_POSITION_REAR_LEFT,              PA_CHANNEL_POSITION_REAR_RIGHT, PA_CHANNEL_POSITION_LFE}},       "a52",       "IEC958/AC3 Digital Surround 5.1", -     "iec958-ac3-surround-51" }, +     "iec958-ac3-surround-51", +     3 },      {{ 8, { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT,              PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT, @@ -558,9 +568,10 @@ static const struct pa_alsa_profile_info device_table[] = {              PA_CHANNEL_POSITION_SIDE_LEFT, PA_CHANNEL_POSITION_SIDE_RIGHT }},       "surround71",       "Analog Surround 7.1", -     "analog-surround-71" }, +     "analog-surround-71", +     7 }, -    {{ 0, { 0 }}, NULL, NULL, NULL } +    {{ 0, { 0 }}, NULL, NULL, NULL, 0 }  };  static pa_bool_t channel_map_superset(const pa_channel_map *a, const pa_channel_map *b) { diff --git a/src/modules/alsa/alsa-util.h b/src/modules/alsa/alsa-util.h index f58ec8e0..59656252 100644 --- a/src/modules/alsa/alsa-util.h +++ b/src/modules/alsa/alsa-util.h @@ -86,6 +86,7 @@ typedef struct pa_alsa_profile_info {      const char *alsa_name;      const char *description;      const char *name; +    unsigned priority;  } pa_alsa_profile_info;  int pa_alsa_probe_profiles( diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c index ac6083de..6c947c06 100644 --- a/src/modules/alsa/module-alsa-card.c +++ b/src/modules/alsa/module-alsa-card.c @@ -108,6 +108,7 @@ static void enumerate_cb(      pa_xfree(t);      pa_xfree(n); +    p->priority = (sink ? sink->priority : 0)*100 + (source ? source->priority : 0);      p->n_sinks = !!sink;      p->n_sources = !!source; diff --git a/src/pulsecore/card.c b/src/pulsecore/card.c index 8e29f0a5..cb775534 100644 --- a/src/pulsecore/card.c +++ b/src/pulsecore/card.c @@ -45,6 +45,10 @@ pa_card_profile *pa_card_profile_new(const char *name, const char *description,      c->name = pa_xstrdup(name);      c->description = pa_xstrdup(description); +    c->priority = 0; +    c->n_sinks = c->n_sources = 0; +    c->max_sink_channels = c->max_source_channels = 0; +      return c;  } @@ -125,8 +129,17 @@ pa_card *pa_card_new(pa_core *core, pa_card_new_data *data) {      c->profiles = data->profiles;      data->profiles = NULL;      if (!(c->active_profile = data->active_profile)) -        if (c->profiles) -            c->active_profile = pa_hashmap_first(c->profiles); +        if (c->profiles) { +            void *state = NULL; +            pa_card_profile *p; + +            while ((p = pa_hashmap_iterate(c->profiles, &state, NULL))) { +                if (!c->active_profile || +                    p->priority > c->active_profile->priority) + +                    c->active_profile = p; +            } +        }      data->active_profile = NULL;      c->userdata = NULL; diff --git a/src/pulsecore/card.h b/src/pulsecore/card.h index b4e68b04..17733c51 100644 --- a/src/pulsecore/card.h +++ b/src/pulsecore/card.h @@ -33,6 +33,8 @@ typedef struct pa_card_profile {      char *name;      char *description; +    unsigned priority; +      /* We probably want to have different properties later on here */      unsigned n_sinks;      unsigned n_sources; diff --git a/src/pulsecore/cli-text.c b/src/pulsecore/cli-text.c index f52968d7..947598b5 100644 --- a/src/pulsecore/cli-text.c +++ b/src/pulsecore/cli-text.c @@ -142,7 +142,7 @@ char *pa_card_list_to_string(pa_core *c) {                      "\tprofiles:\n");              while ((p = pa_hashmap_iterate(card->profiles, &state, NULL))) -                pa_strbuf_printf(s, "\t\t%s: %s\n", p->name, p->description); +                pa_strbuf_printf(s, "\t\t%s: %s (priority %u)\n", p->name, p->description, p->priority);          }          if (card->active_profile) | 
