diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2013-05-03 21:08:42 +0400 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2013-05-03 21:08:42 +0400 |
commit | 1058def8e7827e56ce4a70afb4aeacb5dc44148f (patch) | |
tree | 4495d23e7b54ab5700e3839081e797c1eafe0db9 /kernel/framework/midi/oss_midi_mapper.c | |
download | oss4-upstream.tar.gz |
Imported Upstream version 4.2-build2006upstream/4.2-build2006upstream
Diffstat (limited to 'kernel/framework/midi/oss_midi_mapper.c')
-rw-r--r-- | kernel/framework/midi/oss_midi_mapper.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/kernel/framework/midi/oss_midi_mapper.c b/kernel/framework/midi/oss_midi_mapper.c new file mode 100644 index 0000000..e99d579 --- /dev/null +++ b/kernel/framework/midi/oss_midi_mapper.c @@ -0,0 +1,109 @@ +/* + * Purpose: MIDI device mapper + * + * This code is used to bind applications using /dev/mixer to the actual + * MIDI input and output ports. + */ +/* + * + * This file is part of Open Sound System. + * + * Copyright (C) 4Front Technologies 1996-2008. + * + * This this source file is released under GPL v2 license (no other versions). + * See the COPYING file included in the main directory of this source + * distribution for the license terms and conditions. + * + */ + +#include "oss_config.h" +#include "midi_core.h" + +extern oss_mutex_t midi_mutex; + +void +midi_mapper_init (oss_device_t * osdev) +{ +} + +void +midi_mapper_uninit (void) +{ +} + +int +midi_mapper_autobind (int client_dev, int mode) +{ + int dev; + oss_midi_client_t *client = oss_midi_clients[client_dev]; + + cmn_err (CE_CONT, "MIDI autobind %d\n", client_dev); + + for (dev = 0; dev < num_mididevs; dev++) + { + int err; + + if (midi_devs[dev]->open_mode) /* Busy */ + continue; + + if ((mode & OPEN_WRITE) && !(midi_devs[dev]->flags & MFLAG_OUTPUT)) + continue; + + if ((mode == OPEN_READ) && !(midi_devs[dev]->flags & MFLAG_INPUT)) + continue; + + if ((err = midi_devs[dev]->d->open (dev, client->open_mode, + oss_midi_input_byte, + oss_midi_input_buf, + oss_midi_output_intr)) < 0) + { + /* The device seems to think it's busy */ + continue; + } + + if (midi_devs[dev]->open_mode == 0) /* Not busy */ + { + + midi_devs[dev]->open_mode = mode; + client->mididev = midi_devs[dev]; + + if (mode & OPEN_READ) + { + client->mididev->in_queue = + midi_queue_alloc (client->mididev->osdev, "qread"); + if (client->mididev->in_queue == NULL) + { + cmn_err (CE_WARN, + "Failed to allocate MIDI input queue(2)\n"); + midi_devs[dev]->d->close (dev, mode); + midi_devs[dev]->open_mode = 0; + return OSS_ENOMEM; + + } + } + + if (mode & OPEN_WRITE) + { + client->mididev->out_queue = + midi_queue_alloc (client->mididev->osdev, "qwrite"); + if (client->mididev->out_queue == NULL) + { + cmn_err (CE_WARN, + "Failed to allocate MIDI output queue(2)\n"); + midi_devs[dev]->d->close (dev, mode); + midi_devs[dev]->open_mode = 0; + return OSS_ENOMEM; + + } + } + + oss_midi_set_defaults (client->mididev); + + cmn_err (CE_CONT, "Bound to %d/%s\n", dev, midi_devs[dev]->name); + return dev; + + } + } + + return OSS_EBUSY; +} |