X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=sound%2Fcore%2Fioctl32%2Fpcm32.c;h=caf5ee4c0793e73136bd93252065784d8a4d05e2;hb=c7b5ebbddf7bcd3651947760f423e3783bbe6573;hp=41ea1dabeb1e52ec14f69b6d8efb48dff67fc7f4;hpb=a2c21200f1c81b08cb55e417b68150bba439b646;p=linux-2.6.git diff --git a/sound/core/ioctl32/pcm32.c b/sound/core/ioctl32/pcm32.c index 41ea1dabe..caf5ee4c0 100644 --- a/sound/core/ioctl32/pcm32.c +++ b/sound/core/ioctl32/pcm32.c @@ -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),