diff options
Diffstat (limited to 'sound/core/seq/oss')
| -rw-r--r-- | sound/core/seq/oss/Makefile | 2 | ||||
| -rw-r--r-- | sound/core/seq/oss/seq_oss.c | 111 | ||||
| -rw-r--r-- | sound/core/seq/oss/seq_oss_device.h | 74 | ||||
| -rw-r--r-- | sound/core/seq/oss/seq_oss_event.c | 70 | ||||
| -rw-r--r-- | sound/core/seq/oss/seq_oss_event.h | 50 | ||||
| -rw-r--r-- | sound/core/seq/oss/seq_oss_init.c | 162 | ||||
| -rw-r--r-- | sound/core/seq/oss/seq_oss_ioctl.c | 30 | ||||
| -rw-r--r-- | sound/core/seq/oss/seq_oss_midi.c | 129 | ||||
| -rw-r--r-- | sound/core/seq/oss/seq_oss_midi.h | 27 | ||||
| -rw-r--r-- | sound/core/seq/oss/seq_oss_readq.c | 41 | ||||
| -rw-r--r-- | sound/core/seq/oss/seq_oss_readq.h | 24 | ||||
| -rw-r--r-- | sound/core/seq/oss/seq_oss_rw.c | 18 | ||||
| -rw-r--r-- | sound/core/seq/oss/seq_oss_synth.c | 128 | ||||
| -rw-r--r-- | sound/core/seq/oss/seq_oss_synth.h | 32 | ||||
| -rw-r--r-- | sound/core/seq/oss/seq_oss_timer.c | 44 | ||||
| -rw-r--r-- | sound/core/seq/oss/seq_oss_timer.h | 22 | ||||
| -rw-r--r-- | sound/core/seq/oss/seq_oss_writeq.c | 43 | ||||
| -rw-r--r-- | sound/core/seq/oss/seq_oss_writeq.h | 18 |
18 files changed, 488 insertions, 537 deletions
diff --git a/sound/core/seq/oss/Makefile b/sound/core/seq/oss/Makefile index a37ddedf710..b38406b8463 100644 --- a/sound/core/seq/oss/Makefile +++ b/sound/core/seq/oss/Makefile @@ -1,6 +1,6 @@ # # Makefile for ALSA -# Copyright (c) 1999 by Jaroslav Kysela <perex@suse.cz> +# Copyright (c) 1999 by Jaroslav Kysela <perex@perex.cz> # snd-seq-oss-objs := seq_oss.o seq_oss_init.o seq_oss_timer.o seq_oss_ioctl.o \ diff --git a/sound/core/seq/oss/seq_oss.c b/sound/core/seq/oss/seq_oss.c index 4c0558c0a8b..16d42679e43 100644 --- a/sound/core/seq/oss/seq_oss.c +++ b/sound/core/seq/oss/seq_oss.c @@ -20,10 +20,9 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include <sound/driver.h> #include <linux/init.h> -#include <linux/smp_lock.h> -#include <linux/moduleparam.h> +#include <linux/module.h> +#include <linux/mutex.h> #include <sound/core.h> #include <sound/minors.h> #include <sound/initval.h> @@ -40,20 +39,19 @@ MODULE_LICENSE("GPL"); MODULE_ALIAS_SNDRV_MINOR(SNDRV_MINOR_OSS_SEQUENCER); MODULE_ALIAS_SNDRV_MINOR(SNDRV_MINOR_OSS_MUSIC); -#ifdef SNDRV_SEQ_OSS_DEBUG -module_param(seq_oss_debug, int, 0644); -MODULE_PARM_DESC(seq_oss_debug, "debug option"); -int seq_oss_debug = 0; -#endif - /* * prototypes */ static int register_device(void); static void unregister_device(void); +#ifdef CONFIG_PROC_FS static int register_proc(void); static void unregister_proc(void); +#else +static inline int register_proc(void) { return 0; } +static inline void unregister_proc(void) {} +#endif static int odev_open(struct inode *inode, struct file *file); static int odev_release(struct inode *inode, struct file *file); @@ -61,9 +59,6 @@ static ssize_t odev_read(struct file *file, char __user *buf, size_t count, loff static ssize_t odev_write(struct file *file, const char __user *buf, size_t count, loff_t *offset); static long odev_ioctl(struct file *file, unsigned int cmd, unsigned long arg); static unsigned int odev_poll(struct file *file, poll_table * wait); -#ifdef CONFIG_PROC_FS -static void info_read(snd_info_entry_t *entry, snd_info_buffer_t *buf); -#endif /* @@ -73,7 +68,7 @@ static void info_read(snd_info_entry_t *entry, snd_info_buffer_t *buf); static int __init alsa_seq_oss_init(void) { int rc; - static snd_seq_dev_ops_t ops = { + static struct snd_seq_dev_ops ops = { snd_seq_oss_synth_register, snd_seq_oss_synth_unregister, }; @@ -92,7 +87,7 @@ static int __init alsa_seq_oss_init(void) } if ((rc = snd_seq_device_register_driver(SNDRV_SEQ_DEV_ID_OSS, &ops, - sizeof(snd_seq_oss_reg_t))) < 0) { + sizeof(struct snd_seq_oss_reg))) < 0) { snd_seq_oss_delete_client(); unregister_proc(); unregister_device(); @@ -122,7 +117,7 @@ module_exit(alsa_seq_oss_exit) * ALSA minor device interface */ -static DECLARE_MUTEX(register_mutex); +static DEFINE_MUTEX(register_mutex); static int odev_open(struct inode *inode, struct file *file) @@ -134,9 +129,9 @@ odev_open(struct inode *inode, struct file *file) else level = SNDRV_SEQ_OSS_MODE_SYNTH; - down(®ister_mutex); + mutex_lock(®ister_mutex); rc = snd_seq_oss_open(file, level); - up(®ister_mutex); + mutex_unlock(®ister_mutex); return rc; } @@ -144,16 +139,16 @@ odev_open(struct inode *inode, struct file *file) static int odev_release(struct inode *inode, struct file *file) { - seq_oss_devinfo_t *dp; + struct seq_oss_devinfo *dp; if ((dp = file->private_data) == NULL) return 0; snd_seq_oss_drain_write(dp); - down(®ister_mutex); + mutex_lock(®ister_mutex); snd_seq_oss_release(dp); - up(®ister_mutex); + mutex_unlock(®ister_mutex); return 0; } @@ -161,9 +156,10 @@ odev_release(struct inode *inode, struct file *file) static ssize_t odev_read(struct file *file, char __user *buf, size_t count, loff_t *offset) { - seq_oss_devinfo_t *dp; + struct seq_oss_devinfo *dp; dp = file->private_data; - snd_assert(dp != NULL, return -EIO); + if (snd_BUG_ON(!dp)) + return -ENXIO; return snd_seq_oss_read(dp, buf, count); } @@ -171,18 +167,20 @@ odev_read(struct file *file, char __user *buf, size_t count, loff_t *offset) static ssize_t odev_write(struct file *file, const char __user *buf, size_t count, loff_t *offset) { - seq_oss_devinfo_t *dp; + struct seq_oss_devinfo *dp; dp = file->private_data; - snd_assert(dp != NULL, return -EIO); + if (snd_BUG_ON(!dp)) + return -ENXIO; return snd_seq_oss_write(dp, buf, count, file); } static long odev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { - seq_oss_devinfo_t *dp; + struct seq_oss_devinfo *dp; dp = file->private_data; - snd_assert(dp != NULL, return -EIO); + if (snd_BUG_ON(!dp)) + return -ENXIO; return snd_seq_oss_ioctl(dp, cmd, arg); } @@ -195,9 +193,10 @@ odev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) static unsigned int odev_poll(struct file *file, poll_table * wait) { - seq_oss_devinfo_t *dp; + struct seq_oss_devinfo *dp; dp = file->private_data; - snd_assert(dp != NULL, return 0); + if (snd_BUG_ON(!dp)) + return -ENXIO; return snd_seq_oss_poll(dp, file, wait); } @@ -205,7 +204,7 @@ odev_poll(struct file *file, poll_table * wait) * registration of sequencer minor device */ -static struct file_operations seq_oss_f_ops = +static const struct file_operations seq_oss_f_ops = { .owner = THIS_MODULE, .read = odev_read, @@ -215,11 +214,7 @@ static struct file_operations seq_oss_f_ops = .poll = odev_poll, .unlocked_ioctl = odev_ioctl, .compat_ioctl = odev_ioctl_compat, -}; - -static snd_minor_t seq_oss_reg = { - .comment = "sequencer", - .f_ops = &seq_oss_f_ops, + .llseek = noop_llseek, }; static int __init @@ -227,39 +222,35 @@ register_device(void) { int rc; - down(®ister_mutex); + mutex_lock(®ister_mutex); if ((rc = snd_register_oss_device(SNDRV_OSS_DEVICE_TYPE_SEQUENCER, NULL, 0, - &seq_oss_reg, - SNDRV_SEQ_OSS_DEVNAME)) < 0) { - snd_printk(KERN_ERR "can't register device seq\n"); - up(®ister_mutex); + &seq_oss_f_ops, NULL)) < 0) { + pr_err("ALSA: seq_oss: can't register device seq\n"); + mutex_unlock(®ister_mutex); return rc; } if ((rc = snd_register_oss_device(SNDRV_OSS_DEVICE_TYPE_MUSIC, NULL, 0, - &seq_oss_reg, - SNDRV_SEQ_OSS_DEVNAME)) < 0) { - snd_printk(KERN_ERR "can't register device music\n"); + &seq_oss_f_ops, NULL)) < 0) { + pr_err("ALSA: seq_oss: can't register device music\n"); snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_SEQUENCER, NULL, 0); - up(®ister_mutex); + mutex_unlock(®ister_mutex); return rc; } - debug_printk(("device registered\n")); - up(®ister_mutex); + mutex_unlock(®ister_mutex); return 0; } static void unregister_device(void) { - down(®ister_mutex); - debug_printk(("device unregistered\n")); + mutex_lock(®ister_mutex); if (snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_MUSIC, NULL, 0) < 0) - snd_printk(KERN_ERR "error unregister device music\n"); + pr_err("ALSA: seq_oss: error unregister device music\n"); if (snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_SEQUENCER, NULL, 0) < 0) - snd_printk(KERN_ERR "error unregister device seq\n"); - up(®ister_mutex); + pr_err("ALSA: seq_oss: error unregister device seq\n"); + mutex_unlock(®ister_mutex); } /* @@ -268,26 +259,24 @@ unregister_device(void) #ifdef CONFIG_PROC_FS -static snd_info_entry_t *info_entry; +static struct snd_info_entry *info_entry; static void -info_read(snd_info_entry_t *entry, snd_info_buffer_t *buf) +info_read(struct snd_info_entry *entry, struct snd_info_buffer *buf) { - down(®ister_mutex); + mutex_lock(®ister_mutex); snd_iprintf(buf, "OSS sequencer emulation version %s\n", SNDRV_SEQ_OSS_VERSION_STR); snd_seq_oss_system_info_read(buf); snd_seq_oss_synth_info_read(buf); snd_seq_oss_midi_info_read(buf); - up(®ister_mutex); + mutex_unlock(®ister_mutex); } -#endif /* CONFIG_PROC_FS */ static int __init register_proc(void) { -#ifdef CONFIG_PROC_FS - snd_info_entry_t *entry; + struct snd_info_entry *entry; entry = snd_info_create_module_entry(THIS_MODULE, SNDRV_SEQ_OSS_PROCNAME, snd_seq_root); if (entry == NULL) @@ -295,23 +284,19 @@ register_proc(void) entry->content = SNDRV_INFO_CONTENT_TEXT; entry->private_data = NULL; - entry->c.text.read_size = 1024; entry->c.text.read = info_read; if (snd_info_register(entry) < 0) { snd_info_free_entry(entry); return -ENOMEM; } info_entry = entry; -#endif return 0; } static void unregister_proc(void) { -#ifdef CONFIG_PROC_FS - if (info_entry) - snd_info_unregister(info_entry); + snd_info_free_entry(info_entry); info_entry = NULL; -#endif } +#endif /* CONFIG_PROC_FS */ diff --git a/sound/core/seq/oss/seq_oss_device.h b/sound/core/seq/oss/seq_oss_device.h index 973786758c5..b4392432524 100644 --- a/sound/core/seq/oss/seq_oss_device.h +++ b/sound/core/seq/oss/seq_oss_device.h @@ -21,7 +21,6 @@ #ifndef __SEQ_OSS_DEVICE_H #define __SEQ_OSS_DEVICE_H -#include <sound/driver.h> #include <linux/time.h> #include <linux/wait.h> #include <linux/slab.h> @@ -32,9 +31,6 @@ #include <sound/seq_kernel.h> #include <sound/info.h> -/* enable debug print */ -#define SNDRV_SEQ_OSS_DEBUG - /* max. applications */ #define SNDRV_SEQ_OSS_MAX_CLIENTS 16 #define SNDRV_SEQ_OSS_MAX_SYNTH_DEVS 16 @@ -47,7 +43,6 @@ #define SNDRV_SEQ_OSS_VERSION_STR "0.1.8" /* device and proc interface name */ -#define SNDRV_SEQ_OSS_DEVNAME "seq_oss" #define SNDRV_SEQ_OSS_PROCNAME "oss" @@ -55,32 +50,24 @@ * type definitions */ -typedef struct seq_oss_devinfo_t seq_oss_devinfo_t; -typedef struct seq_oss_writeq_t seq_oss_writeq_t; -typedef struct seq_oss_readq_t seq_oss_readq_t; -typedef struct seq_oss_timer_t seq_oss_timer_t; -typedef struct seq_oss_synthinfo_t seq_oss_synthinfo_t; -typedef struct seq_oss_synth_sysex_t seq_oss_synth_sysex_t; -typedef struct seq_oss_chinfo_t seq_oss_chinfo_t; typedef unsigned int reltime_t; typedef unsigned int abstime_t; -typedef union evrec_t evrec_t; /* * synthesizer channel information */ -struct seq_oss_chinfo_t { +struct seq_oss_chinfo { int note, vel; }; /* * synthesizer information */ -struct seq_oss_synthinfo_t { - snd_seq_oss_arg_t arg; - seq_oss_chinfo_t *ch; - seq_oss_synth_sysex_t *sysex; +struct seq_oss_synthinfo { + struct snd_seq_oss_arg arg; + struct seq_oss_chinfo *ch; + struct seq_oss_synth_sysex *sysex; int nr_voices; int opened; int is_midi; @@ -92,14 +79,14 @@ struct seq_oss_synthinfo_t { * sequencer client information */ -struct seq_oss_devinfo_t { +struct seq_oss_devinfo { int index; /* application index */ int cseq; /* sequencer client number */ int port; /* sequencer port number */ int queue; /* sequencer queue number */ - snd_seq_addr_t addr; /* address of this device */ + struct snd_seq_addr addr; /* address of this device */ int seq_mode; /* sequencer mode */ int file_mode; /* file access */ @@ -109,17 +96,17 @@ struct seq_oss_devinfo_t { /* synth device table */ int max_synthdev; - seq_oss_synthinfo_t synths[SNDRV_SEQ_OSS_MAX_SYNTH_DEVS]; + struct seq_oss_synthinfo synths[SNDRV_SEQ_OSS_MAX_SYNTH_DEVS]; int synth_opened; /* output queue */ - seq_oss_writeq_t *writeq; + struct seq_oss_writeq *writeq; /* midi input queue */ - seq_oss_readq_t *readq; + struct seq_oss_readq *readq; /* timer */ - seq_oss_timer_t *timer; + struct seq_oss_timer *timer; }; @@ -133,24 +120,24 @@ int snd_seq_oss_delete_client(void); /* device file interface */ int snd_seq_oss_open(struct file *file, int level); -void snd_seq_oss_release(seq_oss_devinfo_t *dp); -int snd_seq_oss_ioctl(seq_oss_devinfo_t *dp, unsigned int cmd, unsigned long arg); -int snd_seq_oss_read(seq_oss_devinfo_t *dev, char __user *buf, int count); -int snd_seq_oss_write(seq_oss_devinfo_t *dp, const char __user *buf, int count, struct file *opt); -unsigned int snd_seq_oss_poll(seq_oss_devinfo_t *dp, struct file *file, poll_table * wait); +void snd_seq_oss_release(struct seq_oss_devinfo *dp); +int snd_seq_oss_ioctl(struct seq_oss_devinfo *dp, unsigned int cmd, unsigned long arg); +int snd_seq_oss_read(struct seq_oss_devinfo *dev, char __user *buf, int count); +int snd_seq_oss_write(struct seq_oss_devinfo *dp, const char __user *buf, int count, struct file *opt); +unsigned int snd_seq_oss_poll(struct seq_oss_devinfo *dp, struct file *file, poll_table * wait); -void snd_seq_oss_reset(seq_oss_devinfo_t *dp); -void snd_seq_oss_drain_write(seq_oss_devinfo_t *dp); +void snd_seq_oss_reset(struct seq_oss_devinfo *dp); +void snd_seq_oss_drain_write(struct seq_oss_devinfo *dp); /* */ -void snd_seq_oss_process_queue(seq_oss_devinfo_t *dp, abstime_t time); +void snd_seq_oss_process_queue(struct seq_oss_devinfo *dp, abstime_t time); /* proc interface */ -void snd_seq_oss_system_info_read(snd_info_buffer_t *buf); -void snd_seq_oss_midi_info_read(snd_info_buffer_t *buf); -void snd_seq_oss_synth_info_read(snd_info_buffer_t *buf); -void snd_seq_oss_readq_info_read(seq_oss_readq_t *q, snd_info_buffer_t *buf); +void snd_seq_oss_system_info_read(struct snd_info_buffer *buf); +void snd_seq_oss_midi_info_read(struct snd_info_buffer *buf); +void snd_seq_oss_synth_info_read(struct snd_info_buffer *buf); +void snd_seq_oss_readq_info_read(struct seq_oss_readq *q, struct snd_info_buffer *buf); /* file mode macros */ #define is_read_mode(mode) ((mode) & SNDRV_SEQ_OSS_FILE_READ) @@ -159,21 +146,21 @@ void snd_seq_oss_readq_info_read(seq_oss_readq_t *q, snd_info_buffer_t *buf); /* dispatch event */ static inline int -snd_seq_oss_dispatch(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, int atomic, int hop) +snd_seq_oss_dispatch(struct seq_oss_devinfo *dp, struct snd_seq_event *ev, int atomic, int hop) { return snd_seq_kernel_client_dispatch(dp->cseq, ev, atomic, hop); } /* ioctl */ static inline int -snd_seq_oss_control(seq_oss_devinfo_t *dp, unsigned int type, void *arg) +snd_seq_oss_control(struct seq_oss_devinfo *dp, unsigned int type, void *arg) { return snd_seq_kernel_client_ctl(dp->cseq, type, arg); } /* fill the addresses in header */ static inline void -snd_seq_oss_fill_addr(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, +snd_seq_oss_fill_addr(struct seq_oss_devinfo *dp, struct snd_seq_event *ev, int dest_client, int dest_port) { ev->queue = dp->queue; @@ -186,13 +173,4 @@ snd_seq_oss_fill_addr(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, /* misc. functions for proc interface */ char *enabled_str(int bool); - -/* for debug */ -#ifdef SNDRV_SEQ_OSS_DEBUG -extern int seq_oss_debug; -#define debug_printk(x) do { if (seq_oss_debug > 0) snd_printk x; } while (0) -#else -#define debug_printk(x) /**/ -#endif - #endif /* __SEQ_OSS_DEVICE_H */ diff --git a/sound/core/seq/oss/seq_oss_event.c b/sound/core/seq/oss/seq_oss_event.c index 58e52ddd292..c3908862bc8 100644 --- a/sound/core/seq/oss/seq_oss_event.c +++ b/sound/core/seq/oss/seq_oss_event.c @@ -31,17 +31,17 @@ /* * prototypes */ -static int extended_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev); -static int chn_voice_event(seq_oss_devinfo_t *dp, evrec_t *event_rec, snd_seq_event_t *ev); -static int chn_common_event(seq_oss_devinfo_t *dp, evrec_t *event_rec, snd_seq_event_t *ev); -static int timing_event(seq_oss_devinfo_t *dp, evrec_t *event_rec, snd_seq_event_t *ev); -static int local_event(seq_oss_devinfo_t *dp, evrec_t *event_rec, snd_seq_event_t *ev); -static int old_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev); -static int note_on_event(seq_oss_devinfo_t *dp, int dev, int ch, int note, int vel, snd_seq_event_t *ev); -static int note_off_event(seq_oss_devinfo_t *dp, int dev, int ch, int note, int vel, snd_seq_event_t *ev); -static int set_note_event(seq_oss_devinfo_t *dp, int dev, int type, int ch, int note, int vel, snd_seq_event_t *ev); -static int set_control_event(seq_oss_devinfo_t *dp, int dev, int type, int ch, int param, int val, snd_seq_event_t *ev); -static int set_echo_event(seq_oss_devinfo_t *dp, evrec_t *rec, snd_seq_event_t *ev); +static int extended_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev); +static int chn_voice_event(struct seq_oss_devinfo *dp, union evrec *event_rec, struct snd_seq_event *ev); +static int chn_common_event(struct seq_oss_devinfo *dp, union evrec *event_rec, struct snd_seq_event *ev); +static int timing_event(struct seq_oss_devinfo *dp, union evrec *event_rec, struct snd_seq_event *ev); +static int local_event(struct seq_oss_devinfo *dp, union evrec *event_rec, struct snd_seq_event *ev); +static int old_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev); +static int note_on_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev); +static int note_off_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev); +static int set_note_event(struct seq_oss_devinfo *dp, int dev, int type, int ch, int note, int vel, struct snd_seq_event *ev); +static int set_control_event(struct seq_oss_devinfo *dp, int dev, int type, int ch, int param, int val, struct snd_seq_event *ev); +static int set_echo_event(struct seq_oss_devinfo *dp, union evrec *rec, struct snd_seq_event *ev); /* @@ -51,7 +51,7 @@ static int set_echo_event(seq_oss_devinfo_t *dp, evrec_t *rec, snd_seq_event_t * */ int -snd_seq_oss_process_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) +snd_seq_oss_process_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev) { switch (q->s.code) { case SEQ_EXTENDED: @@ -104,7 +104,7 @@ snd_seq_oss_process_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev /* old type events: mode1 only */ static int -old_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) +old_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev) { switch (q->s.code) { case SEQ_NOTEOFF: @@ -130,7 +130,7 @@ old_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) /* 8bytes extended event: mode1 only */ static int -extended_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) +extended_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev) { int val; @@ -184,7 +184,7 @@ extended_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) /* channel voice events: mode1 and 2 */ static int -chn_voice_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) +chn_voice_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev) { if (q->v.chn >= 32) return -EINVAL; @@ -205,7 +205,7 @@ chn_voice_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) /* channel common events: mode1 and 2 */ static int -chn_common_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) +chn_common_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev) { if (q->l.chn >= 32) return -EINVAL; @@ -232,14 +232,14 @@ chn_common_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) /* timer events: mode1 and mode2 */ static int -timing_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) +timing_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev) { switch (q->t.cmd) { case TMR_ECHO: if (dp->seq_mode == SNDRV_SEQ_OSS_MODE_MUSIC) return set_echo_event(dp, q, ev); else { - evrec_t tmp; + union evrec tmp; memset(&tmp, 0, sizeof(tmp)); /* XXX: only for little-endian! */ tmp.echo = (q->t.time << 8) | SEQ_ECHO; @@ -267,7 +267,7 @@ timing_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) /* local events: mode1 and 2 */ static int -local_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) +local_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev) { return -EINVAL; } @@ -283,9 +283,14 @@ local_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev) * Use key-pressure if note >= 128 */ static int -note_on_event(seq_oss_devinfo_t *dp, int dev, int ch, int note, int vel, snd_seq_event_t *ev) +note_on_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev) { - seq_oss_synthinfo_t *info = &dp->synths[dev]; + struct seq_oss_synthinfo *info; + + if (!snd_seq_oss_synth_is_valid(dp, dev)) + return -ENXIO; + + info = &dp->synths[dev]; switch (info->arg.event_passing) { case SNDRV_SEQ_OSS_PROCESS_EVENTS: if (! info->ch || ch < 0 || ch >= info->nr_voices) { @@ -338,9 +343,14 @@ note_on_event(seq_oss_devinfo_t *dp, int dev, int ch, int note, int vel, snd_seq * process note-off event for OSS synth */ static int -note_off_event(seq_oss_devinfo_t *dp, int dev, int ch, int note, int vel, snd_seq_event_t *ev) +note_off_event(struct seq_oss_devinfo *dp, int dev, int ch, int note, int vel, struct snd_seq_event *ev) { - seq_oss_synthinfo_t *info = &dp->synths[dev]; + struct seq_oss_synthinfo *info; + + if (!snd_seq_oss_synth_is_valid(dp, dev)) + return -ENXIO; + + info = &dp->synths[dev]; switch (info->arg.event_passing) { case SNDRV_SEQ_OSS_PROCESS_EVENTS: if (! info->ch || ch < 0 || ch >= info->nr_voices) { @@ -369,7 +379,7 @@ note_off_event(seq_oss_devinfo_t *dp, int dev, int ch, int note, int vel, snd_se * create a note event */ static int -set_note_event(seq_oss_devinfo_t *dp, int dev, int type, int ch, int note, int vel, snd_seq_event_t *ev) +set_note_event(struct seq_oss_devinfo *dp, int dev, int type, int ch, int note, int vel, struct snd_seq_event *ev) { if (! snd_seq_oss_synth_is_valid(dp, dev)) return -ENXIO; @@ -387,7 +397,7 @@ set_note_event(seq_oss_devinfo_t *dp, int dev, int type, int ch, int note, int v * create a control event */ static int -set_control_event(seq_oss_devinfo_t *dp, int dev, int type, int ch, int param, int val, snd_seq_event_t *ev) +set_control_event(struct seq_oss_devinfo *dp, int dev, int type, int ch, int param, int val, struct snd_seq_event *ev) { if (! snd_seq_oss_synth_is_valid(dp, dev)) return -ENXIO; @@ -405,7 +415,7 @@ set_control_event(seq_oss_devinfo_t *dp, int dev, int type, int ch, int param, i * create an echo event */ static int -set_echo_event(seq_oss_devinfo_t *dp, evrec_t *rec, snd_seq_event_t *ev) +set_echo_event(struct seq_oss_devinfo *dp, union evrec *rec, struct snd_seq_event *ev) { ev->type = SNDRV_SEQ_EVENT_ECHO; /* echo back to itself */ @@ -419,11 +429,11 @@ set_echo_event(seq_oss_devinfo_t *dp, evrec_t *rec, snd_seq_event_t *ev) * the echo event is processed here. */ int -snd_seq_oss_event_input(snd_seq_event_t *ev, int direct, void *private_data, +snd_seq_oss_event_input(struct snd_seq_event *ev, int direct, void *private_data, int atomic, int hop) { - seq_oss_devinfo_t *dp = (seq_oss_devinfo_t *)private_data; - evrec_t *rec; + struct seq_oss_devinfo *dp = (struct seq_oss_devinfo *)private_data; + union evrec *rec; if (ev->type != SNDRV_SEQ_EVENT_ECHO) return snd_seq_oss_midi_input(ev, direct, private_data); @@ -431,7 +441,7 @@ snd_seq_oss_event_input(snd_seq_event_t *ev, int direct, void *private_data, if (ev->source.client != dp->cseq) return 0; /* ignored */ - rec = (evrec_t*)&ev->data; + rec = (union evrec*)&ev->data; if (rec->s.code == SEQ_SYNCTIMER) { /* sync echo back */ snd_seq_oss_writeq_wakeup(dp->writeq, rec->t.time); diff --git a/sound/core/seq/oss/seq_oss_event.h b/sound/core/seq/oss/seq_oss_event.h index bf1d4d3f53c..9a4d9adb7b8 100644 --- a/sound/core/seq/oss/seq_oss_event.h +++ b/sound/core/seq/oss/seq_oss_event.h @@ -29,74 +29,74 @@ #define LONG_EVENT_SIZE 8 /* short event (4bytes) */ -typedef struct evrec_short_t { +struct evrec_short { unsigned char code; unsigned char parm1; unsigned char dev; unsigned char parm2; -} evrec_short_t; +}; /* short note events (4bytes) */ -typedef struct evrec_note_t { +struct evrec_note { unsigned char code; unsigned char chn; unsigned char note; unsigned char vel; -} evrec_note_t; +}; /* long timer events (8bytes) */ -typedef struct evrec_timer_t { +struct evrec_timer { unsigned char code; unsigned char cmd; unsigned char dummy1, dummy2; unsigned int time; -} evrec_timer_t; +}; /* long extended events (8bytes) */ -typedef struct evrec_extended_t { +struct evrec_extended { unsigned char code; unsigned char cmd; unsigned char dev; unsigned char chn; unsigned char p1, p2, p3, p4; -} evrec_extended_t; +}; /* long channel events (8bytes) */ -typedef struct evrec_long_t { +struct evrec_long { unsigned char code; unsigned char dev; unsigned char cmd; unsigned char chn; unsigned char p1, p2; unsigned short val; -} evrec_long_t; +}; /* channel voice events (8bytes) */ -typedef struct evrec_voice_t { +struct evrec_voice { unsigned char code; unsigned char dev; unsigned char cmd; unsigned char chn; unsigned char note, parm; unsigned short dummy; -} evrec_voice_t; +}; /* sysex events (8bytes) */ -typedef struct evrec_sysex_t { +struct evrec_sysex { unsigned char code; unsigned char dev; unsigned char buf[6]; -} evrec_sysex_t; +}; /* event record */ -union evrec_t { - evrec_short_t s; - evrec_note_t n; - evrec_long_t l; - evrec_voice_t v; - evrec_timer_t t; - evrec_extended_t e; - evrec_sysex_t x; +union evrec { + struct evrec_short s; + struct evrec_note n; + struct evrec_long l; + struct evrec_voice v; + struct evrec_timer t; + struct evrec_extended e; + struct evrec_sysex x; unsigned int echo; unsigned char c[LONG_EVENT_SIZE]; }; @@ -104,9 +104,9 @@ union evrec_t { #define ev_is_long(ev) ((ev)->s.code >= 128) #define ev_length(ev) ((ev)->s.code >= 128 ? LONG_EVENT_SIZE : SHORT_EVENT_SIZE) -int snd_seq_oss_process_event(seq_oss_devinfo_t *dp, evrec_t *q, snd_seq_event_t *ev); -int snd_seq_oss_process_timer_event(seq_oss_timer_t *rec, evrec_t *q); -int snd_seq_oss_event_input(snd_seq_event_t *ev, int direct, void *private_data, int atomic, int hop); +int snd_seq_oss_process_event(struct seq_oss_devinfo *dp, union evrec *q, struct snd_seq_event *ev); +int snd_seq_oss_process_timer_event(struct seq_oss_timer *rec, union evrec *q); +int snd_seq_oss_event_input(struct snd_seq_event *ev, int direct, void *private_data, int atomic, int hop); #endif /* __SEQ_OSS_EVENT_H */ diff --git a/sound/core/seq/oss/seq_oss_init.c b/sound/core/seq/oss/seq_oss_init.c index bac4b4f1a94..b9184d20c39 100644 --- a/sound/core/seq/oss/seq_oss_init.c +++ b/sound/core/seq/oss/seq_oss_init.c @@ -28,7 +28,10 @@ #include "seq_oss_timer.h" #include "seq_oss_event.h" #include <linux/init.h> +#include <linux/export.h> #include <linux/moduleparam.h> +#include <linux/slab.h> +#include <linux/workqueue.h> /* * common variables @@ -41,23 +44,31 @@ static int system_client = -1; /* ALSA sequencer client number */ static int system_port = -1; static int num_clients; -static seq_oss_devinfo_t *client_table[SNDRV_SEQ_OSS_MAX_CLIENTS]; +static struct seq_oss_devinfo *client_table[SNDRV_SEQ_OSS_MAX_CLIENTS]; /* * prototypes */ -static int receive_announce(snd_seq_event_t *ev, int direct, void *private, int atomic, int hop); +static int receive_announce(struct snd_seq_event *ev, int direct, void *private, int atomic, int hop); static int translate_mode(struct file *file); -static int create_port(seq_oss_devinfo_t *dp); -static int delete_port(seq_oss_devinfo_t *dp); -static int alloc_seq_queue(seq_oss_devinfo_t *dp); +static int create_port(struct seq_oss_devinfo *dp); +static int delete_port(struct seq_oss_devinfo *dp); +static int alloc_seq_queue(struct seq_oss_devinfo *dp); static int delete_seq_queue(int queue); static void free_devinfo(void *private); #define call_ctl(type,rec) snd_seq_kernel_client_ctl(system_client, type, rec) +/* call snd_seq_oss_midi_lookup_ports() asynchronously */ +static void async_call_lookup_ports(struct work_struct *work) +{ + snd_seq_oss_midi_lookup_ports(system_client); +} + +static DECLARE_WORK(async_lookup_work, async_call_lookup_ports); + /* * create sequencer client for OSS sequencer */ @@ -65,42 +76,22 @@ int __init snd_seq_oss_create_client(void) { int rc; - snd_seq_client_callback_t callback; - snd_seq_client_info_t *info; - snd_seq_port_info_t *port; - snd_seq_port_callback_t port_callback; + struct snd_seq_port_info *port; + struct snd_seq_port_callback port_callback; - info = kmalloc(sizeof(*info), GFP_KERNEL); port = kmalloc(sizeof(*port), GFP_KERNEL); - if (!info || !port) { + if (!port) { rc = -ENOMEM; goto __error; } /* create ALSA client */ - memset(&callback, 0, sizeof(callback)); - - callback.private_data = NULL; - callback.allow_input = 1; - callback.allow_output = 1; - - rc = snd_seq_create_kernel_client(NULL, SNDRV_SEQ_CLIENT_OSS, &callback); + rc = snd_seq_create_kernel_client(NULL, SNDRV_SEQ_CLIENT_OSS, + "OSS sequencer"); if (rc < 0) goto __error; system_client = rc; - debug_printk(("new client = %d\n", rc)); - - /* set client information */ - memset(info, 0, sizeof(*info)); - info->client = system_client; - info->type = KERNEL_CLIENT; - strcpy(info->name, "OSS sequencer"); - - rc = call_ctl(SNDRV_SEQ_IOCTL_SET_CLIENT_INFO, info); - - /* look up midi devices */ - snd_seq_oss_midi_lookup_ports(system_client); /* create annoucement receiver port */ memset(port, 0, sizeof(*port)); @@ -118,7 +109,7 @@ snd_seq_oss_create_client(void) call_ctl(SNDRV_SEQ_IOCTL_CREATE_PORT, port); if ((system_port = port->addr.port) >= 0) { - snd_seq_port_subscribe_t subs; + struct snd_seq_port_subscribe subs; memset(&subs, 0, sizeof(subs)); subs.sender.client = SNDRV_SEQ_CLIENT_SYSTEM; @@ -129,9 +120,11 @@ snd_seq_oss_create_client(void) } rc = 0; + /* look up midi devices */ + schedule_work(&async_lookup_work); + __error: kfree(port); - kfree(info); return rc; } @@ -140,9 +133,9 @@ snd_seq_oss_create_client(void) * receive annoucement from system port, and check the midi device */ static int -receive_announce(snd_seq_event_t *ev, int direct, void *private, int atomic, int hop) +receive_announce(struct snd_seq_event *ev, int direct, void *private, int atomic, int hop) { - snd_seq_port_info_t pinfo; + struct snd_seq_port_info pinfo; if (atomic) return 0; /* it must not happen */ @@ -175,6 +168,7 @@ receive_announce(snd_seq_event_t *ev, int direct, void *private, int atomic, int int snd_seq_oss_delete_client(void) { + cancel_work_sync(&async_lookup_work); if (system_client >= 0) snd_seq_delete_kernel_client(system_client); @@ -191,51 +185,50 @@ int snd_seq_oss_open(struct file *file, int level) { int i, rc; - seq_oss_devinfo_t *dp; + struct seq_oss_devinfo *dp; - if ((dp = kcalloc(1, sizeof(*dp), GFP_KERNEL)) == NULL) { - snd_printk(KERN_ERR "can't malloc device info\n"); + dp = kzalloc(sizeof(*dp), GFP_KERNEL); + if (!dp) { + pr_err("ALSA: seq_oss: can't malloc device info\n"); return -ENOMEM; } - debug_printk(("oss_open: dp = %p\n", dp)); + + dp->cseq = system_client; + dp->port = -1; + dp->queue = -1; for (i = 0; i < SNDRV_SEQ_OSS_MAX_CLIENTS; i++) { if (client_table[i] == NULL) break; } - if (i >= SNDRV_SEQ_OSS_MAX_CLIENTS) { - snd_printk(KERN_ERR "too many applications\n"); - kfree(dp); - return -ENOMEM; - } dp->index = i; - dp->cseq = system_client; - dp->port = -1; - dp->queue = -1; - dp->readq = NULL; - dp->writeq = NULL; + if (i >= SNDRV_SEQ_OSS_MAX_CLIENTS) { + pr_err("ALSA: seq_oss: too many applications\n"); + rc = -ENOMEM; + goto _error; + } /* look up synth and midi devices */ snd_seq_oss_synth_setup(dp); snd_seq_oss_midi_setup(dp); if (dp->synth_opened == 0 && dp->max_mididev == 0) { - /* snd_printk(KERN_ERR "no device found\n"); */ + /* pr_err("ALSA: seq_oss: no device found\n"); */ rc = -ENODEV; goto _error; } /* create port */ - debug_printk(("create new port\n")); - if ((rc = create_port(dp)) < 0) { - snd_printk(KERN_ERR "can't create port\n"); + rc = create_port(dp); + if (rc < 0) { + pr_err("ALSA: seq_oss: can't create port\n"); goto _error; } /* allocate queue */ - debug_printk(("allocate queue\n")); - if ((rc = alloc_seq_queue(dp)) < 0) + rc = alloc_seq_queue(dp); + if (rc < 0) goto _error; /* set address */ @@ -250,32 +243,30 @@ snd_seq_oss_open(struct file *file, int level) dp->file_mode = translate_mode(file); /* initialize read queue */ - debug_printk(("initialize read queue\n")); if (is_read_mode(dp->file_mode)) { - if ((dp->readq = snd_seq_oss_readq_new(dp, maxqlen)) == NULL) { + dp->readq = snd_seq_oss_readq_new(dp, maxqlen); + if (!dp->readq) { rc = -ENOMEM; goto _error; } } /* initialize write queue */ - debug_printk(("initialize write queue\n")); if (is_write_mode(dp->file_mode)) { dp->writeq = snd_seq_oss_writeq_new(dp, maxqlen); - if (dp->writeq == NULL) { + if (!dp->writeq) { rc = -ENOMEM; goto _error; } } /* initialize timer */ - debug_printk(("initialize timer\n")); - if ((dp->timer = snd_seq_oss_timer_new(dp)) == NULL) { - snd_printk(KERN_ERR "can't alloc timer\n"); + dp->timer = snd_seq_oss_timer_new(dp); + if (!dp->timer) { + pr_err("ALSA: seq_oss: can't alloc timer\n"); rc = -ENOMEM; goto _error; } - debug_printk(("timer initialized\n")); /* set private data pointer */ file->private_data = dp; @@ -289,15 +280,13 @@ snd_seq_oss_open(struct file *file, int level) client_table[dp->index] = dp; num_clients++; - debug_printk(("open done\n")); return 0; _error: snd_seq_oss_synth_cleanup(dp); snd_seq_oss_midi_cleanup(dp); - i = dp->queue; + delete_seq_queue(dp->queue); delete_port(dp); - delete_seq_queue(i); return rc; } @@ -323,11 +312,11 @@ translate_mode(struct file *file) * create sequencer port */ static int -create_port(seq_oss_devinfo_t *dp) +create_port(struct seq_oss_devinfo *dp) { int rc; - snd_seq_port_info_t port; - snd_seq_port_callback_t callback; + struct snd_seq_port_info port; + struct snd_seq_port_callback callback; memset(&port, 0, sizeof(port)); port.addr.client = dp->cseq; @@ -349,7 +338,6 @@ create_port(seq_oss_devinfo_t *dp) return rc; dp->port = port.addr.port; - debug_printk(("new port = %d\n", port.addr.port)); return 0; } @@ -358,12 +346,13 @@ create_port(seq_oss_devinfo_t *dp) * delete ALSA port */ static int -delete_port(seq_oss_devinfo_t *dp) +delete_port(struct seq_oss_devinfo *dp) { - if (dp->port < 0) + if (dp->port < 0) { + kfree(dp); return 0; + } - debug_printk(("delete_port %i\n", dp->port)); return snd_seq_event_port_detach(dp->cseq, dp->port); } @@ -371,9 +360,9 @@ delete_port(seq_oss_devinfo_t *dp) * allocate a queue */ static int -alloc_seq_queue(seq_oss_devinfo_t *dp) +alloc_seq_queue(struct seq_oss_devinfo *dp) { - snd_seq_queue_info_t qinfo; + struct snd_seq_queue_info qinfo; int rc; memset(&qinfo, 0, sizeof(qinfo)); @@ -392,7 +381,7 @@ alloc_seq_queue(seq_oss_devinfo_t *dp) static int delete_seq_queue(int queue) { - snd_seq_queue_info_t qinfo; + struct snd_seq_queue_info qinfo; int rc; if (queue < 0) @@ -401,7 +390,7 @@ delete_seq_queue(int queue) qinfo.queue = queue; rc = call_ctl(SNDRV_SEQ_IOCTL_DELETE_QUEUE, &qinfo); if (rc < 0) - printk(KERN_ERR "seq-oss: unable to delete queue %d (%d)\n", queue, rc); + pr_err("ALSA: seq_oss: unable to delete queue %d (%d)\n", queue, rc); return rc; } @@ -412,7 +401,7 @@ delete_seq_queue(int queue) static void free_devinfo(void *private) { - seq_oss_devinfo_t *dp = (seq_oss_devinfo_t *)private; + struct seq_oss_devinfo *dp = (struct seq_oss_devinfo *)private; if (dp->timer) snd_seq_oss_timer_delete(dp->timer); @@ -431,28 +420,23 @@ free_devinfo(void *private) * close sequencer device */ void -snd_seq_oss_release(seq_oss_devinfo_t *dp) +snd_seq_oss_release(struct seq_oss_devinfo *dp) { int queue; client_table[dp->index] = NULL; num_clients--; - debug_printk(("resetting..\n")); snd_seq_oss_reset(dp); - debug_printk(("cleaning up..\n")); snd_seq_oss_synth_cleanup(dp); snd_seq_oss_midi_cleanup(dp); /* clear slot */ - debug_printk(("releasing resource..\n")); queue = dp->queue; if (dp->port >= 0) delete_port(dp); delete_seq_queue(queue); - - debug_printk(("release done\n")); } @@ -460,13 +444,12 @@ snd_seq_oss_release(seq_oss_devinfo_t *dp) * Wait until the queue is empty (if we don't have nonblock) */ void -snd_seq_oss_drain_write(seq_oss_devinfo_t *dp) +snd_seq_oss_drain_write(struct seq_oss_devinfo *dp) { if (! dp->timer->running) return; if (is_write_mode(dp->file_mode) && !is_nonblock_mode(dp->file_mode) && dp->writeq) { - debug_printk(("syncing..\n")); while (snd_seq_oss_writeq_sync(dp->writeq)) ; } @@ -477,7 +460,7 @@ snd_seq_oss_drain_write(seq_oss_devinfo_t *dp) * reset sequencer devices */ void -snd_seq_oss_reset(seq_oss_devinfo_t *dp) +snd_seq_oss_reset(struct seq_oss_devinfo *dp) { int i; @@ -502,6 +485,7 @@ snd_seq_oss_reset(seq_oss_devinfo_t *dp) } +#ifdef CONFIG_PROC_FS /* * misc. functions for proc interface */ @@ -525,10 +509,10 @@ filemode_str(int val) * proc interface */ void -snd_seq_oss_system_info_read(snd_info_buffer_t *buf) +snd_seq_oss_system_info_read(struct snd_info_buffer *buf) { int i; - seq_oss_devinfo_t *dp; + struct seq_oss_devinfo *dp; snd_iprintf(buf, "ALSA client number %d\n", system_client); snd_iprintf(buf, "ALSA receiver port %d\n", system_port); @@ -552,4 +536,4 @@ snd_seq_oss_system_info_read(snd_info_buffer_t *buf) snd_seq_oss_readq_info_read(dp->readq, buf); } } - +#endif /* CONFIG_PROC_FS */ diff --git a/sound/core/seq/oss/seq_oss_ioctl.c b/sound/core/seq/oss/seq_oss_ioctl.c index e86f18d00f3..5b8520177b0 100644 --- a/sound/core/seq/oss/seq_oss_ioctl.c +++ b/sound/core/seq/oss/seq_oss_ioctl.c @@ -28,7 +28,7 @@ #include "seq_oss_midi.h" #include "seq_oss_event.h" -static int snd_seq_oss_synth_info_user(seq_oss_devinfo_t *dp, void __user *arg) +static int snd_seq_oss_synth_info_user(struct seq_oss_devinfo *dp, void __user *arg) { struct synth_info info; @@ -41,7 +41,7 @@ static int snd_seq_oss_synth_info_user(seq_oss_devinfo_t *dp, void __user *arg) return 0; } -static int snd_seq_oss_midi_info_user(seq_oss_devinfo_t *dp, void __user *arg) +static int snd_seq_oss_midi_info_user(struct seq_oss_devinfo *dp, void __user *arg) { struct midi_info info; @@ -54,24 +54,24 @@ static int snd_seq_oss_midi_info_user(seq_oss_devinfo_t *dp, void __user *arg) return 0; } -static int snd_seq_oss_oob_user(seq_oss_devinfo_t *dp, void __user *arg) +static int snd_seq_oss_oob_user(struct seq_oss_devinfo *dp, void __user *arg) { unsigned char ev[8]; - snd_seq_event_t tmpev; + struct snd_seq_event tmpev; if (copy_from_user(ev, arg, 8)) return -EFAULT; memset(&tmpev, 0, sizeof(tmpev)); snd_seq_oss_fill_addr(dp, &tmpev, dp->addr.port, dp->addr.client); tmpev.time.tick = 0; - if (! snd_seq_oss_process_event(dp, (evrec_t*)ev, &tmpev)) { + if (! snd_seq_oss_process_event(dp, (union evrec *)ev, &tmpev)) { snd_seq_oss_dispatch(dp, &tmpev, 0, 0); } return 0; } int -snd_seq_oss_ioctl(seq_oss_devinfo_t *dp, unsigned int cmd, unsigned long carg) +snd_seq_oss_ioctl(struct seq_oss_devinfo *dp, unsigned int cmd, unsigned long carg) { int dev, val; void __user *arg = (void __user *)carg; @@ -90,12 +90,10 @@ snd_seq_oss_ioctl(seq_oss_devinfo_t *dp, unsigned int cmd, unsigned long carg) return snd_seq_oss_timer_ioctl(dp->timer, cmd, arg); case SNDCTL_SEQ_PANIC: - debug_printk(("panic\n")); snd_seq_oss_reset(dp); return -EINVAL; case SNDCTL_SEQ_SYNC: - debug_printk(("sync\n")); if (! is_write_mode(dp->file_mode) || dp->writeq == NULL) return 0; while (snd_seq_oss_writeq_sync(dp->writeq)) @@ -105,55 +103,45 @@ snd_seq_oss_ioctl(seq_oss_devinfo_t *dp, unsigned int cmd, unsigned long carg) return 0; case SNDCTL_SEQ_RESET: - debug_printk(("reset\n")); snd_seq_oss_reset(dp); return 0; case SNDCTL_SEQ_TESTMIDI: - debug_printk(("test midi\n")); if (get_user(dev, p)) return -EFAULT; return snd_seq_oss_midi_open(dp, dev, dp->file_mode); case SNDCTL_SEQ_GETINCOUNT: - debug_printk(("get in count\n")); if (dp->readq == NULL || ! is_read_mode(dp->file_mode)) return 0; return put_user(dp->readq->qlen, p) ? -EFAULT : 0; case SNDCTL_SEQ_GETOUTCOUNT: - debug_printk(("get out count\n")); if (! is_write_mode(dp->file_mode) || dp->writeq == NULL) return 0; return put_user(snd_seq_oss_writeq_get_free_size(dp->writeq), p) ? -EFAULT : 0; case SNDCTL_SEQ_GETTIME: - debug_printk(("get time\n")); return put_user(snd_seq_oss_timer_cur_tick(dp->timer), p) ? -EFAULT : 0; case SNDCTL_SEQ_RESETSAMPLES: - debug_printk(("reset samples\n")); if (get_user(dev, p)) return -EFAULT; return snd_seq_oss_synth_ioctl(dp, dev, cmd, carg); case SNDCTL_SEQ_NRSYNTHS: - debug_printk(("nr synths\n")); return put_user(dp->max_synthdev, p) ? -EFAULT : 0; case SNDCTL_SEQ_NRMIDIS: - debug_printk(("nr midis\n")); return put_user(dp->max_mididev, p) ? -EFAULT : 0; case SNDCTL_SYNTH_MEMAVL: - debug_printk(("mem avail\n")); if (get_user(dev, p)) return -EFAULT; val = snd_seq_oss_synth_ioctl(dp, dev, cmd, carg); return put_user(val, p) ? -EFAULT : 0; case SNDCTL_FM_4OP_ENABLE: - debug_printk(("4op\n")); if (get_user(dev, p)) return -EFAULT; snd_seq_oss_synth_ioctl(dp, dev, cmd, carg); @@ -161,19 +149,15 @@ snd_seq_oss_ioctl(seq_oss_devinfo_t *dp, unsigned int cmd, unsigned long carg) case SNDCTL_SYNTH_INFO: case SNDCTL_SYNTH_ID: - debug_printk(("synth info\n")); return snd_seq_oss_synth_info_user(dp, arg); case SNDCTL_SEQ_OUTOFBAND: - debug_printk(("out of band\n")); return snd_seq_oss_oob_user(dp, arg); case SNDCTL_MIDI_INFO: - debug_printk(("midi info\n")); return snd_seq_oss_midi_info_user(dp, arg); case SNDCTL_SEQ_THRESHOLD: - debug_printk(("threshold\n")); if (! is_write_mode(dp->file_mode)) return 0; if (get_user(val, p)) @@ -186,7 +170,6 @@ snd_seq_oss_ioctl(seq_oss_devinfo_t *dp, unsigned int cmd, unsigned long carg) return 0; case SNDCTL_MIDI_PRETIME: - debug_printk(("pretime\n")); if (dp->readq == NULL || !is_read_mode(dp->file_mode)) return 0; if (get_user(val, p)) @@ -199,7 +182,6 @@ snd_seq_oss_ioctl(seq_oss_devinfo_t *dp, unsigned int cmd, unsigned long carg) return put_user(val, p) ? -EFAULT : 0; default: - debug_printk(("others\n")); if (! is_write_mode(dp->file_mode)) return -EIO; return snd_seq_oss_synth_ioctl(dp, 0, cmd, carg); diff --git a/sound/core/seq/oss/seq_oss_midi.c b/sound/core/seq/oss/seq_oss_midi.c index 9aece6c65db..3a4569669ef 100644 --- a/sound/core/seq/oss/seq_oss_midi.c +++ b/sound/core/seq/oss/seq_oss_midi.c @@ -20,6 +20,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include <sound/asoundef.h> #include "seq_oss_midi.h" #include "seq_oss_readq.h" #include "seq_oss_timer.h" @@ -27,6 +28,7 @@ #include <sound/seq_midi_event.h> #include "../seq_lock.h" #include <linux/init.h> +#include <linux/slab.h> /* @@ -37,15 +39,15 @@ /* * definition of midi device record */ -struct seq_oss_midi_t { +struct seq_oss_midi { int seq_device; /* device number */ int client; /* sequencer client number */ int port; /* sequencer port number */ unsigned int flags; /* port capability */ int opened; /* flag for opening */ unsigned char name[SNDRV_SEQ_OSS_MAX_MIDI_NAME]; - snd_midi_event_t *coder; /* MIDI event coder */ - seq_oss_devinfo_t *devinfo; /* assigned OSSseq device */ + struct snd_midi_event *coder; /* MIDI event coder */ + struct seq_oss_devinfo *devinfo; /* assigned OSSseq device */ snd_use_lock_t use_lock; }; @@ -54,30 +56,30 @@ struct seq_oss_midi_t { * midi device table */ static int max_midi_devs; -static seq_oss_midi_t *midi_devs[SNDRV_SEQ_OSS_MAX_MIDI_DEVS]; +static struct seq_oss_midi *midi_devs[SNDRV_SEQ_OSS_MAX_MIDI_DEVS]; static DEFINE_SPINLOCK(register_lock); /* * prototypes */ -static seq_oss_midi_t *get_mdev(int dev); -static seq_oss_midi_t *get_mididev(seq_oss_devinfo_t *dp, int dev); -static int send_synth_event(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, int dev); -static int send_midi_event(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, seq_oss_midi_t *mdev); +static struct seq_oss_midi *get_mdev(int dev); +static struct seq_oss_midi *get_mididev(struct seq_oss_devinfo *dp, int dev); +static int send_synth_event(struct seq_oss_devinfo *dp, struct snd_seq_event *ev, int dev); +static int send_midi_event(struct seq_oss_devinfo *dp, struct snd_seq_event *ev, struct seq_oss_midi *mdev); /* * look up the existing ports * this looks a very exhausting job. */ -int __init +int snd_seq_oss_midi_lookup_ports(int client) { - snd_seq_client_info_t *clinfo; - snd_seq_port_info_t *pinfo; + struct snd_seq_client_info *clinfo; + struct snd_seq_port_info *pinfo; - clinfo = kcalloc(1, sizeof(*clinfo), GFP_KERNEL); - pinfo = kcalloc(1, sizeof(*pinfo), GFP_KERNEL); + clinfo = kzalloc(sizeof(*clinfo), GFP_KERNEL); + pinfo = kzalloc(sizeof(*pinfo), GFP_KERNEL); if (! clinfo || ! pinfo) { kfree(clinfo); kfree(pinfo); @@ -100,10 +102,10 @@ snd_seq_oss_midi_lookup_ports(int client) /* */ -static seq_oss_midi_t * +static struct seq_oss_midi * get_mdev(int dev) { - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; unsigned long flags; spin_lock_irqsave(®ister_lock, flags); @@ -117,11 +119,11 @@ get_mdev(int dev) /* * look for the identical slot */ -static seq_oss_midi_t * +static struct seq_oss_midi * find_slot(int client, int port) { int i; - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; unsigned long flags; spin_lock_irqsave(®ister_lock, flags); @@ -145,13 +147,12 @@ find_slot(int client, int port) * register a new port if it doesn't exist yet */ int -snd_seq_oss_midi_check_new_port(snd_seq_port_info_t *pinfo) +snd_seq_oss_midi_check_new_port(struct snd_seq_port_info *pinfo) { int i; - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; unsigned long flags; - debug_printk(("check for MIDI client %d port %d\n", pinfo->addr.client, pinfo->addr.port)); /* the port must include generic midi */ if (! (pinfo->type & SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC)) return 0; @@ -172,8 +173,8 @@ snd_seq_oss_midi_check_new_port(snd_seq_port_info_t *pinfo) /* * allocate midi info record */ - if ((mdev = kcalloc(1, sizeof(*mdev), GFP_KERNEL)) == NULL) { - snd_printk(KERN_ERR "can't malloc midi info\n"); + if ((mdev = kzalloc(sizeof(*mdev), GFP_KERNEL)) == NULL) { + pr_err("ALSA: seq_oss: can't malloc midi info\n"); return -ENOMEM; } @@ -189,7 +190,7 @@ snd_seq_oss_midi_check_new_port(snd_seq_port_info_t *pinfo) /* create MIDI coder */ if (snd_midi_event_new(MAX_MIDI_EVENT_BUF, &mdev->coder) < 0) { - snd_printk(KERN_ERR "can't malloc midi coder\n"); + pr_err("ALSA: seq_oss: can't malloc midi coder\n"); kfree(mdev); return -ENOMEM; } @@ -226,7 +227,7 @@ snd_seq_oss_midi_check_new_port(snd_seq_port_info_t *pinfo) int snd_seq_oss_midi_check_exit_port(int client, int port) { - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; unsigned long flags; int index; @@ -258,7 +259,7 @@ void snd_seq_oss_midi_clear_all(void) { int i; - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; unsigned long flags; spin_lock_irqsave(®ister_lock, flags); @@ -279,7 +280,7 @@ snd_seq_oss_midi_clear_all(void) * set up midi tables */ void -snd_seq_oss_midi_setup(seq_oss_devinfo_t *dp) +snd_seq_oss_midi_setup(struct seq_oss_devinfo *dp) { dp->max_mididev = max_midi_devs; } @@ -288,7 +289,7 @@ snd_seq_oss_midi_setup(seq_oss_devinfo_t *dp) * clean up midi tables */ void -snd_seq_oss_midi_cleanup(seq_oss_devinfo_t *dp) +snd_seq_oss_midi_cleanup(struct seq_oss_devinfo *dp) { int i; for (i = 0; i < dp->max_mididev; i++) @@ -301,7 +302,7 @@ snd_seq_oss_midi_cleanup(seq_oss_devinfo_t *dp) * open all midi devices. ignore errors. */ void -snd_seq_oss_midi_open_all(seq_oss_devinfo_t *dp, int file_mode) +snd_seq_oss_midi_open_all(struct seq_oss_devinfo *dp, int file_mode) { int i; for (i = 0; i < dp->max_mididev; i++) @@ -312,8 +313,8 @@ snd_seq_oss_midi_open_all(seq_oss_devinfo_t *dp, int file_mode) /* * get the midi device information */ -static seq_oss_midi_t * -get_mididev(seq_oss_devinfo_t *dp, int dev) +static struct seq_oss_midi * +get_mididev(struct seq_oss_devinfo *dp, int dev) { if (dev < 0 || dev >= dp->max_mididev) return NULL; @@ -325,11 +326,11 @@ get_mididev(seq_oss_devinfo_t *dp, int dev) * open the midi device if not opened yet */ int -snd_seq_oss_midi_open(seq_oss_devinfo_t *dp, int dev, int fmode) +snd_seq_oss_midi_open(struct seq_oss_devinfo *dp, int dev, int fmode) { int perm; - seq_oss_midi_t *mdev; - snd_seq_port_subscribe_t subs; + struct seq_oss_midi *mdev; + struct snd_seq_port_subscribe subs; if ((mdev = get_mididev(dp, dev)) == NULL) return -ENODEV; @@ -392,10 +393,10 @@ snd_seq_oss_midi_open(seq_oss_devinfo_t *dp, int dev, int fmode) * close the midi device if already opened */ int -snd_seq_oss_midi_close(seq_oss_devinfo_t *dp, int dev) +snd_seq_oss_midi_close(struct seq_oss_devinfo *dp, int dev) { - seq_oss_midi_t *mdev; - snd_seq_port_subscribe_t subs; + struct seq_oss_midi *mdev; + struct snd_seq_port_subscribe subs; if ((mdev = get_mididev(dp, dev)) == NULL) return -ENODEV; @@ -404,7 +405,6 @@ snd_seq_oss_midi_close(seq_oss_devinfo_t *dp, int dev) return 0; } - debug_printk(("closing client %d port %d mode %d\n", mdev->client, mdev->port, mdev->opened)); memset(&subs, 0, sizeof(subs)); if (mdev->opened & PERM_WRITE) { subs.sender = dp->addr; @@ -430,9 +430,9 @@ snd_seq_oss_midi_close(seq_oss_devinfo_t *dp, int dev) * change seq capability flags to file mode flags */ int -snd_seq_oss_midi_filemode(seq_oss_devinfo_t *dp, int dev) +snd_seq_oss_midi_filemode(struct seq_oss_devinfo *dp, int dev) { - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; int mode; if ((mdev = get_mididev(dp, dev)) == NULL) @@ -453,9 +453,9 @@ snd_seq_oss_midi_filemode(seq_oss_devinfo_t *dp, int dev) * so far, only close the device. */ void -snd_seq_oss_midi_reset(seq_oss_devinfo_t *dp, int dev) +snd_seq_oss_midi_reset(struct seq_oss_devinfo *dp, int dev) { - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; if ((mdev = get_mididev(dp, dev)) == NULL) return; @@ -465,10 +465,9 @@ snd_seq_oss_midi_reset(seq_oss_devinfo_t *dp, int dev) } if (mdev->opened & PERM_WRITE) { - snd_seq_event_t ev; + struct snd_seq_event ev; int c; - debug_printk(("resetting client %d port %d\n", mdev->client, mdev->port)); memset(&ev, 0, sizeof(ev)); ev.dest.client = mdev->client; ev.dest.port = mdev->port; @@ -476,19 +475,20 @@ snd_seq_oss_midi_reset(seq_oss_devinfo_t *dp, int dev) ev.source.port = dp->port; if (dp->seq_mode == SNDRV_SEQ_OSS_MODE_SYNTH) { ev.type = SNDRV_SEQ_EVENT_SENSING; - snd_seq_oss_dispatch(dp, &ev, 0, 0); /* active sensing */ + snd_seq_oss_dispatch(dp, &ev, 0, 0); } for (c = 0; c < 16; c++) { ev.type = SNDRV_SEQ_EVENT_CONTROLLER; ev.data.control.channel = c; - ev.data.control.param = 123; - snd_seq_oss_dispatch(dp, &ev, 0, 0); /* all notes off */ + ev.data.control.param = MIDI_CTL_ALL_NOTES_OFF; + snd_seq_oss_dispatch(dp, &ev, 0, 0); if (dp->seq_mode == SNDRV_SEQ_OSS_MODE_MUSIC) { - ev.data.control.param = 121; - snd_seq_oss_dispatch(dp, &ev, 0, 0); /* reset all controllers */ + ev.data.control.param = + MIDI_CTL_RESET_CONTROLLERS; + snd_seq_oss_dispatch(dp, &ev, 0, 0); ev.type = SNDRV_SEQ_EVENT_PITCHBEND; ev.data.control.value = 0; - snd_seq_oss_dispatch(dp, &ev, 0, 0); /* bender off */ + snd_seq_oss_dispatch(dp, &ev, 0, 0); } } } @@ -501,9 +501,9 @@ snd_seq_oss_midi_reset(seq_oss_devinfo_t *dp, int dev) * get client/port of the specified MIDI device */ void -snd_seq_oss_midi_get_addr(seq_oss_devinfo_t *dp, int dev, snd_seq_addr_t *addr) +snd_seq_oss_midi_get_addr(struct seq_oss_devinfo *dp, int dev, struct snd_seq_addr *addr) { - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; if ((mdev = get_mididev(dp, dev)) == NULL) return; @@ -517,10 +517,10 @@ snd_seq_oss_midi_get_addr(seq_oss_devinfo_t *dp, int dev, snd_seq_addr_t *addr) * input callback - this can be atomic */ int -snd_seq_oss_midi_input(snd_seq_event_t *ev, int direct, void *private_data) +snd_seq_oss_midi_input(struct snd_seq_event *ev, int direct, void *private_data) { - seq_oss_devinfo_t *dp = (seq_oss_devinfo_t *)private_data; - seq_oss_midi_t *mdev; + struct seq_oss_devinfo *dp = (struct seq_oss_devinfo *)private_data; + struct seq_oss_midi *mdev; int rc; if (dp->readq == NULL) @@ -545,9 +545,9 @@ snd_seq_oss_midi_input(snd_seq_event_t *ev, int direct, void *private_data) * convert ALSA sequencer event to OSS synth event */ static int -send_synth_event(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, int dev) +send_synth_event(struct seq_oss_devinfo *dp, struct snd_seq_event *ev, int dev) { - evrec_t ossev; + union evrec ossev; memset(&ossev, 0, sizeof(ossev)); @@ -606,7 +606,7 @@ send_synth_event(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, int dev) * decode event and send MIDI bytes to read queue */ static int -send_midi_event(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, seq_oss_midi_t *mdev) +send_midi_event(struct seq_oss_devinfo *dp, struct snd_seq_event *ev, struct seq_oss_midi *mdev) { char msg[32]; int len; @@ -634,9 +634,9 @@ send_midi_event(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, seq_oss_midi_t *mdev * non-zero : invalid - ignored */ int -snd_seq_oss_midi_putc(seq_oss_devinfo_t *dp, int dev, unsigned char c, snd_seq_event_t *ev) +snd_seq_oss_midi_putc(struct seq_oss_devinfo *dp, int dev, unsigned char c, struct snd_seq_event *ev) { - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; if ((mdev = get_mididev(dp, dev)) == NULL) return -ENODEV; @@ -653,9 +653,9 @@ snd_seq_oss_midi_putc(seq_oss_devinfo_t *dp, int dev, unsigned char c, snd_seq_e * create OSS compatible midi_info record */ int -snd_seq_oss_midi_make_info(seq_oss_devinfo_t *dp, int dev, struct midi_info *inf) +snd_seq_oss_midi_make_info(struct seq_oss_devinfo *dp, int dev, struct midi_info *inf) { - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; if ((mdev = get_mididev(dp, dev)) == NULL) return -ENXIO; @@ -668,6 +668,7 @@ snd_seq_oss_midi_make_info(seq_oss_devinfo_t *dp, int dev, struct midi_info *inf } +#ifdef CONFIG_PROC_FS /* * proc interface */ @@ -686,10 +687,10 @@ capmode_str(int val) } void -snd_seq_oss_midi_info_read(snd_info_buffer_t *buf) +snd_seq_oss_midi_info_read(struct snd_info_buffer *buf) { int i; - seq_oss_midi_t *mdev; + struct seq_oss_midi *mdev; snd_iprintf(buf, "\nNumber of MIDI devices: %d\n", max_midi_devs); for (i = 0; i < max_midi_devs; i++) { @@ -707,4 +708,4 @@ snd_seq_oss_midi_info_read(snd_info_buffer_t *buf) snd_use_lock_free(&mdev->use_lock); } } - +#endif /* CONFIG_PROC_FS */ diff --git a/sound/core/seq/oss/seq_oss_midi.h b/sound/core/seq/oss/seq_oss_midi.h index 462484b2b6f..84eb866ba58 100644 --- a/sound/core/seq/oss/seq_oss_midi.h +++ b/sound/core/seq/oss/seq_oss_midi.h @@ -26,24 +26,23 @@ #include "seq_oss_device.h" #include <sound/seq_oss_legacy.h> -typedef struct seq_oss_midi_t seq_oss_midi_t; - int snd_seq_oss_midi_lookup_ports(int client); -int snd_seq_oss_midi_check_new_port(snd_seq_port_info_t *pinfo); +int snd_seq_oss_midi_check_new_port(struct snd_seq_port_info *pinfo); int snd_seq_oss_midi_check_exit_port(int client, int port); void snd_seq_oss_midi_clear_all(void); -void snd_seq_oss_midi_setup(seq_oss_devinfo_t *dp); -void snd_seq_oss_midi_cleanup(seq_oss_devinfo_t *dp); +void snd_seq_oss_midi_setup(struct seq_oss_devinfo *dp); +void snd_seq_oss_midi_cleanup(struct seq_oss_devinfo *dp); -int snd_seq_oss_midi_open(seq_oss_devinfo_t *dp, int dev, int file_mode); -void snd_seq_oss_midi_open_all(seq_oss_devinfo_t *dp, int file_mode); -int snd_seq_oss_midi_close(seq_oss_devinfo_t *dp, int dev); -void snd_seq_oss_midi_reset(seq_oss_devinfo_t *dp, int dev); -int snd_seq_oss_midi_putc(seq_oss_devinfo_t *dp, int dev, unsigned char c, snd_seq_event_t *ev); -int snd_seq_oss_midi_input(snd_seq_event_t *ev, int direct, void *private); -int snd_seq_oss_midi_filemode(seq_oss_devinfo_t *dp, int dev); -int snd_seq_oss_midi_make_info(seq_oss_devinfo_t *dp, int dev, struct midi_info *inf); -void snd_seq_oss_midi_get_addr(seq_oss_devinfo_t *dp, int dev, snd_seq_addr_t *addr); +int snd_seq_oss_midi_open(struct seq_oss_devinfo *dp, int dev, int file_mode); +void snd_seq_oss_midi_open_all(struct seq_oss_devinfo *dp, int file_mode); +int snd_seq_oss_midi_close(struct seq_oss_devinfo *dp, int dev); +void snd_seq_oss_midi_reset(struct seq_oss_devinfo *dp, int dev); +int snd_seq_oss_midi_putc(struct seq_oss_devinfo *dp, int dev, unsigned char c, + struct snd_seq_event *ev); +int snd_seq_oss_midi_input(struct snd_seq_event *ev, int direct, void *private); +int snd_seq_oss_midi_filemode(struct seq_oss_devinfo *dp, int dev); +int snd_seq_oss_midi_make_info(struct seq_oss_devinfo *dp, int dev, struct midi_info *inf); +void snd_seq_oss_midi_get_addr(struct seq_oss_devinfo *dp, int dev, struct snd_seq_addr *addr); #endif diff --git a/sound/core/seq/oss/seq_oss_readq.c b/sound/core/seq/oss/seq_oss_readq.c index 0a6f2a64f69..654d17a5023 100644 --- a/sound/core/seq/oss/seq_oss_readq.c +++ b/sound/core/seq/oss/seq_oss_readq.c @@ -25,6 +25,7 @@ #include <sound/seq_oss_legacy.h> #include "../seq_lock.h" #include <linux/wait.h> +#include <linux/slab.h> /* * constants @@ -41,18 +42,18 @@ /* * create a read queue */ -seq_oss_readq_t * -snd_seq_oss_readq_new(seq_oss_devinfo_t *dp, int maxlen) +struct seq_oss_readq * +snd_seq_oss_readq_new(struct seq_oss_devinfo *dp, int maxlen) { - seq_oss_readq_t *q; + struct seq_oss_readq *q; - if ((q = kcalloc(1, sizeof(*q), GFP_KERNEL)) == NULL) { - snd_printk(KERN_ERR "can't malloc read queue\n"); + if ((q = kzalloc(sizeof(*q), GFP_KERNEL)) == NULL) { + pr_err("ALSA: seq_oss: can't malloc read queue\n"); return NULL; } - if ((q->q = kcalloc(maxlen, sizeof(evrec_t), GFP_KERNEL)) == NULL) { - snd_printk(KERN_ERR "can't malloc read queue buffer\n"); + if ((q->q = kcalloc(maxlen, sizeof(union evrec), GFP_KERNEL)) == NULL) { + pr_err("ALSA: seq_oss: can't malloc read queue buffer\n"); kfree(q); return NULL; } @@ -72,7 +73,7 @@ snd_seq_oss_readq_new(seq_oss_devinfo_t *dp, int maxlen) * delete the read queue */ void -snd_seq_oss_readq_delete(seq_oss_readq_t *q) +snd_seq_oss_readq_delete(struct seq_oss_readq *q) { if (q) { kfree(q->q); @@ -84,7 +85,7 @@ snd_seq_oss_readq_delete(seq_oss_readq_t *q) * reset the read queue */ void -snd_seq_oss_readq_clear(seq_oss_readq_t *q) +snd_seq_oss_readq_clear(struct seq_oss_readq *q) { if (q->qlen) { q->qlen = 0; @@ -100,9 +101,9 @@ snd_seq_oss_readq_clear(seq_oss_readq_t *q) * put a midi byte */ int -snd_seq_oss_readq_puts(seq_oss_readq_t *q, int dev, unsigned char *data, int len) +snd_seq_oss_readq_puts(struct seq_oss_readq *q, int dev, unsigned char *data, int len) { - evrec_t rec; + union evrec rec; int result; memset(&rec, 0, sizeof(rec)); @@ -123,7 +124,7 @@ snd_seq_oss_readq_puts(seq_oss_readq_t *q, int dev, unsigned char *data, int len * return zero if enqueued */ int -snd_seq_oss_readq_put_event(seq_oss_readq_t *q, evrec_t *ev) +snd_seq_oss_readq_put_event(struct seq_oss_readq *q, union evrec *ev) { unsigned long flags; @@ -152,7 +153,7 @@ snd_seq_oss_readq_put_event(seq_oss_readq_t *q, evrec_t *ev) * caller must hold lock */ int -snd_seq_oss_readq_pick(seq_oss_readq_t *q, evrec_t *rec) +snd_seq_oss_readq_pick(struct seq_oss_readq *q, union evrec *rec) { if (q->qlen == 0) return -EAGAIN; @@ -164,7 +165,7 @@ snd_seq_oss_readq_pick(seq_oss_readq_t *q, evrec_t *rec) * sleep until ready */ void -snd_seq_oss_readq_wait(seq_oss_readq_t *q) +snd_seq_oss_readq_wait(struct seq_oss_readq *q) { wait_event_interruptible_timeout(q->midi_sleep, (q->qlen > 0 || q->head == q->tail), @@ -176,7 +177,7 @@ snd_seq_oss_readq_wait(seq_oss_readq_t *q) * caller must hold lock */ void -snd_seq_oss_readq_free(seq_oss_readq_t *q) +snd_seq_oss_readq_free(struct seq_oss_readq *q) { if (q->qlen > 0) { q->head = (q->head + 1) % q->maxlen; @@ -189,7 +190,7 @@ snd_seq_oss_readq_free(seq_oss_readq_t *q) * return non-zero if readq is not empty. */ unsigned int -snd_seq_oss_readq_poll(seq_oss_readq_t *q, struct file *file, poll_table *wait) +snd_seq_oss_readq_poll(struct seq_oss_readq *q, struct file *file, poll_table *wait) { poll_wait(file, &q->midi_sleep, wait); return q->qlen; @@ -199,10 +200,10 @@ snd_seq_oss_readq_poll(seq_oss_readq_t *q, struct file *file, poll_table *wait) * put a timestamp */ int -snd_seq_oss_readq_put_timestamp(seq_oss_readq_t *q, unsigned long curt, int seq_mode) +snd_seq_oss_readq_put_timestamp(struct seq_oss_readq *q, unsigned long curt, int seq_mode) { if (curt != q->input_time) { - evrec_t rec; + union evrec rec; memset(&rec, 0, sizeof(rec)); switch (seq_mode) { case SNDRV_SEQ_OSS_MODE_SYNTH: @@ -222,13 +223,15 @@ snd_seq_oss_readq_put_timestamp(seq_oss_readq_t *q, unsigned long curt, int seq_ } +#ifdef CONFIG_PROC_FS /* * proc interface */ void -snd_seq_oss_readq_info_read(seq_oss_readq_t *q, snd_info_buffer_t *buf) +snd_seq_oss_readq_info_read(struct seq_oss_readq *q, struct snd_info_buffer *buf) { snd_iprintf(buf, " read queue [%s] length = %d : tick = %ld\n", (waitqueue_active(&q->midi_sleep) ? "sleeping":"running"), q->qlen, q->input_time); } +#endif /* CONFIG_PROC_FS */ diff --git a/sound/core/seq/oss/seq_oss_readq.h b/sound/core/seq/oss/seq_oss_readq.h index 303b9298f20..f1463f1f449 100644 --- a/sound/core/seq/oss/seq_oss_readq.h +++ b/sound/core/seq/oss/seq_oss_readq.h @@ -28,8 +28,8 @@ /* * definition of read queue */ -struct seq_oss_readq_t { - evrec_t *q; +struct seq_oss_readq { + union evrec *q; int qlen; int maxlen; int head, tail; @@ -39,16 +39,16 @@ struct seq_oss_readq_t { spinlock_t lock; }; -seq_oss_readq_t *snd_seq_oss_readq_new(seq_oss_devinfo_t *dp, int maxlen); -void snd_seq_oss_readq_delete(seq_oss_readq_t *q); -void snd_seq_oss_readq_clear(seq_oss_readq_t *readq); -unsigned int snd_seq_oss_readq_poll(seq_oss_readq_t *readq, struct file *file, poll_table *wait); -int snd_seq_oss_readq_puts(seq_oss_readq_t *readq, int dev, unsigned char *data, int len); -int snd_seq_oss_readq_put_event(seq_oss_readq_t *readq, evrec_t *ev); -int snd_seq_oss_readq_put_timestamp(seq_oss_readq_t *readq, unsigned long curt, int seq_mode); -int snd_seq_oss_readq_pick(seq_oss_readq_t *q, evrec_t *rec); -void snd_seq_oss_readq_wait(seq_oss_readq_t *q); -void snd_seq_oss_readq_free(seq_oss_readq_t *q); +struct seq_oss_readq *snd_seq_oss_readq_new(struct seq_oss_devinfo *dp, int maxlen); +void snd_seq_oss_readq_delete(struct seq_oss_readq *q); +void snd_seq_oss_readq_clear(struct seq_oss_readq *readq); +unsigned int snd_seq_oss_readq_poll(struct seq_oss_readq *readq, struct file *file, poll_table *wait); +int snd_seq_oss_readq_puts(struct seq_oss_readq *readq, int dev, unsigned char *data, int len); +int snd_seq_oss_readq_put_event(struct seq_oss_readq *readq, union evrec *ev); +int snd_seq_oss_readq_put_timestamp(struct seq_oss_readq *readq, unsigned long curt, int seq_mode); +int snd_seq_oss_readq_pick(struct seq_oss_readq *q, union evrec *rec); +void snd_seq_oss_readq_wait(struct seq_oss_readq *q); +void snd_seq_oss_readq_free(struct seq_oss_readq *q); #define snd_seq_oss_readq_lock(q, flags) spin_lock_irqsave(&(q)->lock, flags) #define snd_seq_oss_readq_unlock(q, flags) spin_unlock_irqrestore(&(q)->lock, flags) diff --git a/sound/core/seq/oss/seq_oss_rw.c b/sound/core/seq/oss/seq_oss_rw.c index 1d8fbd22e3e..6a7b6aceeca 100644 --- a/sound/core/seq/oss/seq_oss_rw.c +++ b/sound/core/seq/oss/seq_oss_rw.c @@ -33,7 +33,7 @@ /* * protoypes */ -static int insert_queue(seq_oss_devinfo_t *dp, evrec_t *rec, struct file *opt); +static int insert_queue(struct seq_oss_devinfo *dp, union evrec *rec, struct file *opt); /* @@ -41,12 +41,12 @@ static int insert_queue(seq_oss_devinfo_t *dp, evrec_t *rec, struct file *opt); */ int -snd_seq_oss_read(seq_oss_devinfo_t *dp, char __user *buf, int count) +snd_seq_oss_read(struct seq_oss_devinfo *dp, char __user *buf, int count) { - seq_oss_readq_t *readq = dp->readq; + struct seq_oss_readq *readq = dp->readq; int result = 0, err = 0; int ev_len; - evrec_t rec; + union evrec rec; unsigned long flags; if (readq == NULL || ! is_read_mode(dp->file_mode)) @@ -93,11 +93,11 @@ snd_seq_oss_read(seq_oss_devinfo_t *dp, char __user *buf, int count) */ int -snd_seq_oss_write(seq_oss_devinfo_t *dp, const char __user *buf, int count, struct file *opt) +snd_seq_oss_write(struct seq_oss_devinfo *dp, const char __user *buf, int count, struct file *opt) { int result = 0, err = 0; int ev_size, fmt; - evrec_t rec; + union evrec rec; if (! is_write_mode(dp->file_mode) || dp->writeq == NULL) return -ENXIO; @@ -161,10 +161,10 @@ snd_seq_oss_write(seq_oss_devinfo_t *dp, const char __user *buf, int count, stru * return: 0 = OK, non-zero = NG */ static int -insert_queue(seq_oss_devinfo_t *dp, evrec_t *rec, struct file *opt) +insert_queue(struct seq_oss_devinfo *dp, union evrec *rec, struct file *opt) { int rc = 0; - snd_seq_event_t event; + struct snd_seq_event event; /* if this is a timing event, process the current time */ if (snd_seq_oss_process_timer_event(dp->timer, rec)) @@ -197,7 +197,7 @@ insert_queue(seq_oss_devinfo_t *dp, evrec_t *rec, struct file *opt) */ unsigned int -snd_seq_oss_poll(seq_oss_devinfo_t *dp, struct file *file, poll_table * wait) +snd_seq_oss_poll(struct seq_oss_devinfo *dp, struct file *file, poll_table * wait) { unsigned int mask = 0; diff --git a/sound/core/seq/oss/seq_oss_synth.c b/sound/core/seq/oss/seq_oss_synth.c index 1a7736cbf3a..701feb71b70 100644 --- a/sound/core/seq/oss/seq_oss_synth.c +++ b/sound/core/seq/oss/seq_oss_synth.c @@ -24,6 +24,8 @@ #include "seq_oss_midi.h" #include "../seq_lock.h" #include <linux/init.h> +#include <linux/module.h> +#include <linux/slab.h> /* * constants @@ -37,14 +39,14 @@ */ /* sysex buffer */ -struct seq_oss_synth_sysex_t { +struct seq_oss_synth_sysex { int len; int skip; unsigned char buf[MAX_SYSEX_BUFLEN]; }; /* synth info */ -struct seq_oss_synth_t { +struct seq_oss_synth { int seq_device; /* for synth_info */ @@ -53,7 +55,7 @@ struct seq_oss_synth_t { int nr_voices; char name[SNDRV_SEQ_OSS_MAX_SYNTH_NAME]; - snd_seq_oss_callback_t oper; + struct snd_seq_oss_callback oper; int opened; @@ -66,8 +68,8 @@ struct seq_oss_synth_t { * device table */ static int max_synth_devs; -static seq_oss_synth_t *synth_devs[SNDRV_SEQ_OSS_MAX_SYNTH_DEVS]; -static seq_oss_synth_t midi_synth_dev = { +static struct seq_oss_synth *synth_devs[SNDRV_SEQ_OSS_MAX_SYNTH_DEVS]; +static struct seq_oss_synth midi_synth_dev = { -1, /* seq_device */ SYNTH_TYPE_MIDI, /* synth_type */ 0, /* synth_subtype */ @@ -80,8 +82,8 @@ static DEFINE_SPINLOCK(register_lock); /* * prototypes */ -static seq_oss_synth_t *get_synthdev(seq_oss_devinfo_t *dp, int dev); -static void reset_channels(seq_oss_synthinfo_t *info); +static struct seq_oss_synth *get_synthdev(struct seq_oss_devinfo *dp, int dev); +static void reset_channels(struct seq_oss_synthinfo *info); /* * global initialization @@ -96,15 +98,15 @@ snd_seq_oss_synth_init(void) * registration of the synth device */ int -snd_seq_oss_synth_register(snd_seq_device_t *dev) +snd_seq_oss_synth_register(struct snd_seq_device *dev) { int i; - seq_oss_synth_t *rec; - snd_seq_oss_reg_t *reg = SNDRV_SEQ_DEVICE_ARGPTR(dev); + struct seq_oss_synth *rec; + struct snd_seq_oss_reg *reg = SNDRV_SEQ_DEVICE_ARGPTR(dev); unsigned long flags; - if ((rec = kcalloc(1, sizeof(*rec), GFP_KERNEL)) == NULL) { - snd_printk(KERN_ERR "can't malloc synth info\n"); + if ((rec = kzalloc(sizeof(*rec), GFP_KERNEL)) == NULL) { + pr_err("ALSA: seq_oss: can't malloc synth info\n"); return -ENOMEM; } rec->seq_device = -1; @@ -128,7 +130,7 @@ snd_seq_oss_synth_register(snd_seq_device_t *dev) if (i >= max_synth_devs) { if (max_synth_devs >= SNDRV_SEQ_OSS_MAX_SYNTH_DEVS) { spin_unlock_irqrestore(®ister_lock, flags); - snd_printk(KERN_ERR "no more synth slot\n"); + pr_err("ALSA: seq_oss: no more synth slot\n"); kfree(rec); return -ENOMEM; } @@ -136,7 +138,6 @@ snd_seq_oss_synth_register(snd_seq_device_t *dev) } rec->seq_device = i; synth_devs[i] = rec; - debug_printk(("synth %s registered %d\n", rec->name, i)); spin_unlock_irqrestore(®ister_lock, flags); dev->driver_data = rec; #ifdef SNDRV_OSS_INFO_DEV_SYNTH @@ -148,10 +149,10 @@ snd_seq_oss_synth_register(snd_seq_device_t *dev) int -snd_seq_oss_synth_unregister(snd_seq_device_t *dev) +snd_seq_oss_synth_unregister(struct snd_seq_device *dev) { int index; - seq_oss_synth_t *rec = dev->driver_data; + struct seq_oss_synth *rec = dev->driver_data; unsigned long flags; spin_lock_irqsave(®ister_lock, flags); @@ -161,7 +162,7 @@ snd_seq_oss_synth_unregister(snd_seq_device_t *dev) } if (index >= max_synth_devs) { spin_unlock_irqrestore(®ister_lock, flags); - snd_printk(KERN_ERR "can't unregister synth\n"); + pr_err("ALSA: seq_oss: can't unregister synth\n"); return -EINVAL; } synth_devs[index] = NULL; @@ -187,10 +188,10 @@ snd_seq_oss_synth_unregister(snd_seq_device_t *dev) /* */ -static seq_oss_synth_t * +static struct seq_oss_synth * get_sdev(int dev) { - seq_oss_synth_t *rec; + struct seq_oss_synth *rec; unsigned long flags; spin_lock_irqsave(®ister_lock, flags); @@ -207,11 +208,11 @@ get_sdev(int dev) */ void -snd_seq_oss_synth_setup(seq_oss_devinfo_t *dp) +snd_seq_oss_synth_setup(struct seq_oss_devinfo *dp) { int i; - seq_oss_synth_t *rec; - seq_oss_synthinfo_t *info; + struct seq_oss_synth *rec; + struct seq_oss_synthinfo *info; dp->max_synthdev = max_synth_devs; dp->synth_opened = 0; @@ -244,12 +245,16 @@ snd_seq_oss_synth_setup(seq_oss_devinfo_t *dp) } info->nr_voices = rec->nr_voices; if (info->nr_voices > 0) { - info->ch = kcalloc(info->nr_voices, sizeof(seq_oss_chinfo_t), GFP_KERNEL); - if (!info->ch) - BUG(); + info->ch = kcalloc(info->nr_voices, sizeof(struct seq_oss_chinfo), GFP_KERNEL); + if (!info->ch) { + pr_err("ALSA: seq_oss: Cannot malloc voices\n"); + rec->oper.close(&info->arg); + module_put(rec->oper.owner); + snd_use_lock_free(&rec->use_lock); + continue; + } reset_channels(info); } - debug_printk(("synth %d assigned\n", i)); info->opened++; rec->opened++; dp->synth_opened++; @@ -263,7 +268,7 @@ snd_seq_oss_synth_setup(seq_oss_devinfo_t *dp) */ void -snd_seq_oss_synth_setup_midi(seq_oss_devinfo_t *dp) +snd_seq_oss_synth_setup_midi(struct seq_oss_devinfo *dp) { int i; @@ -271,7 +276,7 @@ snd_seq_oss_synth_setup_midi(seq_oss_devinfo_t *dp) return; for (i = 0; i < dp->max_mididev; i++) { - seq_oss_synthinfo_t *info; + struct seq_oss_synthinfo *info; info = &dp->synths[dp->max_synthdev]; if (snd_seq_oss_midi_open(dp, i, dp->file_mode) < 0) continue; @@ -297,13 +302,14 @@ snd_seq_oss_synth_setup_midi(seq_oss_devinfo_t *dp) */ void -snd_seq_oss_synth_cleanup(seq_oss_devinfo_t *dp) +snd_seq_oss_synth_cleanup(struct seq_oss_devinfo *dp) { int i; - seq_oss_synth_t *rec; - seq_oss_synthinfo_t *info; + struct seq_oss_synth *rec; + struct seq_oss_synthinfo *info; - snd_assert(dp->max_synthdev <= SNDRV_SEQ_OSS_MAX_SYNTH_DEVS, return); + if (snd_BUG_ON(dp->max_synthdev >= SNDRV_SEQ_OSS_MAX_SYNTH_DEVS)) + return; for (i = 0; i < dp->max_synthdev; i++) { info = &dp->synths[i]; if (! info->opened) @@ -318,7 +324,6 @@ snd_seq_oss_synth_cleanup(seq_oss_devinfo_t *dp) if (rec == NULL) continue; if (rec->opened > 0) { - debug_printk(("synth %d closed\n", i)); rec->oper.close(&info->arg); module_put(rec->oper.owner); rec->opened = 0; @@ -338,7 +343,7 @@ snd_seq_oss_synth_cleanup(seq_oss_devinfo_t *dp) * check if the specified device is MIDI mapped device */ static int -is_midi_dev(seq_oss_devinfo_t *dp, int dev) +is_midi_dev(struct seq_oss_devinfo *dp, int dev) { if (dev < 0 || dev >= dp->max_synthdev) return 0; @@ -350,10 +355,10 @@ is_midi_dev(seq_oss_devinfo_t *dp, int dev) /* * return synth device information pointer */ -static seq_oss_synth_t * -get_synthdev(seq_oss_devinfo_t *dp, int dev) +static struct seq_oss_synth * +get_synthdev(struct seq_oss_devinfo *dp, int dev) { - seq_oss_synth_t *rec; + struct seq_oss_synth *rec; if (dev < 0 || dev >= dp->max_synthdev) return NULL; if (! dp->synths[dev].opened) @@ -374,7 +379,7 @@ get_synthdev(seq_oss_devinfo_t *dp, int dev) * reset note and velocity on each channel. */ static void -reset_channels(seq_oss_synthinfo_t *info) +reset_channels(struct seq_oss_synthinfo *info) { int i; if (info->ch == NULL || ! info->nr_voices) @@ -392,12 +397,13 @@ reset_channels(seq_oss_synthinfo_t *info) * event to the corresponding port. */ void -snd_seq_oss_synth_reset(seq_oss_devinfo_t *dp, int dev) +snd_seq_oss_synth_reset(struct seq_oss_devinfo *dp, int dev) { - seq_oss_synth_t *rec; - seq_oss_synthinfo_t *info; + struct seq_oss_synth *rec; + struct seq_oss_synthinfo *info; - snd_assert(dev >= 0 && dev < dp->max_synthdev, return); + if (snd_BUG_ON(dev < 0 || dev >= dp->max_synthdev)) + return; info = &dp->synths[dev]; if (! info->opened) return; @@ -428,7 +434,7 @@ snd_seq_oss_synth_reset(seq_oss_devinfo_t *dp, int dev) if (rec->oper.reset) { rec->oper.reset(&info->arg); } else { - snd_seq_event_t ev; + struct snd_seq_event ev; memset(&ev, 0, sizeof(ev)); snd_seq_oss_fill_addr(dp, &ev, info->arg.addr.client, info->arg.addr.port); @@ -444,10 +450,10 @@ snd_seq_oss_synth_reset(seq_oss_devinfo_t *dp, int dev) * call load_patch callback function */ int -snd_seq_oss_synth_load_patch(seq_oss_devinfo_t *dp, int dev, int fmt, +snd_seq_oss_synth_load_patch(struct seq_oss_devinfo *dp, int dev, int fmt, const char __user *buf, int p, int c) { - seq_oss_synth_t *rec; + struct seq_oss_synth *rec; int rc; if (dev < 0 || dev >= dp->max_synthdev) @@ -470,9 +476,9 @@ snd_seq_oss_synth_load_patch(seq_oss_devinfo_t *dp, int dev, int fmt, * check if the device is valid synth device */ int -snd_seq_oss_synth_is_valid(seq_oss_devinfo_t *dp, int dev) +snd_seq_oss_synth_is_valid(struct seq_oss_devinfo *dp, int dev) { - seq_oss_synth_t *rec; + struct seq_oss_synth *rec; rec = get_synthdev(dp, dev); if (rec) { snd_use_lock_free(&rec->use_lock); @@ -488,18 +494,18 @@ snd_seq_oss_synth_is_valid(seq_oss_devinfo_t *dp, int dev) * (0xff). */ int -snd_seq_oss_synth_sysex(seq_oss_devinfo_t *dp, int dev, unsigned char *buf, snd_seq_event_t *ev) +snd_seq_oss_synth_sysex(struct seq_oss_devinfo *dp, int dev, unsigned char *buf, struct snd_seq_event *ev) { int i, send; unsigned char *dest; - seq_oss_synth_sysex_t *sysex; + struct seq_oss_synth_sysex *sysex; if (! snd_seq_oss_synth_is_valid(dp, dev)) return -ENXIO; sysex = dp->synths[dev].sysex; if (sysex == NULL) { - sysex = kcalloc(1, sizeof(*sysex), GFP_KERNEL); + sysex = kzalloc(sizeof(*sysex), GFP_KERNEL); if (sysex == NULL) return -ENOMEM; dp->synths[dev].sysex = sysex; @@ -545,7 +551,7 @@ snd_seq_oss_synth_sysex(seq_oss_devinfo_t *dp, int dev, unsigned char *buf, snd_ * fill the event source/destination addresses */ int -snd_seq_oss_synth_addr(seq_oss_devinfo_t *dp, int dev, snd_seq_event_t *ev) +snd_seq_oss_synth_addr(struct seq_oss_devinfo *dp, int dev, struct snd_seq_event *ev) { if (! snd_seq_oss_synth_is_valid(dp, dev)) return -EINVAL; @@ -559,9 +565,9 @@ snd_seq_oss_synth_addr(seq_oss_devinfo_t *dp, int dev, snd_seq_event_t *ev) * OSS compatible ioctl */ int -snd_seq_oss_synth_ioctl(seq_oss_devinfo_t *dp, int dev, unsigned int cmd, unsigned long addr) +snd_seq_oss_synth_ioctl(struct seq_oss_devinfo *dp, int dev, unsigned int cmd, unsigned long addr) { - seq_oss_synth_t *rec; + struct seq_oss_synth *rec; int rc; if (is_midi_dev(dp, dev)) @@ -581,7 +587,7 @@ snd_seq_oss_synth_ioctl(seq_oss_devinfo_t *dp, int dev, unsigned int cmd, unsign * send OSS raw events - SEQ_PRIVATE and SEQ_VOLUME */ int -snd_seq_oss_synth_raw_event(seq_oss_devinfo_t *dp, int dev, unsigned char *data, snd_seq_event_t *ev) +snd_seq_oss_synth_raw_event(struct seq_oss_devinfo *dp, int dev, unsigned char *data, struct snd_seq_event *ev) { if (! snd_seq_oss_synth_is_valid(dp, dev) || is_midi_dev(dp, dev)) return -ENXIO; @@ -595,9 +601,12 @@ snd_seq_oss_synth_raw_event(seq_oss_devinfo_t *dp, int dev, unsigned char *data, * create OSS compatible synth_info record */ int -snd_seq_oss_synth_make_info(seq_oss_devinfo_t *dp, int dev, struct synth_info *inf) +snd_seq_oss_synth_make_info(struct seq_oss_devinfo *dp, int dev, struct synth_info *inf) { - seq_oss_synth_t *rec; + struct seq_oss_synth *rec; + + if (dev < 0 || dev >= dp->max_synthdev) + return -ENXIO; if (dp->synths[dev].is_midi) { struct midi_info minf; @@ -621,14 +630,15 @@ snd_seq_oss_synth_make_info(seq_oss_devinfo_t *dp, int dev, struct synth_info *i } +#ifdef CONFIG_PROC_FS /* * proc interface */ void -snd_seq_oss_synth_info_read(snd_info_buffer_t *buf) +snd_seq_oss_synth_info_read(struct snd_info_buffer *buf) { int i; - seq_oss_synth_t *rec; + struct seq_oss_synth *rec; snd_iprintf(buf, "\nNumber of synth devices: %d\n", max_synth_devs); for (i = 0; i < max_synth_devs; i++) { @@ -648,4 +658,4 @@ snd_seq_oss_synth_info_read(snd_info_buffer_t *buf) snd_use_lock_free(&rec->use_lock); } } - +#endif /* CONFIG_PROC_FS */ diff --git a/sound/core/seq/oss/seq_oss_synth.h b/sound/core/seq/oss/seq_oss_synth.h index 07bc0e2cfb8..dbdfcbb80ea 100644 --- a/sound/core/seq/oss/seq_oss_synth.h +++ b/sound/core/seq/oss/seq_oss_synth.h @@ -27,23 +27,25 @@ #include <sound/seq_oss_legacy.h> #include <sound/seq_device.h> -typedef struct seq_oss_synth_t seq_oss_synth_t; - void snd_seq_oss_synth_init(void); -int snd_seq_oss_synth_register(snd_seq_device_t *dev); -int snd_seq_oss_synth_unregister(snd_seq_device_t *dev); -void snd_seq_oss_synth_setup(seq_oss_devinfo_t *dp); -void snd_seq_oss_synth_setup_midi(seq_oss_devinfo_t *dp); -void snd_seq_oss_synth_cleanup(seq_oss_devinfo_t *dp); +int snd_seq_oss_synth_register(struct snd_seq_device *dev); +int snd_seq_oss_synth_unregister(struct snd_seq_device *dev); +void snd_seq_oss_synth_setup(struct seq_oss_devinfo *dp); +void snd_seq_oss_synth_setup_midi(struct seq_oss_devinfo *dp); +void snd_seq_oss_synth_cleanup(struct seq_oss_devinfo *dp); -void snd_seq_oss_synth_reset(seq_oss_devinfo_t *dp, int dev); -int snd_seq_oss_synth_load_patch(seq_oss_devinfo_t *dp, int dev, int fmt, const char __user *buf, int p, int c); -int snd_seq_oss_synth_is_valid(seq_oss_devinfo_t *dp, int dev); -int snd_seq_oss_synth_sysex(seq_oss_devinfo_t *dp, int dev, unsigned char *buf, snd_seq_event_t *ev); -int snd_seq_oss_synth_addr(seq_oss_devinfo_t *dp, int dev, snd_seq_event_t *ev); -int snd_seq_oss_synth_ioctl(seq_oss_devinfo_t *dp, int dev, unsigned int cmd, unsigned long addr); -int snd_seq_oss_synth_raw_event(seq_oss_devinfo_t *dp, int dev, unsigned char *data, snd_seq_event_t *ev); +void snd_seq_oss_synth_reset(struct seq_oss_devinfo *dp, int dev); +int snd_seq_oss_synth_load_patch(struct seq_oss_devinfo *dp, int dev, int fmt, + const char __user *buf, int p, int c); +int snd_seq_oss_synth_is_valid(struct seq_oss_devinfo *dp, int dev); +int snd_seq_oss_synth_sysex(struct seq_oss_devinfo *dp, int dev, unsigned char *buf, + struct snd_seq_event *ev); +int snd_seq_oss_synth_addr(struct seq_oss_devinfo *dp, int dev, struct snd_seq_event *ev); +int snd_seq_oss_synth_ioctl(struct seq_oss_devinfo *dp, int dev, unsigned int cmd, + unsigned long addr); +int snd_seq_oss_synth_raw_event(struct seq_oss_devinfo *dp, int dev, + unsigned char *data, struct snd_seq_event *ev); -int snd_seq_oss_synth_make_info(seq_oss_devinfo_t *dp, int dev, struct synth_info *inf); +int snd_seq_oss_synth_make_info(struct seq_oss_devinfo *dp, int dev, struct synth_info *inf); #endif diff --git a/sound/core/seq/oss/seq_oss_timer.c b/sound/core/seq/oss/seq_oss_timer.c index 42ca9493fa6..4f24ea9fad9 100644 --- a/sound/core/seq/oss/seq_oss_timer.c +++ b/sound/core/seq/oss/seq_oss_timer.c @@ -23,6 +23,7 @@ #include "seq_oss_timer.h" #include "seq_oss_event.h" #include <sound/seq_oss_legacy.h> +#include <linux/slab.h> /* */ @@ -33,20 +34,20 @@ /* */ -static void calc_alsa_tempo(seq_oss_timer_t *timer); -static int send_timer_event(seq_oss_devinfo_t *dp, int type, int value); +static void calc_alsa_tempo(struct seq_oss_timer *timer); +static int send_timer_event(struct seq_oss_devinfo *dp, int type, int value); /* * create and register a new timer. * if queue is not started yet, start it. */ -seq_oss_timer_t * -snd_seq_oss_timer_new(seq_oss_devinfo_t *dp) +struct seq_oss_timer * +snd_seq_oss_timer_new(struct seq_oss_devinfo *dp) { - seq_oss_timer_t *rec; + struct seq_oss_timer *rec; - rec = kcalloc(1, sizeof(*rec), GFP_KERNEL); + rec = kzalloc(sizeof(*rec), GFP_KERNEL); if (rec == NULL) return NULL; @@ -67,7 +68,7 @@ snd_seq_oss_timer_new(seq_oss_devinfo_t *dp) * if no more timer exists, stop the queue. */ void -snd_seq_oss_timer_delete(seq_oss_timer_t *rec) +snd_seq_oss_timer_delete(struct seq_oss_timer *rec) { if (rec) { snd_seq_oss_timer_stop(rec); @@ -82,7 +83,7 @@ snd_seq_oss_timer_delete(seq_oss_timer_t *rec) * 0 : not a timer event -- enqueue this event */ int -snd_seq_oss_process_timer_event(seq_oss_timer_t *rec, evrec_t *ev) +snd_seq_oss_process_timer_event(struct seq_oss_timer *rec, union evrec *ev) { abstime_t parm = ev->t.time; @@ -125,7 +126,7 @@ snd_seq_oss_process_timer_event(seq_oss_timer_t *rec, evrec_t *ev) * convert tempo units */ static void -calc_alsa_tempo(seq_oss_timer_t *timer) +calc_alsa_tempo(struct seq_oss_timer *timer) { timer->tempo = (60 * 1000000) / timer->oss_tempo; timer->ppq = timer->oss_timebase; @@ -136,9 +137,9 @@ calc_alsa_tempo(seq_oss_timer_t *timer) * dispatch a timer event */ static int -send_timer_event(seq_oss_devinfo_t *dp, int type, int value) +send_timer_event(struct seq_oss_devinfo *dp, int type, int value) { - snd_seq_event_t ev; + struct snd_seq_event ev; memset(&ev, 0, sizeof(ev)); ev.type = type; @@ -156,10 +157,10 @@ send_timer_event(seq_oss_devinfo_t *dp, int type, int value) * set queue tempo and start queue */ int -snd_seq_oss_timer_start(seq_oss_timer_t *timer) +snd_seq_oss_timer_start(struct seq_oss_timer *timer) { - seq_oss_devinfo_t *dp = timer->dp; - snd_seq_queue_tempo_t tmprec; + struct seq_oss_devinfo *dp = timer->dp; + struct snd_seq_queue_tempo tmprec; if (timer->running) snd_seq_oss_timer_stop(timer); @@ -181,7 +182,7 @@ snd_seq_oss_timer_start(seq_oss_timer_t *timer) * stop queue */ int -snd_seq_oss_timer_stop(seq_oss_timer_t *timer) +snd_seq_oss_timer_stop(struct seq_oss_timer *timer) { if (! timer->running) return 0; @@ -195,7 +196,7 @@ snd_seq_oss_timer_stop(seq_oss_timer_t *timer) * continue queue */ int -snd_seq_oss_timer_continue(seq_oss_timer_t *timer) +snd_seq_oss_timer_continue(struct seq_oss_timer *timer) { if (timer->running) return 0; @@ -209,7 +210,7 @@ snd_seq_oss_timer_continue(seq_oss_timer_t *timer) * change queue tempo */ int -snd_seq_oss_timer_tempo(seq_oss_timer_t *timer, int value) +snd_seq_oss_timer_tempo(struct seq_oss_timer *timer, int value) { if (value < MIN_OSS_TEMPO) value = MIN_OSS_TEMPO; @@ -227,12 +228,11 @@ snd_seq_oss_timer_tempo(seq_oss_timer_t *timer, int value) * ioctls */ int -snd_seq_oss_timer_ioctl(seq_oss_timer_t *timer, unsigned int cmd, int __user *arg) +snd_seq_oss_timer_ioctl(struct seq_oss_timer *timer, unsigned int cmd, int __user *arg) { int value; if (cmd == SNDCTL_SEQ_CTRLRATE) { - debug_printk(("ctrl rate\n")); /* if *arg == 0, just return the current rate */ if (get_user(value, arg)) return -EFAULT; @@ -247,21 +247,16 @@ snd_seq_oss_timer_ioctl(seq_oss_timer_t *timer, unsigned int cmd, int __user *ar switch (cmd) { case SNDCTL_TMR_START: - debug_printk(("timer start\n")); return snd_seq_oss_timer_start(timer); case SNDCTL_TMR_STOP: - debug_printk(("timer stop\n")); return snd_seq_oss_timer_stop(timer); case SNDCTL_TMR_CONTINUE: - debug_printk(("timer continue\n")); return snd_seq_oss_timer_continue(timer); case SNDCTL_TMR_TEMPO: - debug_printk(("timer tempo\n")); if (get_user(value, arg)) return -EFAULT; return snd_seq_oss_timer_tempo(timer, value); case SNDCTL_TMR_TIMEBASE: - debug_printk(("timer timebase\n")); if (get_user(value, arg)) return -EFAULT; if (value < MIN_OSS_TIMEBASE) @@ -275,7 +270,6 @@ snd_seq_oss_timer_ioctl(seq_oss_timer_t *timer, unsigned int cmd, int __user *ar case SNDCTL_TMR_METRONOME: case SNDCTL_TMR_SELECT: case SNDCTL_TMR_SOURCE: - debug_printk(("timer XXX\n")); /* not supported */ return 0; } diff --git a/sound/core/seq/oss/seq_oss_timer.h b/sound/core/seq/oss/seq_oss_timer.h index 6e4dbd8504c..b995bd68ad1 100644 --- a/sound/core/seq/oss/seq_oss_timer.h +++ b/sound/core/seq/oss/seq_oss_timer.h @@ -27,8 +27,8 @@ /* * timer information definition */ -struct seq_oss_timer_t { - seq_oss_devinfo_t *dp; +struct seq_oss_timer { + struct seq_oss_devinfo *dp; reltime_t cur_tick; int realtime; int running; @@ -37,22 +37,22 @@ struct seq_oss_timer_t { }; -seq_oss_timer_t *snd_seq_oss_timer_new(seq_oss_devinfo_t *dp); -void snd_seq_oss_timer_delete(seq_oss_timer_t *dp); +struct seq_oss_timer *snd_seq_oss_timer_new(struct seq_oss_devinfo *dp); +void snd_seq_oss_timer_delete(struct seq_oss_timer *dp); -int snd_seq_oss_timer_start(seq_oss_timer_t *timer); -int snd_seq_oss_timer_stop(seq_oss_timer_t *timer); -int snd_seq_oss_timer_continue(seq_oss_timer_t *timer); -int snd_seq_oss_timer_tempo(seq_oss_timer_t *timer, int value); +int snd_seq_oss_timer_start(struct seq_oss_timer *timer); +int snd_seq_oss_timer_stop(struct seq_oss_timer *timer); +int snd_seq_oss_timer_continue(struct seq_oss_timer *timer); +int snd_seq_oss_timer_tempo(struct seq_oss_timer *timer, int value); #define snd_seq_oss_timer_reset snd_seq_oss_timer_start -int snd_seq_oss_timer_ioctl(seq_oss_timer_t *timer, unsigned int cmd, int __user *arg); +int snd_seq_oss_timer_ioctl(struct seq_oss_timer *timer, unsigned int cmd, int __user *arg); /* * get current processed time */ static inline abstime_t -snd_seq_oss_timer_cur_tick(seq_oss_timer_t *timer) +snd_seq_oss_timer_cur_tick(struct seq_oss_timer *timer) { return timer->cur_tick; } @@ -62,7 +62,7 @@ snd_seq_oss_timer_cur_tick(seq_oss_timer_t *timer) * is realtime event? */ static inline int -snd_seq_oss_timer_is_realtime(seq_oss_timer_t *timer) +snd_seq_oss_timer_is_realtime(struct seq_oss_timer *timer) { return timer->realtime; } diff --git a/sound/core/seq/oss/seq_oss_writeq.c b/sound/core/seq/oss/seq_oss_writeq.c index 87f85f7ee81..d50338bbc21 100644 --- a/sound/core/seq/oss/seq_oss_writeq.c +++ b/sound/core/seq/oss/seq_oss_writeq.c @@ -27,18 +27,19 @@ #include "../seq_lock.h" #include "../seq_clientmgr.h" #include <linux/wait.h> +#include <linux/slab.h> /* * create a write queue record */ -seq_oss_writeq_t * -snd_seq_oss_writeq_new(seq_oss_devinfo_t *dp, int maxlen) +struct seq_oss_writeq * +snd_seq_oss_writeq_new(struct seq_oss_devinfo *dp, int maxlen) { - seq_oss_writeq_t *q; - snd_seq_client_pool_t pool; + struct seq_oss_writeq *q; + struct snd_seq_client_pool pool; - if ((q = kcalloc(1, sizeof(*q), GFP_KERNEL)) == NULL) + if ((q = kzalloc(sizeof(*q), GFP_KERNEL)) == NULL) return NULL; q->dp = dp; q->maxlen = maxlen; @@ -61,10 +62,12 @@ snd_seq_oss_writeq_new(seq_oss_devinfo_t *dp, int maxlen) * delete the write queue */ void -snd_seq_oss_writeq_delete(seq_oss_writeq_t *q) +snd_seq_oss_writeq_delete(struct seq_oss_writeq *q) { - snd_seq_oss_writeq_clear(q); /* to be sure */ - kfree(q); + if (q) { + snd_seq_oss_writeq_clear(q); /* to be sure */ + kfree(q); + } } @@ -72,9 +75,9 @@ snd_seq_oss_writeq_delete(seq_oss_writeq_t *q) * reset the write queue */ void -snd_seq_oss_writeq_clear(seq_oss_writeq_t *q) +snd_seq_oss_writeq_clear(struct seq_oss_writeq *q) { - snd_seq_remove_events_t reset; + struct snd_seq_remove_events reset; memset(&reset, 0, sizeof(reset)); reset.remove_mode = SNDRV_SEQ_REMOVE_OUTPUT; /* remove all */ @@ -88,9 +91,9 @@ snd_seq_oss_writeq_clear(seq_oss_writeq_t *q) * wait until the write buffer has enough room */ int -snd_seq_oss_writeq_sync(seq_oss_writeq_t *q) +snd_seq_oss_writeq_sync(struct seq_oss_writeq *q) { - seq_oss_devinfo_t *dp = q->dp; + struct seq_oss_devinfo *dp = q->dp; abstime_t time; time = snd_seq_oss_timer_cur_tick(dp->timer); @@ -98,8 +101,8 @@ snd_seq_oss_writeq_sync(seq_oss_writeq_t *q) return 0; /* already finished */ if (! q->sync_event_put) { - snd_seq_event_t ev; - evrec_t *rec; + struct snd_seq_event ev; + union evrec *rec; /* put echoback event */ memset(&ev, 0, sizeof(ev)); @@ -108,7 +111,7 @@ snd_seq_oss_writeq_sync(seq_oss_writeq_t *q) ev.time.tick = time; /* echo back to itself */ snd_seq_oss_fill_addr(dp, &ev, dp->addr.client, dp->addr.port); - rec = (evrec_t*)&ev.data; + rec = (union evrec *)&ev.data; rec->t.code = SEQ_SYNCTIMER; rec->t.time = time; q->sync_event_put = 1; @@ -128,7 +131,7 @@ snd_seq_oss_writeq_sync(seq_oss_writeq_t *q) * wake up sync - echo event was catched */ void -snd_seq_oss_writeq_wakeup(seq_oss_writeq_t *q, abstime_t time) +snd_seq_oss_writeq_wakeup(struct seq_oss_writeq *q, abstime_t time) { unsigned long flags; @@ -146,9 +149,9 @@ snd_seq_oss_writeq_wakeup(seq_oss_writeq_t *q, abstime_t time) * return the unused pool size */ int -snd_seq_oss_writeq_get_free_size(seq_oss_writeq_t *q) +snd_seq_oss_writeq_get_free_size(struct seq_oss_writeq *q) { - snd_seq_client_pool_t pool; + struct snd_seq_client_pool pool; pool.client = q->dp->cseq; snd_seq_oss_control(q->dp, SNDRV_SEQ_IOCTL_GET_CLIENT_POOL, &pool); return pool.output_free; @@ -159,9 +162,9 @@ snd_seq_oss_writeq_get_free_size(seq_oss_writeq_t *q) * set output threshold size from ioctl */ void -snd_seq_oss_writeq_set_output(seq_oss_writeq_t *q, int val) +snd_seq_oss_writeq_set_output(struct seq_oss_writeq *q, int val) { - snd_seq_client_pool_t pool; + struct snd_seq_client_pool pool; pool.client = q->dp->cseq; snd_seq_oss_control(q->dp, SNDRV_SEQ_IOCTL_GET_CLIENT_POOL, &pool); pool.output_room = val; diff --git a/sound/core/seq/oss/seq_oss_writeq.h b/sound/core/seq/oss/seq_oss_writeq.h index 6a13c85e239..c469d296756 100644 --- a/sound/core/seq/oss/seq_oss_writeq.h +++ b/sound/core/seq/oss/seq_oss_writeq.h @@ -25,8 +25,8 @@ #include "seq_oss_device.h" -struct seq_oss_writeq_t { - seq_oss_devinfo_t *dp; +struct seq_oss_writeq { + struct seq_oss_devinfo *dp; int maxlen; abstime_t sync_time; int sync_event_put; @@ -38,13 +38,13 @@ struct seq_oss_writeq_t { /* * seq_oss_writeq.c */ -seq_oss_writeq_t *snd_seq_oss_writeq_new(seq_oss_devinfo_t *dp, int maxlen); -void snd_seq_oss_writeq_delete(seq_oss_writeq_t *q); -void snd_seq_oss_writeq_clear(seq_oss_writeq_t *q); -int snd_seq_oss_writeq_sync(seq_oss_writeq_t *q); -void snd_seq_oss_writeq_wakeup(seq_oss_writeq_t *q, abstime_t time); -int snd_seq_oss_writeq_get_free_size(seq_oss_writeq_t *q); -void snd_seq_oss_writeq_set_output(seq_oss_writeq_t *q, int size); +struct seq_oss_writeq *snd_seq_oss_writeq_new(struct seq_oss_devinfo *dp, int maxlen); +void snd_seq_oss_writeq_delete(struct seq_oss_writeq *q); +void snd_seq_oss_writeq_clear(struct seq_oss_writeq *q); +int snd_seq_oss_writeq_sync(struct seq_oss_writeq *q); +void snd_seq_oss_writeq_wakeup(struct seq_oss_writeq *q, abstime_t time); +int snd_seq_oss_writeq_get_free_size(struct seq_oss_writeq *q); +void snd_seq_oss_writeq_set_output(struct seq_oss_writeq *q, int size); #endif |
