qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 11/12] linux-user: Add support for getting/setting selected a


From: Laurent Vivier
Subject: Re: [PATCH 11/12] linux-user: Add support for getting/setting selected alsa timer parameters using ioctls
Date: Tue, 14 Jan 2020 14:09:46 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.3.1

Le 09/01/2020 à 13:59, Filip Bozuta a écrit :
> This patch implements functionalities of following ioctls:
> 
> SNDRV_TIMER_IOCTL_INFO - Getting information about selected timer
> 
>     Read information about the selected timer. The information is returned in
>     the following structure:
> 
>     struct snd_timer_info {
>         unsigned int flags;         /* timer flags - SNDRV_TIMER_FLG_* */
>         int card;                   /* card number */
>         unsigned char id[64];       /* timer identificator */
>         unsigned char name[80];     /* timer name */
>         unsigned long reserved0;    /* reserved for future use */
>         unsigned long resolution;   /* average period resolution in ns */
>         unsigned char reserved[64]; /* reserved for future use */
>     };
> 
>     A pointer to this structure should be passed as the third ioctl's 
> argument.
>     Before calling this ioctl, the ioctl "SNDRV_TIMER_IOCTL_SELECT" should be
>     called first to select the timer which information is to be obtained. If 
> no
>     timer is selected, the error EBADFD ("File descriptor in bad shape") is
>     returned.
> 
> SNDRV_TIMER_IOCTL_PARAMS - Setting parameters for selected timer
> 
>     Sets parameters for the selected timer. The paramaters are set in the
>     following structure:
> 
>     struct snd_timer_params {
>         unsigned int flags;         /* flags - SNDRV_TIMER_PSFLG_* */
>         unsigned int ticks;         /* requested resolution in ticks */
>         unsigned int queue_size;    /* total size of queue (32-1024) */
>         unsigned int reserved0;     /* reserved, was: failure locations */
>         unsigned int filter;        /* event filter */
>         unsigned char reserved[60]; /* reserved */
>     };
> 
>     A pointer to this structure should be passed as the third ioctl's 
> argument.
>     Before calling this ioctl, the ioctl "SNDRV_TIMER_IOCTL_SELECT" should be
>     called first to select the timer which parameters are to be set. If no
>     timer is selected, the error EBADFD ("File descriptor in bad shape") is
>     returned.
> 
> SNDRV_TIMER_IOCTL_STATUS - Getting status of selected timer
> 
>     Read status of the selected timer. The status of the timer is returned in
>     the following structure:
> 
>     struct snd_timer_status {
>         struct timespec tstamp;     /* Timestamp - last update */
>         unsigned int resolution;    /* current period resolution in ns */
>         unsigned int lost;          /* counter of master tick lost */
>         unsigned int overrun;       /* count of read queue overruns */
>         unsigned int queue;         /* used queue size */
>         unsigned char reserved[64]; /* reserved */
>     };
> 
>     A pointer to this structure should be passed as the third ioctl's 
> argument.
>     Before calling this ioctl, the ioctl "SNDRV_TIMER_IOCTL_SELECT" should be
>     called first to select the timer which status is to be obtained. If no
>     timer is selected, the error EBADFD ("File descriptor in bad shape") is
>     returned.
> 
> Implementation notes:
> 
>     All ioctls in this patch have pointer to some kind of a structure
>     as their third argument. That is the reason why corresponding
>     definitions were added in 'linux-user/syscall_types.h'. Structure
>     'snd_timer_status' has field of type 'struct timespec' which is why
>     a corresponding definition of that structure was also added in
>     'linux-user/syscall_types.h'. All of these strucutures have some
>     fields that are of type 'unsigned long'. That is the reason why
>     separate target structures were defined in 'linux-user/syscall_defs.h'.
>     Structure 'struct timespec' already had a separate target definition
>     so that definition was used to define a target structure for
>     'snd_timer_status'. The rest of the implementation was straightforward.
> 
> Signed-off-by: Filip Bozuta <address@hidden>
> ---
>  linux-user/ioctls.h        |  5 +++++
>  linux-user/syscall_defs.h  | 25 +++++++++++++++++++++++++
>  linux-user/syscall_types.h | 29 +++++++++++++++++++++++++++++
>  3 files changed, 59 insertions(+)
> 
> diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
> index 7652117..43e7e5d 100644
> --- a/linux-user/ioctls.h
> +++ b/linux-user/ioctls.h
> @@ -461,6 +461,11 @@
>          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(HDIO_GETGEO, IOC_R, MK_PTR(MK_STRUCT(STRUCT_hd_geometry)))
>    IOCTL(HDIO_GET_UNMASKINTR, IOC_R, MK_PTR(TYPE_INT))
> diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
> index 9a33b71..d76124d 100644
> --- a/linux-user/syscall_defs.h
> +++ b/linux-user/syscall_defs.h
> @@ -2467,6 +2467,25 @@ struct target_snd_timer_select {
>      unsigned char reserved[32];
>  };
>  
> +struct target_snd_timer_info {
> +    unsigned int flags;
> +    int card;
> +    unsigned char id[64];
> +    unsigned char name[80];
> +    abi_ulong reserved0;
> +    abi_ulong resolution;
> +    unsigned char reserved[64];
> +};
> +
> +struct target_snd_timer_status {
> +    struct target_timespec tstamp;
> +    unsigned int resolution;
> +    unsigned int lost;
> +    unsigned int overrun;
> +    unsigned int queue;
> +    unsigned char reserved[64];
> +};
> +
>  /* alsa timer ioctls */
>  #define TARGET_SNDRV_TIMER_IOCTL_PVERSION     TARGET_IOR('T', 0x00, int)
>  #define TARGET_SNDRV_TIMER_IOCTL_NEXT_DEVICE  TARGET_IOWR('T', 0x01,         
>             \
> @@ -2480,6 +2499,12 @@ struct target_snd_timer_select {
>                                                            struct 
> target_snd_timer_gstatus)
>  #define TARGET_SNDRV_TIMER_IOCTL_SELECT       TARGET_IOW('T', 0x10,          
>             \
>                                                           struct 
> target_snd_timer_select)
> +#define TARGET_SNDRV_TIMER_IOCTL_INFO         TARGET_IOR('T', 0x11,          
>             \
> +                                                         struct 
> target_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 
> target_snd_timer_status)
>  
>  /* vfat ioctls */
>  #define TARGET_VFAT_IOCTL_READDIR_BOTH    TARGET_IORU('r', 1)
> diff --git a/linux-user/syscall_types.h b/linux-user/syscall_types.h
> index 767632d..fbc4be7 100644
> --- a/linux-user/syscall_types.h
> +++ b/linux-user/syscall_types.h
> @@ -120,6 +120,35 @@ STRUCT(snd_timer_select,
>         MK_STRUCT(STRUCT_snd_timer_id), /* id */
>         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_ULONG, /* reserved0 */
> +       TYPE_ULONG, /* 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(timespec,
> +       TYPE_LONG, /* tv_sec */
> +       TYPE_LONG) /* tv_nsec */
> +
> +STRUCT(snd_timer_status,
> +       MK_STRUCT(STRUCT_timespec), /* tstamp */
> +       TYPE_INT, /* resolution */
> +       TYPE_INT, /* lost */
> +       TYPE_INT, /* overrun */
> +       TYPE_INT, /* queue */
> +       MK_ARRAY(TYPE_CHAR, 64)) /* reserved */
> +
>  /* loop device ioctls */
>  STRUCT(loop_info,
>         TYPE_INT,                 /* lo_number */
> 

Reviewed-by: Laurent Vivier <address@hidden>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]