+ /** @brief Return non-0 iff @p d is a valid device name */
+ int (*validate_device)(const char *d);
+
+ /** @brief Return non-0 iff @p c is a valid channel name */
+ int (*validate_channel)(const char *c);
+
+ /** @brief Get the volume
+ * @param left Where to store left-channel volume
+ * @param right Where to store right-channel volume
+ * @return 0 on success, non-0 on error
+ */
+ int (*get)(int *left, int *right);
+
+ /** @brief Set the volume
+ * @param left Pointer to target left-channel volume
+ * @param right Pointer to target right-channel volume
+ * @return 0 on success, non-0 on error
+ *
+ * @p left and @p right are updated with the actual volume set.
+ */
+ int (*set)(int *left, int *right);
+
+ /** @brief Default device */
+ const char *device;
+
+ /** @brief Default channel */
+ const char *channel;
+};
+
+int mixer_valid_device(int api, const char *d);
+int mixer_valid_channel(int api, const char *c);