summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/imagedev/midiin.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/imagedev/midiin.h')
-rw-r--r--src/devices/imagedev/midiin.h47
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;