diff options
author | Fabio Priuli <etabeta78@users.noreply.github.com> | 2014-04-11 07:36:56 +0000 |
---|---|---|
committer | Fabio Priuli <etabeta78@users.noreply.github.com> | 2014-04-11 07:36:56 +0000 |
commit | e238b85bc69cf602bc1e54f3931e33df88bb78eb (patch) | |
tree | ed93600a619b5b44ba3fb5fe2a9be979647498fd | |
parent | af800c1155e24c397849ac52d62aedb250214662 (diff) |
rf5c68: converted to use delegates. nw.
-rw-r--r-- | src/emu/sound/rf5c68.c | 17 | ||||
-rw-r--r-- | src/emu/sound/rf5c68.h | 15 | ||||
-rw-r--r-- | src/mess/drivers/fmtowns.c | 21 |
3 files changed, 21 insertions, 32 deletions
diff --git a/src/emu/sound/rf5c68.c b/src/emu/sound/rf5c68.c index 23dcb94cd46..372f1bf65f0 100644 --- a/src/emu/sound/rf5c68.c +++ b/src/emu/sound/rf5c68.c @@ -24,8 +24,7 @@ rf5c68_device::rf5c68_device(const machine_config &mconfig, const char *tag, dev m_stream(NULL), m_cbank(0), m_wbank(0), - m_enable(0), - m_sample_callback(NULL) + m_enable(0) { memset(m_data, 0, sizeof(UINT8)*0x10000); } @@ -37,19 +36,13 @@ rf5c68_device::rf5c68_device(const machine_config &mconfig, const char *tag, dev void rf5c68_device::device_start() { - const rf5c68_interface* intf = (const rf5c68_interface*)static_config(); - + m_sample_end_cb.bind_relative_to(*owner()); + /* allocate memory for the chip */ memset(m_data, 0xff, sizeof(m_data)); /* allocate the stream */ m_stream = stream_alloc(0, 2, clock() / 384); - - /* set up callback */ - if(intf != NULL) - m_sample_callback = intf->sample_end_callback; - else - m_sample_callback = NULL; } @@ -88,10 +81,10 @@ void rf5c68_device::sound_stream_update(sound_stream &stream, stream_sample_t ** int sample; /* trigger sample callback */ - if(m_sample_callback) + if(!m_sample_end_cb.isnull()) { if(((chan->addr >> 11) & 0xfff) == 0xfff) - m_sample_callback(this, ((chan->addr >> 11)/0x2000)); + m_sample_end_cb((chan->addr >> 11)/0x2000); } /* fetch the sample and handle looping */ diff --git a/src/emu/sound/rf5c68.h b/src/emu/sound/rf5c68.h index 22468038f2b..d4d5b13cf04 100644 --- a/src/emu/sound/rf5c68.h +++ b/src/emu/sound/rf5c68.h @@ -19,15 +19,16 @@ #define MCFG_RF5C68_REPLACE(_tag, _clock) \ MCFG_DEVICE_REPLACE(_tag, RF5C68, _clock) +#define MCFG_RF5C68_SAMPLE_END_CB(_class, _method) \ + rf5c68_device::set_end_callback(*device, rf5c68_sample_end_cb_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); //************************************************************************** // TYPE DEFINITIONS //************************************************************************** -struct rf5c68_interface -{ - void (*sample_end_callback)(device_t* device, int channel); -}; +typedef device_delegate<void (int channel)> rf5c68_sample_end_cb_delegate; + +#define RF5C68_SAMPLE_END_CB_MEMBER(_name) void _name(int channel) struct rf5c68_pcm_channel @@ -51,7 +52,6 @@ struct rf5c68_pcm_channel }; - // ======================> rf5c68_device class rf5c68_device : public device_t, @@ -61,6 +61,8 @@ public: rf5c68_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); ~rf5c68_device() { } + static void set_end_callback(device_t &device, rf5c68_sample_end_cb_delegate callback) { downcast<rf5c68_device &>(device).m_sample_end_cb = callback; } + protected: // device-level overrides virtual void device_start(); @@ -82,7 +84,8 @@ private: UINT8 m_wbank; UINT8 m_enable; UINT8 m_data[0x10000]; - void (*m_sample_callback)(device_t* device,int channel); + + rf5c68_sample_end_cb_delegate m_sample_end_cb; }; extern const device_type RF5C68; diff --git a/src/mess/drivers/fmtowns.c b/src/mess/drivers/fmtowns.c index 0af8b3fdb74..08168a6c5a4 100644 --- a/src/mess/drivers/fmtowns.c +++ b/src/mess/drivers/fmtowns.c @@ -2078,16 +2078,13 @@ WRITE_LINE_MEMBER(towns_state::towns_fm_irq) } // PCM interrupt (IRQ 13) -static void towns_pcm_irq(device_t* device, int channel) +RF5C68_SAMPLE_END_CB_MEMBER(towns_state::towns_pcm_irq) { - towns_state* state = device->machine().driver_data<towns_state>(); - pic8259_device* pic = state->m_pic_slave; - - if(state->m_towns_pcm_channel_mask & (1 << channel)) + if (m_towns_pcm_channel_mask & (1 << channel)) { - state->m_towns_pcm_irq_flag = 1; - state->m_towns_pcm_channel_flag |= (1 << channel); - pic->ir5_w(1); + m_towns_pcm_irq_flag = 1; + m_towns_pcm_channel_flag |= (1 << channel); + m_pic_slave->ir5_w(1); if(IRQ_LOG) logerror("PIC: IRQ13 (PCM) set high (channel %i)\n",channel); } } @@ -2670,11 +2667,6 @@ static const upd71071_intf towns_dma_config = { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL } }; -static const rf5c68_interface rf5c68_intf = -{ - towns_pcm_irq -}; - static const gfx_layout fnt_chars_16x16 = { 16,16, @@ -2733,8 +2725,9 @@ static MACHINE_CONFIG_FRAGMENT( towns_base ) MCFG_SOUND_ADD("fm", YM3438, 53693100 / 7) // actual clock speed unknown MCFG_YM2612_IRQ_HANDLER(WRITELINE(towns_state, towns_fm_irq)) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) + MCFG_RF5C68_ADD("pcm", 53693100 / 7) // actual clock speed unknown - MCFG_SOUND_CONFIG(rf5c68_intf) + MCFG_RF5C68_SAMPLE_END_CB(towns_state, towns_pcm_irq) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.50) MCFG_SOUND_ADD("cdda",CDDA,0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) |