25 #include <linux/sched.h>
26 #include <linux/slab.h>
27 #include <linux/time.h>
28 #include <linux/wait.h>
30 #include <linux/module.h>
42 #ifdef CONFIG_SND_OSSEMUL
46 MODULE_PARM_DESC(midi_map,
"Raw MIDI device number assigned to 1st OSS device.");
48 MODULE_PARM_DESC(amidi_map,
"Raw MIDI device number assigned to 2nd OSS device.");
51 static int snd_rawmidi_free(
struct snd_rawmidi *rawmidi);
64 if (rawmidi->card == card && rawmidi->device == device)
107 if ((runtime = kzalloc(
sizeof(*runtime),
GFP_KERNEL)) == NULL)
143 substream->
ops->trigger(substream, up);
150 substream->
ops->trigger(substream, up);
160 snd_rawmidi_output_trigger(substream, 0);
165 spin_unlock_irqrestore(&runtime->
lock, flags);
189 if (substream->
ops->drain)
190 substream->
ops->drain(substream);
203 snd_rawmidi_input_trigger(substream, 0);
208 spin_unlock_irqrestore(&runtime->
lock, flags);
216 int stream,
int mode,
226 if (!(rmidi->
info_flags & info_flags[stream]))
238 if (subdevice < 0 || subdevice == substream->number) {
239 *sub_ret = substream;
247 static int open_substream(
struct snd_rawmidi *rmidi,
254 err = snd_rawmidi_runtime_create(substream);
257 err = substream->
ops->open(substream);
259 snd_rawmidi_runtime_free(substream);
273 static void close_substream(
struct snd_rawmidi *rmidi,
277 static int rawmidi_open_priv(
struct snd_rawmidi *rmidi,
int subdevice,
int mode,
285 err = assign_substream(rmidi, subdevice,
292 err = assign_substream(rmidi, subdevice,
300 err = open_substream(rmidi, sinput, mode);
305 err = open_substream(rmidi, soutput, mode);
308 close_substream(rmidi, sinput, 0);
314 rfile->
input = sinput;
330 rmidi = snd_rawmidi_search(card, device);
335 if (!try_module_get(rmidi->
card->module)) {
342 err = rawmidi_open_priv(rmidi, subdevice, mode, rfile);
345 module_put(rmidi->
card->module);
349 static int snd_rawmidi_open(
struct inode *
inode,
struct file *file)
351 int maj = imajor(inode);
354 unsigned short fflags;
371 #ifdef CONFIG_SND_OSSEMUL
373 rmidi = snd_lookup_oss_minor_data(iminor(inode),
374 SNDRV_OSS_DEVICE_TYPE_MIDI);
382 if (!try_module_get(rmidi->
card->module)) {
392 fflags = snd_rawmidi_file_flags(file);
396 if (rawmidi_file == NULL) {
400 init_waitqueue_entry(&wait,
current);
413 err = rawmidi_open_priv(rmidi, subdevice, fflags, rawmidi_file);
427 if (rmidi->
card->shutdown) {
441 #ifdef CONFIG_SND_OSSEMUL
442 if (rawmidi_file->
input && rawmidi_file->
input->runtime)
444 if (rawmidi_file->
output && rawmidi_file->
output->runtime)
456 module_put(rmidi->
card->module);
461 static void close_substream(
struct snd_rawmidi *rmidi,
470 snd_rawmidi_input_trigger(substream, 0);
473 unsigned char buf = 0xfe;
480 snd_rawmidi_output_trigger(substream, 0);
483 substream->
ops->close(substream);
484 if (substream->
runtime->private_free)
485 substream->
runtime->private_free(substream);
486 snd_rawmidi_runtime_free(substream);
498 rmidi = rfile->
rmidi;
501 close_substream(rmidi, rfile->
input, 1);
505 close_substream(rmidi, rfile->
output, 1);
521 rmidi = rfile->
rmidi;
522 rawmidi_release_priv(rfile);
523 module_put(rmidi->
card->module);
527 static int snd_rawmidi_release(
struct inode *inode,
struct file *file)
534 rmidi = rfile->
rmidi;
535 rawmidi_release_priv(rfile);
537 module = rmidi->
card->module;
548 if (substream == NULL)
550 rmidi = substream->
rmidi;
551 memset(info, 0,
sizeof(*info));
562 substream->
pstr->substream_opened);
585 rmidi = snd_rawmidi_search(card, info->
device);
603 static int snd_rawmidi_info_select_user(
struct snd_card *card,
680 memset(status, 0,
sizeof(*status));
682 spin_lock_irq(&runtime->
lock);
684 spin_unlock_irq(&runtime->
lock);
693 memset(status, 0,
sizeof(*status));
695 spin_lock_irq(&runtime->
lock);
699 spin_unlock_irq(&runtime->
lock);
703 static long snd_rawmidi_ioctl(
struct file *file,
unsigned int cmd,
unsigned long arg)
709 if (((cmd >> 8) & 0xff) !=
'W')
722 return snd_rawmidi_info_user(rfile->
input, info);
724 return snd_rawmidi_info_user(rfile->
output, info);
736 if (rfile->
output == NULL)
740 if (rfile->
input == NULL)
755 if (rfile->
output == NULL)
757 err = snd_rawmidi_output_status(rfile->
output, &status);
760 if (rfile->
input == NULL)
762 err = snd_rawmidi_input_status(rfile->
input, &status);
776 if (
get_user(val, (
int __user *) argp))
780 if (rfile->
output == NULL)
790 if (
get_user(val, (
int __user *) argp))
794 if (rfile->
output == NULL)
798 if (rfile->
input == NULL)
805 #ifdef CONFIG_SND_DEBUG
813 static int snd_rawmidi_control_ioctl(
struct snd_card *card,
825 if (
get_user(device, (
int __user *)argp))
830 device = device < 0 ? 0 : device + 1;
832 if (snd_rawmidi_search(card, device))
839 if (
put_user(device, (
int __user *)argp))
847 if (
get_user(val, (
int __user *)argp))
853 return snd_rawmidi_info_select_user(card, argp);
877 if (runtime->
buffer == NULL) {
878 snd_printd(
"snd_rawmidi_receive: input is not active!!!\n");
923 else if (snd_rawmidi_ready(substream))
926 spin_unlock_irqrestore(&runtime->
lock, flags);
931 unsigned char __user *userbuf,
932 unsigned char *kernelbuf,
long count)
938 while (count > 0 && runtime->
avail) {
948 spin_unlock_irqrestore(&runtime->
lock, flags);
951 return result > 0 ? result : -
EFAULT;
958 spin_unlock_irqrestore(&runtime->
lock, flags);
966 unsigned char *
buf,
long count)
968 snd_rawmidi_input_trigger(substream, 1);
969 return snd_rawmidi_kernel_read1(substream, NULL, buf, count);
972 static ssize_t snd_rawmidi_read(
struct file *file,
char __user *
buf,
size_t count,
982 substream = rfile->
input;
983 if (substream == NULL)
986 snd_rawmidi_input_trigger(substream, 1);
989 spin_lock_irq(&runtime->
lock);
990 while (!snd_rawmidi_ready(substream)) {
993 spin_unlock_irq(&runtime->
lock);
994 return result > 0 ? result : -
EAGAIN;
996 init_waitqueue_entry(&wait,
current);
999 spin_unlock_irq(&runtime->
lock);
1002 if (rfile->
rmidi->card->shutdown)
1006 if (!runtime->
avail)
1007 return result > 0 ? result : -
EIO;
1008 spin_lock_irq(&runtime->
lock);
1010 spin_unlock_irq(&runtime->
lock);
1011 count1 = snd_rawmidi_kernel_read1(substream,
1012 (
unsigned char __user *)buf,
1016 return result > 0 ? result :
count1;
1034 unsigned long flags;
1036 if (runtime->
buffer == NULL) {
1037 snd_printd(
"snd_rawmidi_transmit_empty: output is not active!!!\n");
1042 spin_unlock_irqrestore(&runtime->
lock, flags);
1061 unsigned char *
buffer,
int count)
1063 unsigned long flags;
1067 if (runtime->
buffer == NULL) {
1068 snd_printd(
"snd_rawmidi_transmit_peek: output is not active!!!\n");
1097 spin_unlock_irqrestore(&runtime->
lock, flags);
1114 unsigned long flags;
1117 if (runtime->
buffer == NULL) {
1118 snd_printd(
"snd_rawmidi_transmit_ack: output is not active!!!\n");
1128 if (runtime->
drain || snd_rawmidi_ready(substream))
1131 spin_unlock_irqrestore(&runtime->
lock, flags);
1146 unsigned char *
buffer,
int count)
1157 const unsigned char __user *userbuf,
1158 const unsigned char *kernelbuf,
1161 unsigned long flags;
1173 if ((
long)runtime->
avail < count) {
1174 spin_unlock_irqrestore(&runtime->
lock, flags);
1178 while (count > 0 && runtime->
avail > 0) {
1182 if (count1 > (
long)runtime->
avail)
1183 count1 = runtime->
avail;
1186 kernelbuf + result, count1);
1188 spin_unlock_irqrestore(&runtime->
lock, flags);
1190 userbuf + result, count1)) {
1192 result = result > 0 ? result : -
EFAULT;
1205 spin_unlock_irqrestore(&runtime->
lock, flags);
1207 snd_rawmidi_output_trigger(substream, 1);
1212 const unsigned char *buf,
long count)
1214 return snd_rawmidi_kernel_write1(substream, NULL, buf, count);
1217 static ssize_t snd_rawmidi_write(
struct file *file,
const char __user *buf,
1218 size_t count, loff_t *offset)
1227 substream = rfile->
output;
1234 spin_lock_irq(&runtime->
lock);
1235 while (!snd_rawmidi_ready_append(substream, count)) {
1238 spin_unlock_irq(&runtime->
lock);
1239 return result > 0 ? result : -
EAGAIN;
1241 init_waitqueue_entry(&wait,
current);
1244 spin_unlock_irq(&runtime->
lock);
1247 if (rfile->
rmidi->card->shutdown)
1251 if (!runtime->
avail && !timeout)
1252 return result > 0 ? result : -
EIO;
1253 spin_lock_irq(&runtime->
lock);
1255 spin_unlock_irq(&runtime->
lock);
1256 count1 = snd_rawmidi_kernel_write1(substream, buf, NULL, count);
1258 return result > 0 ? result :
count1;
1266 spin_lock_irq(&runtime->
lock);
1269 unsigned int last_avail = runtime->
avail;
1270 init_waitqueue_entry(&wait,
current);
1273 spin_unlock_irq(&runtime->
lock);
1278 if (runtime->
avail == last_avail && !timeout)
1279 return result > 0 ? result : -
EIO;
1280 spin_lock_irq(&runtime->
lock);
1282 spin_unlock_irq(&runtime->
lock);
1287 static unsigned int snd_rawmidi_poll(
struct file *file,
poll_table * wait)
1294 if (rfile->
input != NULL) {
1295 runtime = rfile->
input->runtime;
1296 snd_rawmidi_input_trigger(rfile->
input, 1);
1297 poll_wait(file, &runtime->
sleep, wait);
1299 if (rfile->
output != NULL) {
1300 runtime = rfile->
output->runtime;
1301 poll_wait(file, &runtime->
sleep, wait);
1304 if (rfile->
input != NULL) {
1305 if (snd_rawmidi_ready(rfile->
input))
1308 if (rfile->
output != NULL) {
1309 if (snd_rawmidi_ready(rfile->
output))
1317 #ifdef CONFIG_COMPAT
1320 #define snd_rawmidi_ioctl_compat NULL
1335 snd_iprintf(buffer,
"%s\n\n", rmidi->
name);
1343 " Tx bytes : %lu\n",
1345 (
unsigned long) substream->
bytes);
1348 " Owner PID : %d\n",
1353 " Buffer size : %lu\n"
1355 runtime->
oss ?
"OSS compatible" :
"native",
1357 (
unsigned long) runtime->
avail);
1367 " Rx bytes : %lu\n",
1369 (
unsigned long) substream->
bytes);
1372 " Owner PID : %d\n",
1376 " Buffer size : %lu\n"
1378 " Overruns : %lu\n",
1380 (
unsigned long) runtime->
avail,
1381 (
unsigned long) runtime->
xruns);
1395 .read = snd_rawmidi_read,
1396 .write = snd_rawmidi_write,
1397 .open = snd_rawmidi_open,
1398 .release = snd_rawmidi_release,
1400 .poll = snd_rawmidi_poll,
1401 .unlocked_ioctl = snd_rawmidi_ioctl,
1405 static int snd_rawmidi_alloc_substreams(
struct snd_rawmidi *rmidi,
1413 for (idx = 0; idx <
count; idx++) {
1414 substream = kzalloc(
sizeof(*substream),
GFP_KERNEL);
1415 if (substream == NULL) {
1451 .dev_register = snd_rawmidi_dev_register,
1452 .dev_disconnect = snd_rawmidi_dev_disconnect,
1460 if (rmidi == NULL) {
1473 if ((err = snd_rawmidi_alloc_substreams(rmidi,
1476 input_count)) < 0) {
1477 snd_rawmidi_free(rmidi);
1480 if ((err = snd_rawmidi_alloc_substreams(rmidi,
1483 output_count)) < 0) {
1484 snd_rawmidi_free(rmidi);
1488 snd_rawmidi_free(rmidi);
1496 static void snd_rawmidi_free_substreams(
struct snd_rawmidi_str *stream)
1507 static int snd_rawmidi_free(
struct snd_rawmidi *rmidi)
1515 if (rmidi->
ops && rmidi->
ops->dev_unregister)
1516 rmidi->
ops->dev_unregister(rmidi);
1527 static int snd_rawmidi_dev_free(
struct snd_device *device)
1530 return snd_rawmidi_free(rmidi);
1533 #if defined(CONFIG_SND_SEQUENCER) || (defined(MODULE) && defined(CONFIG_SND_SEQUENCER_MODULE))
1534 static void snd_rawmidi_dev_seq_free(
struct snd_seq_device *device)
1537 rmidi->seq_dev =
NULL;
1541 static int snd_rawmidi_dev_register(
struct snd_device *device)
1551 if (snd_rawmidi_search(rmidi->
card, rmidi->
device)) {
1559 &snd_rawmidi_f_ops, rmidi, name)) < 0) {
1565 if (rmidi->
ops && rmidi->
ops->dev_register &&
1566 (err = rmidi->
ops->dev_register(rmidi)) < 0) {
1572 #ifdef CONFIG_SND_OSSEMUL
1574 if ((
int)rmidi->
device == midi_map[rmidi->
card->number]) {
1575 if (snd_register_oss_device(SNDRV_OSS_DEVICE_TYPE_MIDI,
1576 rmidi->
card, 0, &snd_rawmidi_f_ops,
1581 #ifdef SNDRV_OSS_INFO_DEV_MIDI
1582 snd_oss_info_register(SNDRV_OSS_INFO_DEV_MIDI, rmidi->
card->number, rmidi->
name);
1586 if ((
int)rmidi->
device == amidi_map[rmidi->
card->number]) {
1587 if (snd_register_oss_device(SNDRV_OSS_DEVICE_TYPE_MIDI,
1588 rmidi->
card, 1, &snd_rawmidi_f_ops,
1598 entry = snd_info_create_card_entry(rmidi->
card, name, rmidi->
card->proc_root);
1601 entry->
c.
text.read = snd_rawmidi_proc_info_read;
1602 if (snd_info_register(entry) < 0) {
1603 snd_info_free_entry(entry);
1608 #if defined(CONFIG_SND_SEQUENCER) || (defined(MODULE) && defined(CONFIG_SND_SEQUENCER_MODULE))
1609 if (!rmidi->
ops || !rmidi->
ops->dev_register) {
1612 rmidi->seq_dev->
private_free = snd_rawmidi_dev_seq_free;
1621 static int snd_rawmidi_dev_disconnect(
struct snd_device *device)
1629 list_del_init(&rmidi->
list);
1630 for (dir = 0; dir < 2; dir++) {
1638 #ifdef CONFIG_SND_OSSEMUL
1639 if (rmidi->ossreg) {
1640 if ((
int)rmidi->
device == midi_map[rmidi->
card->number]) {
1641 snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_MIDI, rmidi->
card, 0);
1642 #ifdef SNDRV_OSS_INFO_DEV_MIDI
1643 snd_oss_info_unregister(SNDRV_OSS_INFO_DEV_MIDI, rmidi->
card->number);
1646 if ((
int)rmidi->
device == amidi_map[rmidi->
card->number])
1647 snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_MIDI, rmidi->
card, 1);
1678 static int __init alsa_rawmidi_init(
void)
1683 #ifdef CONFIG_SND_OSSEMUL
1701 static void __exit alsa_rawmidi_exit(
void)