diff options
Diffstat (limited to 'sound/oss/sequencer.c')
| -rw-r--r-- | sound/oss/sequencer.c | 34 | 
1 files changed, 16 insertions, 18 deletions
diff --git a/sound/oss/sequencer.c b/sound/oss/sequencer.c index e85789e5381..c0eea1dfe90 100644 --- a/sound/oss/sequencer.c +++ b/sound/oss/sequencer.c @@ -19,6 +19,7 @@  #include "sound_config.h"  #include "midi_ctrl.h" +#include "sleep.h"  static int      sequencer_ok;  static struct sound_timer_operations *tmr; @@ -100,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)  		{ @@ -216,8 +216,6 @@ int sequencer_write(int dev, struct file *file, const char __user *buf, int coun  	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; @@ -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) @@ -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); @@ -1646,13 +1644,13 @@ void sequencer_init(void)  {  	if (sequencer_ok)  		return; -	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");  | 
