Commit Diff


commit - 05b36ee22c78d4ce6e03b06920bf428c44a97eda
commit + 2ae45b1c436f5e25cf4aad9f95f7640eb4affcac
blob - 42429877be1598461e50f1d6738cbfa3944c519c
blob + 7cbbe889753607cde67e5baef9e8732ecfe034c5
--- siomixer.c
+++ siomixer.c
@@ -51,7 +51,20 @@ struct info *firstent(struct info *, char *);
 struct info *nextent(struct info *, int);
 void ondesc(void *, struct sioctl_desc *, int);
 void onctl(void *, unsigned, unsigned);
+static void _info_free(struct info *);
 
+static void
+_info_free(struct info *i)
+{
+	if (i == NULL)
+		return;
+	if (i->widget)
+		audiowidget_free(i->widget);
+	if (i->timeout)
+		g_source_remove(i->timeout);
+	free(i);
+}
+
 /*
  * compare two sioctl_desc structures, used to sort infolist
  */
@@ -109,10 +122,7 @@ ondesc(void *arg, struct sioctl_desc *d, int curval)
 	for (pi = &s.infolist; (i = *pi) != NULL; pi = &i->next) {
 		if (d->addr == i->desc.addr) {
 			*pi = i->next;
-			if (i->widget) {
-				audiowidget_free(i->widget);
-			}
-			free(i);
+			_info_free(i);
 			break;
 		}
 	}