5 * Copyright 2006-2011 Haiku Inc. All rights reserved.
6 * Distributed under the terms of the MIT Licence.
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
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;
34 add_port_info(usbmidi_port_info
* port
)
37 acquire_sem(usbmidi_port_list_lock
);
38 port
->next
= usbmidi_port_list
;
39 usbmidi_port_list
= port
;
41 usbmidi_port_list_changed
= true;
42 release_sem(usbmidi_port_list_lock
);
47 remove_port_info(usbmidi_port_info
* port
)
50 acquire_sem(usbmidi_port_list_lock
);
51 if (usbmidi_port_list
== port
) {
52 usbmidi_port_list
= port
->next
;
54 usbmidi_port_list_changed
= true;
57 for (d
= usbmidi_port_list
; d
!= NULL
; d
= d
->next
) {
58 if (d
->next
== port
) {
61 usbmidi_port_list_changed
= true;
67 release_sem(usbmidi_port_list_lock
);
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)
81 release_sem(usbmidi_port_list_lock
);
87 find_free_device_number(void)
89 usbmidi_port_info
* port
;
92 acquire_sem(usbmidi_port_list_lock
);
94 for (port
= usbmidi_port_list
; port
!= NULL
; port
= port
->next
) {
95 if (port
->device
->devnum
== number
) {
97 break; /* try next higher */
101 release_sem(usbmidi_port_list_lock
);
111 /* dynamically generated */
112 char** usbmidi_port_names
= NULL
;
116 alloc_port_names(void)
118 assert(usbmidi_port_names
== NULL
);
119 usbmidi_port_names
= (char**)malloc(sizeof(char*)
120 * (usbmidi_port_count
+ 1));
125 free_port_names(void)
127 if (usbmidi_port_names
!= NULL
) {
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
;
138 rebuild_port_names(void)
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
);