Import 1.3.39
[davej-history.git] / drivers / sound / midibuf.c
blobc1618a12c1d2991bf30106978bf5ffb587dded0f
1 /*
2 * sound/midibuf.c
4 * Device file manager for /dev/midi#
6 * Copyright by Hannu Savolainen 1993
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are
10 * met: 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer. 2.
12 * Redistributions in binary form must reproduce the above copyright notice,
13 * this list of conditions and the following disclaimer in the documentation
14 * and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
20 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
30 #include "sound_config.h"
32 #if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_MIDI)
35 * Don't make MAX_QUEUE_SIZE larger than 4000
38 #define MAX_QUEUE_SIZE 4000
40 static struct wait_queue *midi_sleeper[MAX_MIDI_DEV] =
41 {NULL};
42 static volatile struct snd_wait midi_sleep_flag[MAX_MIDI_DEV] =
44 {0}};
45 static struct wait_queue *input_sleeper[MAX_MIDI_DEV] =
46 {NULL};
47 static volatile struct snd_wait input_sleep_flag[MAX_MIDI_DEV] =
49 {0}};
51 struct midi_buf
53 int len, head, tail;
54 unsigned char queue[MAX_QUEUE_SIZE];
57 struct midi_parms
59 int prech_timeout; /*
60 * Timeout before the first ch
64 static struct midi_buf *midi_out_buf[MAX_MIDI_DEV] =
65 {NULL};
66 static struct midi_buf *midi_in_buf[MAX_MIDI_DEV] =
67 {NULL};
68 static struct midi_parms parms[MAX_MIDI_DEV];
70 static void midi_poll (unsigned long dummy);
73 static struct timer_list poll_timer =
74 {NULL, NULL, 0, 0, midi_poll};
75 static volatile int open_devs = 0;
77 #define DATA_AVAIL(q) (q->len)
78 #define SPACE_AVAIL(q) (MAX_QUEUE_SIZE - q->len)
80 #define QUEUE_BYTE(q, data) \
81 if (SPACE_AVAIL(q)) \
82 { \
83 unsigned long flags; \
84 save_flags(flags);cli(); \
85 q->queue[q->tail] = (data); \
86 q->len++; q->tail = (q->tail+1) % MAX_QUEUE_SIZE; \
87 restore_flags(flags); \
90 #define REMOVE_BYTE(q, data) \
91 if (DATA_AVAIL(q)) \
92 { \
93 unsigned long flags; \
94 save_flags(flags);cli(); \
95 data = q->queue[q->head]; \
96 q->len--; q->head = (q->head+1) % MAX_QUEUE_SIZE; \
97 restore_flags(flags); \
100 void
101 drain_midi_queue (int dev)
105 * Give the Midi driver time to drain its output queues
108 if (midi_devs[dev]->buffer_status != NULL)
109 while (!(current->signal & ~current->blocked) &&
110 midi_devs[dev]->buffer_status (dev))
113 unsigned long tl;
115 if (HZ / 10)
116 current->timeout = tl = jiffies + (HZ / 10);
117 else
118 tl = 0xffffffff;
119 midi_sleep_flag[dev].mode = WK_SLEEP;
120 interruptible_sleep_on (&midi_sleeper[dev]);
121 if (!(midi_sleep_flag[dev].mode & WK_WAKEUP))
123 if (jiffies >= tl)
124 midi_sleep_flag[dev].mode |= WK_TIMEOUT;
126 midi_sleep_flag[dev].mode &= ~WK_SLEEP;
130 static void
131 midi_input_intr (int dev, unsigned char data)
133 if (midi_in_buf[dev] == NULL)
134 return;
136 if (data == 0xfe) /*
137 * Active sensing
139 return; /*
140 * Ignore
143 if (SPACE_AVAIL (midi_in_buf[dev]))
145 QUEUE_BYTE (midi_in_buf[dev], data);
146 if ((input_sleep_flag[dev].mode & WK_SLEEP))
148 input_sleep_flag[dev].mode = WK_WAKEUP;
149 wake_up (&input_sleeper[dev]);
155 static void
156 midi_output_intr (int dev)
159 * Currently NOP
163 static void
164 midi_poll (unsigned long dummy)
166 unsigned long flags;
167 int dev;
169 save_flags (flags);
170 cli ();
171 if (open_devs)
173 for (dev = 0; dev < num_midis; dev++)
174 if (midi_out_buf[dev] != NULL)
176 while (DATA_AVAIL (midi_out_buf[dev]) &&
177 midi_devs[dev]->putc (dev,
178 midi_out_buf[dev]->queue[midi_out_buf[dev]->head]))
180 midi_out_buf[dev]->head = (midi_out_buf[dev]->head + 1) % MAX_QUEUE_SIZE;
181 midi_out_buf[dev]->len--;
184 if (DATA_AVAIL (midi_out_buf[dev]) < 100 &&
185 (midi_sleep_flag[dev].mode & WK_SLEEP))
187 midi_sleep_flag[dev].mode = WK_WAKEUP;
188 wake_up (&midi_sleeper[dev]);
193 poll_timer.expires = (1) + jiffies;
194 add_timer (&poll_timer);
195 }; /*
196 * Come back later
199 restore_flags (flags);
203 MIDIbuf_open (int dev, struct fileinfo *file)
205 int mode, err;
206 unsigned long flags;
208 dev = dev >> 4;
209 mode = file->mode & O_ACCMODE;
211 if (num_midis > MAX_MIDI_DEV)
213 printk ("Sound: FATAL ERROR: Too many midi interfaces\n");
214 num_midis = MAX_MIDI_DEV;
217 if (dev < 0 || dev >= num_midis)
219 printk ("Sound: Nonexistent MIDI interface %d\n", dev);
220 return -ENXIO;
224 * Interrupts disabled. Be careful
227 save_flags (flags);
228 cli ();
229 if ((err = midi_devs[dev]->open (dev, mode,
230 midi_input_intr, midi_output_intr)) < 0)
232 restore_flags (flags);
233 return err;
236 parms[dev].prech_timeout = 0;
238 midi_sleep_flag[dev].mode = WK_NONE;
239 input_sleep_flag[dev].mode = WK_NONE;
241 midi_in_buf[dev] = (struct midi_buf *) kmalloc (sizeof (struct midi_buf), GFP_KERNEL);
243 if (midi_in_buf[dev] == NULL)
245 printk ("midi: Can't allocate buffer\n");
246 midi_devs[dev]->close (dev);
247 restore_flags (flags);
248 return -EIO;
250 midi_in_buf[dev]->len = midi_in_buf[dev]->head = midi_in_buf[dev]->tail = 0;
252 midi_out_buf[dev] = (struct midi_buf *) kmalloc (sizeof (struct midi_buf), GFP_KERNEL);
254 if (midi_out_buf[dev] == NULL)
256 printk ("midi: Can't allocate buffer\n");
257 midi_devs[dev]->close (dev);
258 kfree (midi_in_buf[dev]);
259 midi_in_buf[dev] = NULL;
260 restore_flags (flags);
261 return -EIO;
263 midi_out_buf[dev]->len = midi_out_buf[dev]->head = midi_out_buf[dev]->tail = 0;
264 if (!open_devs)
267 poll_timer.expires = (1) + jiffies;
268 add_timer (&poll_timer);
269 }; /*
270 * Come back later
272 open_devs++;
273 restore_flags (flags);
275 return err;
278 void
279 MIDIbuf_release (int dev, struct fileinfo *file)
281 int mode;
282 unsigned long flags;
284 dev = dev >> 4;
285 mode = file->mode & O_ACCMODE;
287 save_flags (flags);
288 cli ();
291 * Wait until the queue is empty
294 if (mode != OPEN_READ)
296 midi_devs[dev]->putc (dev, 0xfe); /*
297 * Active sensing to shut the
298 * devices
301 while (!(current->signal & ~current->blocked) &&
302 DATA_AVAIL (midi_out_buf[dev]))
305 unsigned long tl;
307 if (0)
308 current->timeout = tl = jiffies + (0);
309 else
310 tl = 0xffffffff;
311 midi_sleep_flag[dev].mode = WK_SLEEP;
312 interruptible_sleep_on (&midi_sleeper[dev]);
313 if (!(midi_sleep_flag[dev].mode & WK_WAKEUP))
315 if (jiffies >= tl)
316 midi_sleep_flag[dev].mode |= WK_TIMEOUT;
318 midi_sleep_flag[dev].mode &= ~WK_SLEEP;
319 }; /*
320 * Sync
323 drain_midi_queue (dev); /*
324 * Ensure the output queues are empty
328 midi_devs[dev]->close (dev);
329 kfree (midi_in_buf[dev]);
330 kfree (midi_out_buf[dev]);
331 midi_in_buf[dev] = NULL;
332 midi_out_buf[dev] = NULL;
333 open_devs--;
334 del_timer (&poll_timer);;
335 restore_flags (flags);
339 MIDIbuf_write (int dev, struct fileinfo *file, const snd_rw_buf * buf, int count)
341 unsigned long flags;
342 int c, n, i;
343 unsigned char tmp_data;
345 dev = dev >> 4;
347 if (!count)
348 return 0;
350 save_flags (flags);
351 cli ();
353 c = 0;
355 while (c < count)
357 n = SPACE_AVAIL (midi_out_buf[dev]);
359 if (n == 0) /*
360 * No space just now. We have to sleep
365 unsigned long tl;
367 if (0)
368 current->timeout = tl = jiffies + (0);
369 else
370 tl = 0xffffffff;
371 midi_sleep_flag[dev].mode = WK_SLEEP;
372 interruptible_sleep_on (&midi_sleeper[dev]);
373 if (!(midi_sleep_flag[dev].mode & WK_WAKEUP))
375 if (jiffies >= tl)
376 midi_sleep_flag[dev].mode |= WK_TIMEOUT;
378 midi_sleep_flag[dev].mode &= ~WK_SLEEP;
380 if ((current->signal & ~current->blocked))
382 restore_flags (flags);
383 return -EINTR;
386 n = SPACE_AVAIL (midi_out_buf[dev]);
389 if (n > (count - c))
390 n = count - c;
392 for (i = 0; i < n; i++)
394 memcpy_fromfs ((char *) &tmp_data, &((buf)[c]), 1);
395 QUEUE_BYTE (midi_out_buf[dev], tmp_data);
396 c++;
400 restore_flags (flags);
402 return c;
407 MIDIbuf_read (int dev, struct fileinfo *file, snd_rw_buf * buf, int count)
409 int n, c = 0;
410 unsigned long flags;
411 unsigned char tmp_data;
413 dev = dev >> 4;
415 save_flags (flags);
416 cli ();
418 if (!DATA_AVAIL (midi_in_buf[dev])) /*
419 * No data yet, wait
424 unsigned long tl;
426 if (parms[dev].prech_timeout)
427 current->timeout = tl = jiffies + (parms[dev].prech_timeout);
428 else
429 tl = 0xffffffff;
430 input_sleep_flag[dev].mode = WK_SLEEP;
431 interruptible_sleep_on (&input_sleeper[dev]);
432 if (!(input_sleep_flag[dev].mode & WK_WAKEUP))
434 if (jiffies >= tl)
435 input_sleep_flag[dev].mode |= WK_TIMEOUT;
437 input_sleep_flag[dev].mode &= ~WK_SLEEP;
439 if ((current->signal & ~current->blocked))
440 c = -EINTR; /*
441 * The user is getting restless
445 if (c == 0 && DATA_AVAIL (midi_in_buf[dev])) /*
446 * Got some bytes
449 n = DATA_AVAIL (midi_in_buf[dev]);
450 if (n > count)
451 n = count;
452 c = 0;
454 while (c < n)
456 REMOVE_BYTE (midi_in_buf[dev], tmp_data);
457 memcpy_tofs (&((buf)[c]), (char *) &tmp_data, 1);
458 c++;
462 restore_flags (flags);
464 return c;
468 MIDIbuf_ioctl (int dev, struct fileinfo *file,
469 unsigned int cmd, ioctl_arg arg)
471 int val;
473 dev = dev >> 4;
475 if (((cmd >> 8) & 0xff) == 'C')
477 if (midi_devs[dev]->coproc) /* Coprocessor ioctl */
478 return midi_devs[dev]->coproc->ioctl (midi_devs[dev]->coproc->devc, cmd, arg, 0);
479 else
480 printk ("/dev/midi%d: No coprocessor for this device\n", dev);
482 return -ENXIO;
484 else
485 switch (cmd)
488 case SNDCTL_MIDI_PRETIME:
489 val = (int) get_fs_long ((long *) arg);
490 if (val < 0)
491 val = 0;
493 val = (HZ * val) / 10;
494 parms[dev].prech_timeout = val;
495 return snd_ioctl_return ((int *) arg, val);
496 break;
498 default:
499 return midi_devs[dev]->ioctl (dev, cmd, arg);
504 MIDIbuf_select (int dev, struct fileinfo *file, int sel_type, select_table * wait)
506 dev = dev >> 4;
508 switch (sel_type)
510 case SEL_IN:
511 if (!DATA_AVAIL (midi_in_buf[dev]))
513 input_sleep_flag[dev].mode = WK_SLEEP;
514 select_wait (&input_sleeper[dev], wait);
515 return 0;
517 return 1;
518 break;
520 case SEL_OUT:
521 if (SPACE_AVAIL (midi_out_buf[dev]))
523 midi_sleep_flag[dev].mode = WK_SLEEP;
524 select_wait (&midi_sleeper[dev], wait);
525 return 0;
527 return 1;
528 break;
530 case SEL_EX:
531 return 0;
534 return 0;
538 long
539 MIDIbuf_init (long mem_start)
541 return mem_start;
544 #endif