1/*
2 * midi usb driver
3 * usb_midi.h
4 *
5 * Copyright 2006-2013 Haiku Inc.  All rights reserved.
6 * Distributed under the terms of the MIT Licence.
7 *
8 * Authors:
9 *		J��r��me Duval
10 *		Pete Goodeve, pete.goodeve@computer.org
11 *
12 *		Some portions of this code were originally derived from
13 *		USB Joystick driver for BeOS R5
14 *		Copyright 2000 (C) ITO, Takayuki
15 *		All rights reserved
16 *
17 */
18#ifndef _USB_MIDI_H
19#define _USB_MIDI_H
20
21
22#include <Drivers.h>
23#include <USB.h>
24#include <usb/USB_midi.h>
25
26#include <util/ring_buffer.h>
27
28/* Three levels of printout for convenience: */
29/* #define DEBUG 1 -- more convenient to define in the code file when needed */
30#define DEBUG_INFO 1
31#define DEBUG_ERR 1
32
33/* Normally leave this enabled to leave a record in syslog */
34#if DEBUG_ERR
35	#define	DPRINTF_ERR(x)	dprintf x
36#else
37	#define DPRINTF_ERR(x)
38#endif
39
40/* Use this for initialization etc. messages -- nothing repetitive: */
41#if DEBUG_INFO
42	#define	DPRINTF_INFO(x)	dprintf x
43#else
44	#define DPRINTF_INFO(x)
45#endif
46
47/* Enable this to record detailed stuff: */
48#if DEBUG
49	#define	DPRINTF_DEBUG(x)	dprintf x
50#else
51	#define DPRINTF_DEBUG(x)
52#endif
53
54/* a convenient way of suppressing some printouts: */
55#define ZDPRINTF_DEBUG(x)
56
57
58/* driver specific definitions */
59
60#define	DRIVER_NAME	"usb_midi"
61
62#define	MY_ID	"\033[34m" DRIVER_NAME ":\033[m "
63#define	MY_ERR	"\033[31merror:\033[m "
64#define	MY_WARN	"\033[31mwarning:\033[m "
65#define	assert(x) \
66	do { if (!(x)) { dprintf(MY_ID "assertion failed at " \
67	 __FILE__ ", line %d\n", __LINE__); }} while (0)
68
69#define	DEFAULT_CONFIGURATION	0
70
71struct driver_cookie;
72
73
74typedef struct usbmidi_device_info
75{
76	/* Set of actual ports ("cables" -- one or more) */
77	struct usbmidi_port_info* ports[16];
78
79	/* maintain device  (common for all ports) */
80	sem_id sem_lock;
81	sem_id sem_send;
82	area_id buffer_area;
83	usb_midi_event_packet* buffer;	/* input buffer & base of area */
84	usb_midi_event_packet* out_buffer;	/* above input buffer */
85	size_t inMaxPkt, outMaxPkt;		/* for each of in and out buffers */
86
87	const usb_device* dev;
88	uint16 ifno;
89	int devnum;	/* unique device number */
90	char name[20];
91		/* = "/dev/midi/usb/n" --port number will be appended to this */
92
93	bool active;
94
95	/* work area for transfer */
96	int bus_status;
97	int actual_length;
98	const usb_endpoint_info* ept_in;
99	const usb_endpoint_info* ept_out;
100
101	bigtime_t timestamp;	/* Is this needed? Currently set but never read */
102	uint flags;				/* set to 0 but never used */
103} usbmidi_device_info;
104
105
106typedef struct usbmidi_port_info
107{
108	/* list structure for manager */
109	struct usbmidi_port_info* next;
110
111	/* Common device that does the work */
112	usbmidi_device_info* device;
113
114	/* Port-specific variables */
115	char name[40];	/* complete pathname of this port */
116	struct ring_buffer* rbuf;
117
118	int cable;	/* index of this port */
119	bool has_in, has_out;
120
121	int open;
122	struct driver_cookie* open_fd;
123
124} usbmidi_port_info;
125
126
127/*
128 usb_midi.cpp
129*/
130
131extern usb_module_info* usb;
132extern const char* usb_midi_base_name;
133
134extern usbmidi_port_info* create_usbmidi_port(usbmidi_device_info* devinfo,
135	int cable, bool has_in, bool has_out);
136extern void remove_port(usbmidi_port_info* port);
137
138extern usbmidi_device_info* create_device(const usb_device* dev, uint16 ifno);
139extern void remove_device(usbmidi_device_info* my_dev);
140
141
142/*
143 devlist.cpp
144*/
145
146extern sem_id usbmidi_port_list_lock;
147extern bool usbmidi_port_list_changed;
148
149extern void add_port_info(usbmidi_port_info* port);
150extern void remove_port_info(usbmidi_port_info* port);
151
152extern usbmidi_port_info* search_port_info(const char* name);
153
154extern int find_free_device_number(void);
155
156extern char** usbmidi_port_names;
157
158extern void alloc_port_names(void);
159extern void free_port_names(void);
160extern void rebuild_port_names(void);
161
162#endif
163
164