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
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
] =
42 static volatile struct snd_wait midi_sleep_flag
[MAX_MIDI_DEV
] =
45 static struct wait_queue
*input_sleeper
[MAX_MIDI_DEV
] =
47 static volatile struct snd_wait input_sleep_flag
[MAX_MIDI_DEV
] =
54 unsigned char queue
[MAX_QUEUE_SIZE
];
60 * Timeout before the first ch
64 static struct midi_buf
*midi_out_buf
[MAX_MIDI_DEV
] =
66 static struct midi_buf
*midi_in_buf
[MAX_MIDI_DEV
] =
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) \
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) \
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); \
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
))
116 current
->timeout
= tl
= jiffies
+ (HZ
/ 10);
119 midi_sleep_flag
[dev
].mode
= WK_SLEEP
;
120 interruptible_sleep_on (&midi_sleeper
[dev
]);
121 if (!(midi_sleep_flag
[dev
].mode
& WK_WAKEUP
))
124 midi_sleep_flag
[dev
].mode
|= WK_TIMEOUT
;
126 midi_sleep_flag
[dev
].mode
&= ~WK_SLEEP
;
131 midi_input_intr (int dev
, unsigned char data
)
133 if (midi_in_buf
[dev
] == NULL
)
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
]);
156 midi_output_intr (int dev
)
164 midi_poll (unsigned long dummy
)
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
);
199 restore_flags (flags
);
203 MIDIbuf_open (int dev
, struct fileinfo
*file
)
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
);
224 * Interrupts disabled. Be careful
229 if ((err
= midi_devs
[dev
]->open (dev
, mode
,
230 midi_input_intr
, midi_output_intr
)) < 0)
232 restore_flags (flags
);
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
);
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
);
263 midi_out_buf
[dev
]->len
= midi_out_buf
[dev
]->head
= midi_out_buf
[dev
]->tail
= 0;
267 poll_timer
.expires
= (1) + jiffies
;
268 add_timer (&poll_timer
);
273 restore_flags (flags
);
279 MIDIbuf_release (int dev
, struct fileinfo
*file
)
285 mode
= file
->mode
& O_ACCMODE
;
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
301 while (!(current
->signal
& ~current
->blocked
) &&
302 DATA_AVAIL (midi_out_buf
[dev
]))
308 current
->timeout
= tl
= jiffies
+ (0);
311 midi_sleep_flag
[dev
].mode
= WK_SLEEP
;
312 interruptible_sleep_on (&midi_sleeper
[dev
]);
313 if (!(midi_sleep_flag
[dev
].mode
& WK_WAKEUP
))
316 midi_sleep_flag
[dev
].mode
|= WK_TIMEOUT
;
318 midi_sleep_flag
[dev
].mode
&= ~WK_SLEEP
;
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
;
334 del_timer (&poll_timer
);;
335 restore_flags (flags
);
339 MIDIbuf_write (int dev
, struct fileinfo
*file
, const snd_rw_buf
* buf
, int count
)
343 unsigned char tmp_data
;
357 n
= SPACE_AVAIL (midi_out_buf
[dev
]);
360 * No space just now. We have to sleep
368 current
->timeout
= tl
= jiffies
+ (0);
371 midi_sleep_flag
[dev
].mode
= WK_SLEEP
;
372 interruptible_sleep_on (&midi_sleeper
[dev
]);
373 if (!(midi_sleep_flag
[dev
].mode
& WK_WAKEUP
))
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
);
386 n
= SPACE_AVAIL (midi_out_buf
[dev
]);
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
);
400 restore_flags (flags
);
407 MIDIbuf_read (int dev
, struct fileinfo
*file
, snd_rw_buf
* buf
, int count
)
411 unsigned char tmp_data
;
418 if (!DATA_AVAIL (midi_in_buf
[dev
])) /*
426 if (parms
[dev
].prech_timeout
)
427 current
->timeout
= tl
= jiffies
+ (parms
[dev
].prech_timeout
);
430 input_sleep_flag
[dev
].mode
= WK_SLEEP
;
431 interruptible_sleep_on (&input_sleeper
[dev
]);
432 if (!(input_sleep_flag
[dev
].mode
& WK_WAKEUP
))
435 input_sleep_flag
[dev
].mode
|= WK_TIMEOUT
;
437 input_sleep_flag
[dev
].mode
&= ~WK_SLEEP
;
439 if ((current
->signal
& ~current
->blocked
))
441 * The user is getting restless
445 if (c
== 0 && DATA_AVAIL (midi_in_buf
[dev
])) /*
449 n
= DATA_AVAIL (midi_in_buf
[dev
]);
456 REMOVE_BYTE (midi_in_buf
[dev
], tmp_data
);
457 memcpy_tofs (&((buf
)[c
]), (char *) &tmp_data
, 1);
462 restore_flags (flags
);
468 MIDIbuf_ioctl (int dev
, struct fileinfo
*file
,
469 unsigned int cmd
, ioctl_arg arg
)
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);
480 printk ("/dev/midi%d: No coprocessor for this device\n", dev
);
488 case SNDCTL_MIDI_PRETIME
:
489 val
= (int) get_fs_long ((long *) arg
);
493 val
= (HZ
* val
) / 10;
494 parms
[dev
].prech_timeout
= val
;
495 return snd_ioctl_return ((int *) arg
, val
);
499 return midi_devs
[dev
]->ioctl (dev
, cmd
, arg
);
504 MIDIbuf_select (int dev
, struct fileinfo
*file
, int sel_type
, select_table
* wait
)
511 if (!DATA_AVAIL (midi_in_buf
[dev
]))
513 input_sleep_flag
[dev
].mode
= WK_SLEEP
;
514 select_wait (&input_sleeper
[dev
], wait
);
521 if (SPACE_AVAIL (midi_out_buf
[dev
]))
523 midi_sleep_flag
[dev
].mode
= WK_SLEEP
;
524 select_wait (&midi_sleeper
[dev
], wait
);
539 MIDIbuf_init (long mem_start
)