add logic for initializing a useful icon name
authorLennart Poettering <lennart@poettering.net>
Sun, 1 Mar 2009 20:34:01 +0000 (21:34 +0100)
committerLennart Poettering <lennart@poettering.net>
Sun, 1 Mar 2009 20:38:27 +0000 (21:38 +0100)
src/modules/alsa/alsa-sink.c
src/modules/alsa/alsa-source.c
src/modules/alsa/alsa-util.c
src/modules/alsa/alsa-util.h
src/modules/alsa/module-alsa-card.c
src/pulse/proplist.h
src/pulsecore/card.c
src/pulsecore/sink.c
src/pulsecore/sink.h
src/pulsecore/source.c

index b6fcbb79aac83af8fa27151e388dc746d94323f6..7768b38e23e7183dc633bc9990a22e871cf40861 100644 (file)
@@ -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);
index f56b96f3b2ff9222d99ece891c367ba770acd774..def638ec6902ebe37d4a7744e36c5f232ff79330 100644 (file)
@@ -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);
index 2f06acd0c4b57d6570c05fc2e8152377a980dcb7..7d833ff7a35a7327a6fbabd871894c9b7bebadc5 100644 (file)
@@ -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) {
index 1fb5996ad85f02afad558eb5beffbb93acdcccf6..a8397ae9ce7575db4828effe52d5a6504dfbb6f1 100644 (file)
@@ -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);
 
index 74f3099b2fc370bfb73d7786f5465ccd6f617619..9e149a482e6369de9b52a43f4cc20825a43bf7d6 100644 (file)
@@ -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)
index 7d3b7f7ffa7b697ded528e0a85576018141c5441..5d2693cd2a6050975d75e8158d4da508fb3a2682 100644 (file)
@@ -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"
 
index 515d1f90881f46d6b30cd8e8bfd395de8816acb1..94064c728bf83a23e0a242245897fd2815313a23 100644 (file)
@@ -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);
index 7441e9717c6608f22b9f589a0dfc016853f2c30d..fadbb8579ffbd9dc11a802964c46d5b0a7a36f2d 100644 (file)
@@ -33,6 +33,7 @@
 #include <pulse/xmalloc.h>
 #include <pulse/timeval.h>
 #include <pulse/util.h>
+#include <pulse/i18n.h>
 
 #include <pulsecore/sink-input.h>
 #include <pulsecore/namereg.h>
@@ -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;
+}
index 124b4e11b5567a3b24617fa4bfbae0832edce3a4..2eaae6973901fe2b7befd0b9b36a4922b68b50bb 100644 (file)
@@ -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! */
index c0d6d9ea3318589186e4c31d36502d4c6434e2ee..4ce5cbfe524200fe565997465c7f9a22cae8abfb 100644 (file)
@@ -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);