.c => .cpp, build fix
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@41982 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -11,8 +11,8 @@ if $(TARGET_PLATFORM) != haiku {
|
|||||||
UsePrivateHeaders [ FDirName kernel util ] ;
|
UsePrivateHeaders [ FDirName kernel util ] ;
|
||||||
|
|
||||||
KernelAddon usb_midi :
|
KernelAddon usb_midi :
|
||||||
usb_midi.c
|
usb_midi.cpp
|
||||||
devlist.c
|
devlist.cpp
|
||||||
$(buffer_impl)
|
$(buffer_impl)
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -116,7 +116,8 @@ void
|
|||||||
alloc_port_names(void)
|
alloc_port_names(void)
|
||||||
{
|
{
|
||||||
assert(usbmidi_port_names == NULL);
|
assert(usbmidi_port_names == NULL);
|
||||||
usbmidi_port_names = malloc(sizeof(char*) * (usbmidi_port_count + 1));
|
usbmidi_port_names = (char**)malloc(sizeof(char*)
|
||||||
|
* (usbmidi_port_count + 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
+30
-47
@@ -38,7 +38,7 @@ create_usbmidi_port(usbmidi_device_info* devinfo,
|
|||||||
usbmidi_port_info* port = NULL;
|
usbmidi_port_info* port = NULL;
|
||||||
assert(usb != NULL && devinfo != NULL);
|
assert(usb != NULL && devinfo != NULL);
|
||||||
|
|
||||||
port = malloc(sizeof(usbmidi_port_info));
|
port = (usbmidi_port_info*)malloc(sizeof(usbmidi_port_info));
|
||||||
if (port == NULL)
|
if (port == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -88,7 +88,7 @@ create_device(const usb_device* dev, uint16 ifno)
|
|||||||
|
|
||||||
number = find_free_device_number();
|
number = find_free_device_number();
|
||||||
|
|
||||||
midiDevice = malloc(sizeof(usbmidi_device_info));
|
midiDevice = (usbmidi_device_info*)malloc(sizeof(usbmidi_device_info));
|
||||||
if (midiDevice == NULL)
|
if (midiDevice == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@@ -231,7 +231,7 @@ midi_usb_read_callback(void* cookie, status_t status,
|
|||||||
void* data, size_t actual_len)
|
void* data, size_t actual_len)
|
||||||
{
|
{
|
||||||
status_t st;
|
status_t st;
|
||||||
usbmidi_device_info* midiDevice = cookie;
|
usbmidi_device_info* midiDevice = (usbmidi_device_info*)cookie;
|
||||||
|
|
||||||
assert(cookie != NULL);
|
assert(cookie != NULL);
|
||||||
DPRINTF_DEBUG((MY_ID "midi_usb_read_callback() -- packet length %ld\n",
|
DPRINTF_DEBUG((MY_ID "midi_usb_read_callback() -- packet length %ld\n",
|
||||||
@@ -244,14 +244,13 @@ midi_usb_read_callback(void* cookie, status_t status,
|
|||||||
/* request failed */
|
/* request failed */
|
||||||
DPRINTF_DEBUG((MY_ID "bus status 0x%lx\n", status));
|
DPRINTF_DEBUG((MY_ID "bus status 0x%lx\n", status));
|
||||||
if (status == B_CANCELED || !midiDevice->active) {
|
if (status == B_CANCELED || !midiDevice->active) {
|
||||||
int cable;
|
|
||||||
/* cancelled: device is unplugged */
|
/* cancelled: device is unplugged */
|
||||||
DPRINTF_DEBUG((MY_ID "midi_usb_read_callback: cancelled"
|
DPRINTF_DEBUG((MY_ID "midi_usb_read_callback: cancelled"
|
||||||
"(status=%lx active=%d -- deleting sem_cbs\n",
|
"(status=%lx active=%d -- deleting sem_cbs\n",
|
||||||
status, midiDevice->active));
|
status, midiDevice->active));
|
||||||
|
|
||||||
// Free any read() still blocked on semaphore
|
// Free any read() still blocked on semaphore
|
||||||
for (cable = 0; cable < 16; cable++) {
|
for (int cable = 0; cable < 16; cable++) {
|
||||||
usbmidi_port_info* port = midiDevice->ports[cable];
|
usbmidi_port_info* port = midiDevice->ports[cable];
|
||||||
if (port == NULL)
|
if (port == NULL)
|
||||||
break;
|
break;
|
||||||
@@ -285,7 +284,7 @@ static void
|
|||||||
midi_usb_write_callback(void* cookie, status_t status,
|
midi_usb_write_callback(void* cookie, status_t status,
|
||||||
void* data, size_t actual_len)
|
void* data, size_t actual_len)
|
||||||
{
|
{
|
||||||
usbmidi_device_info* midiDevice = cookie;
|
usbmidi_device_info* midiDevice = (usbmidi_device_info*)cookie;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
usb_midi_event_packet* pkt = data;
|
usb_midi_event_packet* pkt = data;
|
||||||
#endif
|
#endif
|
||||||
@@ -305,31 +304,23 @@ midi_usb_write_callback(void* cookie, status_t status,
|
|||||||
static status_t
|
static status_t
|
||||||
usb_midi_added(const usb_device* dev, void** cookie)
|
usb_midi_added(const usb_device* dev, void** cookie)
|
||||||
{
|
{
|
||||||
usbmidi_device_info* midiDevice;
|
|
||||||
usbmidi_port_info* port;
|
|
||||||
const usb_device_descriptor* dev_desc;
|
|
||||||
const usb_configuration_info* conf;
|
|
||||||
const usb_interface_info* intf;
|
|
||||||
status_t status;
|
|
||||||
uint16 ifno, i;
|
|
||||||
int alt;
|
|
||||||
|
|
||||||
/* This seems overcomplicated, but endpoints can be in either order...
|
/* This seems overcomplicated, but endpoints can be in either order...
|
||||||
and could possibly have different number of connectors! */
|
and could possibly have different number of connectors! */
|
||||||
int in_cables = 0, out_cables = 0;
|
int in_cables = 0, out_cables = 0;
|
||||||
int cable_count[2] = {0, 0};
|
int cable_count[2] = {0, 0};
|
||||||
int iep = 0;
|
int iep = 0;
|
||||||
|
status_t status;
|
||||||
|
|
||||||
assert(dev != NULL && cookie != NULL);
|
assert(dev != NULL && cookie != NULL);
|
||||||
DPRINTF_INFO((MY_ID "usb_midi_added(%p, %p)\n", dev, cookie));
|
DPRINTF_INFO((MY_ID "usb_midi_added(%p, %p)\n", dev, cookie));
|
||||||
|
|
||||||
dev_desc = usb->get_device_descriptor(dev);
|
const usb_device_descriptor* dev_desc = usb->get_device_descriptor(dev);
|
||||||
|
|
||||||
DPRINTF_INFO((MY_ID "vendor ID 0x%04X, product ID 0x%04X\n",
|
DPRINTF_INFO((MY_ID "vendor ID 0x%04X, product ID 0x%04X\n",
|
||||||
dev_desc->vendor_id, dev_desc->product_id));
|
dev_desc->vendor_id, dev_desc->product_id));
|
||||||
|
|
||||||
/* check interface class */
|
/* check interface class */
|
||||||
|
const usb_configuration_info* conf;
|
||||||
if ((conf = usb->get_nth_configuration(dev, DEFAULT_CONFIGURATION))
|
if ((conf = usb->get_nth_configuration(dev, DEFAULT_CONFIGURATION))
|
||||||
== NULL) {
|
== NULL) {
|
||||||
DPRINTF_ERR((MY_ID "cannot get default configuration\n"));
|
DPRINTF_ERR((MY_ID "cannot get default configuration\n"));
|
||||||
@@ -337,6 +328,8 @@ usb_midi_added(const usb_device* dev, void** cookie)
|
|||||||
}
|
}
|
||||||
DPRINTF_INFO((MY_ID "Interface count = %ld\n", conf->interface_count));
|
DPRINTF_INFO((MY_ID "Interface count = %ld\n", conf->interface_count));
|
||||||
|
|
||||||
|
uint16 alt, ifno;
|
||||||
|
const usb_interface_info* intf;
|
||||||
for (ifno = 0; ifno < conf->interface_count; ifno++) {
|
for (ifno = 0; ifno < conf->interface_count; ifno++) {
|
||||||
int devclass, subclass, protocol;
|
int devclass, subclass, protocol;
|
||||||
|
|
||||||
@@ -366,12 +359,13 @@ got_one:
|
|||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
usbmidi_device_info* midiDevice;
|
||||||
if ((midiDevice = create_device(dev, ifno)) == NULL) {
|
if ((midiDevice = create_device(dev, ifno)) == NULL) {
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get the actual number of ports in and out */
|
/* get the actual number of ports in and out */
|
||||||
for (i = 0; i < intf->generic_count; i++) {
|
for (uint16 i = 0; i < intf->generic_count; i++) {
|
||||||
usb_generic_descriptor *generic = &intf->generic[i]->generic;
|
usb_generic_descriptor *generic = &intf->generic[i]->generic;
|
||||||
DPRINTF_DEBUG((MY_ID "descriptor %d: type %x sub %x\n",
|
DPRINTF_DEBUG((MY_ID "descriptor %d: type %x sub %x\n",
|
||||||
i, generic->descriptor_type, generic->data[0]));
|
i, generic->descriptor_type, generic->data[0]));
|
||||||
@@ -387,7 +381,7 @@ got_one:
|
|||||||
midiDevice, intf->endpoint_count));
|
midiDevice, intf->endpoint_count));
|
||||||
midiDevice->ept_in = midiDevice->ept_out = NULL;
|
midiDevice->ept_in = midiDevice->ept_out = NULL;
|
||||||
|
|
||||||
for (i = 0; i < intf->endpoint_count && i < 2; i++) {
|
for (uint16 i = 0; i < intf->endpoint_count && i < 2; i++) {
|
||||||
/* we are actually assuming max one IN, one OUT endpoint... */
|
/* we are actually assuming max one IN, one OUT endpoint... */
|
||||||
DPRINTF_INFO((MY_ID "endpoint %d = %p %s\n",
|
DPRINTF_INFO((MY_ID "endpoint %d = %p %s\n",
|
||||||
i, &intf->endpoint[i],
|
i, &intf->endpoint[i],
|
||||||
@@ -407,7 +401,8 @@ got_one:
|
|||||||
midiDevice->timestamp = system_time(); /* This never seems to be used */
|
midiDevice->timestamp = system_time(); /* This never seems to be used */
|
||||||
|
|
||||||
/* Create the actual device ports */
|
/* Create the actual device ports */
|
||||||
for (i = 0; in_cables || out_cables; i++) {
|
usbmidi_port_info* port;
|
||||||
|
for (uint16 i = 0; in_cables > 0 || out_cables > 0; i++) {
|
||||||
port = create_usbmidi_port(midiDevice, i,
|
port = create_usbmidi_port(midiDevice, i,
|
||||||
(bool)in_cables, (bool)out_cables);
|
(bool)in_cables, (bool)out_cables);
|
||||||
midiDevice->ports[i] = port;
|
midiDevice->ports[i] = port;
|
||||||
@@ -438,14 +433,13 @@ got_one:
|
|||||||
static status_t
|
static status_t
|
||||||
usb_midi_removed(void* cookie)
|
usb_midi_removed(void* cookie)
|
||||||
{
|
{
|
||||||
usbmidi_device_info* midiDevice = cookie;
|
usbmidi_device_info* midiDevice = (usbmidi_device_info*)cookie;
|
||||||
int cable;
|
|
||||||
|
|
||||||
assert(cookie != NULL);
|
assert(cookie != NULL);
|
||||||
|
|
||||||
DPRINTF_INFO((MY_ID "usb_midi_removed(%s)\n", midiDevice->name));
|
DPRINTF_INFO((MY_ID "usb_midi_removed(%s)\n", midiDevice->name));
|
||||||
midiDevice->active = false;
|
midiDevice->active = false;
|
||||||
for (cable = 0; cable < 16; cable++) {
|
for (int cable = 0; cable < 16; cable++) {
|
||||||
usbmidi_port_info* port = midiDevice->ports[cable];
|
usbmidi_port_info* port = midiDevice->ports[cable];
|
||||||
if (port == NULL)
|
if (port == NULL)
|
||||||
break;
|
break;
|
||||||
@@ -509,7 +503,7 @@ usb_midi_open(const char* name, uint32 flags,
|
|||||||
else if (!port->has_out && mode != O_WRONLY)
|
else if (!port->has_out && mode != O_WRONLY)
|
||||||
return B_PERMISSION_DENIED;
|
return B_PERMISSION_DENIED;
|
||||||
|
|
||||||
if ((cookie = malloc(sizeof(driver_cookie))) == NULL)
|
if ((cookie = (driver_cookie*)malloc(sizeof(driver_cookie))) == NULL)
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
cookie->sem_cb = create_sem(0, DRIVER_NAME "_cb");
|
cookie->sem_cb = create_sem(0, DRIVER_NAME "_cb");
|
||||||
@@ -545,13 +539,10 @@ static status_t
|
|||||||
usb_midi_read(driver_cookie* cookie, off_t position,
|
usb_midi_read(driver_cookie* cookie, off_t position,
|
||||||
void* buf, size_t* num_bytes)
|
void* buf, size_t* num_bytes)
|
||||||
{
|
{
|
||||||
status_t err = B_ERROR;
|
|
||||||
usbmidi_port_info* port;
|
|
||||||
usbmidi_device_info* midiDevice;
|
|
||||||
|
|
||||||
assert(cookie != NULL);
|
assert(cookie != NULL);
|
||||||
port = cookie->port;
|
status_t err = B_ERROR;
|
||||||
midiDevice = cookie->device;
|
usbmidi_port_info* port = cookie->port;
|
||||||
|
usbmidi_device_info* midiDevice = cookie->device;
|
||||||
|
|
||||||
if (midiDevice == NULL || !midiDevice->active)
|
if (midiDevice == NULL || !midiDevice->active)
|
||||||
return B_ERROR; /* already unplugged */
|
return B_ERROR; /* already unplugged */
|
||||||
@@ -574,7 +565,7 @@ usb_midi_read(driver_cookie* cookie, off_t position,
|
|||||||
DPRINTF_DEBUG((MY_ID "reading from ringbuffer\n"));
|
DPRINTF_DEBUG((MY_ID "reading from ringbuffer\n"));
|
||||||
acquire_sem(midiDevice->sem_lock);
|
acquire_sem(midiDevice->sem_lock);
|
||||||
/* a global semaphore -- OK, I think */
|
/* a global semaphore -- OK, I think */
|
||||||
ring_buffer_user_read(port->rbuf, buf, 1);
|
ring_buffer_user_read(port->rbuf, (uint8*)buf, 1);
|
||||||
release_sem(midiDevice->sem_lock);
|
release_sem(midiDevice->sem_lock);
|
||||||
*num_bytes = 1;
|
*num_bytes = 1;
|
||||||
DPRINTF_DEBUG((MY_ID "read byte %x -- cookie %p)\n",
|
DPRINTF_DEBUG((MY_ID "read byte %x -- cookie %p)\n",
|
||||||
@@ -611,19 +602,16 @@ static status_t
|
|||||||
usb_midi_write(driver_cookie* cookie, off_t position,
|
usb_midi_write(driver_cookie* cookie, off_t position,
|
||||||
const void* buf, size_t* num_bytes)
|
const void* buf, size_t* num_bytes)
|
||||||
{
|
{
|
||||||
usbmidi_port_info* port;
|
|
||||||
usbmidi_device_info* midiDevice;
|
|
||||||
uint8* midiseq = (uint8*)buf;
|
uint8* midiseq = (uint8*)buf;
|
||||||
uint8 midicode = midiseq[0]; /* preserved for reference */
|
uint8 midicode = midiseq[0]; /* preserved for reference */
|
||||||
status_t status;
|
status_t status;
|
||||||
size_t bytes_left = *num_bytes;
|
|
||||||
size_t buff_lim;
|
size_t buff_lim;
|
||||||
uint8 cin = ((midicode & 0xF0) == 0xF0) ? CINcode[midicode & 0x0F]
|
uint8 cin = ((midicode & 0xF0) == 0xF0) ? CINcode[midicode & 0x0F]
|
||||||
: (midicode >> 4);
|
: (midicode >> 4);
|
||||||
|
|
||||||
assert(cookie != NULL);
|
assert(cookie != NULL);
|
||||||
port = cookie->port;
|
usbmidi_port_info* port = cookie->port;
|
||||||
midiDevice = cookie->device;
|
usbmidi_device_info* midiDevice = cookie->device;
|
||||||
|
|
||||||
if (!midiDevice || !midiDevice->active)
|
if (!midiDevice || !midiDevice->active)
|
||||||
return B_ERROR; /* already unplugged */
|
return B_ERROR; /* already unplugged */
|
||||||
@@ -639,6 +627,7 @@ usb_midi_write(driver_cookie* cookie, off_t position,
|
|||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t bytes_left = *num_bytes;
|
||||||
while (bytes_left) {
|
while (bytes_left) {
|
||||||
size_t xfer_bytes = (bytes_left < buff_lim) ? bytes_left : buff_lim;
|
size_t xfer_bytes = (bytes_left < buff_lim) ? bytes_left : buff_lim;
|
||||||
usb_midi_event_packet* pkt = midiDevice->out_buffer;
|
usb_midi_event_packet* pkt = midiDevice->out_buffer;
|
||||||
@@ -693,13 +682,12 @@ usb_midi_control(void* cookie, uint32 iop, void* data, size_t len)
|
|||||||
static status_t
|
static status_t
|
||||||
usb_midi_close(driver_cookie* cookie)
|
usb_midi_close(driver_cookie* cookie)
|
||||||
{
|
{
|
||||||
usbmidi_port_info* port;
|
|
||||||
usbmidi_device_info* midiDevice;
|
|
||||||
|
|
||||||
assert(cookie != NULL);
|
assert(cookie != NULL);
|
||||||
delete_sem(cookie->sem_cb);
|
delete_sem(cookie->sem_cb);
|
||||||
port = cookie->port;
|
|
||||||
midiDevice = cookie->device;
|
usbmidi_port_info* port = cookie->port;
|
||||||
|
usbmidi_device_info* midiDevice = cookie->device;
|
||||||
|
|
||||||
DPRINTF_INFO((MY_ID "usb_midi_close(%p device=%p port=%p)\n",
|
DPRINTF_INFO((MY_ID "usb_midi_close(%p device=%p port=%p)\n",
|
||||||
cookie, midiDevice, port));
|
cookie, midiDevice, port));
|
||||||
|
|
||||||
@@ -719,12 +707,8 @@ usb_midi_close(driver_cookie* cookie)
|
|||||||
static status_t
|
static status_t
|
||||||
usb_midi_free(driver_cookie* cookie)
|
usb_midi_free(driver_cookie* cookie)
|
||||||
{
|
{
|
||||||
usbmidi_port_info* port; /* all only for info */
|
|
||||||
usbmidi_device_info* midiDevice;
|
|
||||||
|
|
||||||
assert(cookie != NULL);
|
assert(cookie != NULL);
|
||||||
port = cookie->port;
|
usbmidi_device_info* midiDevice = cookie->device;
|
||||||
midiDevice = cookie->device;
|
|
||||||
DPRINTF_INFO((MY_ID "usb_midi_free(%p device=%p)\n", cookie, midiDevice));
|
DPRINTF_INFO((MY_ID "usb_midi_free(%p device=%p)\n", cookie, midiDevice));
|
||||||
|
|
||||||
free(cookie);
|
free(cookie);
|
||||||
@@ -760,7 +744,6 @@ init_hardware(void)
|
|||||||
_EXPORT status_t
|
_EXPORT status_t
|
||||||
init_driver(void)
|
init_driver(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
DPRINTF_INFO((MY_ID "init_driver() version:" __DATE__ " " __TIME__ "\n"));
|
DPRINTF_INFO((MY_ID "init_driver() version:" __DATE__ " " __TIME__ "\n"));
|
||||||
|
|
||||||
if (get_module(B_USB_MODULE_NAME, (module_info**)&usb) != B_OK)
|
if (get_module(B_USB_MODULE_NAME, (module_info**)&usb) != B_OK)
|
||||||
@@ -60,8 +60,8 @@
|
|||||||
#define MY_ERR "\033[31merror:\033[m "
|
#define MY_ERR "\033[31merror:\033[m "
|
||||||
#define MY_WARN "\033[31mwarning:\033[m "
|
#define MY_WARN "\033[31mwarning:\033[m "
|
||||||
#define assert(x) \
|
#define assert(x) \
|
||||||
((x) ? 0 : dprintf(MY_ID "assertion failed at " \
|
do { if (!(x)) { dprintf(MY_ID "assertion failed at " \
|
||||||
__FILE__ ", line %d\n", __LINE__))
|
__FILE__ ", line %d\n", __LINE__); }} while (0)
|
||||||
|
|
||||||
#define DEFAULT_CONFIGURATION 0
|
#define DEFAULT_CONFIGURATION 0
|
||||||
|
|
||||||
@@ -125,7 +125,7 @@ typedef struct usbmidi_port_info
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
usb_midi.c
|
usb_midi.cpp
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern usb_module_info* usb;
|
extern usb_module_info* usb;
|
||||||
@@ -140,7 +140,7 @@ extern void remove_device(usbmidi_device_info* my_dev);
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
devlist.c
|
devlist.cpp
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extern sem_id usbmidi_port_list_lock;
|
extern sem_id usbmidi_port_list_lock;
|
||||||
|
|||||||
Reference in New Issue
Block a user