summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2024-03-01 05:06:54 +1100
committer Vas Crabb <vas@vastheman.com>2024-03-01 05:06:54 +1100
commitf28fe7db31dfa205e202889fda6300434f3c0387 (patch)
tree894b3262290442d33b625f318fad25e714ef2505 /src/osd
parent3191b41313165e3f6c302107cf1a691e9d752b04 (diff)
osd: Cleaned up MIDI and network interfaces a little more.
Diffstat (limited to 'src/osd')
-rw-r--r--src/osd/interface/midiport.h40
-rw-r--r--src/osd/modules/lib/osdobj_common.cpp45
-rw-r--r--src/osd/modules/lib/osdobj_common.h3
-rw-r--r--src/osd/modules/midi/midi_module.h21
-rw-r--r--src/osd/modules/midi/none.cpp27
-rw-r--r--src/osd/modules/midi/portmidi.cpp335
-rw-r--r--src/osd/modules/netdev/pcap.cpp4
-rw-r--r--src/osd/modules/netdev/taptun.cpp4
-rw-r--r--src/osd/osdepend.h25
-rw-r--r--src/osd/osdnet.cpp27
-rw-r--r--src/osd/osdnet.h2
11 files changed, 275 insertions, 258 deletions
diff --git a/src/osd/interface/midiport.h b/src/osd/interface/midiport.h
new file mode 100644
index 00000000000..f4ce04835a1
--- /dev/null
+++ b/src/osd/interface/midiport.h
@@ -0,0 +1,40 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb
+/***************************************************************************
+
+ midiport.h
+
+ OSD interface to midi ports
+
+***************************************************************************/
+#ifndef MAME_OSD_INTERFACE_MIDIPORT_H
+#define MAME_OSD_INTERFACE_MIDIPORT_H
+
+#pragma once
+
+#include <cstdint>
+
+
+namespace osd {
+
+class midi_input_port
+{
+public:
+ virtual ~midi_input_port() = default;
+
+ virtual bool poll() = 0;
+ virtual int read(uint8_t *pOut) = 0;
+};
+
+
+class midi_output_port
+{
+public:
+ virtual ~midi_output_port() = default;
+
+ virtual void write(uint8_t data) = 0;
+};
+
+} // namespace osd
+
+#endif // MAME_OSD_INTERFACE_MIDIPORT_H
diff --git a/src/osd/modules/lib/osdobj_common.cpp b/src/osd/modules/lib/osdobj_common.cpp
index 90bb63bf7f5..430f6ceeac9 100644
--- a/src/osd/modules/lib/osdobj_common.cpp
+++ b/src/osd/modules/lib/osdobj_common.cpp
@@ -592,7 +592,19 @@ bool osd_common_t::execute_command(const char *command)
if (strcmp(command, OSDCOMMAND_LIST_NETWORK_ADAPTERS) == 0)
{
osd_module &om = select_module_options<osd_module>(OSD_NETDEV_PROVIDER);
- osd_list_network_adapters();
+ auto const &interfaces = get_netdev_list();
+ if (interfaces.empty())
+ {
+ printf("No supported network interfaces were found\n");
+ }
+ else
+ {
+ printf("Available network interfaces:\n");
+ for (auto &entry : interfaces)
+ {
+ printf(" %s\n", entry->description);
+ }
+ }
om.exit();
return true;
@@ -600,7 +612,27 @@ bool osd_common_t::execute_command(const char *command)
else if (strcmp(command, OSDCOMMAND_LIST_MIDI_DEVICES) == 0)
{
osd_module &om = select_module_options<osd_module>(OSD_MIDI_PROVIDER);
- dynamic_cast<midi_module &>(om).list_midi_devices();
+ auto const ports = dynamic_cast<midi_module &>(om).list_midi_ports();
+ if (ports.empty())
+ {
+ printf("No MIDI ports were found\n");
+ }
+ else
+ {
+ printf("MIDI input ports:\n");
+ for (auto const &port : ports)
+ {
+ if (port.input)
+ printf(port.default_input ? "%s (default)\n" : "%s\n", port.name.c_str());
+ }
+
+ printf("\nMIDI output ports:\n");
+ for (auto const &port : ports)
+ {
+ if (port.output)
+ printf(port.default_output ? "%s (default)\n" : "%s\n", port.name.c_str());
+ }
+ }
om.exit();
return true;
@@ -717,7 +749,12 @@ bool osd_common_t::get_font_families(std::string const &font_path, std::vector<s
return m_font_module->get_font_families(font_path, result);
}
-std::unique_ptr<osd_midi_device> osd_common_t::create_midi_device()
+std::unique_ptr<osd::midi_input_port> osd_common_t::create_midi_input(std::string_view name)
+{
+ return m_midi->create_input(name);
+}
+
+std::unique_ptr<osd::midi_output_port> osd_common_t::create_midi_output(std::string_view name)
{
- return m_midi->create_midi_device();
+ return m_midi->create_output(name);
}
diff --git a/src/osd/modules/lib/osdobj_common.h b/src/osd/modules/lib/osdobj_common.h
index c5cd9b4fc49..919bbc4f717 100644
--- a/src/osd/modules/lib/osdobj_common.h
+++ b/src/osd/modules/lib/osdobj_common.h
@@ -238,7 +238,8 @@ public:
virtual osd_font::ptr font_alloc() override;
virtual bool get_font_families(std::string const &font_path, std::vector<std::pair<std::string, std::string> > &result) override;
- virtual std::unique_ptr<osd_midi_device> create_midi_device() override;
+ virtual std::unique_ptr<osd::midi_input_port> create_midi_input(std::string_view name) override;
+ virtual std::unique_ptr<osd::midi_output_port> create_midi_output(std::string_view name) override;
// FIXME: everything below seems to be osd specific and not part of
// this INTERFACE but part of the osd IMPLEMENTATION
diff --git a/src/osd/modules/midi/midi_module.h b/src/osd/modules/midi/midi_module.h
index 649d8f58b12..6ea7290805b 100644
--- a/src/osd/modules/midi/midi_module.h
+++ b/src/osd/modules/midi/midi_module.h
@@ -9,9 +9,12 @@
#pragma once
-#include "osdepend.h"
+#include "interface/midiport.h"
#include <memory>
+#include <string>
+#include <string_view>
+#include <vector>
//============================================================
@@ -23,13 +26,23 @@
class midi_module
{
public:
+ struct port_info
+ {
+ std::string name;
+ bool input;
+ bool output;
+ bool default_input;
+ bool default_output;
+ };
+ using port_info_vector = std::vector<port_info>;
+
virtual ~midi_module() = default;
// specific routines
- virtual std::unique_ptr<osd_midi_device> create_midi_device() = 0;
- // FIXME: should return a list of strings ...
- virtual void list_midi_devices() = 0;
+ virtual std::unique_ptr<osd::midi_input_port> create_input(std::string_view name) = 0;
+ virtual std::unique_ptr<osd::midi_output_port> create_output(std::string_view name) = 0;
+ virtual port_info_vector list_midi_ports() = 0;
};
#endif // MAME_OSD_MODULES_MIDI_MIDI_MODULE_H
diff --git a/src/osd/modules/midi/none.cpp b/src/osd/modules/midi/none.cpp
index 232a5f1e2a3..c3dd0aaadc5 100644
--- a/src/osd/modules/midi/none.cpp
+++ b/src/osd/modules/midi/none.cpp
@@ -20,18 +20,6 @@ namespace osd {
namespace {
-class osd_midi_device_none : public osd_midi_device
-{
-public:
- virtual bool open_input(const char *devname) override { return false; }
- virtual bool open_output(const char *devname) override { return false; }
- virtual void close() override { }
- virtual bool poll() override { return false; }
- virtual int read(uint8_t *pOut) override { return 0; }
- virtual void write(uint8_t data) override { }
-};
-
-
class none_module : public osd_module, public midi_module
{
public:
@@ -40,20 +28,11 @@ public:
virtual int init(osd_interface &osd, const osd_options &options) override { return 0; }
virtual void exit() override { }
- virtual std::unique_ptr<osd_midi_device> create_midi_device() override;
- virtual void list_midi_devices() override;
+ virtual std::unique_ptr<midi_input_port> create_input(std::string_view name) override { return nullptr; }
+ virtual std::unique_ptr<midi_output_port> create_output(std::string_view name) override { return nullptr; }
+ virtual port_info_vector list_midi_ports() override { return port_info_vector(); }
};
-std::unique_ptr<osd_midi_device> none_module::create_midi_device()
-{
- return std::make_unique<osd_midi_device_none>();
-}
-
-void none_module::list_midi_devices()
-{
- osd_printf_warning("\nMIDI is not supported in this configuration\n");
-}
-
} // anonymous namespace
} // namespace osd
diff --git a/src/osd/modules/midi/portmidi.cpp b/src/osd/modules/midi/portmidi.cpp
index dba61b47c77..3a1dbf6739d 100644
--- a/src/osd/modules/midi/portmidi.cpp
+++ b/src/osd/modules/midi/portmidi.cpp
@@ -14,6 +14,9 @@
#ifndef NO_USE_MIDI
+#include "interface/midiport.h"
+#include "osdcore.h" // osd_printf_*
+
#include <portmidi.h>
#include <cstdio>
@@ -36,45 +39,51 @@ public:
virtual int init(osd_interface &osd, const osd_options &options) override;
virtual void exit() override;
- virtual std::unique_ptr<osd_midi_device> create_midi_device() override;
- virtual void list_midi_devices() override;
+ virtual std::unique_ptr<midi_input_port> create_input(std::string_view name) override;
+ virtual std::unique_ptr<midi_output_port> create_output(std::string_view name) override;
+ virtual port_info_vector list_midi_ports() override;
};
-static const int RX_EVENT_BUF_SIZE = 512;
+static constexpr unsigned RX_EVENT_BUF_SIZE = 512;
-#define MIDI_SYSEX 0xf0
-#define MIDI_EOX 0xf7
+static constexpr uint8_t MIDI_SYSEX = 0xf0;
+static constexpr uint8_t MIDI_EOX = 0xf7;
-class osd_midi_device_pm : public osd_midi_device
+class midi_input_pm : public midi_input_port
{
public:
- osd_midi_device_pm(): pmStream(nullptr), xmit_cnt(0), last_status(0), rx_sysex(false) { }
- virtual ~osd_midi_device_pm() { }
- virtual bool open_input(const char *devname) override;
- virtual bool open_output(const char *devname) override;
- virtual void close() override;
+ midi_input_pm(PortMidiStream *stream) : m_stream(stream), m_rx_sysex(false) { }
+ virtual ~midi_input_pm();
+
virtual bool poll() override;
virtual int read(uint8_t *pOut) override;
- virtual void write(uint8_t data) override;
private:
- PortMidiStream *pmStream;
- PmEvent rx_evBuf[RX_EVENT_BUF_SIZE];
- uint8_t xmit_in[4]; // Pm_Messages mean we can at most have 3 residue bytes
- int xmit_cnt;
- uint8_t last_status;
- bool rx_sysex;
+ PortMidiStream *const m_stream;
+ PmEvent m_evbuf[RX_EVENT_BUF_SIZE];
+ bool m_rx_sysex;
};
-std::unique_ptr<osd_midi_device> pm_module::create_midi_device()
+class midi_output_pm : public midi_output_port
{
- return std::make_unique<osd_midi_device_pm>();
-}
+public:
+ midi_output_pm(PortMidiStream *stream) : m_stream(stream), m_xmit_cnt(0), m_last_status(0) { }
+ virtual ~midi_output_pm();
+
+ virtual void write(uint8_t data) override;
+
+private:
+ PortMidiStream *const m_stream;
+ uint8_t m_xmit_in[4]; // Pm_Messages mean we can at most have 3 residue bytes
+ int m_xmit_cnt;
+ uint8_t m_last_status;
+};
int pm_module::init(osd_interface &osd, const osd_options &options)
{
+ // FIXME: check error return code
Pm_Initialize();
return 0;
}
@@ -84,151 +93,126 @@ void pm_module::exit()
Pm_Terminate();
}
-void pm_module::list_midi_devices()
+std::unique_ptr<midi_input_port> pm_module::create_input(std::string_view name)
{
- int num_devs = Pm_CountDevices();
- const PmDeviceInfo *pmInfo;
-
- printf("\n");
-
- if (num_devs == 0)
+ int found_dev = -1;
+ if (name == "default")
{
- printf("No MIDI ports were found\n");
- return;
+ found_dev = Pm_GetDefaultInputDeviceID();
}
-
- printf("MIDI input ports:\n");
- for (int i = 0; i < num_devs; i++)
+ else
{
- pmInfo = Pm_GetDeviceInfo(i);
-
- if (pmInfo->input)
+ int const num_devs = Pm_CountDevices();
+ for (found_dev = 0; num_devs > found_dev; ++found_dev)
{
- printf("%s %s\n", pmInfo->name, (i == Pm_GetDefaultInputDeviceID()) ? "(default)" : "");
+ auto const info = Pm_GetDeviceInfo(found_dev);
+ if (info->input && (name == info->name))
+ break;
}
+ if (num_devs <= found_dev)
+ found_dev = -1;
}
- printf("\nMIDI output ports:\n");
- for (int i = 0; i < num_devs; i++)
+ if (0 > found_dev)
{
- pmInfo = Pm_GetDeviceInfo(i);
-
- if (pmInfo->output)
- {
- printf("%s %s\n", pmInfo->name, (i == Pm_GetDefaultOutputDeviceID()) ? "(default)" : "");
- }
+ osd_printf_warning("No MIDI input device named '%s' was found.\n", name);
+ return nullptr;
}
-}
-bool osd_midi_device_pm::open_input(const char *devname)
-{
- int num_devs = Pm_CountDevices();
- int found_dev = -1;
- const PmDeviceInfo *pmInfo;
- PortMidiStream *stm;
-
- if (!strcmp("default", devname))
+ PortMidiStream *stream = nullptr;
+ PmError const err = Pm_OpenInput(&stream, found_dev, nullptr, RX_EVENT_BUF_SIZE, nullptr, nullptr);
+ if (pmNoError != err)
{
- 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;
- }
- }
- }
+ osd_printf_error("Error opening PortMidi device '%s' for input.\n", name);
+ return nullptr;
}
- if (found_dev >= 0)
+ try
{
- if (Pm_OpenInput(&stm, found_dev, nullptr, RX_EVENT_BUF_SIZE, nullptr, nullptr) == pmNoError)
- {
- pmStream = stm;
- return true;
- }
- else
- {
- printf("Couldn't open PM device\n");
- return false;
- }
+ return std::make_unique<midi_input_pm>(stream);
}
- else
+ catch (...)
{
- return false;
+ Pm_Close(stream);
+ return nullptr;
}
}
-bool osd_midi_device_pm::open_output(const char *devname)
+std::unique_ptr<midi_output_port> pm_module::create_output(std::string_view name)
{
- int num_devs = Pm_CountDevices();
int found_dev = -1;
- const PmDeviceInfo *pmInfo;
- PortMidiStream *stm;
-
- if (!strcmp("default", devname))
+ if (name == "default")
{
found_dev = Pm_GetDefaultOutputDeviceID();
}
else
{
- for (int i = 0; i < num_devs; i++)
+ int const num_devs = Pm_CountDevices();
+ for (found_dev = 0; num_devs > found_dev; ++found_dev)
{
- pmInfo = Pm_GetDeviceInfo(i);
-
- if (pmInfo->output)
- {
- if (!strcmp(devname, pmInfo->name))
- {
- found_dev = i;
- break;
- }
- }
+ auto const info = Pm_GetDeviceInfo(found_dev);
+ if (info->output && (name == info->name))
+ break;
}
+ if (num_devs <= found_dev)
+ found_dev = -1;
}
- if (found_dev >= 0)
+ PortMidiStream *stream = nullptr;
+ PmError const err = Pm_OpenOutput(&stream, found_dev, nullptr, 100, nullptr, nullptr, 0);
+ if (pmNoError != err)
{
- if (Pm_OpenOutput(&stm, found_dev, nullptr, 100, nullptr, nullptr, 0) == pmNoError)
- {
- pmStream = stm;
- return true;
- }
- else
- {
- printf("Couldn't open PM device\n");
- return false;
- }
+ osd_printf_error("Error opening PortMidi device '%s' for output.\n", name);
+ return nullptr;
}
- else
+
+ try
+ {
+ return std::make_unique<midi_output_pm>(stream);
+ }
+ catch (...)
{
- return false;
+ Pm_Close(stream);
+ return nullptr;
}
}
-void osd_midi_device_pm::close()
+midi_module::port_info_vector pm_module::list_midi_ports()
{
- Pm_Close(pmStream);
+ int const num_devs = Pm_CountDevices();
+ int const def_input = Pm_GetDefaultInputDeviceID();
+ int const def_output = Pm_GetDefaultOutputDeviceID();
+ port_info_vector result;
+ result.reserve(num_devs);
+ for (int i = 0; num_devs > i; ++i)
+ {
+ auto const pm_info = Pm_GetDeviceInfo(i);
+ result.emplace_back(port_info{
+ pm_info->name,
+ 0 != pm_info->input,
+ 0 != pm_info->output,
+ def_input == i,
+ def_output == i });
+ }
+ return result;
}
-bool osd_midi_device_pm::poll()
+
+midi_input_pm::~midi_input_pm()
{
- PmError chk = Pm_Poll(pmStream);
+ if (m_stream)
+ Pm_Close(m_stream);
+}
+bool midi_input_pm::poll()
+{
+ PmError const chk = Pm_Poll(m_stream);
return (chk == pmGotData) ? true : false;
}
-int osd_midi_device_pm::read(uint8_t *pOut)
+int midi_input_pm::read(uint8_t *pOut)
{
- int msgsRead = Pm_Read(pmStream, rx_evBuf, RX_EVENT_BUF_SIZE);
+ int msgsRead = Pm_Read(m_stream, m_evbuf, RX_EVENT_BUF_SIZE);
int bytesOut = 0;
if (msgsRead <= 0)
@@ -238,23 +222,23 @@ int osd_midi_device_pm::read(uint8_t *pOut)
for (int msg = 0; msg < msgsRead; msg++)
{
- uint8_t status = Pm_MessageStatus(rx_evBuf[msg].message);
+ uint8_t status = Pm_MessageStatus(m_evbuf[msg].message);
- if (rx_sysex)
+ if (m_rx_sysex)
{
if (status & 0x80) // sys real-time imposing on us?
{
if (status == 0xf2)
{
*pOut++ = status;
- *pOut++ = Pm_MessageData1(rx_evBuf[msg].message);
- *pOut++ = Pm_MessageData2(rx_evBuf[msg].message);
+ *pOut++ = Pm_MessageData1(m_evbuf[msg].message);
+ *pOut++ = Pm_MessageData2(m_evbuf[msg].message);
bytesOut += 3;
}
else if (status == 0xf3)
{
*pOut++ = status;
- *pOut++ = Pm_MessageData1(rx_evBuf[msg].message);
+ *pOut++ = Pm_MessageData1(m_evbuf[msg].message);
bytesOut += 2;
}
else
@@ -263,7 +247,7 @@ int osd_midi_device_pm::read(uint8_t *pOut)
bytesOut++;
if (status == MIDI_EOX)
{
- rx_sysex = false;
+ m_rx_sysex = false;
}
}
}
@@ -271,15 +255,15 @@ int osd_midi_device_pm::read(uint8_t *pOut)
{
for (int i = 0; i < 4; i++)
{
- uint8_t byte = rx_evBuf[msg].message & 0xff;
+ uint8_t byte = m_evbuf[msg].message & 0xff;
*pOut++ = byte;
bytesOut++;
if (byte == MIDI_EOX)
{
- rx_sysex = false;
+ m_rx_sysex = false;
break;
}
- rx_evBuf[msg].message >>= 8;
+ m_evbuf[msg].message >>= 8;
}
}
}
@@ -290,7 +274,7 @@ int osd_midi_device_pm::read(uint8_t *pOut)
case 0xc: // 2-byte messages
case 0xd:
*pOut++ = status;
- *pOut++ = Pm_MessageData1(rx_evBuf[msg].message);
+ *pOut++ = Pm_MessageData1(m_evbuf[msg].message);
bytesOut += 2;
break;
@@ -300,30 +284,30 @@ int osd_midi_device_pm::read(uint8_t *pOut)
case 0: // System Exclusive
{
*pOut++ = status; // this should be OK: the shortest legal sysex is F0 tt dd F7, I believe
- *pOut++ = (rx_evBuf[msg].message>>8) & 0xff;
- *pOut++ = (rx_evBuf[msg].message>>16) & 0xff;
- uint8_t last = *pOut++ = (rx_evBuf[msg].message>>24) & 0xff;
+ *pOut++ = (m_evbuf[msg].message>>8) & 0xff;
+ *pOut++ = (m_evbuf[msg].message>>16) & 0xff;
+ uint8_t last = *pOut++ = (m_evbuf[msg].message>>24) & 0xff;
bytesOut += 4;
- rx_sysex = (last != MIDI_EOX);
+ m_rx_sysex = (last != MIDI_EOX);
break;
}
case 7: // End of System Exclusive
*pOut++ = status;
bytesOut += 1;
- rx_sysex = false;
+ m_rx_sysex = false;
break;
case 2: // song pos
*pOut++ = status;
- *pOut++ = Pm_MessageData1(rx_evBuf[msg].message);
- *pOut++ = Pm_MessageData2(rx_evBuf[msg].message);
+ *pOut++ = Pm_MessageData1(m_evbuf[msg].message);
+ *pOut++ = Pm_MessageData2(m_evbuf[msg].message);
bytesOut += 3;
break;
case 3: // song select
*pOut++ = status;
- *pOut++ = Pm_MessageData1(rx_evBuf[msg].message);
+ *pOut++ = Pm_MessageData1(m_evbuf[msg].message);
bytesOut += 2;
break;
@@ -336,8 +320,8 @@ int osd_midi_device_pm::read(uint8_t *pOut)
default:
*pOut++ = status;
- *pOut++ = Pm_MessageData1(rx_evBuf[msg].message);
- *pOut++ = Pm_MessageData2(rx_evBuf[msg].message);
+ *pOut++ = Pm_MessageData1(m_evbuf[msg].message);
+ *pOut++ = Pm_MessageData2(m_evbuf[msg].message);
bytesOut += 3;
break;
}
@@ -347,57 +331,64 @@ int osd_midi_device_pm::read(uint8_t *pOut)
return bytesOut;
}
-void osd_midi_device_pm::write(uint8_t data)
+
+midi_output_pm::~midi_output_pm()
+{
+ if (m_stream)
+ Pm_Close(m_stream);
+}
+
+void midi_output_pm::write(uint8_t data)
{
int bytes_needed = 0;
PmEvent ev;
ev.timestamp = 0; // use the current time
-// printf("write: %02x (%d)\n", data, xmit_cnt);
+// printf("write: %02x (%d)\n", data, m_xmit_cnt);
// reject data bytes when no valid status exists
- if ((last_status == 0) && !(data & 0x80))
+ if ((m_last_status == 0) && !(data & 0x80))
{
- xmit_cnt = 0;
+ m_xmit_cnt = 0;
return;
}
- if (xmit_cnt >= 4)
+ if (m_xmit_cnt >= 4)
{
printf("MIDI out: packet assembly overflow, contact MAMEdev!\n");
return;
}
// handle sysex
- if (last_status == MIDI_SYSEX)
+ if (m_last_status == MIDI_SYSEX)
{
-// printf("sysex: %02x (%d)\n", data, xmit_cnt);
+// printf("sysex: %02x (%d)\n", data, m_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(pmStream, &ev, 1);
+ Pm_Write(m_stream, &ev, 1);
return;
}
- xmit_in[xmit_cnt++] = data;
+ m_xmit_in[m_xmit_cnt++] = data;
// if EOX or 4 bytes filled, transmit 4 bytes
- if ((xmit_cnt == 4) || (data == MIDI_EOX))
+ if ((m_xmit_cnt == 4) || (data == MIDI_EOX))
{
- ev.message = xmit_in[0] | (xmit_in[1]<<8) | (xmit_in[2]<<16) | (xmit_in[3]<<24);
- Pm_Write(pmStream, &ev, 1);
- xmit_in[0] = xmit_in[1] = xmit_in[2] = xmit_in[3] = 0;
- xmit_cnt = 0;
+ ev.message = m_xmit_in[0] | (m_xmit_in[1]<<8) | (m_xmit_in[2]<<16) | (m_xmit_in[3]<<24);
+ Pm_Write(m_stream, &ev, 1);
+ m_xmit_in[0] = m_xmit_in[1] = m_xmit_in[2] = m_xmit_in[3] = 0;
+ m_xmit_cnt = 0;
// printf("SysEx packet: %08x\n", ev.message);
// if this is EOX, kill the running status
if (data == MIDI_EOX)
{
- last_status = 0;
+ m_last_status = 0;
}
}
@@ -405,33 +396,33 @@ void osd_midi_device_pm::write(uint8_t data)
}
// handle running status. don't allow system real-time messages to be considered as running status.
- if ((xmit_cnt == 0) && (data & 0x80) && (data < 0xf8))
+ if ((m_xmit_cnt == 0) && (data & 0x80) && (data < 0xf8))
{
- last_status = data;
+ m_last_status = data;
}
- if ((xmit_cnt == 0) && !(data & 0x80))
+ if ((m_xmit_cnt == 0) && !(data & 0x80))
{
- xmit_in[xmit_cnt++] = last_status;
- xmit_in[xmit_cnt++] = data;
-// printf("\trunning status: [%d] = %02x, [%d] = %02x, last_status = %02x\n", xmit_cnt-2, last_status, xmit_cnt-1, data, last_status);
+ m_xmit_in[m_xmit_cnt++] = m_last_status;
+ m_xmit_in[m_xmit_cnt++] = data;
+// printf("\trunning status: [%d] = %02x, [%d] = %02x, m_last_status = %02x\n", m_xmit_cnt-2, m_last_status, m_xmit_cnt-1, data, m_last_status);
}
else
{
- xmit_in[xmit_cnt++] = data;
-// printf("\tNRS: [%d] = %02x\n", xmit_cnt-1, data);
+ m_xmit_in[m_xmit_cnt++] = data;
+// printf("\tNRS: [%d] = %02x\n", m_xmit_cnt-1, data);
}
- if ((xmit_cnt == 1) && (xmit_in[0] == MIDI_SYSEX))
+ if ((m_xmit_cnt == 1) && (m_xmit_in[0] == MIDI_SYSEX))
{
// printf("Start SysEx!\n");
- last_status = MIDI_SYSEX;
+ m_last_status = MIDI_SYSEX;
return;
}
// are we there yet?
-// printf("status check: %02x\n", xmit_in[0]);
- switch ((xmit_in[0]>>4) & 0xf)
+// printf("status check: %02x\n", m_xmit_in[0]);
+ switch ((m_xmit_in[0]>>4) & 0xf)
{
case 0xc: // 2-byte messages
case 0xd:
@@ -439,7 +430,7 @@ void osd_midi_device_pm::write(uint8_t data)
break;
case 0xf: // system common
- switch (xmit_in[0] & 0xf)
+ switch (m_xmit_in[0] & 0xf)
{
case 0: // System Exclusive is handled above
break;
@@ -464,11 +455,11 @@ void osd_midi_device_pm::write(uint8_t data)
break;
}
- if (xmit_cnt == bytes_needed)
+ if (m_xmit_cnt == bytes_needed)
{
- ev.message = Pm_Message(xmit_in[0], xmit_in[1], xmit_in[2]);
- Pm_Write(pmStream, &ev, 1);
- xmit_cnt = 0;
+ ev.message = Pm_Message(m_xmit_in[0], m_xmit_in[1], m_xmit_in[2]);
+ Pm_Write(m_stream, &ev, 1);
+ m_xmit_cnt = 0;
}
}
diff --git a/src/osd/modules/netdev/pcap.cpp b/src/osd/modules/netdev/pcap.cpp
index d4d62bf68cf..77ca557f1de 100644
--- a/src/osd/modules/netdev/pcap.cpp
+++ b/src/osd/modules/netdev/pcap.cpp
@@ -117,7 +117,7 @@ struct netdev_pcap_context
class netdev_pcap : public osd_network_device
{
public:
- netdev_pcap(const char *name, class network_handler &ifdev);
+ netdev_pcap(const char *name, network_handler &ifdev);
~netdev_pcap();
virtual int send(uint8_t *buf, int len) override;
@@ -161,7 +161,7 @@ static void *netdev_pcap_blocker(void *arg) {
}
#endif
-netdev_pcap::netdev_pcap(const char *name, class network_handler &ifdev)
+netdev_pcap::netdev_pcap(const char *name, network_handler &ifdev)
: osd_network_device(ifdev)
{
char errbuf[PCAP_ERRBUF_SIZE];
diff --git a/src/osd/modules/netdev/taptun.cpp b/src/osd/modules/netdev/taptun.cpp
index eb6214231e4..a2953f33efc 100644
--- a/src/osd/modules/netdev/taptun.cpp
+++ b/src/osd/modules/netdev/taptun.cpp
@@ -63,7 +63,7 @@ public:
class netdev_tap : public osd_network_device
{
public:
- netdev_tap(const char *name, class network_handler &ifdev);
+ netdev_tap(const char *name, network_handler &ifdev);
~netdev_tap();
int send(uint8_t *buf, int len) override;
@@ -85,7 +85,7 @@ private:
uint8_t m_buf[2048];
};
-netdev_tap::netdev_tap(const char *name, class network_handler &ifdev)
+netdev_tap::netdev_tap(const char *name, network_handler &ifdev)
: osd_network_device(ifdev)
{
#ifdef __linux__
diff --git a/src/osd/osdepend.h b/src/osd/osdepend.h
index 8f1d86bc816..9824f16ebfe 100644
--- a/src/osd/osdepend.h
+++ b/src/osd/osdepend.h
@@ -20,12 +20,13 @@
#include <cstdint>
#include <memory>
#include <string>
+#include <string_view>
#include <vector>
// forward references
class input_type_entry;
-class osd_midi_device;
+namespace osd { class midi_input_port; class midi_output_port; }
namespace ui { class menu_item; }
@@ -93,28 +94,12 @@ public:
// command option overrides
virtual bool execute_command(const char *command) = 0;
- // midi interface
- virtual std::unique_ptr<osd_midi_device> create_midi_device() = 0;
+ // MIDI interface
+ virtual std::unique_ptr<osd::midi_input_port> create_midi_input(std::string_view name) = 0;
+ virtual std::unique_ptr<osd::midi_output_port> create_midi_output(std::string_view name) = 0;
protected:
virtual ~osd_interface() { }
};
-
-/***************************************************************************
- MIDI I/O INTERFACES
-***************************************************************************/
-
-class osd_midi_device
-{
-public:
- virtual ~osd_midi_device() { }
- virtual bool open_input(const char *devname) = 0;
- virtual bool open_output(const char *devname) = 0;
- virtual void close() = 0;
- virtual bool poll() = 0;
- virtual int read(uint8_t *pOut) = 0;
- virtual void write(uint8_t data) = 0;
-};
-
#endif // MAME_OSD_OSDEPEND_H
diff --git a/src/osd/osdnet.cpp b/src/osd/osdnet.cpp
index 20ac1cb059d..7fe2f7b2eb7 100644
--- a/src/osd/osdnet.cpp
+++ b/src/osd/osdnet.cpp
@@ -108,30 +108,3 @@ const std::array<uint8_t, 6> &osd_network_device::get_mac()
{
return m_dev.get_mac();
}
-
-int netdev_count()
-{
- return netdev_list.size();
-}
-
-void osd_list_network_adapters()
-{
- #ifdef USE_NETWORK
- int num_devs = netdev_list.size();
-
- if (num_devs == 0)
- {
- printf("No network adapters were found\n");
- return;
- }
-
- printf("Available network adapters:\n");
- for (auto &entry : netdev_list)
- {
- printf(" %s\n", entry->description);
- }
-
- #else
- printf("Network is not supported in this build\n");
- #endif
-}
diff --git a/src/osd/osdnet.h b/src/osd/osdnet.h
index 21110e5372d..8b21c38d395 100644
--- a/src/osd/osdnet.h
+++ b/src/osd/osdnet.h
@@ -62,7 +62,5 @@ osd_network_device *open_netdev(int id, osd::network_handler &ifdev);
void add_netdev(const char *name, const char *description, create_netdev func);
void clear_netdev();
const std::vector<std::unique_ptr<osd_network_device::entry_t>>& get_netdev_list();
-int netdev_count();
-void osd_list_network_adapters();
#endif // MAME_OSD_OSDNET_H