From 0bb683fa19ffdfbf13e40fc3940167b7ac5b6fa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Thu, 10 Nov 2005 16:45:45 +0000 Subject: [PATCH] added midi support, untested git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14831 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/drivers/audio/echo/24/Jamfile | 2 + .../kernel/drivers/audio/echo/3g/Jamfile | 2 + .../kernel/drivers/audio/echo/echo.cpp | 26 +++ src/add-ons/kernel/drivers/audio/echo/echo.h | 17 +- .../kernel/drivers/audio/echo/gals/Jamfile | 2 + .../kernel/drivers/audio/echo/midi.cpp | 152 ++++++++++++++++++ 6 files changed, 200 insertions(+), 1 deletion(-) create mode 100644 src/add-ons/kernel/drivers/audio/echo/midi.cpp diff --git a/src/add-ons/kernel/drivers/audio/echo/24/Jamfile b/src/add-ons/kernel/drivers/audio/echo/24/Jamfile index ae59497dc4..4a9804abe3 100644 --- a/src/add-ons/kernel/drivers/audio/echo/24/Jamfile +++ b/src/add-ons/kernel/drivers/audio/echo/24/Jamfile @@ -46,6 +46,7 @@ KernelAddon echo24 : kernel drivers bin : kernel_cpp.cpp debug.c echo.cpp + midi.cpp multi.cpp util.c $(echo_files) @@ -68,6 +69,7 @@ SEARCH on [ FGristFiles SEARCH on [ FGristFiles debug.c echo.cpp + midi.cpp multi.cpp util.c ] = [ FDirName $(HAIKU_TOP) src add-ons kernel drivers audio echo ] ; diff --git a/src/add-ons/kernel/drivers/audio/echo/3g/Jamfile b/src/add-ons/kernel/drivers/audio/echo/3g/Jamfile index 0d95eb2b52..edb29eb095 100644 --- a/src/add-ons/kernel/drivers/audio/echo/3g/Jamfile +++ b/src/add-ons/kernel/drivers/audio/echo/3g/Jamfile @@ -39,6 +39,7 @@ KernelAddon echo3g : kernel drivers bin : kernel_cpp.cpp debug.c echo.cpp + midi.cpp multi.cpp util.c $(echo_files) @@ -61,6 +62,7 @@ SEARCH on [ FGristFiles SEARCH on [ FGristFiles debug.c echo.cpp + midi.cpp multi.cpp util.c ] = [ FDirName $(HAIKU_TOP) src add-ons kernel drivers audio echo ] ; diff --git a/src/add-ons/kernel/drivers/audio/echo/echo.cpp b/src/add-ons/kernel/drivers/audio/echo/echo.cpp index 20c992de82..b24f857ed3 100644 --- a/src/add-ons/kernel/drivers/audio/echo/echo.cpp +++ b/src/add-ons/kernel/drivers/audio/echo/echo.cpp @@ -52,6 +52,9 @@ int32 num_names; char * names[NUM_CARDS*20+1]; extern device_hooks multi_hooks; +#ifdef MIDI_SUPPORT +extern device_hooks midi_hooks; +#endif int32 echo_int(void *arg); status_t init_hardware(void); @@ -380,6 +383,11 @@ int32 echo_int(void *arg) return B_UNHANDLED_INTERRUPT; } +#ifdef MIDI_SUPPORT + if (midiReceived) + release_sem(card->midi.midi_ready_sem); +#endif + LIST_FOREACH(stream, &card->streams, next) { if ((stream->state & ECHO_STATE_STARTED) == 0 || (stream->inth == NULL)) @@ -547,6 +555,11 @@ static void make_device_names( echo_dev * card) { + +#ifdef MIDI_SUPPORT + sprintf(card->midi.name, "midi/"DRIVER_NAME"/%ld", card-cards+1); + names[num_names++] = card->midi.name; +#endif sprintf(card->name, "audio/multi/"DRIVER_NAME"/%ld", card-cards+1); names[num_names++] = card->name; @@ -670,6 +683,10 @@ echo_setup(echo_dev * card) /* Init mems list */ LIST_INIT(&(card->mems)); +#ifdef MIDI_SUPPORT + card->midi.midi_ready_sem = create_sem(0, "midi sem"); +#endif + PRINT(("installing interrupt : %x\n", card->irq)); install_io_interrupt_handler(card->irq, echo_int, card, 0); @@ -701,6 +718,10 @@ echo_shutdown(echo_dev *card) PRINT(("echo_shutdown: error when CloseMixer\n")); remove_io_interrupt_handler(card->irq, echo_int, card); + +#ifdef MIDI_SUPPORT + delete_sem(card->midi.midi_ready_sem); +#endif delete card->pEG; delete card->pOSS; @@ -747,6 +768,11 @@ find_device(const char * name) PRINT(("find_device(%s)\n", name)); for (ix=0; 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) +{ + 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; + + 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; + *(PDWORD)ptr = midiData; + } + 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; + + err = card->pEG->WriteMidi(*nwritten, (PBYTE)ptr, nwritten); + return (err != ECHOSTATUS_OK) ? B_ERROR : B_OK; +} +