From f28fe7db31dfa205e202889fda6300434f3c0387 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Fri, 1 Mar 2024 05:06:54 +1100 Subject: [PATCH] osd: Cleaned up MIDI and network interfaces a little more. --- scripts/src/bus.lua | 4 +- scripts/src/osd/modules.lua | 1 + scripts/src/tools.lua | 4 +- src/devices/bus/mc10/mc10_cart.cpp | 10 +- src/devices/bus/mc10/multiports_ext.cpp | 73 +++-- src/devices/imagedev/midiin.cpp | 14 +- src/devices/imagedev/midiin.h | 4 +- src/devices/imagedev/midiout.cpp | 14 +- src/devices/imagedev/midiout.h | 4 +- src/emu/emufwd.h | 1 - src/frontend/mame/ui/miscmenu.cpp | 6 +- src/osd/interface/midiport.h | 40 +++ src/osd/modules/lib/osdobj_common.cpp | 45 +++- src/osd/modules/lib/osdobj_common.h | 3 +- src/osd/modules/midi/midi_module.h | 21 +- src/osd/modules/midi/none.cpp | 27 +- src/osd/modules/midi/portmidi.cpp | 345 ++++++++++++------------ src/osd/modules/netdev/pcap.cpp | 4 +- src/osd/modules/netdev/taptun.cpp | 4 +- src/osd/osdepend.h | 25 +- src/osd/osdnet.cpp | 27 -- src/osd/osdnet.h | 2 - 22 files changed, 340 insertions(+), 338 deletions(-) create mode 100644 src/osd/interface/midiport.h diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua index f0ba1665af9..e2e2a6031d9 100644 --- a/scripts/src/bus.lua +++ b/scripts/src/bus.lua @@ -2075,12 +2075,12 @@ if (BUSES["MC10"]~=null) then MAME_DIR .. "src/devices/bus/mc10/mc10_cart.h", MAME_DIR .. "src/devices/bus/mc10/mcx128.cpp", MAME_DIR .. "src/devices/bus/mc10/mcx128.h", + MAME_DIR .. "src/devices/bus/mc10/multiports_ext.cpp", + MAME_DIR .. "src/devices/bus/mc10/multiports_ext.h", MAME_DIR .. "src/devices/bus/mc10/pak.cpp", MAME_DIR .. "src/devices/bus/mc10/pak.h", MAME_DIR .. "src/devices/bus/mc10/ram.cpp", MAME_DIR .. "src/devices/bus/mc10/ram.h", - MAME_DIR .. "src/devices/bus/mc10/multiports_ext.cpp", - MAME_DIR .. "src/devices/bus/mc10/multiports_ext.h", } end diff --git a/scripts/src/osd/modules.lua b/scripts/src/osd/modules.lua index a92578153aa..43cb768704d 100644 --- a/scripts/src/osd/modules.lua +++ b/scripts/src/osd/modules.lua @@ -60,6 +60,7 @@ function osdmodulesbuild() MAME_DIR .. "src/osd/interface/inputman.h", MAME_DIR .. "src/osd/interface/inputseq.cpp", MAME_DIR .. "src/osd/interface/inputseq.h", + MAME_DIR .. "src/osd/interface/midiport.h", MAME_DIR .. "src/osd/interface/nethandler.cpp", MAME_DIR .. "src/osd/interface/nethandler.h", MAME_DIR .. "src/osd/modules/debugger/debug_module.h", diff --git a/scripts/src/tools.lua b/scripts/src/tools.lua index 3914a8f4191..e2340724e0c 100644 --- a/scripts/src/tools.lua +++ b/scripts/src/tools.lua @@ -469,7 +469,7 @@ includedirs { } defines { - "NL_DISABLE_DYNAMIC_LOAD=1", + "NL_DISABLE_DYNAMIC_LOAD=1", } files { @@ -747,7 +747,7 @@ if _OPTIONS["targetos"] == "macosx" then } dependency { - { "aueffectutil", MAME_DIR .. "src/tools/aueffectutil-Info.plist", true }, + { "aueffectutil", MAME_DIR .. "src/tools/aueffectutil-Info.plist", true }, } links { diff --git a/src/devices/bus/mc10/mc10_cart.cpp b/src/devices/bus/mc10/mc10_cart.cpp index cb413b13034..0100a8ae5ba 100644 --- a/src/devices/bus/mc10/mc10_cart.cpp +++ b/src/devices/bus/mc10/mc10_cart.cpp @@ -27,9 +27,9 @@ 16 A3 33 GND 17 A5 34 GND - Alice 32 and Alice 90 have 2 more pins: - 35 IRQ (optional) - 36 SOUND + Alice 32 and Alice 90 have 2 more pins: + 35 IRQ (optional) + 36 SOUND SEL is an input to the MC-10 that allows the cartridge to remove the internal chips from the bus. @@ -40,9 +40,9 @@ #include "mc10_cart.h" #include "mcx128.h" +#include "multiports_ext.h" #include "pak.h" #include "ram.h" -#include "multiports_ext.h" //#define VERBOSE 1 #include "logmacro.h" @@ -109,8 +109,6 @@ std::pair mc10cart_slot_device::call_load() util::string_format("Unsupported cartridge size (must be no more than %u bytes)", m_cart->max_rom_length())); } - // TODO: add the min_rom_length() method to the interface - if (!loaded_through_softlist()) { LOG("Allocating %u byte cartridge ROM region\n", len); diff --git a/src/devices/bus/mc10/multiports_ext.cpp b/src/devices/bus/mc10/multiports_ext.cpp index c15c85c3420..90f3716ccee 100644 --- a/src/devices/bus/mc10/multiports_ext.cpp +++ b/src/devices/bus/mc10/multiports_ext.cpp @@ -1,35 +1,37 @@ /*************************************************************************** - multiports_ext.cpp + multiports_ext.cpp - Emulation of the Alice Multiports Extension + Emulation of the Alice Multiports Extension - Features: - The extension provides an extension doubler and two joystick ports. + Features: + The extension provides an extension doubler and two joystick ports. - The extension also provides (for the whole Alice family and MC-10): - - 16K of RAM expansion ($5000-$8FFF) - - 64K of ROM expansion in two possible configurations: - - 8K of ROM between $1000 and $2FFF, as 8 banks (Cartridge mode). - - 16K of ROM between $C000 and $FFFF, as 4 banks (ROM mode). + The extension also provides (for the whole Alice family and MC-10): + - 16K of RAM expansion ($5000-$8FFF) + - 64K of ROM expansion in two possible configurations: + - 8K of ROM between $1000 and $2FFF, as 8 banks (Cartridge mode). + - 16K of ROM between $C000 and $FFFF, as 4 banks (ROM mode). - Only the RAM/ROM expansion is emulated here. + Only the RAM/ROM expansion is emulated here. - Banks are selected by writing to: - - $1000 to $1FFF in Cartridge mode (number of bank between 0 and 7) - - $C000 to $CFFF in ROM mode (number of bank between 0 and 3) + Banks are selected by writing to: + - $1000 to $1FFF in Cartridge mode (number of bank between 0 and 7) + - $C000 to $CFFF in ROM mode (number of bank between 0 and 3) ***************************************************************************/ #include "emu.h" #include "multiports_ext.h" + +namespace { + //************************************************************************** // TYPE DECLARATIONS //************************************************************************** -class mc10_multiports_ext_device : public device_t, - public device_mc10cart_interface +class mc10_multiports_ext_device : public device_t, public device_mc10cart_interface { public: mc10_multiports_ext_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); @@ -43,7 +45,6 @@ protected: // device_t implementation virtual void device_start() override; virtual void device_reset() override; - virtual void device_post_load() override; void control_register_write(offs_t offset, u8 data); @@ -56,8 +57,6 @@ private: memory_share_creator m_extention_ram; }; -DEFINE_DEVICE_TYPE_PRIVATE(ALICE_MULTIPORTS_EXT, device_mc10cart_interface, mc10_multiports_ext_device, "mc10_multiports_ext", "Fred_72 and 6502man's Multiports Extension") - //------------------------------------------------- // IMPLEMENTATION //------------------------------------------------- @@ -68,7 +67,11 @@ mc10_multiports_ext_device::mc10_multiports_ext_device(const machine_config &mco } mc10_multiports_ext_device::mc10_multiports_ext_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) - : device_t(mconfig, type, tag, owner, clock), device_mc10cart_interface(mconfig, *this), m_bank(*this, "cart_bank"), rom_bank_index(0), m_extention_ram(*this, "ext_ram", 1024 * 16, ENDIANNESS_BIG) + : device_t(mconfig, type, tag, owner, clock) + , device_mc10cart_interface(mconfig, *this) + , m_bank(*this, "cart_bank") + , rom_bank_index(0) + , m_extention_ram(*this, "ext_ram", 1024 * 16, ENDIANNESS_BIG) { } @@ -86,8 +89,6 @@ void mc10_multiports_ext_device::multiports_mem(address_map &map) void mc10_multiports_ext_device::device_start() { - save_item(NAME(rom_bank_index)); - owning_slot().memspace().install_device(0x1000, 0x2fff, *this, &mc10_multiports_ext_device::multiports_mem); owning_slot().memspace().install_ram(0x5000, 0x8fff, &m_extention_ram[0]); } @@ -96,38 +97,26 @@ void mc10_multiports_ext_device::device_start() void mc10_multiports_ext_device::device_reset() { - rom_bank_index = 0; - update_bank(); -} - -void mc10_multiports_ext_device::device_post_load() -{ - update_bank(); + m_bank->set_entry(0); } void mc10_multiports_ext_device::control_register_write(offs_t offset, u8 data) { if (offset < 0x1000) - { - rom_bank_index = data & 0x07; - update_bank(); - } -} - -void mc10_multiports_ext_device::update_bank() -{ - m_bank.target()->set_entry(rom_bank_index); + m_bank->set_entry(data & 0x07); } std::pair mc10_multiports_ext_device::load() { memory_region *const romregion(memregion("^rom")); - if (!romregion) - { - return std::make_pair(image_error::BADSOFTWARE, "Software item lacks 'rom' data area"); - } + if (romregion->bytes() < (0x2000 * 8)) + return std::make_pair(image_error::INVALIDLENGTH, "Cartridge ROM must be at least 64KB"); - m_bank.target()->configure_entries(0, 8, romregion->base(), 0x2000); + m_bank->configure_entries(0, 8, romregion->base(), 0x2000); return std::make_pair(std::error_condition(), std::string()); } + +} // anonymous namespace + +DEFINE_DEVICE_TYPE_PRIVATE(ALICE_MULTIPORTS_EXT, device_mc10cart_interface, mc10_multiports_ext_device, "mc10_multiports_ext", "Fred_72 and 6502man's Multiports Extension") diff --git a/src/devices/imagedev/midiin.cpp b/src/devices/imagedev/midiin.cpp index 3f822838894..62c8954e93e 100644 --- a/src/devices/imagedev/midiin.cpp +++ b/src/devices/imagedev/midiin.cpp @@ -10,8 +10,10 @@ #include "emu.h" #include "midiin.h" + #include "osdepend.h" + /*************************************************************************** IMPLEMENTATION ***************************************************************************/ @@ -183,11 +185,9 @@ std::pair midiin_device::call_load() } else { - m_midi = machine().osd().create_midi_device(); - - if (!m_midi->open_input(filename())) + m_midi = machine().osd().create_midi_input(filename()); + if (!m_midi) { - m_midi.reset(); return std::make_pair(image_error::UNSPECIFIED, std::string()); } @@ -202,11 +202,7 @@ std::pair midiin_device::call_load() void midiin_device::call_unload() { - if (m_midi) - { - m_midi->close(); - } - else + if (!m_midi) { // send "all notes off" CC if unloading a MIDI file for (u8 channel = 0; channel < 0x10; channel++) diff --git a/src/devices/imagedev/midiin.h b/src/devices/imagedev/midiin.h index 2bcba3720cc..d557a47b7c4 100644 --- a/src/devices/imagedev/midiin.h +++ b/src/devices/imagedev/midiin.h @@ -15,6 +15,8 @@ #include "diserial.h" +#include "interface/midiport.h" + #include #include #include @@ -67,7 +69,7 @@ private: void xmit_char(uint8_t data); - std::unique_ptr m_midi; + std::unique_ptr m_midi; required_ioport m_config; emu_timer *m_timer; devcb_write_line m_input_cb; diff --git a/src/devices/imagedev/midiout.cpp b/src/devices/imagedev/midiout.cpp index 89ac4872332..67efce46f93 100644 --- a/src/devices/imagedev/midiout.cpp +++ b/src/devices/imagedev/midiout.cpp @@ -10,8 +10,10 @@ #include "emu.h" #include "midiout.h" + #include "osdepend.h" + /*************************************************************************** IMPLEMENTATION ***************************************************************************/ @@ -57,11 +59,9 @@ void midiout_device::device_reset() std::pair midiout_device::call_load() { - m_midi = machine().osd().create_midi_device(); - - if (!m_midi->open_output(filename())) + m_midi = machine().osd().create_midi_output(filename()); + if (!m_midi) { - m_midi.reset(); return std::make_pair(image_error::UNSPECIFIED, std::string()); } @@ -74,11 +74,7 @@ std::pair midiout_device::call_load() void midiout_device::call_unload() { - if (m_midi) - { - m_midi->close(); - m_midi.reset(); - } + m_midi.reset(); } void midiout_device::rcv_complete() // Rx completed receiving byte diff --git a/src/devices/imagedev/midiout.h b/src/devices/imagedev/midiout.h index 67a572fd5e2..e22c92e87a4 100644 --- a/src/devices/imagedev/midiout.h +++ b/src/devices/imagedev/midiout.h @@ -15,6 +15,8 @@ #include "diserial.h" +#include "interface/midiport.h" + #include #include #include @@ -59,7 +61,7 @@ protected: virtual void rcv_complete() override; // Rx completed receiving byte private: - std::unique_ptr m_midi; + std::unique_ptr m_midi; }; // device type definition diff --git a/src/emu/emufwd.h b/src/emu/emufwd.h index fe6ae26cb2c..89e15e4c541 100644 --- a/src/emu/emufwd.h +++ b/src/emu/emufwd.h @@ -38,7 +38,6 @@ class output_module; // declared in osdepend.h class osd_font; class osd_interface; -class osd_midi_device; diff --git a/src/frontend/mame/ui/miscmenu.cpp b/src/frontend/mame/ui/miscmenu.cpp index c05d01159fa..8ed4e64fac3 100644 --- a/src/frontend/mame/ui/miscmenu.cpp +++ b/src/frontend/mame/ui/miscmenu.cpp @@ -200,19 +200,21 @@ bool menu_network_devices::handle(event const *ev) } else if (ev->iptkey == IPT_UI_LEFT || ev->iptkey == IPT_UI_RIGHT) { + // FIXME: this conflates presumably arbitrary interface ID numbers with 0-based indices device_network_interface *const network = (device_network_interface *)ev->itemref; + auto const &interfaces = get_netdev_list(); int curr = network->get_interface(); if (ev->iptkey == IPT_UI_LEFT) curr--; else curr++; if (curr == -2) - curr = netdev_count() - 1; + curr = interfaces.size() - 1; network->set_interface(curr); curr = network->get_interface(); const char *title = nullptr; - for (auto &entry : get_netdev_list()) + for (auto &entry : interfaces) { if (entry->id == curr) { 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 + + +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_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_MIDI_PROVIDER); - dynamic_cast(om).list_midi_devices(); + auto const ports = dynamic_cast(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::vectorget_font_families(font_path, result); } -std::unique_ptr osd_common_t::create_midi_device() +std::unique_ptr osd_common_t::create_midi_input(std::string_view name) { - return m_midi->create_midi_device(); + return m_midi->create_input(name); +} + +std::unique_ptr osd_common_t::create_midi_output(std::string_view name) +{ + 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 > &result) override; - virtual std::unique_ptr create_midi_device() override; + virtual std::unique_ptr create_midi_input(std::string_view name) override; + virtual std::unique_ptr 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 +#include +#include +#include //============================================================ @@ -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; + virtual ~midi_module() = default; // specific routines - virtual std::unique_ptr create_midi_device() = 0; - // FIXME: should return a list of strings ... - virtual void list_midi_devices() = 0; + virtual std::unique_ptr create_input(std::string_view name) = 0; + virtual std::unique_ptr 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 create_midi_device() override; - virtual void list_midi_devices() override; + virtual std::unique_ptr create_input(std::string_view name) override { return nullptr; } + virtual std::unique_ptr create_output(std::string_view name) override { return nullptr; } + virtual port_info_vector list_midi_ports() override { return port_info_vector(); } }; -std::unique_ptr none_module::create_midi_device() -{ - return std::make_unique(); -} - -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 #include @@ -36,45 +39,51 @@ public: virtual int init(osd_interface &osd, const osd_options &options) override; virtual void exit() override; - virtual std::unique_ptr create_midi_device() override; - virtual void list_midi_devices() override; + virtual std::unique_ptr create_input(std::string_view name) override; + virtual std::unique_ptr 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; + +private: + PortMidiStream *const m_stream; + PmEvent m_evbuf[RX_EVENT_BUF_SIZE]; + bool m_rx_sysex; +}; + +class midi_output_pm : public midi_output_port +{ +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 *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; + 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; }; -std::unique_ptr pm_module::create_midi_device() -{ - return std::make_unique(); -} - 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 pm_module::create_input(std::string_view name) { - 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)" : ""); - } - } -} - -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)) + if (name == "default") { found_dev = Pm_GetDefaultInputDeviceID(); } 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->input) - { - if (!strcmp(devname, pmInfo->name)) - { - found_dev = i; - break; - } - } + auto const info = Pm_GetDeviceInfo(found_dev); + if (info->input && (name == info->name)) + break; } + if (num_devs <= found_dev) + found_dev = -1; } - if (found_dev >= 0) + if (0 > found_dev) { - 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; - } + osd_printf_warning("No MIDI input device named '%s' was found.\n", name); + return nullptr; } - else + + PortMidiStream *stream = nullptr; + PmError const err = Pm_OpenInput(&stream, found_dev, nullptr, RX_EVENT_BUF_SIZE, nullptr, nullptr); + if (pmNoError != err) { - return false; + osd_printf_error("Error opening PortMidi device '%s' for input.\n", name); + return nullptr; + } + + try + { + return std::make_unique(stream); + } + catch (...) + { + Pm_Close(stream); + return nullptr; } } -bool osd_midi_device_pm::open_output(const char *devname) +std::unique_ptr 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 false; + return std::make_unique(stream); + } + catch (...) + { + 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() -{ - PmError chk = Pm_Poll(pmStream); +midi_input_pm::~midi_input_pm() +{ + 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 #include #include +#include #include // 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 create_midi_device() = 0; + // MIDI interface + virtual std::unique_ptr create_midi_input(std::string_view name) = 0; + virtual std::unique_ptr 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 &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>& get_netdev_list(); -int netdev_count(); -void osd_list_network_adapters(); #endif // MAME_OSD_OSDNET_H