+ s->f &= ~SF_ACTIVE;
+ source_dec(s);
+}
+
+/* --- @source_inc@ --- *
+ *
+ * Arguments: @source *s@ = pointer to a source
+ *
+ * Returns: ---
+ *
+ * Use: Increments a source's refcount.
+ */
+
+void source_inc(source *s) { s->ref++; }
+
+/* --- @source_dec@ --- *
+ *
+ * Arguments: @source *s@ = pointer to a source
+ *
+ * Returns: ---
+ *
+ * Use: Decrements a source's refcount, destroying it if necessary.
+ */
+
+void source_dec(source *s)
+{
+ assert(s->ref > 0);
+ s->ref--;
+ if (!s->ref) {
+ if (s->f&SF_ACTIVE) s->ops->shutdown(s);
+ s->ops->destroy(s);
+ }