From: Takashi Sakamoto Date: Mon, 30 Dec 2019 03:01:55 +0000 (+0900) Subject: ctl: simplify event dispatching for element event X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=refs%2Fheads%2Ftopic%2Frename-ctl-event-mask;p=alsa-gobject.git ctl: simplify event dispatching for element event 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 --- diff --git a/src/ctl/card.c b/src/ctl/card.c index c4a512b..0a53a7c 100644 --- a/src/ctl/card.c +++ b/src/ctl/card.c @@ -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;