]> git.alsa-project.org Git - alsa-gobject.git/commitdiff
ctl: simplify event dispatching for element event topic/rename-ctl-event-mask
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Mon, 30 Dec 2019 03:01:55 +0000 (12:01 +0900)
committerTakashi Sakamoto <o-takashi@sakamocchi.jp>
Mon, 30 Dec 2019 05:20:05 +0000 (14:20 +0900)
Formerly, GSource for card includes the list of ALSACtlElemId instances
since 'snd_ctl_elem_id' structure was wrapped by GObject class object.
However now it's GObject boxed object and emit signals without the class
object.

This commit removes useless list of ALSACtlElemId and dispatch the event
directly.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
src/ctl/card.c

index c4a512b9a3dfcc44ccddf6b81e8c6de57b00b481..0a53a7ccfa17437a7196ef1f0171f2fb6f7af3c2 100644 (file)
@@ -30,7 +30,6 @@ typedef struct {
     gpointer tag;
     void *buf;
     unsigned int buf_len;
-    GList *entries;
 } CtlCardSource;
 
 enum ctl_card_prop_type {
@@ -762,39 +761,18 @@ void alsactl_card_read_elem_value(ALSACtlCard *self,
 static void handle_elem_event(CtlCardSource *src, struct snd_ctl_event *ev)
 {
     ALSACtlCard *self = src->self;
-    GList *entry;
+    ALSACtlElemId *elem_id;
+    ALSACtlElemEventMask mask;
 
-    // Maintain local cache for addition of element.
-    if (ev->data.elem.mask & SNDRV_CTL_EVENT_MASK_ADD) {
-        ALSACtlElemId *elem_id =
-                        g_boxed_copy(ALSACTL_TYPE_ELEM_ID, &ev->data.elem.id);
-        src->entries = g_list_append(src->entries, (gpointer)elem_id);
-    }
-
-    for (entry = src->entries; entry != NULL; entry = entry->next) {
-        ALSACtlElemId *elem_id = (ALSACtlElemId *)entry->data;
-
-        if (ev->data.elem.id.numid == elem_id->numid) {
-            ALSACtlElemEventMask mask;
-
-            if (ev->data.elem.mask != SNDRV_CTL_EVENT_MASK_REMOVE)
-                mask = ev->data.elem.mask;
-            else
-                mask = ALSACTL_ELEM_EVENT_MASK_REMOVE;
+    elem_id = &ev->data.elem.id;
 
-            g_signal_emit(self,
-                          ctl_card_sigs[CTL_CARD_SIG_HANDLE_ELEM_EVENT], 0,
-                          elem_id, mask);
-
-            // Maintain local cache for removal of element.
-            if (ev->data.elem.mask == SNDRV_CTL_EVENT_MASK_REMOVE) {
-                src->entries = g_list_delete_link(src->entries, entry);
-                g_boxed_free(ALSACTL_TYPE_ELEM_ID, elem_id);
-            }
+    if (ev->data.elem.mask != SNDRV_CTL_EVENT_MASK_REMOVE)
+        mask = ev->data.elem.mask;
+    else
+        mask = ALSACTL_ELEM_EVENT_MASK_REMOVE;
 
-            break;
-        }
-    }
+    g_signal_emit(self, ctl_card_sigs[CTL_CARD_SIG_HANDLE_ELEM_EVENT], 0,
+                  elem_id, mask);
 }
 
 static gboolean ctl_card_prepare_src(GSource *src, gint *timeout)
@@ -863,7 +841,6 @@ static void ctl_card_finalize_src(GSource *gsrc)
 {
     CtlCardSource *src = (CtlCardSource *)gsrc;
     ALSACtlCardPrivate *priv = alsactl_card_get_instance_private(src->self);
-    GList *entry;
 
     // Unsubscribe events.
     if (g_atomic_int_dec_and_test(&priv->subscribers)) {
@@ -871,12 +848,6 @@ static void ctl_card_finalize_src(GSource *gsrc)
         ioctl(priv->fd, SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS, &subscribe);
     }
 
-    for (entry = src->entries; entry != NULL; entry = entry->next) {
-        ALSACtlElemId *elem_id = (ALSACtlElemId *)entry->data;
-        g_boxed_free(ALSACTL_TYPE_ELEM_ID, elem_id);
-    }
-    g_list_free(src->entries);
-
     g_free(src->buf);
     g_object_unref(src->self);
 }
@@ -930,12 +901,6 @@ void alsactl_card_create_source(ALSACtlCard *self, GSource **gsrc,
     src->buf = buf;
     src->buf_len = page_size;
 
-    alsactl_card_get_elem_id_list(self, &src->entries, error);
-    if (*error != NULL) {
-            g_source_unref(*gsrc);
-            return;
-    }
-
     // Subscribe any event.
     {
         int subscribe = 1;