diff mbox

[7/7] Add ALSA ioctls

Message ID 1199154651.1359466.1466295345226.JavaMail.zimbra@raptorengineeringinc.com
State New
Headers show

Commit Message

Timothy Pearson June 19, 2016, 12:15 a.m. UTC
Tested with ExtremeTuxRacer in guest with HDMI audio sink on host

Signed-off-by: Timothy Pearson <tpearson@raptorengineering.com>
---
 linux-user/ioctls.h        |  72 ++++++++++++
 linux-user/syscall.c       |   1 +
 linux-user/syscall_defs.h  |  73 ++++++++++++
 linux-user/syscall_types.h | 273 +++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 419 insertions(+)
diff mbox

Patch

diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
index a06e263..29734f0 100644
--- a/linux-user/ioctls.h
+++ b/linux-user/ioctls.h
@@ -387,6 +387,78 @@ 
   IOCTL_SPECIAL(SIOCDELRT, IOC_W, do_ioctl_rt,
                 MK_PTR(MK_STRUCT(STRUCT_rtentry)))
 
+  IOCTL(SNDRV_CTL_IOCTL_PVERSION, IOC_R, TYPE_INT)
+  IOCTL(SNDRV_CTL_IOCTL_CARD_INFO, IOC_R, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_card_info)))
+  IOCTL(SNDRV_CTL_IOCTL_ELEM_LIST, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_elem_list)))
+  IOCTL(SNDRV_CTL_IOCTL_ELEM_INFO, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_elem_info)))
+  IOCTL(SNDRV_CTL_IOCTL_ELEM_READ, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_elem_value)))
+  IOCTL(SNDRV_CTL_IOCTL_ELEM_WRITE, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_elem_value)))
+  IOCTL(SNDRV_CTL_IOCTL_ELEM_LOCK, IOC_W, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_elem_id)))
+  IOCTL(SNDRV_CTL_IOCTL_ELEM_UNLOCK, IOC_W, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_elem_id)))
+  IOCTL(SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS, IOC_RW, TYPE_INT)
+  IOCTL(SNDRV_CTL_IOCTL_ELEM_ADD, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_elem_info)))
+  IOCTL(SNDRV_CTL_IOCTL_ELEM_REPLACE, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_elem_info)))
+  IOCTL(SNDRV_CTL_IOCTL_ELEM_REMOVE, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_elem_id)))
+  IOCTL(SNDRV_CTL_IOCTL_TLV_READ, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_tlv)))
+  IOCTL(SNDRV_CTL_IOCTL_TLV_WRITE, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_tlv)))
+  IOCTL(SNDRV_CTL_IOCTL_TLV_COMMAND, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_ctl_tlv)))
+  IOCTL(SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE, IOC_RW, TYPE_INT)
+  IOCTL(SNDRV_CTL_IOCTL_HWDEP_INFO, IOC_R, MK_PTR(MK_STRUCT(STRUCT_snd_hwdep_info)))
+  IOCTL(SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE, IOC_R, TYPE_INT)
+  IOCTL(SNDRV_CTL_IOCTL_PCM_INFO, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_pcm_info)))
+  IOCTL(SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE, IOC_W, TYPE_INT)
+  IOCTL(SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE, IOC_RW, TYPE_INT)
+  IOCTL(SNDRV_CTL_IOCTL_RAWMIDI_INFO, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_rawmidi_info)))
+  IOCTL(SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE, IOC_W, TYPE_INT)
+  IOCTL(SNDRV_CTL_IOCTL_POWER, IOC_RW, TYPE_INT)
+  IOCTL(SNDRV_CTL_IOCTL_POWER_STATE, IOC_R, TYPE_INT)
+
+  IOCTL(SNDRV_PCM_IOCTL_PVERSION        , IOC_R, TYPE_INT)
+  IOCTL(SNDRV_PCM_IOCTL_INFO            , IOC_R, MK_PTR(MK_STRUCT(STRUCT_snd_pcm_info)))
+  IOCTL(SNDRV_PCM_IOCTL_TSTAMP          , IOC_W, TYPE_INT)
+  IOCTL(SNDRV_PCM_IOCTL_TTSTAMP         , IOC_W, TYPE_INT)
+  IOCTL(SNDRV_PCM_IOCTL_HW_REFINE       , IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_pcm_hw_params)))
+  IOCTL(SNDRV_PCM_IOCTL_HW_PARAMS       , IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_pcm_hw_params)))
+  IOCTL(SNDRV_PCM_IOCTL_HW_FREE         , 0, TYPE_NULL)
+  IOCTL(SNDRV_PCM_IOCTL_SW_PARAMS       , IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_pcm_sw_params)))
+  IOCTL(SNDRV_PCM_IOCTL_STATUS          , IOC_R, MK_PTR(MK_STRUCT(STRUCT_snd_pcm_status)))
+  IOCTL(SNDRV_PCM_IOCTL_DELAY           , IOC_R, TYPE_ULONG)
+  IOCTL(SNDRV_PCM_IOCTL_HWSYNC          , 0, TYPE_NULL)
+  IOCTL(SNDRV_PCM_IOCTL_SYNC_PTR        , IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_pcm_sync_ptr)))
+  IOCTL(SNDRV_PCM_IOCTL_STATUS_EXT      , IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_pcm_status)))
+  IOCTL(SNDRV_PCM_IOCTL_CHANNEL_INFO    , IOC_R, MK_PTR(MK_STRUCT(STRUCT_snd_pcm_channel_info)))
+  IOCTL(SNDRV_PCM_IOCTL_PREPARE         , 0, TYPE_NULL)
+  IOCTL(SNDRV_PCM_IOCTL_RESET           , 0, TYPE_NULL)
+  IOCTL(SNDRV_PCM_IOCTL_START           , 0, TYPE_NULL)
+  IOCTL(SNDRV_PCM_IOCTL_DROP            , 0, TYPE_NULL)
+  IOCTL(SNDRV_PCM_IOCTL_DRAIN           , 0, TYPE_NULL)
+  IOCTL(SNDRV_PCM_IOCTL_PAUSE           , IOC_W, TYPE_INT)
+  IOCTL(SNDRV_PCM_IOCTL_REWIND          , IOC_W, TYPE_ULONG)
+  IOCTL(SNDRV_PCM_IOCTL_RESUME          , 0, TYPE_NULL)
+  IOCTL(SNDRV_PCM_IOCTL_XRUN            , 0, TYPE_NULL)
+  IOCTL(SNDRV_PCM_IOCTL_FORWARD         , IOC_W, TYPE_ULONG)
+  IOCTL(SNDRV_PCM_IOCTL_WRITEI_FRAMES   , IOC_W, MK_PTR(MK_STRUCT(STRUCT_snd_xferi)))
+  IOCTL(SNDRV_PCM_IOCTL_READI_FRAMES    , IOC_R, MK_PTR(MK_STRUCT(STRUCT_snd_xferi)))
+  IOCTL(SNDRV_PCM_IOCTL_WRITEN_FRAMES   , IOC_W, MK_PTR(MK_STRUCT(STRUCT_snd_xfern)))
+  IOCTL(SNDRV_PCM_IOCTL_READN_FRAMES    , IOC_R, MK_PTR(MK_STRUCT(STRUCT_snd_xfern)))
+  IOCTL(SNDRV_PCM_IOCTL_LINK            , IOC_W, TYPE_INT)
+  IOCTL(SNDRV_PCM_IOCTL_UNLINK          , 0, TYPE_NULL)
+
+  IOCTL(SNDRV_TIMER_IOCTL_PVERSION      , IOC_R, TYPE_INT)
+  IOCTL(SNDRV_TIMER_IOCTL_NEXT_DEVICE   , IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_timer_id)))
+  IOCTL(SNDRV_TIMER_IOCTL_TREAD         , IOC_W, TYPE_INT)
+  IOCTL(SNDRV_TIMER_IOCTL_GINFO         , IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_timer_ginfo)))
+  IOCTL(SNDRV_TIMER_IOCTL_GPARAMS       , IOC_W, MK_PTR(MK_STRUCT(STRUCT_snd_timer_gparams)))
+  IOCTL(SNDRV_TIMER_IOCTL_GSTATUS       , IOC_RW, MK_PTR(MK_STRUCT(STRUCT_snd_timer_gstatus)))
+  IOCTL(SNDRV_TIMER_IOCTL_SELECT        , IOC_W, MK_PTR(MK_STRUCT(STRUCT_snd_timer_select)))
+  IOCTL(SNDRV_TIMER_IOCTL_INFO          , IOC_R, MK_PTR(MK_STRUCT(STRUCT_snd_timer_info)))
+  IOCTL(SNDRV_TIMER_IOCTL_PARAMS        , IOC_W, MK_PTR(MK_STRUCT(STRUCT_snd_timer_params)))
+  IOCTL(SNDRV_TIMER_IOCTL_STATUS        , IOC_R, MK_PTR(MK_STRUCT(STRUCT_snd_timer_status)))
+  IOCTL(SNDRV_TIMER_IOCTL_START         , 0, TYPE_NULL)
+  IOCTL(SNDRV_TIMER_IOCTL_STOP          , 0, TYPE_NULL)
+  IOCTL(SNDRV_TIMER_IOCTL_CONTINUE      , 0, TYPE_NULL)
+  IOCTL(SNDRV_TIMER_IOCTL_PAUSE         , 0, TYPE_NULL)
+
   IOCTL(DRM_IOCTL_VERSION, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_drm_version)))
   IOCTL(DRM_IOCTL_GET_UNIQUE, IOC_RW, MK_PTR(MK_STRUCT(STRUCT_drm_unique)))
   IOCTL(DRM_IOCTL_GET_MAGIC, IOC_R, MK_PTR(MK_STRUCT(STRUCT_drm_auth)))
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 602e445..35d0f04 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -82,6 +82,7 @@  int __clone2(int (*fn)(void *), void *child_stack_base,
 #define tchars host_tchars /* same as target */
 #define ltchars host_ltchars /* same as target */
 
+#include <sound/asound.h>
 #include <libdrm/drm.h>
 #include <libdrm/i915_drm.h>
 #include <libdrm/radeon_drm.h>
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
index 23baa15..0301962 100644
--- a/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h
@@ -2605,6 +2605,79 @@  struct target_user_cap_data {
     uint32_t inheritable;
 };
 
+/* asound defines */
+#define TARGET_SNDRV_CTL_IOCTL_PVERSION                    TARGET_IOR('U', 0x00, int)
+#define TARGET_SNDRV_CTL_IOCTL_CARD_INFO                   TARGET_IOR('U', 0x01, struct snd_ctl_card_info)
+#define TARGET_SNDRV_CTL_IOCTL_ELEM_LIST                   TARGET_IOWR('U', 0x10, struct snd_ctl_elem_list)
+#define TARGET_SNDRV_CTL_IOCTL_ELEM_INFO                   TARGET_IOWR('U', 0x11, struct snd_ctl_elem_info)
+#define TARGET_SNDRV_CTL_IOCTL_ELEM_READ                   TARGET_IOWR('U', 0x12, struct snd_ctl_elem_value)
+#define TARGET_SNDRV_CTL_IOCTL_ELEM_WRITE                  TARGET_IOWR('U', 0x13, struct snd_ctl_elem_value)
+#define TARGET_SNDRV_CTL_IOCTL_ELEM_LOCK                   TARGET_IOW('U', 0x14, struct snd_ctl_elem_id)
+#define TARGET_SNDRV_CTL_IOCTL_ELEM_UNLOCK                 TARGET_IOW('U', 0x15, struct snd_ctl_elem_id)
+#define TARGET_SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS            TARGET_IOWR('U', 0x16, int)
+#define TARGET_SNDRV_CTL_IOCTL_ELEM_ADD                    TARGET_IOWR('U', 0x17, struct snd_ctl_elem_info)
+#define TARGET_SNDRV_CTL_IOCTL_ELEM_REPLACE                TARGET_IOWR('U', 0x18, struct snd_ctl_elem_info)
+#define TARGET_SNDRV_CTL_IOCTL_ELEM_REMOVE                 TARGET_IOWR('U', 0x19, struct snd_ctl_elem_id)
+#define TARGET_SNDRV_CTL_IOCTL_TLV_READ                    TARGET_IOWR('U', 0x1a, struct snd_ctl_tlv)
+#define TARGET_SNDRV_CTL_IOCTL_TLV_WRITE                   TARGET_IOWR('U', 0x1b, struct snd_ctl_tlv)
+#define TARGET_SNDRV_CTL_IOCTL_TLV_COMMAND                 TARGET_IOWR('U', 0x1c, struct snd_ctl_tlv)
+#define TARGET_SNDRV_CTL_IOCTL_HWDEP_NEXT_DEVICE           TARGET_IOWR('U', 0x20, int)
+#define TARGET_SNDRV_CTL_IOCTL_HWDEP_INFO                  TARGET_IOR('U', 0x21, struct snd_hwdep_info)
+#define TARGET_SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE             TARGET_IOR('U', 0x30, int)
+#define TARGET_SNDRV_CTL_IOCTL_PCM_INFO                    TARGET_IOWR('U', 0x31, struct snd_pcm_info)
+#define TARGET_SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE        TARGET_IOW('U', 0x32, int)
+#define TARGET_SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE         TARGET_IOWR('U', 0x40, int)
+#define TARGET_SNDRV_CTL_IOCTL_RAWMIDI_INFO                TARGET_IOWR('U', 0x41, struct snd_rawmidi_info)
+#define TARGET_SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE    TARGET_IOW('U', 0x42, int)
+#define TARGET_SNDRV_CTL_IOCTL_POWER                       TARGET_IOWR('U', 0xd0, int)
+#define TARGET_SNDRV_CTL_IOCTL_POWER_STATE                 TARGET_IOR('U', 0xd1, int)
+
+#define TARGET_SNDRV_PCM_IOCTL_PVERSION                    TARGET_IOR('A', 0x00, int)
+#define TARGET_SNDRV_PCM_IOCTL_INFO                        TARGET_IOR('A', 0x01, struct snd_pcm_info)
+#define TARGET_SNDRV_PCM_IOCTL_TSTAMP                      TARGET_IOW('A', 0x02, int)
+#define TARGET_SNDRV_PCM_IOCTL_TTSTAMP                     TARGET_IOW('A', 0x03, int)
+#define TARGET_SNDRV_PCM_IOCTL_HW_REFINE                   TARGET_IOWR('A', 0x10, struct snd_pcm_hw_params)
+#define TARGET_SNDRV_PCM_IOCTL_HW_PARAMS                   TARGET_IOWR('A', 0x11, struct snd_pcm_hw_params)
+#define TARGET_SNDRV_PCM_IOCTL_HW_FREE                     TARGET_IO('A', 0x12)
+#define TARGET_SNDRV_PCM_IOCTL_SW_PARAMS                   TARGET_IOWR('A', 0x13, struct snd_pcm_sw_params)
+#define TARGET_SNDRV_PCM_IOCTL_STATUS                      TARGET_IOR('A', 0x20, struct snd_pcm_status)
+#define TARGET_SNDRV_PCM_IOCTL_DELAY                       TARGET_IOR('A', 0x21, long)
+#define TARGET_SNDRV_PCM_IOCTL_HWSYNC                      TARGET_IO('A', 0x22)
+#define TARGET_SNDRV_PCM_IOCTL_SYNC_PTR                    TARGET_IOWR('A', 0x23, struct snd_pcm_sync_ptr)
+#define TARGET_SNDRV_PCM_IOCTL_STATUS_EXT                  TARGET_IOWR('A', 0x24, struct snd_pcm_status)
+#define TARGET_SNDRV_PCM_IOCTL_CHANNEL_INFO                TARGET_IOR('A', 0x32, struct snd_pcm_channel_info)
+#define TARGET_SNDRV_PCM_IOCTL_PREPARE                     TARGET_IO('A', 0x40)
+#define TARGET_SNDRV_PCM_IOCTL_RESET                       TARGET_IO('A', 0x41)
+#define TARGET_SNDRV_PCM_IOCTL_START                       TARGET_IO('A', 0x42)
+#define TARGET_SNDRV_PCM_IOCTL_DROP                        TARGET_IO('A', 0x43)
+#define TARGET_SNDRV_PCM_IOCTL_DRAIN                       TARGET_IO('A', 0x44)
+#define TARGET_SNDRV_PCM_IOCTL_PAUSE                       TARGET_IOW('A', 0x45, int)
+#define TARGET_SNDRV_PCM_IOCTL_REWIND                      TARGET_IOW('A', 0x46, unsigned long)
+#define TARGET_SNDRV_PCM_IOCTL_RESUME                      TARGET_IO('A', 0x47)
+#define TARGET_SNDRV_PCM_IOCTL_XRUN                        TARGET_IO('A', 0x48)
+#define TARGET_SNDRV_PCM_IOCTL_FORWARD                     TARGET_IOW('A', 0x49, unsigned long)
+#define TARGET_SNDRV_PCM_IOCTL_WRITEI_FRAMES               TARGET_IOW('A', 0x50, struct snd_xferi)
+#define TARGET_SNDRV_PCM_IOCTL_READI_FRAMES                TARGET_IOR('A', 0x51, struct snd_xferi)
+#define TARGET_SNDRV_PCM_IOCTL_WRITEN_FRAMES               TARGET_IOW('A', 0x52, struct snd_xfern)
+#define TARGET_SNDRV_PCM_IOCTL_READN_FRAMES                TARGET_IOR('A', 0x53, struct snd_xfern)
+#define TARGET_SNDRV_PCM_IOCTL_LINK                        TARGET_IOW('A', 0x60, int)
+#define TARGET_SNDRV_PCM_IOCTL_UNLINK                      TARGET_IO('A', 0x61)
+
+#define TARGET_SNDRV_TIMER_IOCTL_PVERSION                  TARGET_IOR('T', 0x00, int)
+#define TARGET_SNDRV_TIMER_IOCTL_NEXT_DEVICE               TARGET_IOWR('T', 0x01, struct snd_timer_id)
+#define TARGET_SNDRV_TIMER_IOCTL_TREAD                     TARGET_IOW('T', 0x02, int)
+#define TARGET_SNDRV_TIMER_IOCTL_GINFO                     TARGET_IOWR('T', 0x03, struct snd_timer_ginfo)
+#define TARGET_SNDRV_TIMER_IOCTL_GPARAMS                   TARGET_IOW('T', 0x04, struct snd_timer_gparams)
+#define TARGET_SNDRV_TIMER_IOCTL_GSTATUS                   TARGET_IOWR('T', 0x05, struct snd_timer_gstatus)
+#define TARGET_SNDRV_TIMER_IOCTL_SELECT                    TARGET_IOW('T', 0x10, struct snd_timer_select)
+#define TARGET_SNDRV_TIMER_IOCTL_INFO                      TARGET_IOR('T', 0x11, struct snd_timer_info)
+#define TARGET_SNDRV_TIMER_IOCTL_PARAMS                    TARGET_IOW('T', 0x12, struct snd_timer_params)
+#define TARGET_SNDRV_TIMER_IOCTL_STATUS                    TARGET_IOR('T', 0x14, struct snd_timer_status)
+#define TARGET_SNDRV_TIMER_IOCTL_START                     TARGET_IO('T', 0xa0)
+#define TARGET_SNDRV_TIMER_IOCTL_STOP                      TARGET_IO('T', 0xa1)
+#define TARGET_SNDRV_TIMER_IOCTL_CONTINUE                  TARGET_IO('T', 0xa2)
+#define TARGET_SNDRV_TIMER_IOCTL_PAUSE                     TARGET_IO('T', 0xa3)
+
 /* drm defines */
 #define TARGET_DRM_IOCTL_VERSION                      TARGET_IOWR('d', 0x00, struct drm_version)
 #define TARGET_DRM_IOCTL_GET_UNIQUE                   TARGET_IOWR('d', 0x01, struct drm_unique)
diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h
index c5c9ada..26fccb5 100644
--- a/linux-user/syscall_types.h
+++ b/linux-user/syscall_types.h
@@ -254,6 +254,279 @@  STRUCT(blkpg_ioctl_arg,
        TYPE_INT, /* datalen */
        TYPE_PTRVOID) /* data */
 
+STRUCT(snd_ctl_card_info,
+       TYPE_INT, /* card */
+       TYPE_INT, /* pad */
+       MK_ARRAY(TYPE_CHAR, 16), /* id */
+       MK_ARRAY(TYPE_CHAR, 16), /* driver */
+       MK_ARRAY(TYPE_CHAR, 32), /* name */
+       MK_ARRAY(TYPE_CHAR, 80), /* longname */
+       MK_ARRAY(TYPE_CHAR, 16), /* reserved_ */
+       MK_ARRAY(TYPE_CHAR, 80), /* mixername */
+       MK_ARRAY(TYPE_CHAR, 128)) /* components */
+
+STRUCT(snd_ctl_elem_list,
+        TYPE_INT, /* offset */
+        TYPE_INT, /* space */
+        TYPE_INT, /* used */
+        TYPE_INT, /* count */
+        TYPE_PTRVOID, /* pids */
+        MK_ARRAY(TYPE_CHAR, 50)) /* reserved */
+
+STRUCT(snd_ctl_elem_info,
+        /* id struct */
+        TYPE_INT, /* numid */
+        TYPE_INT, /* iface */
+        TYPE_INT, /* device */
+        TYPE_INT, /* subdevice */
+        MK_ARRAY(TYPE_CHAR, SNDRV_CTL_ELEM_ID_NAME_MAXLEN), /* name */
+        TYPE_INT, /* index */
+
+        TYPE_INT, /*type */
+        TYPE_INT, /* access */
+        TYPE_INT, /* count */
+        TYPE_INT, /* owner */
+        MK_ARRAY(TYPE_CHAR, 128),  /* value */
+        MK_ARRAY(TYPE_CHAR, 8),    /* dimen */
+        MK_ARRAY(TYPE_CHAR, 56))   /* reserved */
+
+STRUCT(snd_ctl_elem_value,
+        /* id struct */
+        TYPE_INT, /* numid */
+        TYPE_INT, /* iface */
+        TYPE_INT, /* device */
+        TYPE_INT, /* subdevice */
+        MK_ARRAY(TYPE_CHAR, SNDRV_CTL_ELEM_ID_NAME_MAXLEN), /* name */
+        TYPE_INT, /* index */
+
+        TYPE_INT, /* indirect */
+        MK_ARRAY(TYPE_CHAR, 512), /* value */
+
+        /* timespec struct */
+        TYPE_LONG, /* tv_sec */
+        TYPE_LONG, /* tv_nsec */
+        MK_ARRAY(TYPE_CHAR, 112))   /* reserved */
+
+STRUCT(snd_ctl_elem_id,
+        TYPE_INT, /* numid */
+        TYPE_INT, /* iface */
+        TYPE_INT, /* device */
+        TYPE_INT, /* subdevice */
+        MK_ARRAY(TYPE_CHAR, SNDRV_CTL_ELEM_ID_NAME_MAXLEN), /* name */
+        TYPE_INT) /* index */
+
+STRUCT(snd_ctl_tlv,
+        TYPE_INT, /* numid */
+        TYPE_INT, /* length */
+        TYPE_INT) /* tlv */
+
+STRUCT(snd_hwdep_info,
+        TYPE_INT, /* device */
+        TYPE_INT, /* card */
+        MK_ARRAY(TYPE_CHAR, 64), /* id */
+        MK_ARRAY(TYPE_CHAR, 80), /* name */
+        TYPE_INT, /* iface */
+        MK_ARRAY(TYPE_CHAR, 64)) /* reserved */
+
+STRUCT(snd_pcm_info,
+        TYPE_INT, /* device */
+        TYPE_INT, /* subdevice */
+        TYPE_INT, /* stream */
+        TYPE_INT, /* card */
+        MK_ARRAY(TYPE_CHAR, 64), /* id */
+        MK_ARRAY(TYPE_CHAR, 80), /* name */
+        MK_ARRAY(TYPE_CHAR, 32), /* subname */
+        TYPE_INT, /* dev_class */
+        TYPE_INT, /* dev_subclass */
+        TYPE_INT, /* subdevices_count */
+        TYPE_INT, /* subdevices_avail */
+        MK_ARRAY(TYPE_CHAR, 16), /* sync */
+        MK_ARRAY(TYPE_CHAR, 64)) /* reserved */
+
+STRUCT(snd_rawmidi_info,
+        TYPE_INT, /* device */
+        TYPE_INT, /* subdevice */
+        TYPE_INT, /* stream */
+        TYPE_INT, /* card */
+        TYPE_INT, /* flags */
+        MK_ARRAY(TYPE_CHAR, 64), /* id */
+        MK_ARRAY(TYPE_CHAR, 80), /* name */
+        MK_ARRAY(TYPE_CHAR, 32), /* subname */
+        TYPE_INT, /* subdevices_count */
+        TYPE_INT, /* subdevices_avail */
+        MK_ARRAY(TYPE_CHAR, 64)) /* reserved */
+
+STRUCT(snd_pcm_hw_params,
+        TYPE_INT, /* flags */
+        MK_ARRAY(TYPE_INT, SNDRV_PCM_HW_PARAM_LAST_MASK - SNDRV_PCM_HW_PARAM_FIRST_MASK + 1), /* masks */
+        MK_ARRAY(TYPE_INT, ((SNDRV_MASK_MAX+31)/32) * 5), /* mres */
+        MK_ARRAY(TYPE_INT, 6 * (SNDRV_PCM_HW_PARAM_LAST_INTERVAL - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL + 1)), /* snd_interval */
+        MK_ARRAY(TYPE_INT, 6 * 9), /* ires */
+        TYPE_INT, /* rmask */
+        TYPE_INT, /* cmask */
+        TYPE_INT, /* info */
+        TYPE_INT, /* msbits */
+        TYPE_INT, /* rate_num */
+        TYPE_INT, /* rate_den */
+        TYPE_LONG, /* fifo_size */
+        MK_ARRAY(TYPE_CHAR, 64)) /* reserved */
+
+STRUCT(snd_pcm_sw_params,
+        TYPE_INT, /* tstamp_mode */
+        TYPE_INT, /* period_step */
+        TYPE_INT, /* sleep_min */
+        TYPE_LONG, /* avail_min */
+        TYPE_LONG, /* xfer_align */
+        TYPE_LONG, /* start_threshold */
+        TYPE_LONG, /* stop_threshold */
+        TYPE_LONG, /* silence_threshold */
+        TYPE_LONG, /* silence_size */
+        TYPE_LONG, /* boundary */
+        TYPE_INT, /* proto */
+        TYPE_INT, /* tstamp_type */
+        MK_ARRAY(TYPE_CHAR, 56)) /* reserved */
+
+STRUCT(snd_pcm_status,
+        TYPE_INT, /* state */
+
+        /* timespec struct */
+        TYPE_LONG, /* tv_sec */
+        TYPE_LONG, /* tv_nsec */
+
+        /* timespec struct */
+        TYPE_LONG, /* tv_sec */
+        TYPE_LONG, /* tv_nsec */
+
+        TYPE_LONG, /* appl_ptr */
+        TYPE_LONG, /* hw_ptr */
+        TYPE_LONG, /* delay */
+        TYPE_LONG, /* avail */
+        TYPE_LONG, /* avail_max */
+        TYPE_LONG, /* overrange */
+        TYPE_INT, /* suspended_state */
+        TYPE_INT, /* audio_tstamp_data */
+
+        /* timespec struct */
+        TYPE_LONG, /* tv_sec */
+        TYPE_LONG, /* tv_nsec */
+
+        /* timespec struct */
+        TYPE_LONG, /* tv_sec */
+        TYPE_LONG, /* tv_nsec */
+
+        TYPE_INT, /* audio_tstamp_accuracy */
+        MK_ARRAY(TYPE_CHAR, 36)) /* reserved */
+
+STRUCT(snd_pcm_sync_ptr,
+        TYPE_INT, /* flags */
+        MK_ARRAY(TYPE_CHAR, 64), /* reserved */
+        MK_ARRAY(TYPE_CHAR, 64)) /* reserved */
+
+STRUCT(snd_pcm_channel_info,
+        TYPE_INT, /*  channel */
+        TYPE_ULONGLONG, /*  offset */
+        TYPE_INT, /*  first */
+        TYPE_INT) /*  step */
+
+STRUCT(snd_xferi,
+        TYPE_LONG, /* result */
+        TYPE_PTRVOID, /* buf */
+        TYPE_LONG) /* frames */
+
+STRUCT(snd_xfern,
+        TYPE_LONG, /* result */
+        TYPE_PTRVOID, /* bufs */
+        TYPE_LONG) /* frames */
+
+STRUCT(snd_timer_id,
+        TYPE_INT, /* dev_class */
+        TYPE_INT, /* dev_sclass */
+        TYPE_INT, /* card */
+        TYPE_INT, /* device */
+        TYPE_INT) /* subdevice */
+
+STRUCT(snd_timer_ginfo,
+        /* struct snd_timer_id */
+        TYPE_INT, /* dev_class */
+        TYPE_INT, /* dev_sclass */
+        TYPE_INT, /* card */
+        TYPE_INT, /* device */
+        TYPE_INT, /* subdevice */
+
+        TYPE_INT, /* flags */
+        TYPE_INT, /* card */
+        MK_ARRAY(TYPE_CHAR, 64), /* id */
+        MK_ARRAY(TYPE_CHAR, 80), /* name */
+        TYPE_LONG, /* reserved0 */
+        TYPE_LONG, /* resolution */
+        TYPE_LONG, /* resolution_min */
+        TYPE_LONG, /* resolution_max */
+        TYPE_INT, /* clients */
+        MK_ARRAY(TYPE_CHAR, 32)) /* reserved */
+
+STRUCT(snd_timer_gparams,
+        /* struct snd_timer_id */
+        TYPE_INT, /* dev_class */
+        TYPE_INT, /* dev_sclass */
+        TYPE_INT, /* card */
+        TYPE_INT, /* device */
+        TYPE_INT, /* subdevice */
+
+        TYPE_LONG, /* period_num */
+        TYPE_LONG, /* period_den */
+        MK_ARRAY(TYPE_CHAR, 32)) /* reserved */
+
+STRUCT(snd_timer_gstatus,
+        /* struct snd_timer_id */
+        TYPE_INT, /* dev_class */
+        TYPE_INT, /* dev_sclass */
+        TYPE_INT, /* card */
+        TYPE_INT, /* device */
+        TYPE_INT, /* subdevice */
+
+        TYPE_LONG, /* resolution */
+        TYPE_LONG, /* resolution_num */
+        TYPE_LONG, /* resolution_den */
+        MK_ARRAY(TYPE_CHAR, 32)) /* reserved */
+
+STRUCT(snd_timer_select,
+        /* struct snd_timer_id */
+        TYPE_INT, /* dev_class */
+        TYPE_INT, /* dev_sclass */
+        TYPE_INT, /* card */
+        TYPE_INT, /* device */
+        TYPE_INT, /* subdevice */
+
+        MK_ARRAY(TYPE_CHAR, 32)) /* reserved */
+
+STRUCT(snd_timer_info,
+        TYPE_INT, /* flags */
+        TYPE_INT, /* card */
+        MK_ARRAY(TYPE_CHAR, 64), /* id */
+        MK_ARRAY(TYPE_CHAR, 80), /* name */
+        TYPE_LONG, /* reserved0 */
+        TYPE_LONG, /* resolution */
+        MK_ARRAY(TYPE_CHAR, 64)) /* reserved */
+
+STRUCT(snd_timer_params,
+        TYPE_INT, /* flags */
+        TYPE_INT, /* ticks */
+        TYPE_INT, /* queue_size */
+        TYPE_INT, /* reserved0 */
+        TYPE_INT, /* filter */
+        MK_ARRAY(TYPE_CHAR, 60)) /* reserved */
+
+STRUCT(snd_timer_status,
+        /* timespec struct */
+        TYPE_LONG, /* tv_sec */
+        TYPE_LONG, /* tv_nsec */
+
+        TYPE_INT, /* resolution */
+        TYPE_INT, /* lost */
+        TYPE_INT, /* overrun */
+        TYPE_INT, /* queue */
+        MK_ARRAY(TYPE_CHAR, 64)) /* reserved */
+
 STRUCT(drm_version,
        TYPE_INT, /* version_major */
        TYPE_INT, /* version_minor */