SNDRV_HWDEP_IFACE_SSCAPE, /* Ensoniq SoundScape ISA card (MC68EC000) */
SNDRV_HWDEP_IFACE_VX, /* Digigram VX cards */
SNDRV_HWDEP_IFACE_MIXART, /* Digigram miXart cards */
+ SNDRV_HWDEP_IFACE_USX2Y, /* Tascam US122, US224 & US428 usb */
/* Don't forget to change the following: */
- SNDRV_HWDEP_IFACE_LAST = SNDRV_HWDEP_IFACE_MIXART,
+ SNDRV_HWDEP_IFACE_LAST = SNDRV_HWDEP_IFACE_USX2Y,
};
struct sndrv_hwdep_info {
* *
****************************************************************************/
-#define SNDRV_CTL_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 2)
+#define SNDRV_CTL_VERSION SNDRV_PROTOCOL_VERSION(2, 0, 3)
struct sndrv_ctl_card_info {
int card; /* card number */
#define SNDRV_CTL_ELEM_ACCESS_INACTIVE (1<<8) /* control does actually nothing, but may be updated */
#define SNDRV_CTL_ELEM_ACCESS_LOCK (1<<9) /* write lock */
#define SNDRV_CTL_ELEM_ACCESS_OWNER (1<<10) /* write lock owner */
+#define SNDRV_CTL_ELEM_ACCESS_USER (1<<29) /* user space element */
#define SNDRV_CTL_ELEM_ACCESS_DINDIRECT (1<<30) /* indirect access for matrix dimensions in the info structure */
#define SNDRV_CTL_ELEM_ACCESS_INDIRECT (1<<31) /* indirect access for element value in the value structure */
SNDRV_CTL_IOCTL_ELEM_LOCK = _IOW('U', 0x14, struct sndrv_ctl_elem_id),
SNDRV_CTL_IOCTL_ELEM_UNLOCK = _IOW('U', 0x15, struct sndrv_ctl_elem_id),
SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS = _IOWR('U', 0x16, int),
+ SNDRV_CTL_IOCTL_ELEM_ADD = _IOWR('U', 0x17, struct sndrv_ctl_elem_info),
+ SNDRV_CTL_IOCTL_ELEM_REPLACE = _IOWR('U', 0x18, struct sndrv_ctl_elem_info),
+ SNDRV_CTL_IOCTL_ELEM_REMOVE = _IOWR('U', 0x19, struct sndrv_ctl_elem_id),
SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE = _IOWR('U', 0x20, int),
SNDRV_CTL_IOCTL_HWDEP_INFO = _IOR('U', 0x21, struct sndrv_hwdep_info),
SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE = _IOR('U', 0x30, int),
ALSA_0.9.8 {
global:
+ snd_ctl_elem_add;
+ snd_ctl_elem_replace;
+ snd_ctl_elem_remove;
snd_hctl_poll_descriptors_revents;
} ALSA_0.9.7;
return ctl->ops->element_info(ctl, info);
}
+/**
+ * \brief Create and add an user CTL element
+ * \param ctl CTL handle
+ * \param info CTL element info
+ * \return 0 on success otherwise a negative error code
+ *
+ * Note that the new element is locked!
+ */
+int snd_ctl_elem_add(snd_ctl_t *ctl, snd_ctl_elem_info_t *info)
+{
+ assert(ctl && info && info->id.name[0]);
+ return ctl->ops->element_add(ctl, info);
+}
+
+/**
+ * \brief Replace an user CTL element
+ * \param ctl CTL handle
+ * \param info CTL element info
+ * \return 0 on success otherwise a negative error code
+ *
+ * Note that the new element is locked!
+ */
+int snd_ctl_elem_replace(snd_ctl_t *ctl, snd_ctl_elem_info_t *info)
+{
+ assert(ctl && info && info->id.name[0]);
+ return ctl->ops->element_replace(ctl, info);
+}
+
+/**
+ * \brief Remove an user CTL element
+ * \param ctl CTL handle
+ * \param id CTL element identification
+ * \return 0 on success otherwise a negative error code
+ *
+ * Note that the new element is locked!
+ */
+int snd_ctl_elem_remove(snd_ctl_t *ctl, snd_ctl_elem_id_t *id)
+{
+ assert(ctl && id && (id->name[0] || id->numid));
+ return ctl->ops->element_remove(ctl, id);
+}
+
/**
* \brief Get CTL element value
* \param ctl CTL handle
#endif
#define SNDRV_FILE_CONTROL "/dev/snd/controlC%i"
-#define SNDRV_CTL_VERSION_MAX SNDRV_PROTOCOL_VERSION(2, 0, 2)
+#define SNDRV_CTL_VERSION_MAX SNDRV_PROTOCOL_VERSION(2, 0, 3)
typedef struct {
int card;
return 0;
}
+static int snd_ctl_hw_elem_add(snd_ctl_t *handle, snd_ctl_elem_info_t *info)
+{
+ snd_ctl_hw_t *hw = handle->private_data;
+ if (ioctl(hw->fd, SNDRV_CTL_IOCTL_ELEM_ADD, info) < 0)
+ return -errno;
+ return 0;
+}
+
+static int snd_ctl_hw_elem_replace(snd_ctl_t *handle, snd_ctl_elem_info_t *info)
+{
+ snd_ctl_hw_t *hw = handle->private_data;
+ if (ioctl(hw->fd, SNDRV_CTL_IOCTL_ELEM_REPLACE, info) < 0)
+ return -errno;
+ return 0;
+}
+
+static int snd_ctl_hw_elem_remove(snd_ctl_t *handle, snd_ctl_elem_id_t *id)
+{
+ snd_ctl_hw_t *hw = handle->private_data;
+ if (ioctl(hw->fd, SNDRV_CTL_IOCTL_ELEM_REMOVE, id) < 0)
+ return -errno;
+ return 0;
+}
+
static int snd_ctl_hw_elem_read(snd_ctl_t *handle, snd_ctl_elem_value_t *control)
{
snd_ctl_hw_t *hw = handle->private_data;
.card_info = snd_ctl_hw_card_info,
.element_list = snd_ctl_hw_elem_list,
.element_info = snd_ctl_hw_elem_info,
+ .element_add = snd_ctl_hw_elem_add,
+ .element_replace = snd_ctl_hw_elem_replace,
+ .element_remove = snd_ctl_hw_elem_remove,
.element_read = snd_ctl_hw_elem_read,
.element_write = snd_ctl_hw_elem_write,
.element_lock = snd_ctl_hw_elem_lock,
int (*card_info)(snd_ctl_t *handle, snd_ctl_card_info_t *info);
int (*element_list)(snd_ctl_t *handle, snd_ctl_elem_list_t *list);
int (*element_info)(snd_ctl_t *handle, snd_ctl_elem_info_t *info);
+ int (*element_add)(snd_ctl_t *handle, snd_ctl_elem_info_t *info);
+ int (*element_replace)(snd_ctl_t *handle, snd_ctl_elem_info_t *info);
+ int (*element_remove)(snd_ctl_t *handle, snd_ctl_elem_id_t *id);
int (*element_read)(snd_ctl_t *handle, snd_ctl_elem_value_t *control);
int (*element_write)(snd_ctl_t *handle, snd_ctl_elem_value_t *control);
int (*element_lock)(snd_ctl_t *handle, snd_ctl_elem_id_t *lock);