MIDI: Fixed several bugs and bumped the input buffer sizes [R. Belmont]

This commit is contained in:
R. Belmont 2013-01-15 14:45:36 +00:00
parent 4efc1f7b05
commit 9c0f4e6683
6 changed files with 27 additions and 14 deletions

View File

@ -34,6 +34,7 @@ void midiin_device::device_start()
{ {
m_input_func.resolve(m_input_callback, *this); m_input_func.resolve(m_input_callback, *this);
m_timer = timer_alloc(0); m_timer = timer_alloc(0);
m_midi = NULL;
} }
void midiin_device::device_reset() void midiin_device::device_reset()
@ -71,10 +72,10 @@ void midiin_device::device_config_complete(void)
void midiin_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) void midiin_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
{ {
UINT8 buf[256]; UINT8 buf[8192*4];
int bytesRead; int bytesRead;
if (osd_poll_midi_channel(m_midi)) while (osd_poll_midi_channel(m_midi))
{ {
bytesRead = osd_read_midi_channel(m_midi, buf); bytesRead = osd_read_midi_channel(m_midi, buf);
@ -112,7 +113,10 @@ bool midiin_device::call_load(void)
void midiin_device::call_unload(void) void midiin_device::call_unload(void)
{ {
if (m_midi)
{
osd_close_midi_channel(m_midi); osd_close_midi_channel(m_midi);
}
} }
void midiin_device::tra_complete() void midiin_device::tra_complete()

View File

@ -68,7 +68,7 @@ protected:
void input_callback(UINT8 state); void input_callback(UINT8 state);
private: private:
static const int XMIT_RING_SIZE = 64; static const int XMIT_RING_SIZE = (8192*4*4);
void xmit_char(UINT8 data); void xmit_char(UINT8 data);

View File

@ -32,6 +32,7 @@ midiout_device::midiout_device(const machine_config &mconfig, const char *tag, d
void midiout_device::device_start() void midiout_device::device_start()
{ {
m_midi = NULL;
} }
void midiout_device::device_reset() void midiout_device::device_reset()
@ -73,7 +74,10 @@ bool midiout_device::call_load(void)
void midiout_device::call_unload(void) void midiout_device::call_unload(void)
{ {
if (m_midi)
{
osd_close_midi_channel(m_midi); osd_close_midi_channel(m_midi);
}
} }
void midiout_device::rcv_complete() // Rx completed receiving byte void midiout_device::rcv_complete() // Rx completed receiving byte
@ -81,7 +85,10 @@ void midiout_device::rcv_complete() // Rx completed receiving byte
receive_register_extract(); receive_register_extract();
UINT8 data = get_received_char(); UINT8 data = get_received_char();
if (m_midi)
{
osd_write_midi_channel(m_midi, data); osd_write_midi_channel(m_midi, data);
}
} }
void midiout_device::input_callback(UINT8 state) void midiout_device::input_callback(UINT8 state)

View File

@ -13,7 +13,7 @@ const device_type MIDIIN_PORT = &device_creator<midiin_port_device>;
midiin_port_device::midiin_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) midiin_port_device::midiin_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, MIDIIN_PORT, "MIDI In port", tag, owner, clock), : device_t(mconfig, MIDIIN_PORT, "MIDI In port", tag, owner, clock),
device_serial_port_interface(mconfig, *this), device_serial_port_interface(mconfig, *this),
m_midiin(*this, "midiin") m_midiin(*this, "midiinimg")
{ {
} }
@ -23,7 +23,7 @@ static midiin_config midiin_port_image_config =
}; };
static MACHINE_CONFIG_FRAGMENT(midiin_port_config) static MACHINE_CONFIG_FRAGMENT(midiin_port_config)
MCFG_MIDIIN_ADD("midiin", midiin_port_image_config) MCFG_MIDIIN_ADD("midiinimg", midiin_port_image_config)
MACHINE_CONFIG_END MACHINE_CONFIG_END
machine_config_constructor midiin_port_device::device_mconfig_additions() const machine_config_constructor midiin_port_device::device_mconfig_additions() const

View File

@ -13,12 +13,12 @@ const device_type MIDIOUT_PORT = &device_creator<midiout_port_device>;
midiout_port_device::midiout_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) midiout_port_device::midiout_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, MIDIOUT_PORT, "MIDI Out port", tag, owner, clock), : device_t(mconfig, MIDIOUT_PORT, "MIDI Out port", tag, owner, clock),
device_serial_port_interface(mconfig, *this), device_serial_port_interface(mconfig, *this),
m_midiout(*this, "midiout") m_midiout(*this, "midioutimg")
{ {
} }
static MACHINE_CONFIG_FRAGMENT(midiout_port_config) static MACHINE_CONFIG_FRAGMENT(midiout_port_config)
MCFG_MIDIOUT_ADD("midiout") MCFG_MIDIOUT_ADD("midioutimg")
MACHINE_CONFIG_END MACHINE_CONFIG_END
machine_config_constructor midiout_port_device::device_mconfig_additions() const machine_config_constructor midiout_port_device::device_mconfig_additions() const

View File

@ -10,11 +10,13 @@
#include "portmidi/portmidi.h" #include "portmidi/portmidi.h"
#include "osdcore.h" #include "osdcore.h"
static const int RX_EVENT_BUF_SIZE = 512;
struct osd_midi_device struct osd_midi_device
{ {
#ifndef DISABLE_MIDI #ifndef DISABLE_MIDI
PortMidiStream *pmStream; PortMidiStream *pmStream;
PmEvent rx_evBuf[20]; // up to 20 events PmEvent rx_evBuf[RX_EVENT_BUF_SIZE];
#endif #endif
UINT8 xmit_in[4]; // Pm_Messages mean we can at most have 3 residue bytes UINT8 xmit_in[4]; // Pm_Messages mean we can at most have 3 residue bytes
int xmit_cnt; int xmit_cnt;
@ -85,7 +87,7 @@ osd_midi_device *osd_open_midi_input(const char *devname)
if (found_dev >= 0) if (found_dev >= 0)
{ {
if (Pm_OpenInput(&stm, found_dev, NULL, 20, NULL, NULL) == pmNoError) if (Pm_OpenInput(&stm, found_dev, NULL, RX_EVENT_BUF_SIZE, NULL, NULL) == pmNoError)
{ {
ret = (osd_midi_device *)osd_malloc(sizeof(osd_midi_device)); ret = (osd_midi_device *)osd_malloc(sizeof(osd_midi_device));
memset(ret, 0, sizeof(osd_midi_device)); memset(ret, 0, sizeof(osd_midi_device));
@ -132,7 +134,7 @@ osd_midi_device *osd_open_midi_output(const char *devname)
if (found_dev >= 0) if (found_dev >= 0)
{ {
if (Pm_OpenOutput(&stm, found_dev, NULL, 20, NULL, NULL, 0) == pmNoError) if (Pm_OpenOutput(&stm, found_dev, NULL, 100, NULL, NULL, 0) == pmNoError)
{ {
ret = (osd_midi_device *)osd_malloc(sizeof(osd_midi_device)); ret = (osd_midi_device *)osd_malloc(sizeof(osd_midi_device));
memset(ret, 0, sizeof(osd_midi_device)); memset(ret, 0, sizeof(osd_midi_device));
@ -175,7 +177,7 @@ bool osd_poll_midi_channel(osd_midi_device *dev)
int osd_read_midi_channel(osd_midi_device *dev, UINT8 *pOut) int osd_read_midi_channel(osd_midi_device *dev, UINT8 *pOut)
{ {
#ifndef DISABLE_MIDI #ifndef DISABLE_MIDI
int msgsRead = Pm_Read(dev->pmStream, dev->rx_evBuf, 20); int msgsRead = Pm_Read(dev->pmStream, dev->rx_evBuf, RX_EVENT_BUF_SIZE);
int bytesOut = 0; int bytesOut = 0;
if (msgsRead <= 0) if (msgsRead <= 0)