#include "echo.h"
#include "debug.h"
#include "midi_driver.h"
static status_t midi_open(const char *name, uint32 flags, void **cookie);
static status_t midi_close(void *cookie);
static status_t midi_free(void *cookie);
static status_t midi_control(void *cookie, uint32 op, void *data, size_t len);
static status_t midi_read(void *cookie, off_t pos, void *data, size_t *len);
static status_t midi_write(void *cookie, off_t pos, const void *data, size_t *len);
device_hooks midi_hooks = {
&midi_open,
&midi_close,
&midi_free,
&midi_control,
&midi_read,
&midi_write,
NULL,
NULL,
NULL,
NULL
};
static status_t
midi_open(const char* name, uint32 flags, void** cookie)
{
int ix;
LOG(("midi_open()\n"));
*cookie = NULL;
for (ix=0; ix<num_cards; ix++) {
if (!strcmp(name, cards[ix].midi.name)) {
break;
}
}
if (ix >= num_cards) {
LOG(("bad device\n"));
return ENODEV;
}
*cookie = &cards[ix];
atomic_add(&cards[ix].midi.count, 1);
memset(&cards[ix].midi.context, 0, sizeof(cards[ix].midi.context));
cards[ix].pEG->OpenMidiInput(&cards[ix].midi.context);
return B_OK;
}
static status_t
midi_close(void* cookie)
{
LOG(("midi_close()\n"));
return B_OK;
}
static status_t
midi_free(void* cookie)
{
echo_dev *card = (echo_dev *) cookie;
LOG(("midi_free()\n"));
card->pEG->CloseMidiInput(&card->midi.context);
atomic_add(&card->midi.count, -1);
LOG(("midi_free() done\n"));
return B_OK;
}
static status_t
midi_control(void* cookie, uint32 iop, void* data, size_t len)
{
LOG(("midi_control()\n"));
return B_ERROR;
}
static status_t
midi_read(void* cookie, off_t pos, void* ptr, size_t* nread)
{
echo_dev *card = (echo_dev *) cookie;
ECHOSTATUS err;
DWORD midiData;
LONGLONG timestamp;
PBYTE next = (PBYTE)ptr;
LOG(("midi_read()\n"));
if (acquire_sem(card->midi.midi_ready_sem) != B_OK)
return B_ERROR;
err = card->pEG->ReadMidiByte(&card->midi.context, midiData, timestamp);
if (err == ECHOSTATUS_OK) {
*nread = 1;
*next = midiData;
LOG(("midi_read() : 0x%lx\n", *next));
return B_OK;
}
return B_ERROR;
}
static status_t
midi_write(void* cookie, off_t pos, const void* ptr, size_t* _nwritten)
{
echo_dev *card = (echo_dev *) cookie;
ECHOSTATUS err;
DWORD nwritten = *_nwritten;
LOG(("midi_write()\n"));
err = card->pEG->WriteMidi(nwritten, (PBYTE)ptr, &nwritten);
*_nwritten = nwritten;
return (err != ECHOSTATUS_OK) ? B_ERROR : B_OK;
}