summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/emu/clifront.c2
-rw-r--r--src/osd/osdcore.c423
-rw-r--r--src/osd/osdcore.h2
-rw-r--r--src/osd/osdepend.c17
-rw-r--r--src/osd/osdepend.h7
-rw-r--r--src/osd/sdl/sdl.mak15
-rw-r--r--src/osd/sdl/sdlmain.c25
-rw-r--r--src/osd/windows/windows.mak8
8 files changed, 51 insertions, 448 deletions
diff --git a/src/emu/clifront.c b/src/emu/clifront.c
index ae9ee9e1374..a5f146bb7cf 100644
--- a/src/emu/clifront.c
+++ b/src/emu/clifront.c
@@ -780,7 +780,7 @@ void cli_frontend::listmedia(const char *gamename)
void cli_frontend::listmididevices(const char *gamename)
{
- osd_list_midi_devices();
+ m_osd.list_midi_devices();
}
diff --git a/src/osd/osdcore.c b/src/osd/osdcore.c
index 8207595d158..41214b3c852 100644
--- a/src/osd/osdcore.c
+++ b/src/osd/osdcore.c
@@ -1,6 +1,5 @@
#include "emucore.h"
#include "osdcore.h"
-#include "portmidi/portmidi.h"
bool g_print_verbose = false;
@@ -166,425 +165,3 @@ void CLIB_DECL osd_printf_log(const char *format, ...)
}
#endif
-static const int RX_EVENT_BUF_SIZE = 512;
-
-#define MIDI_SYSEX 0xf0
-#define MIDI_EOX 0xf7
-
-struct osd_midi_device
-{
- #ifndef DISABLE_MIDI
- PortMidiStream *pmStream;
- PmEvent rx_evBuf[RX_EVENT_BUF_SIZE];
- #endif
- UINT8 xmit_in[4]; // Pm_Messages mean we can at most have 3 residue bytes
- int xmit_cnt;
- UINT8 last_status;
- bool rx_sysex;
-};
-
-void osd_list_midi_devices(void)
-{
- #ifndef DISABLE_MIDI
- int num_devs = Pm_CountDevices();
- const PmDeviceInfo *pmInfo;
-
- printf("\n");
-
- if (num_devs == 0)
- {
- printf("No MIDI ports were found\n");
- return;
- }
-
- printf("MIDI input ports:\n");
- for (int i = 0; i < num_devs; i++)
- {
- pmInfo = Pm_GetDeviceInfo(i);
-
- if (pmInfo->input)
- {
- printf("%s %s\n", pmInfo->name, (i == Pm_GetDefaultInputDeviceID()) ? "(default)" : "");
- }
- }
-
- printf("\nMIDI output ports:\n");
- for (int i = 0; i < num_devs; i++)
- {
- pmInfo = Pm_GetDeviceInfo(i);
-
- if (pmInfo->output)
- {
- printf("%s %s\n", pmInfo->name, (i == Pm_GetDefaultOutputDeviceID()) ? "(default)" : "");
- }
- }
- #else
- printf("\nMIDI is not supported in this build\n");
- #endif
-}
-
-osd_midi_device *osd_open_midi_input(const char *devname)
-{
- #ifndef DISABLE_MIDI
- int num_devs = Pm_CountDevices();
- int found_dev = -1;
- const PmDeviceInfo *pmInfo;
- PortMidiStream *stm;
- osd_midi_device *ret;
-
- if (!strcmp("default", devname))
- {
- found_dev = Pm_GetDefaultInputDeviceID();
- }
- else
- {
- for (int i = 0; i < num_devs; i++)
- {
- pmInfo = Pm_GetDeviceInfo(i);
-
- if (pmInfo->input)
- {
- if (!strcmp(devname, pmInfo->name))
- {
- found_dev = i;
- break;
- }
- }
- }
- }
-
- if (found_dev >= 0)
- {
- if (Pm_OpenInput(&stm, found_dev, NULL, RX_EVENT_BUF_SIZE, NULL, NULL) == pmNoError)
- {
- ret = (osd_midi_device *)osd_malloc(sizeof(osd_midi_device));
- memset(ret, 0, sizeof(osd_midi_device));
- ret->pmStream = stm;
- return ret;
- }
- else
- {
- printf("Couldn't open PM device\n");
- return NULL;
- }
- }
- else
- {
- return NULL;
- }
- #else
- return NULL;
- #endif
-}
-
-osd_midi_device *osd_open_midi_output(const char *devname)
-{
- #ifndef DISABLE_MIDI
- int num_devs = Pm_CountDevices();
- int found_dev = -1;
- const PmDeviceInfo *pmInfo;
- PortMidiStream *stm;
- osd_midi_device *ret;
-
- if (!strcmp("default", devname))
- {
- found_dev = Pm_GetDefaultOutputDeviceID();
- }
- else
- {
- for (int i = 0; i < num_devs; i++)
- {
- pmInfo = Pm_GetDeviceInfo(i);
-
- if (pmInfo->output)
- {
- if (!strcmp(devname, pmInfo->name))
- {
- found_dev = i;
- break;
- }
- }
- }
- }
-
- if (found_dev >= 0)
- {
- if (Pm_OpenOutput(&stm, found_dev, NULL, 100, NULL, NULL, 0) == pmNoError)
- {
- ret = (osd_midi_device *)osd_malloc(sizeof(osd_midi_device));
- memset(ret, 0, sizeof(osd_midi_device));
- ret->pmStream = stm;
- return ret;
- }
- else
- {
- printf("Couldn't open PM device\n");
- return NULL;
- }
- }
- else
- {
- return NULL;
- }
- #endif
- return NULL;
-}
-
-void osd_close_midi_channel(osd_midi_device *dev)
-{
- #ifndef DISABLE_MIDI
- Pm_Close(dev->pmStream);
- osd_free(dev);
- #endif
-}
-
-bool osd_poll_midi_channel(osd_midi_device *dev)
-{
- #ifndef DISABLE_MIDI
- PmError chk = Pm_Poll(dev->pmStream);
-
- return (chk == pmGotData) ? true : false;
- #else
- return false;
- #endif
-}
-
-int osd_read_midi_channel(osd_midi_device *dev, UINT8 *pOut)
-{
- #ifndef DISABLE_MIDI
- int msgsRead = Pm_Read(dev->pmStream, dev->rx_evBuf, RX_EVENT_BUF_SIZE);
- int bytesOut = 0;
-
- if (msgsRead <= 0)
- {
- return 0;
- }
-
- for (int msg = 0; msg < msgsRead; msg++)
- {
- UINT8 status = Pm_MessageStatus(dev->rx_evBuf[msg].message);
-
- if (dev->rx_sysex)
- {
- if (status & 0x80) // sys real-time imposing on us?
- {
- if ((status == 0xf2) || (status == 0xf3))
- {
- *pOut++ = status;
- *pOut++ = Pm_MessageData1(dev->rx_evBuf[msg].message);
- *pOut++ = Pm_MessageData2(dev->rx_evBuf[msg].message);
- bytesOut += 3;
- }
- else
- {
- *pOut++ = status;
- bytesOut++;
- if (status == MIDI_EOX)
- {
- dev->rx_sysex = false;
- }
- }
- }
- else // shift out the sysex bytes
- {
- for (int i = 0; i < 4; i++)
- {
- UINT8 byte = dev->rx_evBuf[msg].message & 0xff;
- *pOut++ = byte;
- bytesOut++;
- if (byte == MIDI_EOX)
- {
- dev->rx_sysex = false;
- break;
- }
- dev->rx_evBuf[msg].message >>= 8;
- }
- }
- }
- else
- {
- switch ((status>>4) & 0xf)
- {
- case 0xc: // 2-byte messages
- case 0xd:
- *pOut++ = status;
- *pOut++ = Pm_MessageData1(dev->rx_evBuf[msg].message);
- bytesOut += 2;
- break;
-
- case 0xf: // system common
- switch (status & 0xf)
- {
- case 0: // System Exclusive
- {
- *pOut++ = status; // this should be OK: the shortest legal sysex is F0 tt dd F7, I believe
- *pOut++ = (dev->rx_evBuf[msg].message>>8) & 0xff;
- *pOut++ = (dev->rx_evBuf[msg].message>>16) & 0xff;
- UINT8 last = *pOut++ = (dev->rx_evBuf[msg].message>>24) & 0xff;
- bytesOut += 4;
- dev->rx_sysex = (last != MIDI_EOX);
- break;
- }
-
- case 7: // End of System Exclusive
- *pOut++ = status;
- bytesOut += 1;
- dev->rx_sysex = false;
- break;
-
- case 2: // song pos
- case 3: // song select
- *pOut++ = status;
- *pOut++ = Pm_MessageData1(dev->rx_evBuf[msg].message);
- *pOut++ = Pm_MessageData2(dev->rx_evBuf[msg].message);
- bytesOut += 3;
- break;
-
- default: // all other defined Fx messages are 1 byte
- break;
- }
- break;
-
- default:
- *pOut++ = status;
- *pOut++ = Pm_MessageData1(dev->rx_evBuf[msg].message);
- *pOut++ = Pm_MessageData2(dev->rx_evBuf[msg].message);
- bytesOut += 3;
- break;
- }
- }
- }
-
- return bytesOut;
- #else
- return 0;
- #endif
-}
-
-void osd_write_midi_channel(osd_midi_device *dev, UINT8 data)
-{
- #ifndef DISABLE_MIDI
- int bytes_needed = 0;
- PmEvent ev;
- ev.timestamp = 0; // use the current time
-
-// printf("write: %02x (%d)\n", data, dev->xmit_cnt);
-
- // reject data bytes when no valid status exists
- if ((dev->last_status == 0) && !(data & 0x80))
- {
- dev->xmit_cnt = 0;
- return;
- }
-
- if (dev->xmit_cnt >= 4)
- {
- printf("MIDI out: packet assembly overflow, contact MAMEdev!\n");
- return;
- }
-
- // handle sysex
- if (dev->last_status == MIDI_SYSEX)
- {
-// printf("sysex: %02x (%d)\n", data, dev->xmit_cnt);
-
- // if we get a status that isn't sysex, assume it's system common
- if ((data & 0x80) && (data != MIDI_EOX))
- {
-// printf("common during sysex!\n");
- ev.message = Pm_Message(data, 0, 0);
- Pm_Write(dev->pmStream, &ev, 1);
- return;
- }
-
- dev->xmit_in[dev->xmit_cnt++] = data;
-
- // if EOX or 4 bytes filled, transmit 4 bytes
- if ((dev->xmit_cnt == 4) || (data == MIDI_EOX))
- {
- ev.message = dev->xmit_in[0] | (dev->xmit_in[1]<<8) | (dev->xmit_in[2]<<16) | (dev->xmit_in[3]<<24);
- Pm_Write(dev->pmStream, &ev, 1);
- dev->xmit_in[0] = dev->xmit_in[1] = dev->xmit_in[2] = dev->xmit_in[3] = 0;
- dev->xmit_cnt = 0;
-
-// printf("SysEx packet: %08x\n", ev.message);
-
- // if this is EOX, kill the running status
- if (data == MIDI_EOX)
- {
- dev->last_status = 0;
- }
- }
-
- return;
- }
-
- // handle running status. don't allow system real-time messages to be considered as running status.
- if ((dev->xmit_cnt == 0) && (data & 0x80) && (data < 0xf8))
- {
- dev->last_status = data;
- }
-
- if ((dev->xmit_cnt == 0) && !(data & 0x80))
- {
- dev->xmit_in[dev->xmit_cnt++] = dev->last_status;
- dev->xmit_in[dev->xmit_cnt++] = data;
-// printf("\trunning status: [%d] = %02x, [%d] = %02x, last_status = %02x\n", dev->xmit_cnt-2, dev->last_status, dev->xmit_cnt-1, data, dev->last_status);
- }
- else
- {
- dev->xmit_in[dev->xmit_cnt++] = data;
-// printf("\tNRS: [%d] = %02x\n", dev->xmit_cnt-1, data);
- }
-
- if ((dev->xmit_cnt == 1) && (dev->xmit_in[0] == MIDI_SYSEX))
- {
-// printf("Start SysEx!\n");
- dev->last_status = MIDI_SYSEX;
- return;
- }
-
- // are we there yet?
-// printf("status check: %02x\n", dev->xmit_in[0]);
- switch ((dev->xmit_in[0]>>4) & 0xf)
- {
- case 0xc: // 2-byte messages
- case 0xd:
- bytes_needed = 2;
- break;
-
- case 0xf: // system common
- switch (dev->xmit_in[0] & 0xf)
- {
- case 0: // System Exclusive is handled above
- break;
-
- case 7: // End of System Exclusive
- bytes_needed = 1;
- break;
-
- case 2: // song pos
- case 3: // song select
- bytes_needed = 3;
- break;
-
- default: // all other defined Fx messages are 1 byte
- bytes_needed = 1;
- break;
- }
- break;
-
- default:
- bytes_needed = 3;
- break;
- }
-
- if (dev->xmit_cnt == bytes_needed)
- {
- ev.message = Pm_Message(dev->xmit_in[0], dev->xmit_in[1], dev->xmit_in[2]);
- Pm_Write(dev->pmStream, &ev, 1);
- dev->xmit_cnt = 0;
- }
-
- #endif
-}
diff --git a/src/osd/osdcore.h b/src/osd/osdcore.h
index 2d9a4ac4f85..599a2a52576 100644
--- a/src/osd/osdcore.h
+++ b/src/osd/osdcore.h
@@ -874,6 +874,8 @@ file_error osd_get_full_path(char **dst, const char *path);
***************************************************************************/
struct osd_midi_device;
+bool osd_midi_init();
+void osd_midi_exit();
void osd_list_midi_devices(void);
// free result with osd_close_midi_channel()
osd_midi_device *osd_open_midi_input(const char *devname);
diff --git a/src/osd/osdepend.c b/src/osd/osdepend.c
index 73563f0eb01..9083999337b 100644
--- a/src/osd/osdepend.c
+++ b/src/osd/osdepend.c
@@ -11,7 +11,6 @@
#include "emu.h"
#include "osdepend.h"
-#include "portmidi/portmidi.h"
#include "modules/sound/none.h"
#include "modules/debugger/none.h"
#include "modules/debugger/debugint.h"
@@ -474,15 +473,6 @@ bool osd_interface::network_init()
return true;
}
-bool osd_interface::midi_init()
-{
- #ifndef DISABLE_MIDI
- Pm_Initialize();
- #endif
- return true;
-}
-
-
void osd_interface::exit_subsystems()
{
video_exit();
@@ -521,13 +511,6 @@ void osd_interface::network_exit()
{
}
-void osd_interface::midi_exit()
-{
- #ifndef DISABLE_MIDI
- Pm_Terminate();
- #endif
-}
-
void osd_interface::osd_exit()
{
exit_subsystems();
diff --git a/src/osd/osdepend.h b/src/osd/osdepend.h
index 0096143c46c..104039edf3d 100644
--- a/src/osd/osdepend.h
+++ b/src/osd/osdepend.h
@@ -167,6 +167,13 @@ public:
// video overridables
virtual void *get_slider_list();
+ // midi overridables
+ // FIXME: this should return a list of devices, not list them on stdout
+ virtual void list_midi_devices(void);
+
+ // FIXME: everything below seems to be osd specific and not part of
+ // this INTERFACE but part of the osd IMPLEMENTATION
+
void init_subsystems();
virtual bool video_init();
diff --git a/src/osd/sdl/sdl.mak b/src/osd/sdl/sdl.mak
index 96b407feda8..43ff46c9cbc 100644
--- a/src/osd/sdl/sdl.mak
+++ b/src/osd/sdl/sdl.mak
@@ -394,7 +394,10 @@ endif
SDLSRC = $(SRC)/osd/$(OSD)
SDLOBJ = $(OBJ)/osd/$(OSD)
-OBJDIRS += $(SDLOBJ) $(OSDOBJ)/modules/sync $(OSDOBJ)/modules/lib
+OBJDIRS += $(SDLOBJ) \
+ $(OSDOBJ)/modules/sync \
+ $(OSDOBJ)/modules/lib \
+ $(OSDOBJ)/modules/midi \
#-------------------------------------------------
# OSD core library
@@ -430,12 +433,14 @@ OSDOBJS = \
$(SDLOBJ)/output.o \
$(SDLOBJ)/watchdog.o \
-ifeq ($(BASE_TARGETOS),win32)
- OSDOBJS += $(OSDOBJ)/modules/sound/direct_sound.o
+ifdef NO_USE_MIDI
+ OSDOBJS += $(OSDOBJ)/modules/midi/none.o
+else
+ OSDOBJS += $(OSDOBJ)/modules/midi/portmidi.o
endif
-ifdef NO_USE_MIDI
-DEFS += -DDISABLE_MIDI=1
+ifeq ($(BASE_TARGETOS),win32)
+ OSDOBJS += $(OSDOBJ)/modules/sound/direct_sound.o
endif
# Add SDL2.0 support
diff --git a/src/osd/sdl/sdlmain.c b/src/osd/sdl/sdlmain.c
index 19d4f3313fc..3a29515b743 100644
--- a/src/osd/sdl/sdlmain.c
+++ b/src/osd/sdl/sdlmain.c
@@ -1438,3 +1438,28 @@ bool sdl_osd_interface::font_get_bitmap(osd_font font, unicode_char chnum, bitma
}
#endif
#endif
+
+//-------------------------------------------------
+// FIXME: Doesn't belong here but there's no better
+// place currently.
+//-------------------------------------------------
+
+bool osd_interface::midi_init()
+{
+ // this should be done on the OS_level
+ return osd_midi_init();
+}
+
+//-------------------------------------------------
+// list_midi_devices - list available midi devices
+//-------------------------------------------------
+
+void osd_interface::list_midi_devices(void)
+{
+ osd_list_midi_devices();
+}
+
+void osd_interface::midi_exit()
+{
+ osd_midi_exit();
+}
diff --git a/src/osd/windows/windows.mak b/src/osd/windows/windows.mak
index 8705213cdd9..158418640d3 100644
--- a/src/osd/windows/windows.mak
+++ b/src/osd/windows/windows.mak
@@ -87,7 +87,10 @@ WINOBJ = $(OBJ)/osd/$(OSD)
OSDSRC = $(SRC)/osd
OSDOBJ = $(OBJ)/osd
-OBJDIRS += $(WINOBJ) $(OSDOBJ)/modules/sync $(OSDOBJ)/modules/lib
+OBJDIRS += $(WINOBJ) \
+ $(OSDOBJ)/modules/sync \
+ $(OSDOBJ)/modules/lib \
+ $(OSDOBJ)/modules/midi \
ifdef USE_QTDEBUG
OBJDIRS += $(OSDOBJ)/modules/debugger/qt
@@ -374,7 +377,8 @@ OSDOBJS = \
$(WINOBJ)/video.o \
$(WINOBJ)/window.o \
$(WINOBJ)/winmenu.o \
- $(WINOBJ)/winmain.o
+ $(WINOBJ)/winmain.o \
+ $(OSDOBJ)/modules/midi/portmidi.o \
ifdef USE_SDL
OSDOBJS += \