From 671b927955745dd62787113a8b8ebcaf018ec0f6 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sun, 1 Mar 2009 21:34:01 +0100 Subject: add logic for initializing a useful icon name --- src/modules/alsa/alsa-sink.c | 2 +- src/modules/alsa/alsa-source.c | 2 +- src/modules/alsa/alsa-util.c | 23 ++++--------- src/modules/alsa/alsa-util.h | 2 +- src/modules/alsa/module-alsa-card.c | 2 +- src/pulse/proplist.h | 6 ++++ src/pulsecore/card.c | 3 ++ src/pulsecore/sink.c | 69 +++++++++++++++++++++++++++++++++++++ src/pulsecore/sink.h | 3 ++ src/pulsecore/source.c | 3 ++ 10 files changed, 95 insertions(+), 20 deletions(-) diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c index b6fcbb79..7768b38e 100644 --- a/src/modules/alsa/alsa-sink.c +++ b/src/modules/alsa/alsa-sink.c @@ -1667,7 +1667,7 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_DESCRIPTION, profile->description); } - pa_alsa_set_description(data.proplist); + pa_alsa_init_description(data.proplist); u->sink = pa_sink_new(m->core, &data, PA_SINK_HARDWARE|PA_SINK_LATENCY); pa_sink_new_data_done(&data); diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c index f56b96f3..def638ec 100644 --- a/src/modules/alsa/alsa-source.c +++ b/src/modules/alsa/alsa-source.c @@ -1509,7 +1509,7 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_DESCRIPTION, profile->description); } - pa_alsa_set_description(data.proplist); + pa_alsa_init_description(data.proplist); u->source = pa_source_new(m->core, &data, PA_SOURCE_HARDWARE|PA_SOURCE_LATENCY); pa_source_new_data_done(&data); diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c index 2f06acd0..7d833ff7 100644 --- a/src/modules/alsa/alsa-util.c +++ b/src/modules/alsa/alsa-util.c @@ -1366,33 +1366,24 @@ void pa_alsa_redirect_errors_dec(void) { snd_lib_error_set_handler(NULL); } -void pa_alsa_set_description(pa_proplist *p) { +pa_bool_t pa_alsa_init_description(pa_proplist *p) { const char *s; pa_assert(p); - if (pa_proplist_contains(p, PA_PROP_DEVICE_DESCRIPTION)) - return; - - if ((s = pa_proplist_gets(p, PA_PROP_DEVICE_FORM_FACTOR))) - if (pa_streq(s, "internal")) { - pa_proplist_sets(p, PA_PROP_DEVICE_DESCRIPTION, _("Internal Audio")); - return; - } - - if ((s = pa_proplist_gets(p, PA_PROP_DEVICE_PRODUCT_NAME))) { - pa_proplist_sets(p, PA_PROP_DEVICE_DESCRIPTION, s); - return; - } + if (pa_device_init_description(p)) + return TRUE; if ((s = pa_proplist_gets(p, "alsa.card_name"))) { pa_proplist_sets(p, PA_PROP_DEVICE_DESCRIPTION, s); - return; + return TRUE; } if ((s = pa_proplist_gets(p, "alsa.name"))) { pa_proplist_sets(p, PA_PROP_DEVICE_DESCRIPTION, s); - return; + return TRUE; } + + return FALSE; } void pa_alsa_init_proplist_card(pa_core *c, pa_proplist *p, int card) { diff --git a/src/modules/alsa/alsa-util.h b/src/modules/alsa/alsa-util.h index 1fb5996a..a8397ae9 100644 --- a/src/modules/alsa/alsa-util.h +++ b/src/modules/alsa/alsa-util.h @@ -123,7 +123,7 @@ void pa_alsa_redirect_errors_dec(void); void pa_alsa_init_proplist_pcm_info(pa_core *c, pa_proplist *p, snd_pcm_info_t *pcm_info); void pa_alsa_init_proplist_card(pa_core *c, pa_proplist *p, int card); void pa_alsa_init_proplist_pcm(pa_core *c, pa_proplist *p, snd_pcm_t *pcm); -void pa_alsa_set_description(pa_proplist *p); +pa_bool_t pa_alsa_init_description(pa_proplist *p); int pa_alsa_recover_from_poll(snd_pcm_t *pcm, int revents); diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c index 74f3099b..9e149a48 100644 --- a/src/modules/alsa/module-alsa-card.c +++ b/src/modules/alsa/module-alsa-card.c @@ -318,7 +318,7 @@ int pa__init(pa_module *m) { data.module = m; pa_alsa_init_proplist_card(m->core, data.proplist, alsa_card_index); pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, u->device_id); - pa_alsa_set_description(data.proplist); + pa_alsa_init_description(data.proplist); set_card_name(&data, ma, u->device_id); if (reserve) diff --git a/src/pulse/proplist.h b/src/pulse/proplist.h index 7d3b7f7f..5d2693cd 100644 --- a/src/pulse/proplist.h +++ b/src/pulse/proplist.h @@ -171,6 +171,12 @@ PA_C_DECL_BEGIN /** For devices: bus of the device if applicable. One of "isa", "pci", "usb", "firewire", "bluetooth" */ #define PA_PROP_DEVICE_BUS "device.bus" +/** For devices: icon for the device. A binary blob containing PNG image data */ +#define PA_PROP_DEVICE_ICON "device.icon" + +/** For devices: an XDG icon name for the device. e.g. "sound-card-speakers-usb" */ +#define PA_PROP_DEVICE_ICON_NAME "device.icon_name" + /** For devices: access mode of the device if applicable. One of "mmap", "mmap_rewrite", "serial" */ #define PA_PROP_DEVICE_ACCESS_MODE "device.access_mode" diff --git a/src/pulsecore/card.c b/src/pulsecore/card.c index 515d1f90..94064c72 100644 --- a/src/pulsecore/card.c +++ b/src/pulsecore/card.c @@ -160,6 +160,9 @@ pa_card *pa_card_new(pa_core *core, pa_card_new_data *data) { c->userdata = NULL; c->set_profile = NULL; + pa_device_init_description(c->proplist); + pa_device_init_icon(c->proplist, TRUE); + pa_assert_se(pa_idxset_put(core->cards, c, &c->index) >= 0); pa_log_info("Created %u \"%s\"", c->index, c->name); diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c index 7441e971..fadbb857 100644 --- a/src/pulsecore/sink.c +++ b/src/pulsecore/sink.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -172,6 +173,9 @@ pa_sink* pa_sink_new( if (data->card) pa_proplist_update(data->proplist, PA_UPDATE_MERGE, data->card->proplist); + pa_device_init_description(data->proplist); + pa_device_init_icon(data->proplist, TRUE); + if (pa_hook_fire(&core->hooks[PA_CORE_HOOK_SINK_FIXATE], data) < 0) { pa_xfree(s); pa_namereg_unregister(core, name); @@ -1886,3 +1890,68 @@ size_t pa_sink_get_max_request(pa_sink *s) { return r; } + +/* Called from main context */ +pa_bool_t pa_device_init_icon(pa_proplist *p, pa_bool_t is_sink) { + const char *ff, *t = NULL, *s = "", *profile, *bus; + + pa_assert(p); + + if (pa_proplist_contains(p, PA_PROP_DEVICE_ICON_NAME)) + return TRUE; + + if ((ff = pa_proplist_gets(p, PA_PROP_DEVICE_FORM_FACTOR))) { + + if (pa_streq(ff, "microphone")) + t = "audio-input-microphone"; + else if (pa_streq(ff, "webcam")) + t = "camera-web"; + else if (pa_streq(ff, "computer")) + t = "computer"; + else if (pa_streq(ff, "handset")) + t = "phone"; + } + + if (!t) { + if (is_sink) + t = "audio-card"; + else + t = "audio-input-microphone"; + } + + if ((profile = pa_proplist_gets(p, PA_PROP_DEVICE_PROFILE_NAME))) { + if (strstr(profile, "analog")) + s = "-analog"; + else if (strstr(profile, "iec958")) + s = "-iec958"; + else if (strstr(profile, "hdmi")) + s = "-hdmi"; + } + + bus = pa_proplist_gets(p, PA_PROP_DEVICE_BUS); + + pa_proplist_setf(p, PA_PROP_DEVICE_ICON_NAME, "%s%s%s%s", t, pa_strempty(s), bus ? "-" : "", pa_strempty(bus)); + + return TRUE; +} + +pa_bool_t pa_device_init_description(pa_proplist *p) { + const char *s; + pa_assert(p); + + if (pa_proplist_contains(p, PA_PROP_DEVICE_DESCRIPTION)) + return TRUE; + + if ((s = pa_proplist_gets(p, PA_PROP_DEVICE_FORM_FACTOR))) + if (pa_streq(s, "internal")) { + pa_proplist_sets(p, PA_PROP_DEVICE_DESCRIPTION, _("Internal Audio")); + return TRUE; + } + + if ((s = pa_proplist_gets(p, PA_PROP_DEVICE_PRODUCT_NAME))) { + pa_proplist_sets(p, PA_PROP_DEVICE_DESCRIPTION, s); + return TRUE; + } + + return FALSE; +} diff --git a/src/pulsecore/sink.h b/src/pulsecore/sink.h index 124b4e11..2eaae697 100644 --- a/src/pulsecore/sink.h +++ b/src/pulsecore/sink.h @@ -225,6 +225,9 @@ void pa_sink_attach(pa_sink *s); void pa_sink_set_soft_volume(pa_sink *s, const pa_cvolume *volume); +pa_bool_t pa_device_init_description(pa_proplist *p); +pa_bool_t pa_device_init_icon(pa_proplist *p, pa_bool_t is_sink); + /**** May be called by everyone, from main context */ /* The returned value is supposed to be in the time domain of the sound card! */ diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c index c0d6d9ea..4ce5cbfe 100644 --- a/src/pulsecore/source.c +++ b/src/pulsecore/source.c @@ -163,6 +163,9 @@ pa_source* pa_source_new( if (data->card) pa_proplist_update(data->proplist, PA_UPDATE_MERGE, data->card->proplist); + pa_device_init_description(data->proplist); + pa_device_init_icon(data->proplist, FALSE); + if (pa_hook_fire(&core->hooks[PA_CORE_HOOK_SOURCE_FIXATE], data) < 0) { pa_xfree(s); pa_namereg_unregister(core, name); -- cgit