File: oss_midi_mapper.c

package info (click to toggle)
oss4 4.2-build2020-4
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 16,408 kB
  • sloc: ansic: 237,053; cpp: 18,981; sh: 4,909; pascal: 3,863; asm: 1,189; makefile: 646; php: 53; xml: 46
file content (109 lines) | stat: -rw-r--r-- 2,342 bytes parent folder | download | duplicates (4)
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;
}