summaryrefslogtreecommitdiff
path: root/kernel/framework/midi/oss_midi_mapper.c
blob: e99d579437569fbbe290b331a1e2711516b111c4 (plain)
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;
}