| /* |
| * 32bit -> 64bit ioctl wrapper for sequencer API |
| * Copyright (c) by Takashi Iwai <tiwai@suse.de> |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| * |
| */ |
| |
| #include <sound/driver.h> |
| #include <linux/time.h> |
| #include <linux/fs.h> |
| #include <sound/core.h> |
| #include <sound/timer.h> |
| #include <asm/uaccess.h> |
| #include <sound/asequencer.h> |
| #include "ioctl32.h" |
| |
| struct sndrv_seq_port_info32 { |
| struct sndrv_seq_addr addr; /* client/port numbers */ |
| char name[64]; /* port name */ |
| |
| u32 capability; /* port capability bits */ |
| u32 type; /* port type bits */ |
| s32 midi_channels; /* channels per MIDI port */ |
| s32 midi_voices; /* voices per MIDI port */ |
| s32 synth_voices; /* voices per SYNTH port */ |
| |
| s32 read_use; /* R/O: subscribers for output (from this port) */ |
| s32 write_use; /* R/O: subscribers for input (to this port) */ |
| |
| u32 kernel; /* reserved for kernel use (must be NULL) */ |
| u32 flags; /* misc. conditioning */ |
| unsigned char time_queue; /* queue # for timestamping */ |
| char reserved[59]; /* for future use */ |
| }; |
| |
| #define CVT_sndrv_seq_port_info()\ |
| {\ |
| COPY(addr);\ |
| COPY_ARRAY(name);\ |
| COPY(capability);\ |
| COPY(type);\ |
| COPY(midi_channels);\ |
| COPY(midi_voices);\ |
| COPY(synth_voices);\ |
| COPY(read_use);\ |
| COPY(write_use);\ |
| COPY(flags);\ |
| COPY(time_queue);\ |
| } |
| |
| DEFINE_ALSA_IOCTL(seq_port_info); |
| DEFINE_ALSA_IOCTL_ENTRY(create_port, seq_port_info, SNDRV_SEQ_IOCTL_CREATE_PORT); |
| DEFINE_ALSA_IOCTL_ENTRY(delete_port, seq_port_info, SNDRV_SEQ_IOCTL_DELETE_PORT); |
| DEFINE_ALSA_IOCTL_ENTRY(get_port_info, seq_port_info, SNDRV_SEQ_IOCTL_GET_PORT_INFO); |
| DEFINE_ALSA_IOCTL_ENTRY(set_port_info, seq_port_info, SNDRV_SEQ_IOCTL_SET_PORT_INFO); |
| DEFINE_ALSA_IOCTL_ENTRY(query_next_port, seq_port_info, SNDRV_SEQ_IOCTL_QUERY_NEXT_PORT); |
| |
| /* |
| */ |
| #define AP(x) snd_ioctl32_##x |
| |
| enum { |
| SNDRV_SEQ_IOCTL_CREATE_PORT32 = _IOWR('S', 0x20, struct sndrv_seq_port_info32), |
| SNDRV_SEQ_IOCTL_DELETE_PORT32 = _IOW ('S', 0x21, struct sndrv_seq_port_info32), |
| SNDRV_SEQ_IOCTL_GET_PORT_INFO32 = _IOWR('S', 0x22, struct sndrv_seq_port_info32), |
| SNDRV_SEQ_IOCTL_SET_PORT_INFO32 = _IOW ('S', 0x23, struct sndrv_seq_port_info32), |
| SNDRV_SEQ_IOCTL_QUERY_NEXT_PORT32 = _IOWR('S', 0x52, struct sndrv_seq_port_info32), |
| }; |
| |
| struct ioctl32_mapper seq_mappers[] = { |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_PVERSION), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_CLIENT_ID), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_SYSTEM_INFO), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_GET_CLIENT_INFO), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_SET_CLIENT_INFO), |
| { SNDRV_SEQ_IOCTL_CREATE_PORT32, AP(create_port) }, |
| { SNDRV_SEQ_IOCTL_DELETE_PORT32, AP(delete_port) }, |
| { SNDRV_SEQ_IOCTL_GET_PORT_INFO32, AP(get_port_info) }, |
| { SNDRV_SEQ_IOCTL_SET_PORT_INFO32, AP(set_port_info) }, |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_SUBSCRIBE_PORT), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_UNSUBSCRIBE_PORT), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_CREATE_QUEUE), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_DELETE_QUEUE), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_GET_QUEUE_INFO), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_SET_QUEUE_INFO), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_GET_NAMED_QUEUE), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_GET_QUEUE_STATUS), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_GET_QUEUE_TEMPO), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_SET_QUEUE_TEMPO), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_GET_QUEUE_TIMER), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_SET_QUEUE_TIMER), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_GET_QUEUE_CLIENT), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_SET_QUEUE_CLIENT), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_GET_CLIENT_POOL), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_SET_CLIENT_POOL), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_REMOVE_EVENTS), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_QUERY_SUBS), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_GET_SUBSCRIPTION), |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_QUERY_NEXT_CLIENT), |
| { SNDRV_SEQ_IOCTL_QUERY_NEXT_PORT32, AP(query_next_port) }, |
| MAP_COMPAT(SNDRV_SEQ_IOCTL_RUNNING_MODE), |
| { 0 }, |
| }; |