1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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;
}
|