diff options
Diffstat (limited to 'src/devices/imagedev/midiin.h')
-rw-r--r-- | src/devices/imagedev/midiin.h | 47 |
1 files changed, 29 insertions, 18 deletions
diff --git a/src/devices/imagedev/midiin.h b/src/devices/imagedev/midiin.h index 28a0826fc0b..d557a47b7c4 100644 --- a/src/devices/imagedev/midiin.h +++ b/src/devices/imagedev/midiin.h @@ -15,6 +15,13 @@ #include "diserial.h" +#include "interface/midiport.h" + +#include <memory> +#include <string> +#include <system_error> +#include <utility> + /*************************************************************************** TYPE DEFINITIONS @@ -27,40 +34,43 @@ class midiin_device : public device_t, public: // construction/destruction midiin_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + ~midiin_device(); auto input_callback() { return m_input_cb.bind(); } - // image-level overrides - virtual image_init_result call_load() override; + // device_image_interface implementation + virtual std::pair<std::error_condition, std::string> call_load() override; virtual void call_unload() override; // image device - virtual iodevice_t image_type() const noexcept override { return IO_MIDIIN; } virtual bool is_readable() const noexcept override { return true; } virtual bool is_writeable() const noexcept override { return false; } virtual bool is_creatable() const noexcept override { return false; } - virtual bool must_be_loaded() const noexcept override { return false; } virtual bool is_reset_on_load() const noexcept override { return false; } - virtual const char *file_extensions() const noexcept override { return "mid"; } + virtual const char *file_extensions() const noexcept override { return "mid,syx"; } virtual bool core_opens_image_file() const noexcept override { return false; } + virtual const char *image_type_name() const noexcept override { return "midiin"; } + virtual const char *image_brief_type_name() const noexcept override { return "min"; } protected: - // device-level overrides + // device_t implementation + virtual ioport_constructor device_input_ports() const override; virtual void device_start() override; virtual void device_reset() override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; - - // serial overrides + // device_serial_interface implementation virtual void tra_complete() override; // Tx completed sending byte virtual void tra_callback() override; // Tx send bit + TIMER_CALLBACK_MEMBER(midi_update); + private: static const int XMIT_RING_SIZE = (8192*4*4); void xmit_char(uint8_t data); - std::unique_ptr<osd_midi_device> m_midi; + std::unique_ptr<osd::midi_input_port> m_midi; + required_ioport m_config; emu_timer *m_timer; devcb_write_line m_input_cb; uint8_t m_xmitring[XMIT_RING_SIZE]; @@ -82,7 +92,7 @@ private: }; // construction - midi_parser(u8 const *data, u32 length, u32 offset); + midi_parser(util::random_read &stream, u32 length, u32 offset); // end of buffer? bool eob() const { return (m_offset >= m_length); } @@ -95,11 +105,11 @@ private: midi_parser &reset() { return rewind(m_offset); } // read data of various sizes and endiannesses - u8 byte() { check_bounds(1); return m_data[m_offset++]; } - u16 word_be() { u16 result = byte() << 8; return result | byte(); } - u32 triple_be() { u32 result = word_be() << 8; return result | byte(); } - u32 dword_be() { u32 result = word_be() << 16; return result | word_be(); } - u32 dword_le() { return swapendian_int32(dword_be()); } + u8 byte(); + u16 word_be(); + u32 triple_be(); + u32 dword_be(); + u32 dword_le(); // special variable reader for MIDI u32 variable(); @@ -109,7 +119,7 @@ private: void check_bounds(u32 length); // internal state - u8 const *m_data; + util::random_read &m_stream; u32 m_length; u32 m_offset; }; @@ -152,7 +162,7 @@ private: void clear() { m_list.clear(); } // parse a new sequence - bool parse(u8 const *data, u32 length); + std::error_condition parse(util::random_read &stream, u32 length); // rewind to the start of time void rewind(attotime const &basetime); @@ -165,6 +175,7 @@ private: midi_event &event_at(u32 tick); u32 parse_track_data(midi_parser &buffer, u32 start_tick); void parse_midi_data(midi_parser &buffer); + void parse_sysex_data(midi_parser &buffer); // internal state std::list<midi_event> m_list; |