vserver 1.9.3
[linux-2.6.git] / sound / core / ioctl32 / pcm32.c
index 41ea1da..caf5ee4 100644 (file)
@@ -69,7 +69,7 @@ struct sndrv_pcm_hw_params32 {
        unsigned char reserved[64];
 } __attribute__((packed));
 
-#define numberof(array)  (sizeof(array)/sizeof(array[0]))
+#define numberof(array) ARRAY_SIZE(array)
 
 #define CVT_sndrv_pcm_hw_params()\
 {\
@@ -235,7 +235,7 @@ static int _snd_ioctl32_xfern(unsigned int fd, unsigned int cmd, unsigned long a
 
        /* FIXME: need to check whether fop->ioctl is sane */
 
-       pcm_file = snd_magic_cast(snd_pcm_file_t, file->private_data, return -ENXIO);
+       pcm_file = file->private_data;
        substream = pcm_file->substream;
        snd_assert(substream != NULL && substream->runtime, return -ENXIO);
 
@@ -313,7 +313,7 @@ static void snd_pcm_hw_convert_from_old_params(snd_pcm_hw_params_t *params, stru
 
        memset(params, 0, sizeof(*params));
        params->flags = oparams->flags;
-       for (i = 0; i < sizeof(oparams->masks) / sizeof(unsigned int); i++)
+       for (i = 0; i < ARRAY_SIZE(oparams->masks); i++)
                params->masks[i].bits[0] = oparams->masks[i];
        memcpy(params->intervals, oparams->intervals, sizeof(oparams->intervals));
        params->rmask = __OLD_TO_NEW_MASK(oparams->rmask);
@@ -331,7 +331,7 @@ static void snd_pcm_hw_convert_to_old_params(struct sndrv_pcm_hw_params_old32 *o
 
        memset(oparams, 0, sizeof(*oparams));
        oparams->flags = params->flags;
-       for (i = 0; i < sizeof(oparams->masks) / sizeof(unsigned int); i++)
+       for (i = 0; i < ARRAY_SIZE(oparams->masks); i++)
                oparams->masks[i] = params->masks[i].bits[0];
        memcpy(oparams->intervals, params->intervals, sizeof(oparams->intervals));
        oparams->rmask = __NEW_TO_OLD_MASK(params->rmask);
@@ -350,8 +350,8 @@ static int _snd_ioctl32_pcm_hw_params_old(unsigned int fd, unsigned int cmd, uns
        mm_segment_t oldseg;
        int err;
 
-       data32 = snd_kcalloc(sizeof(*data32), GFP_KERNEL);
-       data = snd_kcalloc(sizeof(*data), GFP_KERNEL);
+       data32 = kcalloc(1, sizeof(*data32), GFP_KERNEL);
+       data = kcalloc(1, sizeof(*data), GFP_KERNEL);
        if (data32 == NULL || data == NULL) {
                err = -ENOMEM;
                goto __end;
@@ -379,6 +379,45 @@ static int _snd_ioctl32_pcm_hw_params_old(unsigned int fd, unsigned int cmd, uns
        return err;
 }
 
+struct sndrv_pcm_mmap_status32 {
+       s32 state;
+       s32 pad1;
+       u32 hw_ptr;
+       struct compat_timespec tstamp;
+       s32 suspended_state;
+} __attribute__((packed));
+
+struct sndrv_pcm_mmap_control32 {
+       u32 appl_ptr;
+       u32 avail_min;
+} __attribute__((packed));
+
+struct sndrv_pcm_sync_ptr32 {
+       u32 flags;
+       union {
+               struct sndrv_pcm_mmap_status32 status;
+               unsigned char reserved[64];
+       } s;
+       union {
+               struct sndrv_pcm_mmap_control32 control;
+               unsigned char reserved[64];
+       } c;
+} __attribute__((packed));
+
+#define CVT_sndrv_pcm_sync_ptr()\
+{\
+       COPY(flags);\
+       COPY(s.status.state);\
+       COPY(s.status.pad1);\
+       COPY(s.status.hw_ptr);\
+       COPY(s.status.tstamp.tv_sec);\
+       COPY(s.status.tstamp.tv_nsec);\
+       COPY(s.status.suspended_state);\
+       COPY(c.control.appl_ptr);\
+       COPY(c.control.avail_min);\
+}
+
+DEFINE_ALSA_IOCTL_BIG(pcm_sync_ptr);
 
 /*
  */
@@ -396,6 +435,7 @@ DEFINE_ALSA_IOCTL_ENTRY(pcm_readi, xferi, SNDRV_PCM_IOCTL_READI_FRAMES);
 DEFINE_ALSA_IOCTL_ENTRY(pcm_writei, xferi, SNDRV_PCM_IOCTL_WRITEI_FRAMES);
 DEFINE_ALSA_IOCTL_ENTRY(pcm_readn, xfern, SNDRV_PCM_IOCTL_READN_FRAMES);
 DEFINE_ALSA_IOCTL_ENTRY(pcm_writen, xfern, SNDRV_PCM_IOCTL_WRITEN_FRAMES);
+DEFINE_ALSA_IOCTL_ENTRY(pcm_sync_ptr, pcm_sync_ptr, SNDRV_PCM_IOCTL_SYNC_PTR);
 
 
 /*
@@ -416,6 +456,7 @@ enum {
        SNDRV_PCM_IOCTL_READN_FRAMES32 = _IOR('A', 0x53, struct sndrv_xfern32),
        SNDRV_PCM_IOCTL_HW_REFINE_OLD32 = _IOWR('A', 0x10, struct sndrv_pcm_hw_params_old32),
        SNDRV_PCM_IOCTL_HW_PARAMS_OLD32 = _IOWR('A', 0x11, struct sndrv_pcm_hw_params_old32),
+       SNDRV_PCM_IOCTL_SYNC_PTR32 = _IOWR('A', 0x23, struct sndrv_pcm_sync_ptr),
 
 };
 
@@ -431,6 +472,8 @@ struct ioctl32_mapper pcm_mappers[] = {
        { SNDRV_PCM_IOCTL_SW_PARAMS32, AP(pcm_sw_params) },
        { SNDRV_PCM_IOCTL_STATUS32, AP(pcm_status) },
        { SNDRV_PCM_IOCTL_DELAY32, AP(pcm_delay) },
+       MAP_COMPAT(SNDRV_PCM_IOCTL_HWSYNC),
+       { SNDRV_PCM_IOCTL_SYNC_PTR32, AP(pcm_sync_ptr) },
        { SNDRV_PCM_IOCTL_CHANNEL_INFO32, AP(pcm_channel_info) },
        MAP_COMPAT(SNDRV_PCM_IOCTL_PREPARE),
        MAP_COMPAT(SNDRV_PCM_IOCTL_RESET),