diff options
Diffstat (limited to 'sound/oss/sequencer.c')
| -rw-r--r-- | sound/oss/sequencer.c | 73 |
1 files changed, 29 insertions, 44 deletions
diff --git a/sound/oss/sequencer.c b/sound/oss/sequencer.c index 698614226c9..c0eea1dfe90 100644 --- a/sound/oss/sequencer.c +++ b/sound/oss/sequencer.c @@ -1,5 +1,5 @@ /* - * sound/sequencer.c + * sound/oss/sequencer.c * * The sequencer personality manager. */ @@ -16,10 +16,10 @@ */ #include <linux/kmod.h> #include <linux/spinlock.h> -#define SEQUENCER_C #include "sound_config.h" #include "midi_ctrl.h" +#include "sleep.h" static int sequencer_ok; static struct sound_timer_operations *tmr; @@ -101,8 +101,7 @@ int sequencer_read(int dev, struct file *file, char __user *buf, int count) return -EAGAIN; } - interruptible_sleep_on_timeout(&midi_sleeper, - pre_event_timeout); + oss_broken_sleep_on(&midi_sleeper, pre_event_timeout); spin_lock_irqsave(&lock,flags); if (!iqlen) { @@ -157,6 +156,7 @@ void seq_copy_to_input(unsigned char *event_rec, int len) wake_up(&midi_sleeper); spin_unlock_irqrestore(&lock,flags); } +EXPORT_SYMBOL(seq_copy_to_input); static void sequencer_midi_input(int dev, unsigned char data) { @@ -206,18 +206,16 @@ void seq_input_event(unsigned char *event_rec, int len) } seq_copy_to_input(event_rec, len); } +EXPORT_SYMBOL(seq_input_event); int sequencer_write(int dev, struct file *file, const char __user *buf, int count) { unsigned char event_rec[EV_SZ], ev_code; int p = 0, c, ev_size; - int err; int mode = translate_mode(file); dev = dev >> 4; - DEB(printk("sequencer_write(dev=%d, count=%d)\n", dev, count)); - if (mode == OPEN_READ) return -EIO; @@ -241,7 +239,7 @@ int sequencer_write(int dev, struct file *file, const char __user *buf, int coun return -ENXIO; fmt = (*(short *) &event_rec[0]) & 0xffff; - err = synth_devs[dev]->load_patch(dev, fmt, buf, p + 4, c, 0); + err = synth_devs[dev]->load_patch(dev, fmt, buf + p, c, 0); if (err < 0) return err; @@ -284,7 +282,7 @@ int sequencer_write(int dev, struct file *file, const char __user *buf, int coun { if (!midi_opened[event_rec[2]]) { - int mode; + int err, mode; int dev = event_rec[2]; if (dev >= max_mididev || midi_devs[dev]==NULL) @@ -343,7 +341,7 @@ static int seq_queue(unsigned char *note, char nonblock) /* * Sleep until there is enough space on the queue */ - interruptible_sleep_on(&seq_sleeper); + oss_broken_sleep_on(&seq_sleeper, MAX_SCHEDULE_TIMEOUT); } if (qlen >= SEQ_MAX_QUEUE) { @@ -545,6 +543,9 @@ static void seq_chn_common_event(unsigned char *event_rec) case MIDI_PGM_CHANGE: if (seq_mode == SEQ_2) { + if (chn > 15) + break; + synth_devs[dev]->chn_info[chn].pgm_num = p1; if ((int) dev >= num_synths) synth_devs[dev]->set_instr(dev, chn, p1); @@ -596,6 +597,9 @@ static void seq_chn_common_event(unsigned char *event_rec) case MIDI_PITCH_BEND: if (seq_mode == SEQ_2) { + if (chn > 15) + break; + synth_devs[dev]->chn_info[chn].bender_value = w14; if ((int) dev < num_synths) @@ -709,11 +713,11 @@ static void seq_local_event(unsigned char *event_rec) static void seq_sysex_message(unsigned char *event_rec) { - int dev = event_rec[1]; + unsigned int dev = event_rec[1]; int i, l = 0; unsigned char *buf = &event_rec[2]; - if ((int) dev > max_synthdev) + if (dev > max_synthdev) return; if (!(synth_open_mask & (1 << dev))) return; @@ -953,8 +957,6 @@ int sequencer_open(int dev, struct file *file) dev = dev >> 4; mode = translate_mode(file); - DEB(printk("sequencer_open(dev=%d)\n", dev)); - if (!sequencer_ok) { /* printk("Sound card: sequencer not initialized\n");*/ @@ -1116,8 +1118,7 @@ static void seq_drain_midi_queues(void) */ if (n) - interruptible_sleep_on_timeout(&seq_sleeper, - HZ/10); + oss_broken_sleep_on(&seq_sleeper, HZ/10); } } @@ -1128,8 +1129,6 @@ void sequencer_release(int dev, struct file *file) dev = dev >> 4; - DEB(printk("sequencer_release(dev=%d)\n", dev)); - /* * Wait until the queue is empty (if we don't have nonblock) */ @@ -1139,8 +1138,7 @@ void sequencer_release(int dev, struct file *file) while (!signal_pending(current) && qlen > 0) { seq_sync(); - interruptible_sleep_on_timeout(&seq_sleeper, - 3*HZ); + oss_broken_sleep_on(&seq_sleeper, 3*HZ); /* Extra delay */ } } @@ -1195,7 +1193,7 @@ static int seq_sync(void) seq_startplay(); if (qlen > 0) - interruptible_sleep_on_timeout(&seq_sleeper, HZ); + oss_broken_sleep_on(&seq_sleeper, HZ); return qlen; } @@ -1218,7 +1216,7 @@ static void midi_outc(int dev, unsigned char data) spin_lock_irqsave(&lock,flags); while (n && !midi_devs[dev]->outputc(dev, data)) { - interruptible_sleep_on_timeout(&seq_sleeper, HZ/25); + oss_broken_sleep_on(&seq_sleeper, HZ/25); n--; } spin_unlock_irqrestore(&lock,flags); @@ -1554,6 +1552,7 @@ void sequencer_timer(unsigned long dummy) { seq_startplay(); } +EXPORT_SYMBOL(sequencer_timer); int note_to_freq(int note_num) { @@ -1587,6 +1586,7 @@ int note_to_freq(int note_num) return note_freq; } +EXPORT_SYMBOL(note_to_freq); unsigned long compute_finetune(unsigned long base_freq, int bend, int range, int vibrato_cents) @@ -1629,8 +1629,6 @@ unsigned long compute_finetune(unsigned long base_freq, int bend, int range, } semitones = bend / 100; - if (semitones > 99) - semitones = 99; cents = bend % 100; amount = (int) (semitone_tuning[semitones] * multiplier * cent_tuning[cents]) / 10000; @@ -1640,26 +1638,19 @@ unsigned long compute_finetune(unsigned long base_freq, int bend, int range, else return (base_freq * amount) / 10000; /* Bend up */ } - +EXPORT_SYMBOL(compute_finetune); void sequencer_init(void) { - /* drag in sequencer_syms.o */ - { - extern char sequencer_syms_symbol; - sequencer_syms_symbol = 0; - } - if (sequencer_ok) return; - MIDIbuf_init(); - queue = (unsigned char *)vmalloc(SEQ_MAX_QUEUE * EV_SZ); + queue = vmalloc(SEQ_MAX_QUEUE * EV_SZ); if (queue == NULL) { printk(KERN_ERR "sequencer: Can't allocate memory for sequencer output queue\n"); return; } - iqueue = (unsigned char *)vmalloc(SEQ_MAX_QUEUE * IEV_SZ); + iqueue = vmalloc(SEQ_MAX_QUEUE * IEV_SZ); if (iqueue == NULL) { printk(KERN_ERR "sequencer: Can't allocate memory for sequencer input queue\n"); @@ -1668,17 +1659,11 @@ void sequencer_init(void) } sequencer_ok = 1; } +EXPORT_SYMBOL(sequencer_init); void sequencer_unload(void) { - if(queue) - { - vfree(queue); - queue=NULL; - } - if(iqueue) - { - vfree(iqueue); - iqueue=NULL; - } + vfree(queue); + vfree(iqueue); + queue = iqueue = NULL; } |
