usb_ecm: Use the current configuration instead of a fixed one.
[haiku.git] / src / add-ons / kernel / drivers / midi / usb_midi / devlist.cpp
blobec90b50e6b0d5431f57b0c4e8d517a9ee7feb2a4
1 /*
2 * midi usb driver
3 * devlist.c
5 * Copyright 2006-2011 Haiku Inc. All rights reserved.
6 * Distributed under the terms of the MIT Licence.
8 * Authors:
9 * Jérôme Duval
10 * Pete Goodeve, pete.goodeve@computer.org
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
20 #include "usb_midi.h"
22 #include <stdlib.h>
23 #include <string.h>
26 sem_id usbmidi_port_list_lock = -1;
27 bool usbmidi_port_list_changed = true; /* added or removed */
29 static usbmidi_port_info* usbmidi_port_list = NULL;
30 static int usbmidi_port_count = 0;
33 void
34 add_port_info(usbmidi_port_info* port)
36 assert(port != NULL);
37 acquire_sem(usbmidi_port_list_lock);
38 port->next = usbmidi_port_list;
39 usbmidi_port_list = port;
40 usbmidi_port_count++;
41 usbmidi_port_list_changed = true;
42 release_sem(usbmidi_port_list_lock);
46 void
47 remove_port_info(usbmidi_port_info* port)
49 assert(port != NULL);
50 acquire_sem(usbmidi_port_list_lock);
51 if (usbmidi_port_list == port) {
52 usbmidi_port_list = port->next;
53 --usbmidi_port_count;
54 usbmidi_port_list_changed = true;
55 } else {
56 usbmidi_port_info* d;
57 for (d = usbmidi_port_list; d != NULL; d = d->next) {
58 if (d->next == port) {
59 d->next = port->next;
60 --usbmidi_port_count;
61 usbmidi_port_list_changed = true;
62 break;
65 assert(d != NULL);
67 release_sem(usbmidi_port_list_lock);
71 usbmidi_port_info*
72 search_port_info(const char* name)
74 usbmidi_port_info* port;
76 acquire_sem(usbmidi_port_list_lock);
77 for (port = usbmidi_port_list; port != NULL; port = port->next) {
78 if (strcmp(port->name, name) == 0)
79 break;
81 release_sem(usbmidi_port_list_lock);
82 return port;
86 int
87 find_free_device_number(void)
89 usbmidi_port_info* port;
90 int number = 0;
92 acquire_sem(usbmidi_port_list_lock);
93 do {
94 for (port = usbmidi_port_list; port != NULL; port = port->next) {
95 if (port->device->devnum == number) {
96 number++;
97 break; /* try next higher */
100 } while (port);
101 release_sem(usbmidi_port_list_lock);
102 return number;
108 device names
111 /* dynamically generated */
112 char** usbmidi_port_names = NULL;
115 void
116 alloc_port_names(void)
118 assert(usbmidi_port_names == NULL);
119 usbmidi_port_names = (char**)malloc(sizeof(char*)
120 * (usbmidi_port_count + 1));
124 void
125 free_port_names(void)
127 if (usbmidi_port_names != NULL) {
128 int i;
129 for (i = 0; usbmidi_port_names[i] != NULL; i++)
130 free(usbmidi_port_names[i]);
131 free(usbmidi_port_names);
132 usbmidi_port_names = NULL;
137 void
138 rebuild_port_names(void)
140 int i;
141 usbmidi_port_info* port;
143 assert(usbmidi_port_names != NULL);
144 acquire_sem(usbmidi_port_list_lock);
145 for (i = 0, port = usbmidi_port_list; port != NULL; port = port->next) {
146 usbmidi_port_names[i++] = strdup(port->name);
147 DPRINTF_INFO((MY_ID "publishing %s\n", port->name));
149 usbmidi_port_names[i] = NULL;
150 release_sem(usbmidi_port_list_lock);